From 07b24c6e6e266999dbaaa12ffb201f402190cad1 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 19 Apr 2020 16:29:36 +0300 Subject: [PATCH 001/750] add append_images support for ico, much like icns --- src/PIL/IcoImagePlugin.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index e4a74321b..0186751be 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -52,6 +52,9 @@ def _save(im, fp, filename): sizes = list(sizes) fp.write(struct.pack(" Date: Sun, 19 Apr 2020 16:45:12 +0300 Subject: [PATCH 002/750] add test for ico append_images --- Tests/test_file_ico.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 9ed1ffcb7..7fb52b12d 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -85,6 +85,24 @@ def test_only_save_relevant_sizes(tmp_path): assert im_saved.info["sizes"] == {(16, 16), (24, 24), (32, 32), (48, 48)} +def test_only_save_append_images(tmp_path): + """append_images should work to provide alternative sizes""" + im = hopper() + provided_im = Image.new("RGBA", (32, 32), (255, 0, 0, 255)) + outfile = str(tmp_path / "temp_saved_multi_icon.ico") + im.save(outfile, sizes = [(32, 32), (64, 64)], append_images = [provided_im]) + + with Image.open(outfile) as reread: + reread.size = (64, 64) + reread.load() + assert_image_equal(reread, hopper().resize((64, 64), Image.LANCZOS)) + + with Image.open(outfile) as reread: + reread.size = (32, 32) + reread.load() + assert_image_equal(reread, provided_im) + + def test_unexpected_size(): # This image has been manually hexedited to state that it is 16x32 # while the image within is still 16x16 From 39f47387753d88b3c24743a71907e09245867d01 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 19 Apr 2020 16:54:53 +0300 Subject: [PATCH 003/750] lint --- Tests/test_file_ico.py | 2 +- src/PIL/IcoImagePlugin.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 7fb52b12d..ba9f84f5e 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -90,7 +90,7 @@ def test_only_save_append_images(tmp_path): im = hopper() provided_im = Image.new("RGBA", (32, 32), (255, 0, 0, 255)) outfile = str(tmp_path / "temp_saved_multi_icon.ico") - im.save(outfile, sizes = [(32, 32), (64, 64)], append_images = [provided_im]) + im.save(outfile, sizes=[(32, 32), (64, 64)], append_images=[provided_im]) with Image.open(outfile) as reread: reread.size = (64, 64) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 0186751be..62a1fb4ab 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -52,9 +52,7 @@ def _save(im, fp, filename): sizes = list(sizes) fp.write(struct.pack(" Date: Mon, 20 Apr 2020 12:08:41 +0300 Subject: [PATCH 004/750] commit suggestion; update src/PIL/IcoImagePlugin.py Co-Authored-By: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/PIL/IcoImagePlugin.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 62a1fb4ab..dc2d6606a 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -64,9 +64,8 @@ def _save(im, fp, filename): fp.write(struct.pack(" Date: Mon, 12 Oct 2020 18:38:36 +1100 Subject: [PATCH 005/750] Moved warning to end of execution --- setup.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 2f7c85e9b..e02095bd2 100755 --- a/setup.py +++ b/setup.py @@ -38,12 +38,16 @@ ZLIB_ROOT = None if sys.platform == "win32" and sys.version_info >= (3, 10): - warnings.warn( - f"Pillow {PILLOW_VERSION} does not support Python " - f"{sys.version_info.major}.{sys.version_info.minor} and does not provide " - "prebuilt Windows binaries. We do not recommend building from source on " - "Windows.", - RuntimeWarning, + import atexit + + atexit.register( + lambda: warnings.warn( + f"Pillow {PILLOW_VERSION} does not support Python " + f"{sys.version_info.major}.{sys.version_info.minor} and does not provide " + "prebuilt Windows binaries. We do not recommend building from source on " + "Windows.", + RuntimeWarning, + ) ) From 1e4d81f160ce37de635bd45a5162cf5c080a55fa Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 14 Oct 2020 17:31:21 +0100 Subject: [PATCH 006/750] add Python 3.10-dev to GHA --- .github/workflows/test-windows.yml | 2 +- .github/workflows/test.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index d384a7d29..0ebeed7cd 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "pypy3"] + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10-dev", "pypy3"] architecture: ["x86", "x64"] include: - architecture: "x86" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6cb099640..72291876a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: ] python-version: [ "pypy3", + "3.10-dev", "3.9", "3.8", "3.7", From 26cfe04fea451f689e9a4d137fc8ff8dbf292993 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 14 Oct 2020 20:52:16 +0100 Subject: [PATCH 007/750] fix PY_SSIZE_T_CLEAN in display.c --- src/display.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/display.c b/src/display.c index 2eb4a5855..c95844bbc 100644 --- a/src/display.c +++ b/src/display.c @@ -22,7 +22,7 @@ * See the README file for information on usage and redistribution. */ - +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "libImaging/Imaging.h" @@ -196,7 +196,7 @@ static PyObject* _frombytes(ImagingDisplayObject* display, PyObject* args) { char* ptr; - int bytes; + Py_ssize_t bytes; if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes)) { return NULL; @@ -777,7 +777,7 @@ PyImaging_DrawWmf(PyObject* self, PyObject* args) char* ptr; char* data; - int datasize; + Py_ssize_t datasize; int width, height; int x0, y0, x1, y1; if (!PyArg_ParseTuple(args, "y#(ii)(iiii):_load", &data, &datasize, From bdcc48f0a2d5af58155c6e10a127536d4ac79374 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 14 Oct 2020 20:59:19 +0100 Subject: [PATCH 008/750] skip wheels on 3.10-dev due to wheel#354 --- .github/workflows/test-windows.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 0ebeed7cd..7c28b5075 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -187,14 +187,16 @@ jobs: - name: Build wheel id: wheel - if: "github.event_name == 'push'" + # Skip wheels on 3.10 due to https://github.com/pypa/wheel/issues/354 + if: "github.event_name == 'push' && !contains(matrix.python-version, '3.10')" run: | for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ::set-output name=dist::dist-%%a winbuild\\build\\build_pillow.cmd --disable-imagequant bdist_wheel shell: cmd - uses: actions/upload-artifact@v2 - if: "github.event_name == 'push'" + # Skip wheels on 3.10 due to https://github.com/pypa/wheel/issues/354 + if: "github.event_name == 'push' && !contains(matrix.python-version, '3.10')" with: name: ${{ steps.wheel.outputs.dist }} path: dist\*.whl From b305f99416aafbdf6b799418bb2b9bf1af6be3f1 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 14 Oct 2020 19:26:45 +0100 Subject: [PATCH 009/750] skip numpy on 3.10-dev due to wheel#354 --- .ci/install.sh | 3 ++- .github/workflows/macos-install.sh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index afb88eb17..8e1e263e1 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -31,7 +31,8 @@ pip install -U pytest pip install -U pytest-cov pip install pyroma pip install test-image-results -pip install numpy +# TODO Remove condition when numpy supports 3.10 +if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then pip install numpy ; fi # TODO Remove when 3.8 / 3.9 / PyPy3 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then pip install -U "setuptools>=49.3.2" ; fi diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 16f532edf..4d5e54b27 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -13,7 +13,8 @@ pip install pyroma pip install test-image-results echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg -pip install numpy +# TODO Remove condition when numpy supports 3.10 +if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then pip install numpy ; fi # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then pip install -U "setuptools>=49.3.2" ; fi From 42e23ff4d1b025acca68391a024afb06b6c509be Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 15 Oct 2020 14:39:49 +0300 Subject: [PATCH 010/750] Replace viewdoc with markdown2 and twine check --- Makefile | 4 ++-- RELEASING.md | 26 +++++++++++++++++++------- requirements.txt | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 4fd031b69..519dadb30 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,7 @@ release-test: python3 -m pytest -qq check-manifest pyroma . - viewdoc + $(MAKE) readme .PHONY: sdist sdist: @@ -106,4 +106,4 @@ test: .PHONY: readme readme: - viewdoc + python3 setup.py --long-description | markdown2 > .long-description.html && open .long-description.html diff --git a/RELEASING.md b/RELEASING.md index c9a0439d8..514c61519 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -21,12 +21,17 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. git push --all git push --tags ``` -* [ ] Create source distributions e.g.: +* [ ] Create and check source distribution: ```bash make sdist + twine check dist/* ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) -* [ ] Upload all binaries and source distributions e.g. `twine upload dist/Pillow-5.2.0*` +* [ ] Check and upload all binaries and source distributions e.g.: + ```bash + twine check dist/* + twine upload dist/Pillow-5.2.0* + ``` * [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), increment and append `.dev0` to version identifier in `src/PIL/_version.py` @@ -56,12 +61,17 @@ Released as needed for security, installation or critical bug fixes. git push git push --tags ``` -* [ ] Create source distributions e.g.: +* [ ] Create and check source distribution: ```bash make sdist + twine check dist/* ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) -* [ ] Upload all binaries and source distributions e.g. `twine upload dist/Pillow-5.2.1*` +* [ ] Check and upload all binaries and source distributions e.g.: + ```bash + twine check dist/* + twine upload dist/Pillow-5.2.0* + ``` * [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) ## Embargoed Release @@ -81,9 +91,10 @@ Released as needed privately to individual vendors for critical security-related git push origin 2.5.x git push origin --tags ``` -* [ ] Create source distributions e.g.: +* [ ] Create and check source distribution: ```bash make sdist + twine check dist/* ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) * [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) @@ -92,7 +103,7 @@ Released as needed privately to individual vendors for critical security-related ### Windows * [ ] Contact `@cgohlke` for Windows binaries via release ticket e.g. https://github.com/python-pillow/Pillow/issues/1174. -* [ ] Download and extract tarball from `@cgohlke` and `twine upload *`. +* [ ] Download and extract tarball from `@cgohlke` and copy into `dist/` ### Mac and Linux * [ ] Use the [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels): @@ -101,7 +112,8 @@ Released as needed privately to individual vendors for critical security-related cd pillow-wheels ./update-pillow-tag.sh [[release tag]] ``` -* [ ] Download wheels from the [Pillow Wheel Builder release](https://github.com/python-pillow/pillow-wheels/releases). +* [ ] Download wheels from the [Pillow Wheel Builder release](https://github.com/python-pillow/pillow-wheels/releases) + and copy into `dist/` ## Publicize Release diff --git a/requirements.txt b/requirements.txt index 9758f91fd..7b52e1253 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ black check-manifest coverage -jarn.viewdoc +markdown2 olefile pycodestyle pyflakes From eb460a2ac8e4ab58937e8d3cf034be077e8e24a6 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 17 Oct 2020 11:23:58 -0700 Subject: [PATCH 011/750] Fix internal Sphinx link to installation doc Fixes linkcheck warnings: handbook/image-file-formats.rst:563: [broken] ../installation.html: releasenotes/4.2.0.rst:7: [broken] ../installation.html: --- docs/handbook/image-file-formats.rst | 4 ++-- docs/releasenotes/4.2.0.rst | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 5ed72ac1a..680582f12 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -561,8 +561,8 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: .. note:: To enable PNG support, you need to build and install the ZLIB compression - library before building the Python Imaging Library. See the `installation - documentation <../installation.html>`_ for details. + library before building the Python Imaging Library. See the + :doc:`installation documentation <../installation>` for details. .. _apng-sequences: diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index a3e29f271..1e9637f1e 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -6,10 +6,9 @@ Added Complex Text Rendering Pillow now supports complex text rendering for scripts requiring glyph composition and bidirectional flow. This optional feature adds three -dependencies: harfbuzz, fribidi, and raqm. See the `install -documentation <../installation.html>`_ for further details. This feature is -tested and works on Unix and Mac, but has not yet been built on Windows -platforms. +dependencies: harfbuzz, fribidi, and raqm. See the :doc:`install documentation +<../installation>` for further details. This feature is tested and works on +Unix and Mac, but has not yet been built on Windows platforms. New Optional Parameters ======================= From 0045cca027a3cf2e9cf1069b62edd571deef6a90 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Oct 2020 07:22:24 +1100 Subject: [PATCH 012/750] Clean up dist in release-test --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 4fd031b69..99232cac9 100644 --- a/Makefile +++ b/Makefile @@ -91,6 +91,8 @@ release-test: python3 selftest.py python3 -m pytest Tests python3 setup.py install + -rm dist/*.egg + -rmdir dist python3 -m pytest -qq check-manifest pyroma . From f886bc973bb972a796756d9c0a728795d203dd97 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Oct 2020 21:32:56 +1100 Subject: [PATCH 013/750] Moved string_dimension image to pillow-depends --- Tests/images/string_dimension.tiff | Bin 483 -> 0 bytes Tests/test_file_tiff.py | 4 ++++ 2 files changed, 4 insertions(+) delete mode 100644 Tests/images/string_dimension.tiff diff --git a/Tests/images/string_dimension.tiff b/Tests/images/string_dimension.tiff deleted file mode 100644 index d0b55830128495194a82252d3cf7c4d4cae0931c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmebD)M8k`z`)R8{~*9Zg|kh8VgI4#AJPZd7_|03?EgOd?~ecmmq+Ulb-K)F>OG$P z(L>+^vvSvg84E5@4K%E0*&6*!HDCo3r@s7ty^k6vW!LF2P2FPl+D_}z`*(wr2g%Hka!nV9LVHlWMpFS05a-;h6ysVfX(Cp z@`a#kKz4{CvBf~_|2P0pEdvXKI0Mw2H8U9GKtc>sjI3aT+kmD?L)m>mwhYYRgVX^a hyBvUK@&M^+K=TEFbeb%qUP)#eNQwdEY%l}J0staUza0Po diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bcffecd35..f644ef887 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -598,6 +598,10 @@ class TestFileTiff: # Ignore this UserWarning which triggers for four tags: # "Possibly corrupt EXIF data. Expecting to read 50404352 bytes but..." @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") + @pytest.mark.skipif( + not os.path.exists("Tests/images/string_dimension.tiff"), + reason="Extra image files not installed", + ) def test_string_dimension(self): # Assert that an error is raised if one of the dimensions is a string with pytest.raises(ValueError): From bd65c8ebb56351f0ce3c6a623bbedf3b7c61eba9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Oct 2020 22:12:51 +1100 Subject: [PATCH 014/750] Updated libimagequant to 2.13.0 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 1f2b677fd..ae70bde8f 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.12.6 +archive=libimagequant-2.13.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index cf9742d45..c09b641ab 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -177,7 +177,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.12.6** + * Pillow has been tested with libimagequant **2.6-2.13.0** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From 4f4c3b34f8685bc9e16f596d093f8b01f8b2e1b6 Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 20 Oct 2020 05:59:25 +0100 Subject: [PATCH 015/750] jpeg2000: add subsampling decoder support --- src/libImaging/Jpeg2KDecode.c | 128 +++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 49 deletions(-) diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index b08e607a7..71bedeb52 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -78,6 +78,8 @@ struct j2k_decode_unpacker { const char *mode; OPJ_COLOR_SPACE color_space; unsigned components; + /* bool indicating if unpacker supports subsampling */ + int subsampling; j2k_unpacker_t unpacker; }; @@ -332,6 +334,7 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, unsigned h = tileinfo->y1 - tileinfo->y0; int shifts[3], offsets[3], csiz[3]; + unsigned dx[3], dy[3]; const UINT8 *cdata[3]; const UINT8 *cptr = tiledata; unsigned n, x, y; @@ -341,6 +344,8 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, shifts[n] = 8 - in->comps[n].prec; offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; csiz[n] = (in->comps[n].prec + 7) >> 3; + dx[n] = (in->comps[n].dx); + dy[n] = (in->comps[n].dy); if (csiz[n] == 3) { csiz[n] = 4; @@ -350,14 +355,14 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, offsets[n] += 1 << (-shifts[n] - 1); } - cptr += csiz[n] * w * h; + cptr += csiz[n] * (w / dx[n]) * (h / dy[n]); } for (y = 0; y < h; ++y) { const UINT8 *data[3]; UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; for (n = 0; n < 3; ++n) { - data[n] = &cdata[n][csiz[n] * y * w]; + data[n] = &cdata[n][csiz[n] * (y / dy[n]) * (w / dx[n])]; } for (x = 0; x < w; ++x) { @@ -365,9 +370,9 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: word = data[n][x / dx[n]]; break; + case 2: word = ((const UINT16 *)data[n])[x / dx[n]]; break; + case 4: word = ((const UINT32 *)data[n])[x / dx[n]]; break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -387,6 +392,7 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, unsigned h = tileinfo->y1 - tileinfo->y0; int shifts[3], offsets[3], csiz[3]; + unsigned dx[3], dy[3]; const UINT8 *cdata[3]; const UINT8 *cptr = tiledata; unsigned n, x, y; @@ -396,6 +402,8 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, shifts[n] = 8 - in->comps[n].prec; offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; csiz[n] = (in->comps[n].prec + 7) >> 3; + dx[n] = (in->comps[n].dx); + dy[n] = (in->comps[n].dy); if (csiz[n] == 3) { csiz[n] = 4; @@ -405,7 +413,7 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, offsets[n] += 1 << (-shifts[n] - 1); } - cptr += csiz[n] * w * h; + cptr += csiz[n] * (w / dx[n]) * (h / dy[n]); } for (y = 0; y < h; ++y) { @@ -413,7 +421,7 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; UINT8 *row_start = row; for (n = 0; n < 3; ++n) { - data[n] = &cdata[n][csiz[n] * y * w]; + data[n] = &cdata[n][csiz[n] * (y / dy[n]) * (w / dx[n])]; } for (x = 0; x < w; ++x) { @@ -421,9 +429,9 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: word = data[n][x / dx[n]]; break; + case 2: word = ((const UINT16 *)data[n])[x / dx[n]]; break; + case 4: word = ((const UINT32 *)data[n])[x / dx[n]]; break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -445,6 +453,7 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, unsigned h = tileinfo->y1 - tileinfo->y0; int shifts[4], offsets[4], csiz[4]; + unsigned dx[4], dy[4]; const UINT8 *cdata[4]; const UINT8 *cptr = tiledata; unsigned n, x, y; @@ -454,6 +463,8 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, shifts[n] = 8 - in->comps[n].prec; offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; csiz[n] = (in->comps[n].prec + 7) >> 3; + dx[n] = (in->comps[n].dx); + dy[n] = (in->comps[n].dy); if (csiz[n] == 3) { csiz[n] = 4; @@ -463,14 +474,14 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, offsets[n] += 1 << (-shifts[n] - 1); } - cptr += csiz[n] * w * h; + cptr += csiz[n] * (w / dx[n]) * (h / dy[n]); } for (y = 0; y < h; ++y) { const UINT8 *data[4]; UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; for (n = 0; n < 4; ++n) { - data[n] = &cdata[n][csiz[n] * y * w]; + data[n] = &cdata[n][csiz[n] * (y / dy[n]) * (w / dx[n])]; } for (x = 0; x < w; ++x) { @@ -478,9 +489,9 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: word = data[n][x / dx[n]]; break; + case 2: word = ((const UINT16 *)data[n])[x / dx[n]]; break; + case 4: word = ((const UINT32 *)data[n])[x / dx[n]]; break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -499,6 +510,7 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, unsigned h = tileinfo->y1 - tileinfo->y0; int shifts[4], offsets[4], csiz[4]; + unsigned dx[4], dy[4]; const UINT8 *cdata[4]; const UINT8 *cptr = tiledata; unsigned n, x, y; @@ -508,6 +520,8 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, shifts[n] = 8 - in->comps[n].prec; offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; csiz[n] = (in->comps[n].prec + 7) >> 3; + dx[n] = (in->comps[n].dx); + dy[n] = (in->comps[n].dy); if (csiz[n] == 3) { csiz[n] = 4; @@ -517,7 +531,7 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, offsets[n] += 1 << (-shifts[n] - 1); } - cptr += csiz[n] * w * h; + cptr += csiz[n] * (w / dx[n]) * (h / dy[n]); } for (y = 0; y < h; ++y) { @@ -525,7 +539,7 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; UINT8 *row_start = row; for (n = 0; n < 4; ++n) { - data[n] = &cdata[n][csiz[n] * y * w]; + data[n] = &cdata[n][csiz[n] * (y / dy[n]) * (w / dx[n])]; } for (x = 0; x < w; ++x) { @@ -533,9 +547,9 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: word = data[n][x / dx[n]]; break; + case 2: word = ((const UINT16 *)data[n])[x / dx[n]]; break; + case 4: word = ((const UINT32 *)data[n])[x / dx[n]]; break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -548,22 +562,22 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static const struct j2k_decode_unpacker j2k_unpackers[] = { - { "L", OPJ_CLRSPC_GRAY, 1, j2ku_gray_l }, - { "I;16", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, - { "I;16B", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, - { "LA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, - { "RGB", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, - { "RGB", OPJ_CLRSPC_GRAY, 2, j2ku_gray_rgb }, - { "RGB", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, - { "RGB", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, - { "RGB", OPJ_CLRSPC_SRGB, 4, j2ku_srgb_rgb }, - { "RGB", OPJ_CLRSPC_SYCC, 4, j2ku_sycc_rgb }, - { "RGBA", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, - { "RGBA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, - { "RGBA", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, - { "RGBA", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, - { "RGBA", OPJ_CLRSPC_SRGB, 4, j2ku_srgba_rgba }, - { "RGBA", OPJ_CLRSPC_SYCC, 4, j2ku_sycca_rgba }, + { "L", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_l }, + { "I;16", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i }, + { "I;16B", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_i }, + { "LA", OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la }, + { "RGB", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb }, + { "RGB", OPJ_CLRSPC_GRAY, 2, 0, j2ku_gray_rgb }, + { "RGB", OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb }, + { "RGB", OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb }, + { "RGB", OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgb_rgb }, + { "RGB", OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycc_rgb }, + { "RGBA", OPJ_CLRSPC_GRAY, 1, 0, j2ku_gray_rgb }, + { "RGBA", OPJ_CLRSPC_GRAY, 2, 0, j2ku_graya_la }, + { "RGBA", OPJ_CLRSPC_SRGB, 3, 1, j2ku_srgb_rgb }, + { "RGBA", OPJ_CLRSPC_SYCC, 3, 1, j2ku_sycc_rgb }, + { "RGBA", OPJ_CLRSPC_SRGB, 4, 1, j2ku_srgba_rgba }, + { "RGBA", OPJ_CLRSPC_SYCC, 4, 1, j2ku_sycca_rgba }, }; /* -------------------------------------------------------------------- */ @@ -589,7 +603,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) j2k_unpacker_t unpack = NULL; size_t buffer_size = 0, tile_bytes = 0; unsigned n, tile_height, tile_width; - int components; + int components, subsampling; stream = opj_stream_create(BUFFER_SIZE, OPJ_TRUE); @@ -652,11 +666,16 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) goto quick_exit; } - for (n = 1; n < image->numcomps; ++n) { + /* + * Find first component with subsampling. + * + * This is a heuristic to determine the colorspace if unspecified. + */ + subsampling = -1; + for (n = 0; n < image->numcomps; ++n) { if (image->comps[n].dx != 1 || image->comps[n].dy != 1) { - state->errcode = IMAGING_CODEC_BROKEN; - state->state = J2K_STATE_FAILED; - goto quick_exit; + subsampling = n; + break; } } @@ -672,12 +691,14 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) If colorspace is unspecified, we assume: - Number of components Colorspace - ----------------------------------------- - 1 gray - 2 gray (+ alpha) - 3 sRGB - 4 sRGB (+ alpha) + Number of components Subsampling Colorspace + ------------------------------------------------------- + 1 Any gray + 2 Any gray (+ alpha) + 3 -1, 0 sRGB + 3 1, 2 YCbCr + 4 -1, 0, 3 sRGB (+ alpha) + 4 1, 2 YCbCr (+ alpha) */ @@ -686,14 +707,23 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) if (color_space == OPJ_CLRSPC_UNSPECIFIED) { switch (image->numcomps) { - case 1: case 2: color_space = OPJ_CLRSPC_GRAY; break; - case 3: case 4: color_space = OPJ_CLRSPC_SRGB; break; + case 1: case 2: + color_space = OPJ_CLRSPC_GRAY; break; + case 3: case 4: + switch (subsampling) { + case -1: case 0: case 3: + color_space = OPJ_CLRSPC_SRGB; break; + case 1: case 2: + color_space = OPJ_CLRSPC_SYCC; break; + } + break; } } for (n = 0; n < sizeof(j2k_unpackers) / sizeof (j2k_unpackers[0]); ++n) { if (color_space == j2k_unpackers[n].color_space && image->numcomps == j2k_unpackers[n].components + && (j2k_unpackers[n].subsampling || (subsampling == -1)) && strcmp (im->mode, j2k_unpackers[n].mode) == 0) { unpack = j2k_unpackers[n].unpacker; break; From 2586b7ddefa55882baa620de71b6c329944f8d72 Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 20 Oct 2020 06:33:01 +0100 Subject: [PATCH 016/750] add tests for subsampled jpeg2000 image decoding --- Tests/test_file_jpeg2k.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index c9e37f8b0..869e740ba 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -1,3 +1,4 @@ +import os import re from io import BytesIO @@ -12,6 +13,8 @@ from .helper import ( skip_unless_feature, ) +EXTRA_DIR = "Tests/images/jpeg2000" + pytestmark = skip_unless_feature("jpg_2000") test_card = Image.open("Tests/images/test-card.png") @@ -233,3 +236,23 @@ def test_parser_feed(): # Assert assert p.image.size == (640, 480) + + +@pytest.mark.skipif( + not os.path.exists(EXTRA_DIR), reason="Extra image files not installed" +) +@pytest.mark.parametrize("name", ("subsampling_1", "subsampling_2", "zoo1", "zoo2")) +def test_subsampling_decode(name): + test = f"{EXTRA_DIR}/{name}.jp2" + reference = f"{EXTRA_DIR}/{name}.ppm" + + with Image.open(test) as im: + epsilon = 3 # for YCbCr images + with Image.open(reference) as im2: + width, height = im2.size + if name[-1] == "2": + # RGB reference images are downscaled + epsilon = 3e-3 + width, height = width * 2, height * 2 + expected = im2.resize((width, height), Image.NEAREST) + assert_image_similar(im, expected, epsilon) From 919fdcc49c6f9f803d6c3086c7ec7cf9a75c15a3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Oct 2020 19:55:44 +1100 Subject: [PATCH 017/750] Updated freetype to 2.10.4 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 352c3f76b..6c431f4d6 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -184,9 +184,9 @@ deps = { "libs": [r"libpng16.lib"], }, "freetype": { - "url": "https://download.savannah.gnu.org/releases/freetype/freetype-2.10.3.tar.gz", # noqa: E501 - "filename": "freetype-2.10.3.tar.gz", - "dir": "freetype-2.10.3", + "url": "https://download.savannah.gnu.org/releases/freetype/freetype-2.10.4.tar.gz", # noqa: E501 + "filename": "freetype-2.10.4.tar.gz", + "dir": "freetype-2.10.4", "patch": { r"builds\windows\vc2010\freetype.vcxproj": { # freetype setting is /MD for .dll and /MT for .lib, we need /MD From 558b2e6cf6143acd6323f0887c112043f34b5fb4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 22 Oct 2020 15:45:58 +0300 Subject: [PATCH 018/750] Add release notes for 8.0.1 --- CHANGES.rst | 6 ++++++ docs/releasenotes/8.0.1.rst | 23 +++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 3 files changed, 30 insertions(+) create mode 100644 docs/releasenotes/8.0.1.rst diff --git a/CHANGES.rst b/CHANGES.rst index 6e1970cba..95a7d1c46 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,12 @@ Changelog (Pillow) - Support raw rgba8888 for DDS #4760 [qiankanglai] +8.0.1 (2020-10-22) +------------------ + +- Update FreeType used in binary wheels to 2.10.4 to fix CVE-2020-15999. + [radarhere] + 8.0.0 (2020-10-15) ------------------ diff --git a/docs/releasenotes/8.0.1.rst b/docs/releasenotes/8.0.1.rst new file mode 100644 index 000000000..be10d8e47 --- /dev/null +++ b/docs/releasenotes/8.0.1.rst @@ -0,0 +1,23 @@ +8.0.1 +----- + +Security +======== + +Update FreeType used in binary wheels to `2.10.4`_ to fix CVE-2020-15999_: + + - A heap buffer overflow has been found in the handling of embedded PNG bitmaps, + introduced in FreeType version 2.6. + + https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 + + If you use option ``FT_CONFIG_OPTION_USE_PNG`` you should upgrade immediately. + +Before Pillow 8.0.0 bitmap fonts were disabled with ``FT_LOAD_NO_BITMAP``, but it is not +clear if this prevents the exploit and we recommend updating to Pillow 8.0.1. + +Pillow 8.0.0 and earlier are potentially vulnerable releases, including the last release +to support Python 2.7, namely Pillow 6.2.2. + +.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ +.. _CVE-2020-15999: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index ba81fbaf8..5c74bed9b 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -13,6 +13,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 8.0.1 8.0.0 7.2.0 7.1.2 From ac348ea3b1807f805c165cd29a54734000f14c3a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 22 Oct 2020 17:09:20 +0300 Subject: [PATCH 019/750] Clarify wording [CI skip] Co-authored-by: nulano --- docs/releasenotes/8.0.1.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/releasenotes/8.0.1.rst b/docs/releasenotes/8.0.1.rst index be10d8e47..e50596e5c 100644 --- a/docs/releasenotes/8.0.1.rst +++ b/docs/releasenotes/8.0.1.rst @@ -13,7 +13,9 @@ Update FreeType used in binary wheels to `2.10.4`_ to fix CVE-2020-15999_: If you use option ``FT_CONFIG_OPTION_USE_PNG`` you should upgrade immediately. -Before Pillow 8.0.0 bitmap fonts were disabled with ``FT_LOAD_NO_BITMAP``, but it is not +We strongly recommend updating to Pillow 8.0.1 if you are using Pillow 8.0.0, which improved support for bitmap fonts. + +In Pillow 7.2.0 and earlier bitmap fonts were disabled with ``FT_LOAD_NO_BITMAP``, but it is not clear if this prevents the exploit and we recommend updating to Pillow 8.0.1. Pillow 8.0.0 and earlier are potentially vulnerable releases, including the last release From ece120d63c1d645e4bf986757dd41986365eb0e5 Mon Sep 17 00:00:00 2001 From: nulano Date: Thu, 22 Oct 2020 15:53:16 +0100 Subject: [PATCH 020/750] replace test images when copying from pillow-depends --- .appveyor.yml | 2 +- .github/workflows/test-windows.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 8ef91212d..23ac977ae 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,7 +22,7 @@ install: - curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip - 7z x pillow-depends.zip -oc:\ - mv c:\pillow-depends-master c:\pillow-depends -- xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images +- xcopy /S /Y c:\pillow-depends\test_images\* c:\pillow\tests\images - 7z x ..\pillow-depends\nasm-2.14.02-win64.zip -oc:\ - ..\pillow-depends\gs9533w32.exe /S - path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.53.3\bin;%PATH% diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index d384a7d29..9864455de 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -76,7 +76,7 @@ jobs: winbuild\depends\gs9533w32.exe /S echo "C:\Program Files (x86)\gs\gs9.53.3\bin" >> $env:GITHUB_PATH - xcopy /s winbuild\depends\test_images\* Tests\images\ + xcopy /S /Y winbuild\depends\test_images\* Tests\images\ shell: pwsh - name: Cache build From 82c8b76a3683da75ec95b9c64094db9a2681614c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 23 Oct 2020 08:22:17 +1100 Subject: [PATCH 021/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 95a7d1c46..e7090219f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -14,6 +14,9 @@ Changelog (Pillow) - Update FreeType used in binary wheels to 2.10.4 to fix CVE-2020-15999. [radarhere] +- Moved string_dimension image to pillow-depends #4993 + [radarhere] + 8.0.0 (2020-10-15) ------------------ From d1650cb2b3bae7f79b3b002f83eb81ba50bfa575 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 23 Oct 2020 21:08:06 +1100 Subject: [PATCH 022/750] Document FreeMono license [ci skip] --- Tests/fonts/LICENSE.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index db3af7c34..06eaa9a4e 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -11,6 +11,8 @@ BungeeColor-Regular_colr_Windows.ttf, from https://github.com/djrrb/bungee All of the above fonts are published under the SIL Open Font License (OFL) v1.1 (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL), which allows you to copy, modify, and redistribute them if you need to. +FreeMono.ttf is licensed under GPLv3, with the GPL font exception. + OpenSansCondensed-LightItalic.tt, from https://fonts.google.com/specimen/Open+Sans, under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. From 07cfe1d0d0799673ab922537cb7ba7958b8be496 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Oct 2020 13:14:51 +1100 Subject: [PATCH 023/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index c09b641ab..4a70b7fbf 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -469,7 +469,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 10.15 Catalina | 3.5, 3.6, 3.7, 3.8 | 7.2.0 |x86-64 | +| macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | +| +------------------------------+--------------------------------+ + +| | 3.5 | 7.2.0 | | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.14 Mojave | 3.5, 3.6, 3.7, 3.8 | 7.2.0 |x86-64 | | +------------------------------+--------------------------------+ + From 25be3364575c8f2c2051a86e0995a2415f93f8ed Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 25 Oct 2020 14:40:40 +0200 Subject: [PATCH 024/750] Add a 'git push' to point release, adjust MD formatting for issues [CI skip] --- RELEASING.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index c9a0439d8..ad166527c 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -6,10 +6,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in `master` branch. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), - [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and - [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm - passing tests in `master` branch. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. * [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Update `CHANGES.rst`. @@ -40,14 +37,11 @@ Released as needed for security, installation or critical bug fixes. ```bash git checkout -t remotes/origin/5.2.x ``` -* [ ] Cherry pick individual commits from `master` branch to release branch e.g. `5.2.x`. +* [ ] Cherry pick individual commits from `master` branch to release branch e.g. `5.2.x`, then `git push`. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), - [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and - [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm - passing tests in release branch e.g. `5.2.x`. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Run pre-release check via `make release-test`. * [ ] Create tag for release e.g.: From 3581600bf34d98f4f50684037459cd7c52e3054b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 26 Oct 2020 06:58:20 +1100 Subject: [PATCH 025/750] Clarified that "text" must be a string [ci skip] --- docs/reference/ImageDraw.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 6052d2833..57d1c2dda 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -296,7 +296,7 @@ Methods Draws the string at the given position. :param xy: The anchor coordinates of the text. - :param text: Text to be drawn. If it contains any newline characters, + :param text: String to be drawn. If it contains any newline characters, the text is passed on to :py:meth:`~PIL.ImageDraw.ImageDraw.multiline_text`. :param fill: Color to use for the text. @@ -362,7 +362,7 @@ Methods Draws the string at the given position. :param xy: The anchor coordinates of the text. - :param text: Text to be drawn. + :param text: String to be drawn. :param fill: Color to use for the text. :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. From 3fca42f27db2ea7cc83d16b2ccd4c2fc97a71251 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 26 Oct 2020 21:59:24 +0200 Subject: [PATCH 026/750] Test on Python 3.9 final --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b02f054d0..da8aedf8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,8 +28,8 @@ matrix: - python: "pypy3.6-7.3.1" name: "PyPy3 Xenial" - - python: "3.9-dev" - name: "3.9-dev Xenial" + - python: "3.9" + name: "3.9 Xenial" services: xvfb - python: "3.8" name: "3.8 Xenial" @@ -43,9 +43,6 @@ matrix: env: PYTHONOPTIMIZE=1 services: xvfb - allow_failures: - - python: "3.9-dev" - install: - | if [ "$LINT" == "true" ]; then From 5eab56860bc79ff8a68dd519bfe8051393a93cb3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 Oct 2020 21:12:51 +1100 Subject: [PATCH 027/750] Updated CI targets [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 4a70b7fbf..131a60692 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -438,7 +438,7 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | +----------------------------------+--------------------------+-----------------------+ -| Ubuntu Linux 16.04 LTS (Xenial) | 3.6, 3.7, 3.8, PyPy3 |x86-64 | +| Ubuntu Linux 16.04 LTS (Xenial) | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | +----------------------------------+--------------------------+-----------------------+ | Ubuntu Linux 18.04 LTS (Bionic) | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | +----------------------------------+--------------------------+-----------------------+ From 91de1880b3bdd9b56a22f115ea83e5c92cc252a9 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 27 Oct 2020 21:47:06 +0200 Subject: [PATCH 028/750] Add Fedora 33 --- .github/workflows/test-docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 2d6d12933..ddec1bee4 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -21,6 +21,7 @@ jobs: amazon-1-amd64, amazon-2-amd64, fedora-32-amd64, + fedora-33-amd64, ] dockerTag: [master] From 1b3685aeddaea9fadeeed120d87e68a8d0b44e59 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 27 Oct 2020 21:54:04 +0200 Subject: [PATCH 029/750] Test on Python 3.9 final --- .appveyor.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 23ac977ae..092b73748 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,5 +1,4 @@ version: '{build}' -image: Visual Studio 2017 clone_folder: c:\pillow init: - ECHO %PYTHON% @@ -12,10 +11,12 @@ environment: TEST_OPTIONS: DEPLOY: YES matrix: - - PYTHON: C:/Python38 + - PYTHON: C:/Python39 ARCHITECTURE: x86 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - PYTHON: C:/Python36-x64 ARCHITECTURE: x64 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 install: @@ -32,6 +33,7 @@ install: c:\pillow\winbuild\build\build_dep_all.cmd $host.SetShouldExit(0) - path C:\pillow\winbuild\build\bin;%PATH% +- '%PYTHON%\%PIP_DIR%\pip.exe install -U "setuptools>=49.3.2"' build_script: - ps: | From d171afc19ee4401530ab9e0d7862f4206e7ce6e1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Oct 2020 22:03:27 +1100 Subject: [PATCH 030/750] Describe effect of WebP save_all [ci skip] --- docs/handbook/image-file-formats.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 680582f12..2b6f9483b 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -947,9 +947,10 @@ Saving sequences library is v0.5.0 or later. You can check webp animation support at runtime by calling ``features.check("webp_anim")``. -When calling :py:meth:`~PIL.Image.Image.save` to write a WebP file, the -following options are available when the ``save_all`` argument is present and -true. +When calling :py:meth:`~PIL.Image.Image.save` to write a WebP file, by default +only the first frame of a multiframe image will be saved. If the ``save_all`` +argument is present and true, then all frames will be saved, and the following +options will also be available. **append_images** A list of images to append as additional frames. Each of the From b3f0f9ae8ca09d53ea6982254ec0984a0e6424af Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Oct 2020 18:40:46 +1100 Subject: [PATCH 031/750] Updated CI targets [ci skip] --- docs/installation.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 131a60692..0a8c41ba6 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -444,9 +444,7 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | Ubuntu Linux 20.04 LTS (Focal) | 3.8 |x86-64 | +----------------------------------+--------------------------+-----------------------+ -| Windows Server 2016 | 3.8 |x86 | -| +--------------------------+-----------------------+ -| | 3.6 |x86-64 | +| Windows Server 2016 | 3.6 |x86-64 | +----------------------------------+--------------------------+-----------------------+ | Windows Server 2019 | 3.6, 3.7, 3.8, 3.9 |x86, x86-64 | | +--------------------------+-----------------------+ From 6a50e1076afff4c8f04a11f55bd0e6512dbfd8d9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Oct 2020 22:41:29 +1100 Subject: [PATCH 032/750] Invoke pip using Python --- .appveyor.yml | 8 ++++---- .ci/install.sh | 28 ++++++++++++++-------------- .github/workflows/macos-install.sh | 20 ++++++++++---------- .github/workflows/test-windows.yml | 2 +- .github/workflows/test.yml | 4 ++-- .travis.yml | 2 +- depends/diffcover-install.sh | 2 +- docs/releasenotes/6.0.0.rst | 2 +- tox.ini | 4 ++-- winbuild/build.rst | 2 +- 10 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 092b73748..45b748140 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -33,7 +33,7 @@ install: c:\pillow\winbuild\build\build_dep_all.cmd $host.SetShouldExit(0) - path C:\pillow\winbuild\build\bin;%PATH% -- '%PYTHON%\%PIP_DIR%\pip.exe install -U "setuptools>=49.3.2"' +- '%PYTHON%\%EXECUTABLE% -m pip install -U "setuptools>=49.3.2"' build_script: - ps: | @@ -44,13 +44,13 @@ build_script: test_script: - cd c:\pillow -- '%PYTHON%\%PIP_DIR%\pip.exe install pytest pytest-cov' +- '%PYTHON%\%EXECUTABLE% -m pip install pytest pytest-cov' - c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\%EXECUTABLE% - '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests' #- '%PYTHON%\%EXECUTABLE% test-installed.py -v -s %TEST_OPTIONS%' TODO TEST_OPTIONS with pytest? after_test: -- pip install codecov +- python -m pip install codecov - codecov --file coverage.xml --name %PYTHON% --flags AppVeyor matrix: @@ -67,7 +67,7 @@ artifacts: before_deploy: - cd c:\pillow - - '%PYTHON%\%PIP_DIR%\pip.exe install wheel' + - '%PYTHON%\%EXECUTABLE% -m pip install wheel' - cd c:\pillow\winbuild\ - c:\pillow\winbuild\build\build_pillow.cmd bdist_wheel - cd c:\pillow diff --git a/.ci/install.sh b/.ci/install.sh index 6f83fef22..6b9ade699 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -23,32 +23,32 @@ sudo apt-get -qq install libfreetype6-dev liblcms2-dev python3-tk\ if [[ $TRAVIS_CPU_ARCH == "s390x" ]]; then sudo chown $USER ~/.cache/pip/wheels ; fi -pip install --upgrade pip -PYTHONOPTIMIZE=0 pip install cffi -pip install coverage -pip install olefile -pip install -U pytest -pip install -U pytest-cov -pip install pyroma -pip install test-image-results -pip install numpy +python3 -m pip install --upgrade pip +PYTHONOPTIMIZE=0 python3 -m pip install cffi +python3 -m pip install coverage +python3 -m pip install olefile +python3 -m pip install -U pytest +python3 -m pip install -U pytest-cov +python3 -m pip install pyroma +python3 -m pip install test-image-results +python3 -m pip install numpy # TODO Remove when 3.8 / 3.9 / PyPy3 includes setuptools 49.3.2+: -if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then pip install -U "setuptools>=49.3.2" ; fi -if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then pip install -U "setuptools>=49.3.2" ; fi -if [ "$TRAVIS_PYTHON_VERSION" == "pypy3.6-7.3.1" ]; then pip install -U "setuptools>=49.3.2" ; fi +if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi +if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi +if [ "$TRAVIS_PYTHON_VERSION" == "pypy3.6-7.3.1" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then # arm64, ppc64le, s390x CPUs: # "ERROR: Could not find a version that satisfies the requirement pyqt5" if [[ $TRAVIS_CPU_ARCH == "amd64" ]]; then sudo apt-get -qq install libxcb-xinerama0 pyqt5-dev-tools - pip install pyqt5 + python3 -m pip install pyqt5 fi fi # docs only on Python 3.8 -if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then pip install -r requirements.txt ; fi +if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -r requirements.txt ; fi # webp pushd depends && ./install_webp.sh && popd diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 16f532edf..473412d3b 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -4,20 +4,20 @@ set -e brew install libtiff libjpeg openjpeg libimagequant webp little-cms2 freetype openblas -PYTHONOPTIMIZE=0 pip install cffi -pip install coverage -pip install olefile -pip install -U pytest -pip install -U pytest-cov -pip install pyroma -pip install test-image-results +PYTHONOPTIMIZE=0 python3 -m pip install cffi +python3 -m pip install coverage +python3 -m pip install olefile +python3 -m pip install -U pytest +python3 -m pip install -U pytest-cov +python3 -m pip install pyroma +python3 -m pip install test-image-results echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg -pip install numpy +python3 -m pip install numpy # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: -if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then pip install -U "setuptools>=49.3.2" ; fi -if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then pip install -U "setuptools>=49.3.2" ; fi +if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi +if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi # extra test images pushd depends && ./install_extra_test_images.sh && popd diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index a52f092c6..a7fb2bdbc 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -55,7 +55,7 @@ jobs: - name: Print build system information run: python .github/workflows/system-info.py - - name: pip install wheel pytest pytest-cov + - name: python -m pip install wheel pytest pytest-cov run: python -m pip install wheel pytest pytest-cov # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6cb099640..df5f6f07c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,7 +44,7 @@ jobs: - name: Get pip cache dir id: pip-cache run: | - echo "::set-output name=dir::$(pip cache dir)" + echo "::set-output name=dir::$(python3 -m pip cache dir)" - name: pip cache uses: actions/cache@v2 @@ -96,7 +96,7 @@ jobs: - name: Docs if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.8 run: | - pip install sphinx-removed-in sphinx-rtd-theme + python3 -m pip install sphinx-removed-in sphinx-rtd-theme make doccheck - name: After success diff --git a/.travis.yml b/.travis.yml index da8aedf8c..2966cdf19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,7 +46,7 @@ matrix: install: - | if [ "$LINT" == "true" ]; then - pip install tox + python3 -m pip install tox else .ci/install.sh; fi diff --git a/depends/diffcover-install.sh b/depends/diffcover-install.sh index a0b462b56..18be4f9f9 100755 --- a/depends/diffcover-install.sh +++ b/depends/diffcover-install.sh @@ -5,4 +5,4 @@ git fetch origin master:refs/remotes/origin/master # CFLAGS=-O0 means build with no optimisation. # Makes build much quicker for lxml and other dependencies. -time CFLAGS=-O0 pip install diff_cover +time CFLAGS=-O0 python3 -m pip install diff_cover diff --git a/docs/releasenotes/6.0.0.rst b/docs/releasenotes/6.0.0.rst index 0145347f2..3e3b945a0 100644 --- a/docs/releasenotes/6.0.0.rst +++ b/docs/releasenotes/6.0.0.rst @@ -17,7 +17,7 @@ Removed deprecated PIL.OleFileIO PIL.OleFileIO was removed as a vendored file and in Pillow 4.0.0 (2017-01) in favour of the upstream olefile Python package, and replaced with an ``ImportError``. The deprecated file has now been removed from Pillow. If needed, install from PyPI (eg. -``pip install olefile``). +``python3 -m pip install olefile``). Removed deprecated ImageOps functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tox.ini b/tox.ini index 81c6e19cf..2557d5067 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ # Tox (https://tox.readthedocs.io/en/latest/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the -# test suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. +# test suite on all supported python versions. To use it, +# "python3 -m pip install tox" and then run "tox" from this directory. [tox] envlist = diff --git a/winbuild/build.rst b/winbuild/build.rst index ba568a030..cd4a45e87 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -82,7 +82,7 @@ Pillow for the selected version of Python. instead of installing Pillow. You can also use ``winbuild\build\build_pillow.cmd --inplace develop`` to build -and install Pillow in develop mode (instead of ``pip install --editable``). +and install Pillow in develop mode (instead of ``python3 -m pip install --editable``). Testing Pillow -------------- From 0823b37d41f0d36d38187e74d868015d6eb2c80e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Oct 2020 19:25:50 +1100 Subject: [PATCH 033/750] Removed PIP_DIR variable --- .appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 45b748140..a77033ec1 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,7 +7,6 @@ init: environment: EXECUTABLE: python.exe - PIP_DIR: Scripts TEST_OPTIONS: DEPLOY: YES matrix: From 57ac10a3faf930c11078b7105a9f06d0ae151cf6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Oct 2020 21:26:44 +1100 Subject: [PATCH 034/750] Updated Python for diffcover to 3.9 --- .ci/after_success.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/after_success.sh b/.ci/after_success.sh index dcf276daa..762670f10 100755 --- a/.ci/after_success.sh +++ b/.ci/after_success.sh @@ -12,7 +12,7 @@ if [[ $TRAVIS ]]; then codecov --flags TravisCI fi -if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then +if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ]; then # Coverage and quality reports on just the latest diff. depends/diffcover-install.sh depends/diffcover-run.sh From c309c64d0ab9603442c2a5564a4babb5d91b9e46 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Oct 2020 23:51:41 +1100 Subject: [PATCH 035/750] Updated Python for doccheck to 3.9 --- .ci/install.sh | 4 ++-- .ci/test.sh | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 6b9ade699..a8e82fa49 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -47,8 +47,8 @@ if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then fi fi -# docs only on Python 3.8 -if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -r requirements.txt ; fi +# docs only on Python 3.9 +if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -r requirements.txt ; fi # webp pushd depends && ./install_webp.sh && popd diff --git a/.ci/test.sh b/.ci/test.sh index 579372a62..1396445e0 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -5,6 +5,6 @@ set -e python -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests # Docs -if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ] && [ "$TRAVIS_CPU_ARCH" == "amd64" ]; then +if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ] && [ "$TRAVIS_CPU_ARCH" == "amd64" ]; then make doccheck fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index df5f6f07c..1fc8a09cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -94,7 +94,7 @@ jobs: path: Tests/errors - name: Docs - if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.8 + if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.9 run: | python3 -m pip install sphinx-removed-in sphinx-rtd-theme make doccheck From c34cf8ccb9e694583cbcf87875b6fd624c71645d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 30 Oct 2020 21:11:31 +0200 Subject: [PATCH 036/750] Update Travis CI links for .com --- .github/CONTRIBUTING.md | 4 ++-- README.md | 8 ++++---- RELEASING.md | 4 ++-- docs/about.rst | 2 +- docs/index.rst | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3d27b5d88..a65487d5e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Fork the Pillow repository. - Create a branch from master. - Develop bug fixes, features, tests, etc. -- Run the test suite. You can enable [Travis CI](https://travis-ci.org/profile/) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. +- Run the test suite. You can enable [Travis CI](https://travis-ci.com/account/repositories) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. - Create a pull request to pull the changes from your branch to the Pillow master. ### Guidelines @@ -17,7 +17,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Separate code commits from reformatting commits. - Provide tests for any newly added code. - Follow PEP 8. -- When committing only documentation changes please include [ci skip] in the commit message to avoid running tests on Travis-CI and AppVeyor. +- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on Travis CI and AppVeyor. ## Reporting Issues diff --git a/README.md b/README.md index 0e6fa1157..9ead486a0 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,12 @@ As of 2019, Pillow development is tests - Travis CI build status (Linux) - + Travis CI build status (macOS) + src="https://img.shields.io/travis/com/python-pillow/pillow-wheels/master.svg?label=macOS%20build"> AppVeyor CI build status (Windows) diff --git a/RELEASING.md b/RELEASING.md index ad166527c..dac0ba731 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -6,7 +6,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in `master` branch. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.com/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. * [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Update `CHANGES.rst`. @@ -41,7 +41,7 @@ Released as needed for security, installation or critical bug fixes. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.org/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.com/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Run pre-release check via `make release-test`. * [ ] Create tag for release e.g.: diff --git a/docs/about.rst b/docs/about.rst index 283135aca..e2bd75561 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -10,7 +10,7 @@ The fork author's goal is to foster and support active development of PIL throug - Publicized development activity on `GitHub`_ - Regular releases to the `Python Package Index`_ -.. _Travis CI: https://travis-ci.org/python-pillow/Pillow +.. _Travis CI: https://travis-ci.com/github/python-pillow/Pillow .. _AppVeyor: https://ci.appveyor.com/project/Python-pillow/pillow .. _GitHub Actions: https://github.com/python-pillow/Pillow/actions .. _GitHub: https://github.com/python-pillow/Pillow diff --git a/docs/index.rst b/docs/index.rst index fb59a6c00..eafcb1fec 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,12 +9,12 @@ Pillow for enterprise is available via the Tidelift Subscription. `Learn more Date: Fri, 30 Oct 2020 21:28:35 +0200 Subject: [PATCH 037/750] Update Travis CI status check for .com --- .github/mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/mergify.yml b/.github/mergify.yml index 3683bc483..fd4b5271f 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -7,8 +7,8 @@ pull_request_rules: - status-success=Test Successful - status-success=Docker Test Successful - status-success=Windows Test Successful + - status-success=Travis CI - Pull Request - status-success=continuous-integration/appveyor/pr - - status-success=continuous-integration/travis-ci/pr actions: merge: method: merge From 84052eb8c528df381642167b0cf51570295e98a6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 31 Oct 2020 14:20:14 +1100 Subject: [PATCH 038/750] Added Fedora 33 to CI targets [ci skip] --- docs/installation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 0a8c41ba6..bb8c06580 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -436,6 +436,8 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | Fedora 32 | 3.8 |x86-64 | +----------------------------------+--------------------------+-----------------------+ +| Fedora 33 | 3.9 |x86-64 | ++----------------------------------+--------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | +----------------------------------+--------------------------+-----------------------+ | Ubuntu Linux 16.04 LTS (Xenial) | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | From 81078e8a0d26c9094446a64aadfa8047b8af3484 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 31 Oct 2020 14:51:41 +1100 Subject: [PATCH 039/750] Refer to "HPND License" instead of "PIL Software License" --- LICENSE | 2 +- docs/about.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 4aac532f4..eb9c41f56 100644 --- a/LICENSE +++ b/LICENSE @@ -7,7 +7,7 @@ Pillow is the friendly PIL fork. It is Copyright © 2010-2020 by Alex Clark and contributors -Like PIL, Pillow is licensed under the open source PIL Software License: +Like PIL, Pillow is licensed under the open source HPND License: By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply diff --git a/docs/about.rst b/docs/about.rst index e2bd75561..acd361fa8 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -19,7 +19,7 @@ The fork author's goal is to foster and support active development of PIL throug License ------- -Like PIL, Pillow is `licensed under the open source PIL Software License `_ +Like PIL, Pillow is `licensed under the open source HPND License `_ Why a fork? ----------- From 8593e17b0500b847070014e219b5e2cbebd9f9c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Nov 2020 20:58:51 +1100 Subject: [PATCH 040/750] Removed unused methods --- src/display.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/display.c b/src/display.c index 2eb4a5855..9960d829f 100644 --- a/src/display.c +++ b/src/display.c @@ -234,8 +234,6 @@ static struct PyMethodDef methods[] = { {"releasedc", (PyCFunction)_releasedc, 1}, {"frombytes", (PyCFunction)_frombytes, 1}, {"tobytes", (PyCFunction)_tobytes, 1}, - {"fromstring", (PyCFunction)_frombytes, 1}, - {"tostring", (PyCFunction)_tobytes, 1}, {NULL, NULL} /* sentinel */ }; From 1ff21dd5b0e0d4c898709e79c0d172fd2f2b743d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Nov 2020 21:47:57 +1100 Subject: [PATCH 041/750] Updated extra test images list --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index ef7520c0d..15add232b 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,10 @@ docs/_build/ # Extra test images installed from pillow-depends/test_images Tests/images/README.md +Tests/images/crash_1.tif +Tests/images/crash_2.tif +Tests/images/string_dimension.tiff +Tests/images/jpeg2000 Tests/images/msp Tests/images/picins Tests/images/sunraster From ddd363f7df8374a06c00ebb44bcda746d2121264 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 2 Nov 2020 23:02:24 +0200 Subject: [PATCH 042/750] Remove excess Travis CI jobs --- .travis.yml | 46 ++++------------------------------------------ 1 file changed, 4 insertions(+), 42 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2966cdf19..e239ed496 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,24 +1,13 @@ dist: xenial language: python -cache: - pip: true - directories: - - $HOME/.cache/pre-commit +cache: pip notifications: irc: "chat.freenode.net#pil" -# Run fast lint first to get fast feedback. -# Run slower CPUs next, to give them a headstart and reduce waiting time. -# Then run the remainder. - matrix: fast_finish: true include: - - python: "3.6" - name: "Lint" - env: LINT="true" - - python: "3.6" arch: arm64 - python: "3.7" @@ -26,42 +15,15 @@ matrix: - python: "3.8" arch: s390x - - python: "pypy3.6-7.3.1" - name: "PyPy3 Xenial" - - python: "3.9" - name: "3.9 Xenial" - services: xvfb - - python: "3.8" - name: "3.8 Xenial" - services: xvfb - - python: '3.7' - name: "3.7 Xenial PYTHONOPTIMIZE=2" - env: PYTHONOPTIMIZE=2 - services: xvfb - - python: '3.6' - name: "3.6 Xenial PYTHONOPTIMIZE=1" - env: PYTHONOPTIMIZE=1 - services: xvfb - install: - | - if [ "$LINT" == "true" ]; then - python3 -m pip install tox - else - .ci/install.sh; - fi + .ci/install.sh; script: -- | - if [ "$LINT" == "true" ]; then - tox -e lint - else + - | .ci/build.sh .ci/test.sh - fi after_success: -- | - if [ "$LINT" == "" ]; then + - | .ci/after_success.sh - fi From b01567fb0b7ce9c5ffa6e2a50bbe993bac11109b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 3 Nov 2020 17:31:59 +0200 Subject: [PATCH 043/750] Fix setting PYTHONOPTIMIZE env var --- .github/workflows/test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3da945f39..8403e2ee5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,9 +22,9 @@ jobs: ] include: - python-version: "3.6" - env: PYTHONOPTIMIZE=1 + PYTHONOPTIMIZE: 1 - python-version: "3.7" - env: PYTHONOPTIMIZE=2 + PYTHONOPTIMIZE: 2 # Include new variables for Codecov - os: ubuntu-latest codecov-flag: GHA_Ubuntu @@ -80,6 +80,8 @@ jobs: - name: Test run: | .ci/test.sh + env: + PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }} - name: Prepare to upload errors if: failure() From 8ec8d23af47e4f718d1b3a0c1f3cbf645c1be649 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 3 Nov 2020 18:49:16 +0200 Subject: [PATCH 044/750] Install Qt on GHA --- .ci/install.sh | 6 +++--- .github/workflows/test.yml | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 77dccaa4a..db259bdca 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -39,13 +39,13 @@ if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptool if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi if [ "$TRAVIS_PYTHON_VERSION" == "pypy3.6-7.3.1" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi -if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then +# PyQt5 doesn't support PyPy3 +# Wheel doesn't yet support 3.10 +if [[ $GHA_PYTHON_VERSION == 3.* && $GHA_PYTHON_VERSION != "3.10-dev" ]]; then # arm64, ppc64le, s390x CPUs: # "ERROR: Could not find a version that satisfies the requirement pyqt5" - if [[ $TRAVIS_CPU_ARCH == "amd64" ]]; then sudo apt-get -qq install libxcb-xinerama0 pyqt5-dev-tools python3 -m pip install pyqt5 - fi fi # docs only on Python 3.9 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8403e2ee5..b33b2195a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -78,8 +78,9 @@ jobs: .ci/build.sh - name: Test - run: | - .ci/test.sh + uses: GabrielBB/xvfb-action@v1 + with: + run: .ci/test.sh env: PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }} From 5b2da5f7b0c0186a43c810a3b44d3463487b7df1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Nov 2020 21:52:00 +1100 Subject: [PATCH 045/750] Link directly to pilfont script [ci skip] --- docs/reference/ImageFont.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index ff79bdcd8..dbab0f395 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -8,10 +8,10 @@ The :py:mod:`~PIL.ImageFont` module defines a class with the same name. Instance this class store bitmap fonts, and are used with the :py:meth:`PIL.ImageDraw.ImageDraw.text` method. -PIL uses its own font file format to store bitmap fonts. You can use the -:command:`pilfont` utility from -`pillow-scripts `_ -to convert BDF and PCF font descriptors (X window font formats) to this format. +PIL uses its own font file format to store bitmap fonts. You can use +`pilfont.py `_ +from `pillow-scripts `_ to convert BDF and +PCF font descriptors (X window font formats) to this format. Starting with version 1.1.4, PIL can be configured to support TrueType and OpenType fonts (as well as other font formats supported by the FreeType From a357ff12ad38f23190dfcf632fcbd6abd3065bc3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Nov 2020 22:39:25 +1100 Subject: [PATCH 046/750] Simplified test --- Tests/test_file_ico.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index ba9f84f5e..a5f728c42 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -87,19 +87,15 @@ def test_only_save_relevant_sizes(tmp_path): def test_only_save_append_images(tmp_path): """append_images should work to provide alternative sizes""" - im = hopper() - provided_im = Image.new("RGBA", (32, 32), (255, 0, 0, 255)) + im = hopper("RGBA") + provided_im = Image.new("RGBA", (32, 32), (255, 0, 0)) outfile = str(tmp_path / "temp_saved_multi_icon.ico") - im.save(outfile, sizes=[(32, 32), (64, 64)], append_images=[provided_im]) + im.save(outfile, sizes=[(32, 32), (128, 128)], append_images=[provided_im]) with Image.open(outfile) as reread: - reread.size = (64, 64) - reread.load() - assert_image_equal(reread, hopper().resize((64, 64), Image.LANCZOS)) + assert_image_equal(reread, hopper("RGBA")) - with Image.open(outfile) as reread: reread.size = (32, 32) - reread.load() assert_image_equal(reread, provided_im) From 2ae597c357134a25a6c8ec3da669fedee11bd8f9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Nov 2020 22:42:53 +1100 Subject: [PATCH 047/750] Renamed variable to match IcnsImagePlugin --- src/PIL/IcoImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index dc2d6606a..152d2a275 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -52,7 +52,7 @@ def _save(im, fp, filename): sizes = list(sizes) fp.write(struct.pack(" Date: Wed, 4 Nov 2020 22:52:45 +1100 Subject: [PATCH 048/750] Document ICO append_images [ci skip] --- docs/handbook/image-file-formats.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 40db9fe2b..691892536 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -127,8 +127,8 @@ following options are available:: images in the list can be single or multiframe images. This is currently supported for GIF, PDF, TIFF, and WebP. - It is also supported for ICNS. If images are passed in of relevant sizes, - they will be used instead of scaling down the main image. + It is also supported for ICO and ICNS. If images are passed in of relevant + sizes, they will be used instead of scaling down the main image. **include_color_table** Whether or not to include local color table. @@ -238,6 +238,15 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: (64, 64), (128, 128), (256, 256)]``. Any sizes bigger than the original size or 256 will be ignored. +The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments: + +**append_images** + A list of images to replace the scaled down versions of the image. + The order of the images does not matter, as their use is determined by + the size of each image. + + .. versionadded:: 8.1.0 + IM ^^ From 6806fa1a20e56ef8a7b2102b3f43cbc6cdf73985 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Nov 2020 22:56:14 +1100 Subject: [PATCH 049/750] PNG supports append_images [ci skip] --- docs/handbook/image-file-formats.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 2b6f9483b..e15a02aed 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -125,7 +125,7 @@ following options are available:: **append_images** A list of images to append as additional frames. Each of the images in the list can be single or multiframe images. - This is currently supported for GIF, PDF, TIFF, and WebP. + This is currently supported for GIF, PDF, PNG, TIFF, and WebP. It is also supported for ICNS. If images are passed in of relevant sizes, they will be used instead of scaling down the main image. From 85e991e5b6f99b97df612a1914ec5c42f6d16f5b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 4 Nov 2020 15:36:02 +0200 Subject: [PATCH 050/750] Don't include test-skipping 'except' in coverage --- Tests/test_image_quantize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 192617a52..921c39e3f 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -21,7 +21,7 @@ def test_libimagequant_quantize(): image = hopper() try: converted = image.quantize(100, Image.LIBIMAGEQUANT) - except ValueError as ex: + except ValueError as ex: # pragma: no cover if "dependency" in str(ex).lower(): pytest.skip("libimagequant support not available") else: From d8d8a2c74d6f9611d2b92313db01e711e51b8319 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 4 Nov 2020 13:58:33 +0000 Subject: [PATCH 051/750] set xvfb bit depth --- .github/workflows/test.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b33b2195a..51ce9d085 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -78,9 +78,12 @@ jobs: .ci/build.sh - name: Test - uses: GabrielBB/xvfb-action@v1 - with: - run: .ci/test.sh + run: | + if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then + xvfb-run -s '-screen 0 1024x768x24' .ci/test.sh + else + .ci/test.sh + fi env: PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }} From 7e2015c75f35b07e8a050d9fbb4d8db0a472fedb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 11 Nov 2020 21:05:57 +1100 Subject: [PATCH 052/750] init() if one of the formats is unrecognised --- src/PIL/Image.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index f9a5d82fd..8d3f6b0aa 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2905,6 +2905,8 @@ def open(fp, mode="r", formats=None): def _open_core(fp, filename, prefix, formats): for i in formats: + if i not in OPEN: + init() try: factory, accept = OPEN[i] result = not accept or accept(prefix) From 4f0b9185a3b497a92ca9f251e8e7307bd6a37946 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Nov 2020 08:41:44 +1100 Subject: [PATCH 053/750] Fixed link formatting --- src/PIL/ImageFont.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 89d180ce8..3a8a309c6 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -285,7 +285,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. :return: Width for horizontal, height for vertical text. @@ -338,7 +338,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. :param stroke_width: The width of the text stroke. @@ -398,7 +398,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. .. versionadded:: 6.0.0 @@ -455,7 +455,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. .. versionadded:: 6.0.0 @@ -539,7 +539,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. .. versionadded:: 6.0.0 @@ -625,7 +625,7 @@ class FreeTypeFont: the font which language the text is in, and to apply the correct substitutions as appropriate, if available. It should be a `BCP 47 language code - ` + `_ Requires libraqm. .. versionadded:: 6.0.0 From a8b6fc84a3b2155279af4da0da12625d9ebe0e4c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 17 Nov 2020 23:34:55 +1100 Subject: [PATCH 054/750] Updated libjpeg-turbo to 2.0.6 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 6c431f4d6..e6060b9cc 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -105,9 +105,9 @@ header = [ # dependencies, listed in order of compilation deps = { "libjpeg": { - "url": SF_MIRROR + "/project/libjpeg-turbo/2.0.5/libjpeg-turbo-2.0.5.tar.gz", - "filename": "libjpeg-turbo-2.0.5.tar.gz", - "dir": "libjpeg-turbo-2.0.5", + "url": SF_MIRROR + "/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6.tar.gz", + "filename": "libjpeg-turbo-2.0.6.tar.gz", + "dir": "libjpeg-turbo-2.0.6", "build": [ cmd_cmake( [ From 7383e77bf6db75e1bbe46f2ca305837cf4b15dc9 Mon Sep 17 00:00:00 2001 From: Nulano Date: Sat, 21 Nov 2020 15:07:31 +0100 Subject: [PATCH 055/750] add line breaks in test-windows --- .github/workflows/test-windows.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 4d3619edb..9797b4895 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -91,25 +91,32 @@ jobs: - name: Build dependencies / libjpeg-turbo if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libjpeg.cmd" + - name: Build dependencies / zlib if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_zlib.cmd" + - name: Build dependencies / LibTiff if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libtiff.cmd" + - name: Build dependencies / WebP if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libwebp.cmd" + # for FreeType CBDT font support - name: Build dependencies / libpng if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libpng.cmd" + - name: Build dependencies / FreeType if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_freetype.cmd" + - name: Build dependencies / LCMS2 if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_lcms2.cmd" + - name: Build dependencies / OpenJPEG if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_openjpeg.cmd" @@ -123,9 +130,11 @@ jobs: - name: Build dependencies / HarfBuzz if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_harfbuzz.cmd" + - name: Build dependencies / FriBidi if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_fribidi.cmd" + - name: Build dependencies / Raqm if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libraqm.cmd" From 12918605c122281e8e14fd02b54f91ef2033155a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 22 Nov 2020 12:41:17 +0200 Subject: [PATCH 056/750] Add logo to docs [CI skip] --- docs/conf.py | 2 +- docs/resources/pillow-logo.png | Bin 0 -> 15681 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/resources/pillow-logo.png diff --git a/docs/conf.py b/docs/conf.py index b5f8ad59d..a8f101141 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -143,7 +143,7 @@ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # The name of an image file (relative to this directory) to place at the top # of the sidebar. -# html_logo = None +html_logo = "resources/pillow-logo.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 diff --git a/docs/resources/pillow-logo.png b/docs/resources/pillow-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc2006a6f78e04c9129bbc911ccbaabd5c1989b GIT binary patch literal 15681 zcmY+r19&D)@Gttt_8aSstxd8U+qSdO#8Yu% z>YAzUuKD$JxPqKG5uO_L2j)=+n9b`=Sz>(4K9w;O%^BT)d%EB}+;|0BOUWw_{?4zUg2;dd zcYRw1wQ(QCcsGmJUkf_1U?z(7-{Jm@isk0e=)A7e^qtfea}}Er?e4*l4=*=CWx|N9 z#G&0q+Tn{P5^W#lFulgzZ5){Qko|^6*-3FAs`(GK3(ZqhlMb99^Kux-TIe{7MHgi} zcwD@pgMp1;JncjEny;;NV4}%;P9lOjfVi_2FNW(5)bAG8BoP%4m=F$Ww5UC>lhmEP z;auJd+>7fM$FyG?g?R(J$$oxc9STw7f~4F8GcC$5a`lUp)!)j`cSrUkx;c4M!eq;5 z^_Dh{ z{73RT0sx$u0e};I0DvnE0Km4(`m4zEbpy^$LemidU?lr5gSi#)yL`Q0O>-3uCkx!4u%*n})i;2nA)s@kemC@G0 zl!=9tlaq=08`HOM3||}!j_x*225t;Cj%5E^$p0fp#Msfu!Q9Tt+|~y4pIie&TW2R; zQqunv{onMz+v#L(^8aeGar{4KeHqB~-yJ3vMrNk}EBmV|&wo@dc?WajFU|kS=VRgd zAI|?D?f>ZEVfs(`|EDqk+tUA`ewoS#&%^Y89~&RMOfQut0KnNNDI%!iwsP(brGc&a z_?dRvcDhnsO)3RTON(V_P`OTM3G*Eb7RxXX2NXdHPg+y}-b@;?wEmUAHecQ*aW9|n zHI){UT!46KV9!;Jv}`M?zpEk?s>jGRPBeN z5Epm(er`|{dEqX)`WY=&>vB@_MI5E2RLke`ZTIxSaM<7AG+VC+%+saz_{O8CwT$&g zpefht-?oN`NX+R5O>z1oYunT5kVY~^{8zaLsoN_4 z?8Q;_v*yr?3oNck(j5|a@rMOxj|{%aMUHn{d`US_Z%Jo{{i#nxZ+HScI%82JJ0y9! zQPJ6{MnAOE*dotbSUajz7j1S_rQ6GquF_fwA)D@dk3vNTj@EDFmxT(H8m@VyAv&oS zLc)5=vvAEKzy9-0tB?7V0LXS)xKn^b`qKPZyh@iU01m77J)GKq*J+Xt3L!ytj)mKv z4_^2i;N}Mk<$yd9zkL*gm{%m@{ZwltA^nX{9T8WB)U!ghhka6oE@9E>a_`>)%;IIW z{^1a$x<4kEPwdsusbWoNGiRj$BiO*Xpb^TpuG(DVV|=$*Ap*Xz;h-vTO_RIl~ zFTQS7adGMV8e$dKM?Syn1)D4(pTXt_FLN2_m|=8ZpbU>Y@InltMi zuBq-Fv8C8GI@vtVLOHQ)rHV)$(Wl+hrO1D^w0`qVL(gufF)jB9mq*QGEwpeP{Wv>S zMl-eCAIgqlM`i8CefMk(m~F}6Xf#b$qn;Q0Y!*~GP$SQSag!6s4+#^7h>uw#Y4^A< zHzeJ^!xW%?14oT0!3AZ-(m;Utp+Px6Y&PP+5*kW>;qX-Q%fB@4jbfoqR@4X6*s6;W z&sqL8Pzvrm(rm$d0ais#K#kW{FX$66o(AQ~ShEOx8)~fo4m9a4n0QB3--Jum4%V+8 zHA}iA&DVmEyge9aB^nz3Tqx2*pNhnb4uMiF0T1&ByEz!g&qVZl`-F*uN@dbZ0aN;2 zM!|J&W3G=Rq3(F?r642}U?sS+SPAnAFFQ3phO8??SJ0#aX<2M1YOjg&l zh6;8d{vW`m?*YHa^IasRo&Kp}RUf$ESXn?J(7{!!T9TGuqmETBfn!Ls_d*UspK49^ zXK;R)@%MtCdo0AAwm97HbfJSHR6){;Q9<{0^;Q)@{kVKa$5Eb*CQfFIrbe>>p9^oRa7vDI{?rEs?n}hz=Vu_!C(iB{S?x`;<_B? zgTWj=ZZL5{&KByT%kV`C>k}!yr{RrCXu}F6oeUNWbdeTKl?n}NG{6catiVjQzM~8Z zmbz%Tm!&o+JKbo=*)k7`Q+Y-Sc*W|M9Qxckx+35ZRx_GCGU4E;$GCVk>FL4!p7yPd6aG&k z+mB0~ZTma9*yLBV1y%-QI-#3rh?i6@O8J~DP71$vujd3PU9uf>XxKxe7a~8qRVA(; z#V6{`jqtQ3yAMTFkG@)8lnU1SoF;;M3@x$4mBZt%6y^?kQp{cX`Mlod z+EtW9#m=XIE1EWG4koEIS;m`uvEKHW+o*-I;rQ2XTj+sYHl21OCe7ORV|fl1t=?nBLAP@q%tsnLP9|F?tAM9Mrp^hcU_ zEHQs|3Xmh^rkiK=55{z02wuuG0a?tEgQuiperaLrtmX`lQyg3DtMp6B1^UDr`L-Jx zTxQWsSb|KQ*hzqJ0!FjM`*di8W0He@!7s*1L0UA?hh*l~dPu57f;1C`o-T8&DB1)l zBEp;9rT#3tx_81(_Q-7q6_R$1L@3X!Dw6$FyR9j{Wi2EJ{?d570W$~J=y?gkKjwuG zEO=$QY||-0l*n}}5JSXt0_M4EJ^~)yJtiq>-=mIpzGA{Xj9Pe{qa1%21=x(3bZIO| zttvGvRKt2x3y|W)tXCkz3=)>kgnSC19YttARstDBKi3W%yJr=E)R=)p1%q!rFNk6T z6IqWfkIhKiB1x#L9@a+%6RWSA=NGz>V4Fd8iW`DKI0P|1UU_cq4n$&pR zVOdNmA&vySJZj9m=-9Uw=yT0;;DFIOm1WA)mi1hQ> z(s3e+yrFOJl$PkW#vG(k1%6+X3(MF^BEsYMl)n8VCM?KV@QL5cX}d?^ejV1eni5JoH2j}|HKSR!6piQ}IMD3xXg(WO+Peph}Dt4Vj}P+`=W zuZ5UG@w5WK?E;=rsHb!$L~ud~Z9w!TKel8|8~UuBS3nJT>(#m068&XPLEKha-TRt-YuaH)oqBj|WhVWdz63I}0n z=J0#wLweg}yw5(W_+65n2bX)5(G<$~SJW$@X1}3V(%_0s1l!&_z|tr~1X|M>N_@;L3EalvM^f;#Imtl(3z+{i?K`2$!SpxAfG?Hh*M%tJ zb*Ep?#v#kpEj_enwqOlz2@=LT6Llnv>a2w*@Bpnr3ju7$e?Bg+fo`BgPw=|K$ri*? z*Emu#(ZdMfMKHOQ%g+fDh7SM9+@`ccc-;@kXRBFiQaZux&7~J8Jwt`22-Z@4`HFoO zMj~e&_$U>{A^?i5Bt~gvh(6Qe&u3|XNc{WXi0h-njAWKh5lqINa9jTb6oD|o$S3ux z&N8TPi(y>9e$LoN77i*Id+*@L6zECuY1%8afXY6~lEidbI`PnczJ60XYi;+vCa9vI zF%Zz?t_RN7P8H%oAF>F?i8AyjS%oYs;ety^a=h6<9#)E7#aY#{=)qXgY(gl*Ck^cM zR@I3+bf;*=XsC7Z7w=WX(Cp(GN!DS7vEW55-R#!3PLKns>GJ)|iJZ*RP)66N3ps~O z9($MeX}5!H;dnN!V|Z<_!tj5>fsJS8>1LNNvCH(nBiztp1vK*v9{IJU;do*1g4-Ic zC1m34`a&3C=?%5`o#IHdv0UMC$?@l2-9={&P*pjiQ6Ry^As`?HUmNOke1!WaYT+hL zWL6;tYmp+ezh#arXSuOUy}xevg+fuE(?J&i(!?6KnE;B=F~J$S@YT|ixoUo4^{vrb ziemL&Pno$0*z^02{;0mV=m`T_%z-E0G#dwW;x(ph!>T#915d1SVd8$RBUy80=!8BZ zR0rr%{QE}-RK+Xu!7oC4~mgc$Xw;5GJ2Fr4-lBK--POLMoxU&0Q67+&bKc zQz|c51y(sCZr)5ZWha)=jw*6Sk~U_5(*pFcIFUv(KR}(Rg_B!D8G_X)s6RoZVX}ao z$t5Q)A?zu`UKN^-g~Z&YM1@$s3|OaK5CChiV*W82y(zUv>3V8fpl9z<1$8k56uPp* zAo!^SZ+e)%os^4Y=p9u@^$+g{83j+*?eYNp<~0GU8h>AV)8rQ6J@99|JhSIL*_hTn z>a6-&sP;c=8Ti&4uJD|Ys{xlDc1v10IHsD<(@ zb;K0JZ}rH=7=a>4sO6Uw5J58~a9^`qIGE5iF*ItqQISMuw>K#tjblyu$Vp-ZlZ!5oz;4F5W9d7T) zyyC6AE^*T?b(7P9#J3p zq~*?dgTWrYD+2Oe3UNUZA;mltD(?o{v#=DTU8B_il2$^O>5W98qo#Zq__=M7tDhI-g^nPu=I0d~eT@SnTcPj!~gU^1MrSmknicHC{Q*x621-#Ig5F^DR z0~``f{hz@TEh?^Xq*76X^s5&d4?_|n>h?Y9-w^DYpM_dhodc8916rqTOAVC~@v~Np zOzzQfROyLH#rFqXsNf7;; zIRpa097JWe-ju-Ae<{f?W~muBig51&MIAcOf6@;TftMAHn#NVMus?A`yrn+HDrU+V zy4`J1ZZlQ~v847A8DN=w6yE-x&>K+ByFKo^py@pkddp!y8uJ`aR>HVm^lBuq5mwO} zcvR_at8>#WJSNn()&!|Ow4!QV@^kFGA`n@Pgft-3@2s@v+HF=a%gM%VsaLU+;>83D z*Kr;FY(ed{5+f-ck$6%i_LJna>}xeau(Hbvw05apn(_Ij#SWrN5DsuQCL25ZgdsRh z`yH>zCv#yNmFUm*=h!?#;?^HX#0Jt_!-JEdE0C+@!AU3%nw|LVU3QkUjR!zT%c2lR0t-65wZA=+ zc0BRK1hc3M1T7C7dA?+Bao4@yQWd;|P~^ij47y=vCU2nMnJ$FE4mPBXPU(7nH~!#mt_zbEF{DcsXWWn>DDCG zJB~ZBrOSq`bAu($Pi9$9>T<+@Yhbu<5>|^Fm_5jfx?;vgsbU=}3&F$Ep~nvdVV}B= zC|Aj$NfYAVe%>4K(vC>hdWrN;B4BW~JjFdFC7ir`V3wv=BO&So8OfroFN2n(sHhpUtW6Lj$#}_QjB9@euw~O|v+XlJIxAz*uoRhBTDrlYAVv_;Oa9W)2S2zp`QI?z+ zvUKCDE;U?m=r=_VV_#{P)1yCuN0Z{vEWz6Ds&PWNQDdHr!iDk4MGjd(sjf8V!ue@V zhG;vVKkbY8OBNUr#C0?BxYZhZ;?CSrr+A2MUQ7n7%9iWu92vpo!OpaN9EnN)$sDKQD3n;PRY(6h2E6o?ULm67pgh*)9LoSX#wo zIQ=1V@vW=(uNRFQIYqhZpCD%>$HppixKwB?GwuD`v?{*x>$Zxn;*5`!VULupf{c5v?Shg(#3$R3C#MJU_ACqRt!MW6dIuT!?C^q=D? zZWhJQt{yo$fwZz?s4&v@Bt8Y$9G(_>L_{3CF~*a>Ne@$Rl*GKAJrGH1ezgjp`hL{6 zu>m4A%i^X6yMJ4lfU$C?ig>}MR$!1VPBN8jM;m0|@{C3Fs-NYsK3)`iNo$&#Kvcjo zwcoXWZemde_08qsaO+VCPfXH7hQo;fpH!F-x=#Tf_kP9nuBuJ0NIwKz3;z8g3E&hHpvOum6- zinh$0JNKqq@9>Fg9RaH&sdl>01l4po25&bdIM@$3M#97fUQ5D=4_!3~(cTnHtr+|N zq0UCZgVGgHij8e0O3+B~K*3*ne4Ks?8Hex!9J#1#Krm9s-8KN}hy*++0yR00k6htN zR6#T+%;}7UCdHYqO{&1gy(?_Q+wpXvs#j9eUCL1owpOlAXD%gh#1Z{u?d~;wD^pJ9 zt%7d1R82`I7a+)>`b-pnO)Ro9pm*(0n#(gN?-x#v>vgIwB%n$rQi)F6h2ZDlIroq2p#n+r@eX)1Wc2xMQ~J(&ZZ7j11ur-bfImzN33|_;*3* zur>9l1VymLjcLGZwiq*r8~g?IUig%hkV0!Y&jwNw@d)Z4*gw<^+6F$<46uVaZ|>8$wY=iOsfy+z^7#&VEz zTK>*&!A3!O_@XQYdRZKSHNO0R)pQpaOeuDJ(9JV8iVHeLxS+I18Fk4yQ&Q0ZCT&m_BRvQ->to!TYzWf zbFX!u0^zYT$V!ep!6m+ecf6pBMWs?v>UR@(4B+3~zR5@7v{>I%|(}?%5;8lM8?Pip#^#>vZ!wrL;g+FOs`|JnSKEbW{dZ@gi z;&aO0OB3o-$4JCw?gKOMsCbp}V^-_})H#fPYaO18+BAV-!kVZwP7+|CNjIh8-tOl) zfFgpIp`YEdln1;r6l~MDbm2VhxfDD|ihp^L>Tii(>TT^pG4s69QTVgyb8JI#Njn!M zNv%41jeZ%^h-3IHoIwiJL(*Z~(I}ka&vt+i%>7$XFIs>&4>C0A@;Iqo(m~_d&*_d> z(#wagESD|ayQ`ueYLUdd??rS5zvdlaZKw>aCtcE3+nBz8XAIY9gXfqjrNvs(Fvx2{ zlWWo53QG*aUN!Y@Mum)9n$4|^3vwNER#=irs=PqQ$3(3f6OfY5hGVn}(s^=Z$N5gk8IiIbujrz(IXQ{#f1A zziw8)iZt+mo4lXAJ4Nx0+e9KA$z9-tg$PQQ8Z#{(p~DBtFOp}^z%-=ne+%Q7gUh$b z1qwVt(M#P%HL;i~5-Oskh>xDFY?z`W$D|jYfIfw<NQH! zj;zxrJ~nx7;DG@`>a?~j+QbpQsBd;Jqb`8=r8>IrDOCSfkdx1+#(Kfo`g$TZAka7s zfgvB129ka7X6k+Dyw+0sQL1QX*|gghc?{@$?Wwv2N55+%{P+#u;RqL42p0{`|N^--|2x&#rGga?nLg$6w6-2@7h#a9JT1e2y4kw6F0 zlH70e2uUD;-zl71naWuci@;Wh!L|s_4;@Q3X&zI}YbrpfMk9(e^tTdInme$!;0V&fOXOku8! zgM39#H_%fGs8dvHSzriqx29hr6kaQiuD|E#v}HPIl@t0kJ@FD|55rOZSVW+Nrzv2UEH72)*5=XZSpE zs3EzX;muTQ@ab5&`3lTL;S+9@k*EG3(0=3A@RsCX0WH{{)IBfYqc6{x-34#v{;=7uWg0r`h|fL>=` z1ObhwSpe!}Be=-3?78`{5ao@4IdL$A@@kOk{Hkb+xYh{OZOFR%%nJ>XsHwm44;c-I zY(R-1>|<)P0v@)rb^@+^X;ShUu?+-oTj9#%aG}kcpKDS&gT!-&$&tbY?7K8j2$TXyxsdlh3~V=D+ED^3Q6o}k3@sh8Gyy@JP-wT zzIBKZlQ&<23Uo)7R?8Jun1iC%^@h$zE2-l-0jh~)3+(;H(CB!eCS4>RdO;GewV1c5 zgkANYr*ko!uP4;NY|f^JrV}neYyL$h^tMPsu1`3yNHXIKwSzS-aF*4xw9k##<|Sru zn*^qDxq`yoE>3FG$-2T<_tnkGVNhFZ5Ur$c z6#!|$Nt=S(UY?0ugSk;Vnv-5z%?`xrHNXuS^N;)yZuLe@GPm-B8v3ib8mVxXJ>!jy z7W?1iMbmK1-os=P+uAdmI=}H%pFrxfYQ9?~=n461s;qN#1`$|l1I(obLBr8!TQikd z?OdvZr50Wp>b>>x=f^-uK<7 zf6%bj#Z*U>y(Oc*}_!x^84U)enzA9@+1fiiFo2mHPnZyBm1Ih!#W z>Qys)DBvoG4C|c?Mce`1CG#rAH}s<1*(-Nn z!sozLoIR^^IRI3qFB2=yzAAD+;`0!q@(zJzc7zxv9x7Pnup;7{q6~OUZfhK`2>M#I zy+L2|8pkPlRwy8$Vu9eDFsQf&S}gftacjKs=N9WVIUA<^&6<}yA(wjt zfqNQ!~t=*TCY&-h}nnY5gq=RqT#MQB@BPj{JukfYlzAMya?uh#x zBsatDm~Zp2MD%jz$OB#~Zbf^>qW#|aPjp4^;hT$!v?yJ6+gUs)W%uIlNo5K6##Xm^ z2Fc)NN}bFZz-Ez(@{}W$#jMXy03{d42!PZ64wh>LuVPRz*`CbZgmy24r6$!r7X zT#HRGaxi+TT~oQyYC)tp#yaD-^=R?Yd>JNzNAu8Dbyb*FU!A;o6yXvQ+3P#p(8qeM zTNH2e7+x^p?NB2Aehf#~a9ED?LXRn1^J}zVWiG;ZH%|TaN|Law4dRO7rqw-88EBcg zsC>w=ZCCm8Z`ZzfKPrZmOyNL z4PEO;b*$FBwL-HJluCV*zizh0(NY29i;G1Rm~KXIohw}nvQ;c@Ut9N3E7jZJqi9|x zubK?L3|koe6l!HUZ&oEV+;f0EN23+i4mhPzA5Vt38`6-+C7K9Xoxj=a8rl+%E#!B1 z6ycyDK#=T3wEiLyY~~#PD0Qcog)cqf;&QD|4~MXaUaKmEh}ja;iWsal4?^IS$h8PI z%{W>!GSAVOShy2B$BuiKKg@SdeqHA{ChQ{LEG$22p;4@Wldd5x)kak;C*He7QgMg@r1-N>hJrsa*73-jaS9Wq}dN#T1n+tpO$Tjg@Z_U_n}MJ6=QE9~zWgKEG|GdNCGykH z&=2)Q9K@@K#6RRVcwdW$%*fXeS2Mt9RmA6oNgTk5nxBP1Wrik65NL|18fx?j1HtFc zz-&Xtg{2GExhZgt|IU1i<~);_6vtPo9+fa52*xv{46S#;3c!)Si@&(8X6QFp#1$d! zhzX9#y%ovbF`&tIQ-uh+S;OA9`-tV4K5Qo6|4kPlI++=%ibFyCM{pw_D^u@nOa+Z7 zxpp3v`^_OYso9b5g4@zfN}2N--%W~``W>;(o$4_&Y&6cFlrIf*8+xhOnww-QBrsI* zl5^5hDi5Lj^C$hb!@m92cLg5CB6~GA@poK?!TZEss_730npSnGL+gEPDzElE%&Lt0 zD*eSg9;;K$f;wx=#=7c=ji%GS1(|@|mPyCB#35uOh2I5fyGwxr)7jlqFw&A&!s{;> z@l*0gp_qx#`uj=#U$F+N5Y;^u62D)NCyv@AL5wOZL2Ux{Tz1YRPQbmRm?3*G-P&uS z_I?y$q)x4~KbfJIIk;Tc??djHU)~%A2T=n3X9keeQrzBgi1fwDds++xO2S>NUIsfT z-wTf+9KJ9-uxnGc|9~*#PM|h_ZLsj;0EOaeP}vna0&{X~4`|^H;yFB_?5E=0t#fBY^w7Md zOoy$NZs2RrBpvsG52j^WO&(Bz68q|5{>T9nYh>>j-P7$}ko2 z>7A^C0jbS)R?1+`zKL6$EodpN&iOpqWm$4z8Rqh8{Trw(9c_$bRgp0lr{F`bQ_oyY zbK}I*GCxe?vKM~0iT1we6Av`u)>m~|n|R{nyQBek((6t4<&GwG{BCL5ncRGb?(sJ;?wDrKtpjD9jJ{v=aX_TY1SWYA+%|Jd(+{DLh?eo?4? zE^K=yix&6a7l%%Urz|%3%yx}RMA@-O@LxlQFAhEb)+f#0?7&xNX)G^<%lwWrYJPJj z39vt($6gvQ(M zpj6z39kV^S+}GlK0UIoC_u6Z}*5#x^#z*?;UiEsttC#fM+h%c5Z}&rup$HnbO|~%j z3+8gwr}>yy#JFDeJ&;w~SAIUeukh_JvdFyol>YYl&&y(4^)oiEYu7ihaEsB~u{G;Q z6K^UTCTZt;5@)L2%7-|j9? z2Tt_VvH#>~^&w(RplGdiCJBzTvp*%xTH6YAoJO!WZ{ugQy`|V1o6}wWgLn9YX)0Ii z)SRPX8T*Gz=+4<+O}wxDFZ^%0ZYEzUU$ns-J|~c5o@S*m_*T*CdX(#Ilc{2=(?c7y zu@cy?2H?O4;w6|!<-vyuIDI%AzJr-U`x|^muE`1K9W61iO~aqCLV$L<`HY_us2SMz zwyd*#{?)g9G{DiYAZ+CJxJL{HYYR{+CDH$P=tG?Y78gaQ3%K5orGF!r#Cvt|)gQ@w zfVDf7o|E5rTHQO1!uhOQ5_ODksVxgbN)H&99yF?Z1ypJtMXBD3>1WqqXl84MArbtZ z^@{6aBfQ&LY0?489sF316&st&T@|WUPilj{>~yH}p%!5L+0K#h$j+$yw~$2t*MFu` z`i;50ToL)kvluYv{yAB|X%KfBEC_$!-e1D}sP?Y4deIkoZPj-@BDd0F3o)a232jZB zzY^HAy{^S7#6pJr9E}?H0@m; zEa(Re%^a$PTSH_|!haUa0u;Xkxdm#3y9W2!)-x9Ug-b%xE~em=L!JC$rBR+_j{-4S z3IBaT`>?Qr$}c2VF9KFNTVY6do|fGl8DniD827v+M$RiJHx+diS0COa(BOz#E?sx8 z<^^5czY4^xg5S!Zk7L3A1tVaG+|Dq9k>`ZPTH5hIfN<3_0Hk~Xm#j@P_ZG`j4@7g2 zdB@#V|H6#VrAIkkzwtIKLB@>=@x?;5fMG3 z^goY&p``0Qw5&Bt$uxP(#dL1Se(fDCV&VyL?Wv5{-P)f+`mlL`P5UKZjXf?~j6~{( z*i(;-tic+qQ|bP@&N-aUg)vhO%b30yCT5X%{cEAEC-L6$Fj{2pjPGTsHXY6o+xsfE zk;q~zo7c0M!2cJa{|=HidQPqKn;Nvhx9U6C#G8#vwv>%hV`-Kn6q=s(&iEd04fQdX zlVGUbm)^;FB0eJzrS`=`$v2T=z8m`_W)$$TC=v~JQ}TtE7~#8w;ibJptECqGAcMd^ z-o4@0bjiOd5qt{w74%MY)xaeU3iu8uvbmi;-kvR|r>FUi|Leqb0&|~)sq$b{?Y{2> z@&0^iD_vzKLaFd8?tR)vUPBLTV-9Cvo7WE--<+wzi;=~;_xx{oD7+37Dj)E`KCgKZ zr74}JpSiv-K+7MOEq73&uDCKKv1-VjaDCGJ_;ww`12*s^&Vc+&=hG&RIwj~6%?vQ@ z+3_7reKJ=}M}-=^BsxHQb8zK4d(`3pv9d_>Y)*o8GC#&d>=O?!wsW3cu-ex`-7UJO zE=|?V;S~K2@A;GaCKXk9cXwC19P<0DZ@%vcN!u9i?`(VTSWuZB3FlGK81cZ9>j~a7pqf>lJUjDM&HCaO6WzBkNzwx9UrK zY4i>aGGCT~jL-4RC;qbyk&l1_)Yh;^`4PHH*$Qm%&ciK(!DRdQA2l+=Xb9}Yf}bg_ zh@_;X^^QNUo3)C8)Vm`sAEsbE)nZs>HtUtibm|i(#>UAVBH`$qX%Rr0UNt|OlBz1} z>T2D#1HvCRIzA{Uu>myE>d&7wctl>|#a&mG|Umr!OH8$&i-Kj5YvbwzT zZ@O@Bao4@q4ANy>sfY|ppsFFs4Q3DwcL>U%=>v+ zR5qrRLP?pDwb8D@!up~cFv`NDHCL)pXDHg@RbB(~ryyRRv{s#>rGhy81dtgI1EdD; zHv!^USOQpL($b@P(Qv5rr9x(rnYiicsq{bF8_VL&TN5axRG1k|w1R)FF0{K{pOF7+ z8k0^cHBxJL<89b6@zub|T=>JxZmlrWUzjiSmN~<|b(j@1n+c>d5x>S$$zez~6*g97 zWBEp7Yh$Go0@lA($6QZ6l4sDZfmQpa3Kp3JmK1eL3@L7c#kGC1N7hO|rj^~TkPtK< zQ7Iw{9avV!0+G+iYc5dU6>e@ndvHKW$w0F)*ywisKsiWB7{-->pXpTKnGNNPHkW>> z{2~W*0o68<*)@IzP%{xDmV(#CNq!BJhxG*}a-_6_W64@~meXeTbJf^YNpA>>~ok@d35YH$uhnvEENX)V8MwE4$SNfr!l zXi9DR=AT%DgT+?Um9YJ1FL2Tcb>x}$?{)|`P@uDkTIqpXIF}Mwg5>3B!&Hf8g2Lm^ zNsF{*)5vZROR}J022g@85pF%P$DjaO9DAU^&KM!KoX}SwK7h-5v5D+k{nbq zf6>rpy!Q3)YCshCmG>-DwQBeRB5X5`j-26RM7Lu4&i=B))vugtL&TrZ_W3t@nz4x3 zbh|I60=?B(Om*KB-1Z|5$;i{XG$X>fYSgabfs@i26|83e4(sBnPU+{^wkd1p3>U*F z51KF%q1F!%t#FrU%P0?%TX-4_O^lb7(r|IpM=_ib$lL>dmYYq#A?oCi*}n$u|4Z}z z8icap+LFx5Qo;J@v@1I_HI{p?bcz}+T2sS=Gg7^mF%3_R46O1=jg+OYWyb6ye1C4R z|1bnNxFd=&>Q(0L?|8KOKmiH4P0qr Date: Mon, 23 Nov 2020 07:08:05 +1100 Subject: [PATCH 057/750] Updated libimagequant to 2.13.1 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index ae70bde8f..ed438f904 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.13.0 +archive=libimagequant-2.13.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index bb8c06580..0d28b8347 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -177,7 +177,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.13.0** + * Pillow has been tested with libimagequant **2.6-2.13.1** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From effb351d09daf2bd4327ddccfd1943433db3f3ca Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 24 Nov 2020 12:25:40 +0200 Subject: [PATCH 058/750] Don't add light mode bg to 4th level menu items [CI skip] --- docs/resources/js/script.js | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/resources/js/script.js b/docs/resources/js/script.js index 3bc216c2d..d58571d6d 100644 --- a/docs/resources/js/script.js +++ b/docs/resources/js/script.js @@ -30,7 +30,6 @@ jQuery(document).ready(function ($) { if (!$upperA.find('.toctree-expand').length) { $upperA.prepend($('').addClass('toctree-expand')); } - $a.css('background-color', '#c9c9c9'); $a.css('padding-left', '5em'); } else { $a.css('background-color', '#bdbdbd'); From dea2eb54affa99f213eb9cafff4fefbcb2a5e5ca Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 24 Nov 2020 13:10:01 +0200 Subject: [PATCH 059/750] Set background-color depending on dark/light mode --- docs/conf.py | 1 + docs/resources/css/dark.css | 4 ++++ docs/resources/css/light.css | 7 +++++++ 3 files changed, 12 insertions(+) create mode 100644 docs/resources/css/light.css diff --git a/docs/conf.py b/docs/conf.py index a8f101141..bd17da0e6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -310,3 +310,4 @@ texinfo_documents = [ def setup(app): app.add_js_file("js/script.js") app.add_css_file("css/dark.css") + app.add_css_file("css/light.css") diff --git a/docs/resources/css/dark.css b/docs/resources/css/dark.css index c746e76cf..2ed958429 100644 --- a/docs/resources/css/dark.css +++ b/docs/resources/css/dark.css @@ -1196,6 +1196,10 @@ color: rgb(166, 158, 146); } + .wy-menu-vertical li.toctree-l3.current a { + background-color: #363636; + } + .wy-menu-vertical li ul li a { color: rgb(208, 204, 198); } diff --git a/docs/resources/css/light.css b/docs/resources/css/light.css new file mode 100644 index 000000000..ae3debc91 --- /dev/null +++ b/docs/resources/css/light.css @@ -0,0 +1,7 @@ +@media (prefers-color-scheme: light) { + + .wy-menu-vertical li.toctree-l3.current a { + background-color: #c9c9c9; + } + +} From a89705493098e009f311d212b94d7393a5a7e011 Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 24 Nov 2020 12:53:42 +0000 Subject: [PATCH 060/750] GHA: make windows cache depend on VS version --- .github/workflows/test-windows.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 9797b4895..91d41fdb0 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -64,6 +64,7 @@ jobs: run: python -m pip install -U "setuptools>=49.3.2" - name: Install dependencies + id: install run: | 7z x winbuild\depends\nasm-2.14.02-win64.zip "-o$env:RUNNER_WORKSPACE\" echo "$env:RUNNER_WORKSPACE\nasm-2.14.02" >> $env:GITHUB_PATH @@ -72,6 +73,9 @@ jobs: echo "C:\Program Files (x86)\gs\gs9.53.3\bin" >> $env:GITHUB_PATH xcopy /S /Y winbuild\depends\test_images\* Tests\images\ + + # make cache key depend on VS version + & "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" | find """catalog_buildVersion""" | ForEach-Object { $a = $_.split(" ")[1]; echo "::set-output name=vs::$a" } shell: pwsh - name: Cache build @@ -80,7 +84,7 @@ jobs: with: path: winbuild\build key: - ${{ hashFiles('winbuild\build_prepare.py') }}-${{ hashFiles('.github\workflows\test-windows.yml') }}-${{ env.pythonLocation }} + ${{ hashFiles('winbuild\build_prepare.py') }}-${{ hashFiles('.github\workflows\test-windows.yml') }}-${{ env.pythonLocation }}-${{ steps.install.outputs.vs }} - name: Prepare build if: steps.build-cache.outputs.cache-hit != 'true' From e095391a3532e72d95f8df487369c99fd5ac237b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 16 Oct 2020 17:17:51 +0300 Subject: [PATCH 061/750] Add release drafter to draft releases --- .github/release-drafter.yml | 14 ++++++++++++++ .github/workflows/release-drafter.yml | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/release-drafter.yml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 000000000..0412bd9dd --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,14 @@ +name-template: "$NEXT_MINOR_VERSION" +tag-template: "$NEXT_MINOR_VERSION" +change-template: '- $TITLE #$NUMBER [@$AUTHOR]' + +exclude-labels: + - "changelog: skip" + +template: | + + https://pillow.readthedocs.io/en/stable/releasenotes/$NEXT_MINOR_VERSION.html + + ## Changes + + $CHANGES diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 000000000..52456597b --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,17 @@ +name: Release drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - master + +jobs: + update_release_draft: + if: github.repository == 'python-pillow/Pillow' + runs-on: ubuntu-latest + steps: + # Drafts your next release notes as pull requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From e377d243b167dc1a053c01b3fd21765425f78411 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 24 Nov 2020 23:25:20 +0200 Subject: [PATCH 062/750] Remove soon-EOL Amazon Linux 1 and CentOS 6 --- .github/workflows/test-docker.yml | 2 -- docs/installation.rst | 4 ---- 2 files changed, 6 deletions(-) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index ddec1bee4..6acb6cf70 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -15,10 +15,8 @@ jobs: ubuntu-18.04-bionic-amd64, ubuntu-20.04-focal-amd64, debian-10-buster-x86, - centos-6-amd64, centos-7-amd64, centos-8-amd64, - amazon-1-amd64, amazon-2-amd64, fedora-32-amd64, fedora-33-amd64, diff --git a/docs/installation.rst b/docs/installation.rst index bb8c06580..279d78704 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -422,12 +422,8 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | Arch | 3.8 |x86-64 | +----------------------------------+--------------------------+-----------------------+ -| Amazon Linux 1 | 3.6 |x86-64 | -+----------------------------------+--------------------------+-----------------------+ | Amazon Linux 2 | 3.7 |x86-64 | +----------------------------------+--------------------------+-----------------------+ -| CentOS 6 | 3.6 |x86-64 | -+----------------------------------+--------------------------+-----------------------+ | CentOS 7 | 3.6 |x86-64 | +----------------------------------+--------------------------+-----------------------+ | CentOS 8 | 3.6 |x86-64 | From 5abdbe12313162e40e6e9e65e7793d808fad8fb0 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 25 Nov 2020 00:02:34 +0200 Subject: [PATCH 063/750] Sort for easier reference --- .github/workflows/test-docker.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 6acb6cf70..f6814f932 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -11,15 +11,15 @@ jobs: matrix: docker: [ alpine, + amazon-2-amd64, arch, - ubuntu-18.04-bionic-amd64, - ubuntu-20.04-focal-amd64, - debian-10-buster-x86, centos-7-amd64, centos-8-amd64, - amazon-2-amd64, + debian-10-buster-x86, fedora-32-amd64, fedora-33-amd64, + ubuntu-18.04-bionic-amd64, + ubuntu-20.04-focal-amd64, ] dockerTag: [master] From ece157b09cb5418e69de1153b892203ebd60feb3 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 06:58:13 +0000 Subject: [PATCH 064/750] install raqm on macos --- .github/workflows/macos-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index fb8869c7d..afcb9a5a7 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -2,7 +2,7 @@ set -e -brew install libtiff libjpeg openjpeg libimagequant webp little-cms2 freetype openblas +brew install libtiff libjpeg openjpeg libimagequant webp little-cms2 freetype openblas libraqm PYTHONOPTIMIZE=0 python3 -m pip install cffi python3 -m pip install coverage From 74048f9b4ffd0bfee645cd13f276a888434332d1 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 07:27:11 +0000 Subject: [PATCH 065/750] remove FT 2.3 from tests --- Tests/test_imagefont.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 7824b7f53..f779463e6 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -35,14 +35,6 @@ class TestImageFont: # Freetype has different metrics depending on the version. # (and, other things, but first things first) METRICS = { - (">=2.3", "<2.4"): { - "multiline": 30, - "textsize": 12, - "getters": (13, 16), - "mask": (107, 13), - "multiline-anchor": 6, - "getlength": (36, 27, 27, 33), - }, (">=2.7",): { "multiline": 6.2, "textsize": 2.5, From 86993df834ace1e6bbe0a05ebd8d288a601eeb9d Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 07:38:13 +0000 Subject: [PATCH 066/750] remove duplicate values --- Tests/test_imagefont.py | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index f779463e6..06ed42658 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -35,22 +35,8 @@ class TestImageFont: # Freetype has different metrics depending on the version. # (and, other things, but first things first) METRICS = { - (">=2.7",): { - "multiline": 6.2, - "textsize": 2.5, - "getters": (12, 16), - "mask": (108, 13), - "multiline-anchor": 4, - "getlength": (36, 21, 24, 33), - }, - "Default": { - "multiline": 0.5, - "textsize": 0.5, - "getters": (12, 16), - "mask": (108, 13), - "multiline-anchor": 4, - "getlength": (36, 24, 24, 33), - }, + (">=2.7",): {"multiline": 6.2, "textsize": 2.5, "getlength": (36, 21, 24, 33)}, + "Default": {"multiline": 0.5, "textsize": 0.5, "getlength": (36, 24, 24, 33)}, } @classmethod @@ -387,7 +373,7 @@ class TestImageFont: mask = transposed_font.getmask(text) # Assert - assert mask.size == self.metrics["mask"][::-1] + assert mask.size == (13, 108) def test_unrotated_transposed_font_get_mask(self): # Arrange @@ -400,7 +386,7 @@ class TestImageFont: mask = transposed_font.getmask(text) # Assert - assert mask.size == self.metrics["mask"] + assert mask.size == (108, 13) def test_free_type_font_get_name(self): # Arrange @@ -444,7 +430,7 @@ class TestImageFont: mask = font.getmask(text) # Assert - assert mask.size == self.metrics["mask"] + assert mask.size == (108, 13) def test_load_path_not_found(self): # Arrange @@ -625,7 +611,7 @@ class TestImageFont: assert t.font.glyphs == 4177 assert t.getsize("A") == (12, 16) assert t.getsize("AB") == (24, 16) - assert t.getsize("M") == self.metrics["getters"] + assert t.getsize("M") == (12, 16) assert t.getsize("y") == (12, 20) assert t.getsize("a") == (12, 16) assert t.getsize_multiline("A") == (12, 16) @@ -861,7 +847,7 @@ class TestImageFont: ) with Image.open(target) as expected: - assert_image_similar(im, expected, self.metrics["multiline-anchor"]) + assert_image_similar(im, expected, 4) def test_anchor_invalid(self): font = self.get_font() From fba3ece341566b625f0e8ce699cd35fb27479478 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 26 Nov 2020 01:01:38 +1100 Subject: [PATCH 067/750] Updated libraqm to 0.7.1 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index e6060b9cc..fd5ac40f0 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -300,9 +300,9 @@ deps = { "libs": [r"*.lib"], }, "libraqm": { - "url": "https://github.com/HOST-Oman/libraqm/archive/v0.7.0.zip", - "filename": "libraqm-0.7.0.zip", - "dir": "libraqm-0.7.0", + "url": "https://github.com/HOST-Oman/libraqm/archive/v0.7.1.zip", + "filename": "libraqm-0.7.1.zip", + "dir": "libraqm-0.7.1", "build": [ cmd_copy(r"{winbuild_dir}\raqm.cmake", r"CMakeLists.txt"), cmd_cmake(), From dd1a514346841ce3baddd78be5806806a4141fae Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 21:40:16 +0000 Subject: [PATCH 068/750] update FriBiDi to 1.0.10 --- winbuild/build_prepare.py | 6 +++--- winbuild/fribidi.cmake | 2 +- winbuild/raqm.cmake | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index fd5ac40f0..178194ffe 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -287,9 +287,9 @@ deps = { "libs": [r"*.lib"], }, "fribidi": { - "url": "https://github.com/fribidi/fribidi/archive/v1.0.9.zip", - "filename": "fribidi-1.0.9.zip", - "dir": "fribidi-1.0.9", + "url": "https://github.com/fribidi/fribidi/archive/v1.0.10.zip", + "filename": "fribidi-1.0.10.zip", + "dir": "fribidi-1.0.10", "build": [ cmd_copy(r"{winbuild_dir}\fribidi.cmake", r"CMakeLists.txt"), cmd_cmake(), diff --git a/winbuild/fribidi.cmake b/winbuild/fribidi.cmake index 112174731..47ab2c329 100644 --- a/winbuild/fribidi.cmake +++ b/winbuild/fribidi.cmake @@ -99,4 +99,4 @@ add_library(fribidi STATIC ${FRIBIDI_SOURCES_GENERATED}) fribidi_definitions(fribidi) target_compile_definitions(fribidi - PUBLIC -DFRIBIDI_ENTRY=extern) + PUBLIC -DFRIBIDI_LIB_STATIC) diff --git a/winbuild/raqm.cmake b/winbuild/raqm.cmake index e8e71800e..82c9cdc70 100644 --- a/winbuild/raqm.cmake +++ b/winbuild/raqm.cmake @@ -7,7 +7,7 @@ find_library(fribidi NAMES fribidi) find_library(harfbuzz NAMES harfbuzz) find_library(freetype NAMES freetype) -add_definitions(-DFRIBIDI_ENTRY=extern) +add_definitions(-DFRIBIDI_LIB_STATIC) function(raqm_conf) From 6f64eef699b571874b34641c6561c8a948e81a12 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Nov 2020 15:12:14 +1100 Subject: [PATCH 069/750] Updated instructions now that draft releases may exist [ci skip] --- RELEASING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index dac0ba731..5e00e5724 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -24,7 +24,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) * [ ] Upload all binaries and source distributions e.g. `twine upload dist/Pillow-5.2.0*` -* [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) +* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases) * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), increment and append `.dev0` to version identifier in `src/PIL/_version.py` ## Point Release @@ -56,7 +56,7 @@ Released as needed for security, installation or critical bug fixes. ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) * [ ] Upload all binaries and source distributions e.g. `twine upload dist/Pillow-5.2.1*` -* [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) +* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases) ## Embargoed Release @@ -80,7 +80,7 @@ Released as needed privately to individual vendors for critical security-related make sdist ``` * [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions) -* [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) +* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases) ## Binary Distributions From 3d80b743427f3b93722f27b2c2fbdada7890d45f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Nov 2020 18:50:31 +1100 Subject: [PATCH 070/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index bb8c06580..de97d7676 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -469,6 +469,8 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ +| macOS 11.0 Big Sur | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | | +------------------------------+--------------------------------+ + | | 3.5 | 7.2.0 | | From cf9158f635a892c551961bf3ed6f8855f22cc0ce Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Nov 2020 12:10:20 +1100 Subject: [PATCH 071/750] Corrected syntax [ci skip] --- docs/handbook/writing-your-own-file-decoder.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 97cb5abe1..03b4ca601 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -157,7 +157,7 @@ The raw decoder The ``raw`` decoder is used to read uncompressed data from an image file. It can be used with most uncompressed file formats, such as PPM, BMP, uncompressed TIFF, and many others. To use the raw decoder with the -:py:func:`PIL.Image.frombytes` function, use the following syntax:: +:py:func:`PIL.Image.frombytes` function, use the following syntax: .. code-block:: python From ce1e73e5a87b2acc4b1356fada4d042fdb1e99f1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Nov 2020 01:20:51 +1100 Subject: [PATCH 072/750] Updated libraqm to 0.7.1 --- depends/install_raqm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh index 38a5bfd52..a7ce16792 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -2,7 +2,7 @@ # install raqm -archive=raqm-0.7.0 +archive=raqm-0.7.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 8c110b7232c9b9341926252862c2948298f7875e Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 2 Dec 2020 18:15:09 +0200 Subject: [PATCH 073/750] Add 'Release notes' and 'Changelog' links to PyPI [CI skip] --- README.md | 1 + setup.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 9ead486a0..6c323413d 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ The core image library is designed for fast access to data stored in a few basic - [Contribute](https://github.com/python-pillow/Pillow/blob/master/.github/CONTRIBUTING.md) - [Issues](https://github.com/python-pillow/Pillow/issues) - [Pull requests](https://github.com/python-pillow/Pillow/pulls) +- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html) - [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst) - [Pre-fork](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst#pre-fork) diff --git a/setup.py b/setup.py index 5bc683c8c..cbc2641c5 100755 --- a/setup.py +++ b/setup.py @@ -877,6 +877,10 @@ try: "Source": "https://github.com/python-pillow/Pillow", "Funding": "https://tidelift.com/subscription/pkg/pypi-pillow?" "utm_source=pypi-pillow&utm_medium=pypi", + "Release notes": "https://pillow.readthedocs.io/en/stable/releasenotes/" + "index.html", + "Changelog": "https://github.com/python-pillow/Pillow/blob/master/" + "CHANGES.rst", }, classifiers=[ "Development Status :: 6 - Mature", From a0565bc8acbd9137fab94118c9c43f18956a03b1 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Fri, 4 Dec 2020 18:24:22 -0500 Subject: [PATCH 074/750] Update CHANGES.rst https://twitter.com/aclark4life/status/1335001987075747841 --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e7090219f..b05fa78df 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4039,8 +4039,8 @@ Changelog (Pillow) 1.0 (07/30/2010) ---------------- -- Remove support for ``import Image``, etc. from the standard namespace. ``from PIL import Image`` etc. now required. -- Forked PIL based on `Hanno Schlichting's re-packaging `_ +- Remove support for ``import Image``. ``from PIL import Image`` now required. +- Forked PIL based on `Chris McDonough and Hanno Schlichting's setuptools compatible re-packaging `_ [aclark4life] Pre-fork From 1e8e7fea7de598cd629af973bb15f781b0beb1ad Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 7 Dec 2020 22:01:25 +0200 Subject: [PATCH 075/750] Add categories to Release Drafter [CI skip] --- .github/release-drafter.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 0412bd9dd..aa49c2ec0 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -2,6 +2,18 @@ name-template: "$NEXT_MINOR_VERSION" tag-template: "$NEXT_MINOR_VERSION" change-template: '- $TITLE #$NUMBER [@$AUTHOR]' +categories: + - title: "Dependencies" + label: "Dependencies" + - title: "Deprecations" + label: "Deprecation" + - title: "Documentation" + label: "Documentation" + - title: "Removals" + label: "Removal" + - title: "Testing" + label: "Testing" + exclude-labels: - "changelog: skip" From 786fddb794f68dd3f7c68ba9b9ce51fc6abd3699 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 8 Dec 2020 12:23:53 +0200 Subject: [PATCH 076/750] Fix label name Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index aa49c2ec0..4d855469a 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -4,7 +4,7 @@ change-template: '- $TITLE #$NUMBER [@$AUTHOR]' categories: - title: "Dependencies" - label: "Dependencies" + label: "Dependency" - title: "Deprecations" label: "Deprecation" - title: "Documentation" From 0893f502c3699736269817d54a61d51229aaf9c8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 10 Dec 2020 14:32:43 +0200 Subject: [PATCH 077/750] Document when deprecations will be removed [CI skip] --- docs/deprecations.rst | 18 +++++++++--------- src/PIL/Image.py | 6 +++--- src/PIL/ImageFile.py | 2 +- src/PIL/__init__.py | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index e3ad2a9e3..07d845dd6 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -17,7 +17,7 @@ Image.show command parameter .. deprecated:: 7.2.0 -The ``command`` parameter was deprecated and will be removed in a future release. +The ``command`` parameter will be removed in Pillow 9.0.0 (2022-01-02). Use a subclass of :py:class:`.ImageShow.Viewer` instead. Image._showxv @@ -25,26 +25,26 @@ Image._showxv .. deprecated:: 7.2.0 -``Image._showxv`` has been deprecated. Use :py:meth:`.Image.Image.show` -instead. If custom behaviour is required, use :py:func:`.ImageShow.register` to add -a custom :py:class:`.ImageShow.Viewer` class. +``Image._showxv`` will be removed in Pillow 9.0.0 (2022-01-02). +Use :py:meth:`.Image.Image.show` instead. If custom behaviour is required, use +:py:func:`.ImageShow.register` to add a custom :py:class:`.ImageShow.Viewer` class. ImageFile.raise_ioerror ~~~~~~~~~~~~~~~~~~~~~~~ .. deprecated:: 7.2.0 -``IOError`` was merged into ``OSError`` in Python 3.3. So, ``ImageFile.raise_ioerror`` -is now deprecated and will be removed in a future release. Use -``ImageFile.raise_oserror`` instead. +``IOError`` was merged into ``OSError`` in Python 3.3. +So, ``ImageFile.raise_ioerror`` will be removed in Pillow 9.0.0 (2022-01-02). +Use ``ImageFile.raise_oserror`` instead. PILLOW_VERSION constant ~~~~~~~~~~~~~~~~~~~~~~~ .. deprecated:: 5.2.0 -``PILLOW_VERSION`` has been deprecated and will be removed in a future release. Use -``__version__`` instead. +``PILLOW_VERSION`` will be removed in Pillow 9.0.0 (2022-01-02). +Use ``__version__`` instead. It was initially removed in Pillow 7.0.0, but brought back in 7.1.0 to give projects more time to upgrade. diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 8d3f6b0aa..ae2559d11 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2197,8 +2197,8 @@ class Image: if command is not None: warnings.warn( - "The command parameter is deprecated and will be removed in a future " - "release. Use a subclass of ImageShow.Viewer instead.", + "The command parameter is deprecated and will be removed in Pillow 9 " + "(2022-01-02). Use a subclass of ImageShow.Viewer instead.", DeprecationWarning, ) @@ -3176,7 +3176,7 @@ def _showxv(image, title=None, **options): del options["_internal_pillow"] else: warnings.warn( - "_showxv is deprecated and will be removed in a future release. " + "_showxv is deprecated and will be removed in Pillow 9 (2022-01-02). " "Use Image.show instead.", DeprecationWarning, ) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 49633ef51..f2a55cb54 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -69,7 +69,7 @@ def raise_oserror(error): def raise_ioerror(error): warnings.warn( - "raise_ioerror is deprecated and will be removed in a future release. " + "raise_ioerror is deprecated and will be removed in Pillow 9 (2022-01-02). " "Use raise_oserror instead.", DeprecationWarning, ) diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index d4f5ea76a..890ae44f5 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -26,7 +26,7 @@ __version__ = _version.__version__ # Use __version__ instead. def _raise_version_warning(): warnings.warn( - "PILLOW_VERSION is deprecated and will be removed in a future release. " + "PILLOW_VERSION is deprecated and will be removed in Pillow 9 (2022-01-02). " "Use __version__ instead.", DeprecationWarning, stacklevel=3, From 1c82fbd5e9da2b80f42727d90e158865d37e3a90 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 11 Dec 2020 20:46:00 +0200 Subject: [PATCH 078/750] Disable Travis from automerge --- .github/mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/mergify.yml b/.github/mergify.yml index fd4b5271f..b37db48d4 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -7,7 +7,7 @@ pull_request_rules: - status-success=Test Successful - status-success=Docker Test Successful - status-success=Windows Test Successful - - status-success=Travis CI - Pull Request +# - status-success=Travis CI - Pull Request - status-success=continuous-integration/appveyor/pr actions: merge: From 4ed79ea79c71ba97726f95c06bdac8df3018cfb9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Dec 2020 10:31:55 +1100 Subject: [PATCH 079/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b05fa78df..e009c9508 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,18 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Moved warning to end of execution #4965 + [radarhere] + +- Removed unused fromstring and tostring C methods #5026 + [radarhere] + +- init() if one of the formats is unrecognised #5037 + [radarhere] + +- Moved string_dimension CVE image to pillow-depends #4993 + [radarhere] + - Support raw rgba8888 for DDS #4760 [qiankanglai] From a666c91e10d3d4922b2eefe3c31dbeb970baa8d6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Dec 2020 14:12:30 +1100 Subject: [PATCH 080/750] Allow putpalette to accept 1024 integers to include alpha values --- Tests/test_image_putpalette.py | 21 +++++++++++++++++++-- src/PIL/Image.py | 26 ++++++++++++++++++-------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/Tests/test_image_putpalette.py b/Tests/test_image_putpalette.py index 32f8de2c0..5a9df11b1 100644 --- a/Tests/test_image_putpalette.py +++ b/Tests/test_image_putpalette.py @@ -1,8 +1,8 @@ import pytest -from PIL import ImagePalette +from PIL import Image, ImagePalette -from .helper import hopper +from .helper import assert_image_equal, hopper def test_putpalette(): @@ -39,3 +39,20 @@ def test_imagepalette(): im.putpalette(ImagePalette.random()) im.putpalette(ImagePalette.sepia()) im.putpalette(ImagePalette.wedge()) + + +def test_putpalette_with_alpha_values(): + with Image.open("Tests/images/transparent.gif") as im: + expected = im.convert("RGBA") + + palette = im.getpalette() + transparency = im.info.pop("transparency") + + palette_with_alpha_values = [] + for i in range(256): + color = palette[i * 3 : i * 3 + 3] + alpha = 0 if i == transparency else 255 + palette_with_alpha_values += color + [alpha] + im.putpalette(palette_with_alpha_values, "RGBA") + + assert_image_equal(im.convert("RGBA"), expected) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ae2559d11..55861a75a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -815,9 +815,15 @@ class Image: """ if self.im and self.palette and self.palette.dirty: # realize palette - self.im.putpalette(*self.palette.getdata()) + mode, arr = self.palette.getdata() + if mode == "RGBA": + mode = "RGB" + self.info["transparency"] = arr[3::4] + arr = bytes( + value for (index, value) in enumerate(arr) if index % 4 != 3 + ) + self.im.putpalette(mode, arr) self.palette.dirty = 0 - self.palette.mode = "RGB" self.palette.rawmode = None if "transparency" in self.info: if isinstance(self.info["transparency"], int): @@ -825,6 +831,8 @@ class Image: else: self.im.putpalettealphas(self.info["transparency"]) self.palette.mode = "RGBA" + else: + self.palette.mode = "RGB" if self.im: if cffi and USE_CFFI_ACCESS: @@ -1672,12 +1680,14 @@ class Image: def putpalette(self, data, rawmode="RGB"): """ - Attaches a palette to this image. The image must be a "P", - "PA", "L" or "LA" image, and the palette sequence must contain - 768 integer values, where each group of three values represent - the red, green, and blue values for the corresponding pixel - index. Instead of an integer sequence, you can use an 8-bit - string. + Attaches a palette to this image. The image must be a "P", "PA", "L" + or "LA" image. + + The palette sequence must contain either 768 integer values, or 1024 + integer values if alpha is included. Each group of values represents + the red, green, blue (and alpha if included) values for the + corresponding pixel index. Instead of an integer sequence, you can use + an 8-bit string. :param data: A palette sequence (either a list or a string). :param rawmode: The raw mode of the palette. From ff0ad9af3445346d385da76e7c3acc881ce55336 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Dec 2020 23:36:57 +1100 Subject: [PATCH 081/750] Do not catch a ValueError only to raise another --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ae2559d11..a4e6f3682 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1626,7 +1626,7 @@ class Image: self.im = im self.pyaccess = None self.mode = self.im.mode - except (KeyError, ValueError) as e: + except KeyError as e: raise ValueError("illegal image mode") from e if self.mode in ("LA", "PA"): From 989c9b303a253a9c864e8053a53752dbd3f47918 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 4 Nov 2020 00:38:28 +0000 Subject: [PATCH 082/750] xfail failing libtiff tests on big-endian (cherry picked from commit 25ce233edf732edb5660f877365379377a64f136) --- Tests/test_file_libtiff.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index da955b3de..7d3e10c24 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -16,6 +16,7 @@ from .helper import ( assert_image_similar, assert_image_similar_tofile, hopper, + is_big_endian, skip_unless_feature, ) @@ -813,11 +814,13 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: @@ -828,16 +831,19 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/flower2.jpg") + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_old_style_jpeg(self): infile = "Tests/images/old-style-jpeg-compression.tif" with Image.open(infile) as im: From a3ab868b0f4d1d147030b4eead32a046ed48bf72 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 4 Nov 2020 00:58:06 +0000 Subject: [PATCH 083/750] xfail tests failing on ppc64le on GHA (cherry picked from commit 9c7fb5bd14c3064fede96131a0f7f67abf26a4e7) --- Tests/helper.py | 6 ++++++ Tests/test_image_quantize.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index 3da2571f2..d76389621 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -278,6 +278,12 @@ def is_big_endian(): return sys.byteorder == "big" +def is_ppc64le(): + import platform + + return platform.machine() == "ppc64le" + + def is_win32(): return sys.platform.startswith("win32") diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 921c39e3f..af4172c88 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -2,7 +2,7 @@ import pytest from PIL import Image -from .helper import assert_image, assert_image_similar, hopper +from .helper import assert_image, assert_image_similar, hopper, is_ppc64le def test_sanity(): @@ -17,6 +17,7 @@ def test_sanity(): assert_image_similar(converted.convert("RGB"), image, 60) +@pytest.mark.xfail(is_ppc64le(), reason="failing on ppc64le on GHA") def test_libimagequant_quantize(): image = hopper() try: From 903ec9723d425daba09eeaacdb0fea7427cea35c Mon Sep 17 00:00:00 2001 From: nulano Date: Fri, 11 Dec 2020 20:41:02 +0100 Subject: [PATCH 084/750] move tests for arm64v8, ppc64le, s390x from Travis CI to GHA using Docker and aptman/qus --- .github/workflows/test-docker.yml | 17 +++++++++++++++++ .travis.yml | 29 ----------------------------- 2 files changed, 17 insertions(+), 29 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index f6814f932..eb173c359 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -10,6 +10,11 @@ jobs: fail-fast: false matrix: docker: [ + # Run slower jobs first to give them a headstart and reduce waiting time + ubuntu-20.04-focal-arm64v8, + ubuntu-20.04-focal-ppc64le, + ubuntu-20.04-focal-s390x, + # Then run the remainder alpine, amazon-2-amd64, arch, @@ -22,6 +27,13 @@ jobs: ubuntu-20.04-focal-amd64, ] dockerTag: [master] + include: + - docker: "ubuntu-20.04-focal-arm64v8" + qemu-arch: "aarch64" + - docker: "ubuntu-20.04-focal-ppc64le" + qemu-arch: "ppc64le" + - docker: "ubuntu-20.04-focal-s390x" + qemu-arch: "s390x" name: ${{ matrix.docker }} @@ -31,6 +43,11 @@ jobs: - name: Build system information run: python .github/workflows/system-info.py + - name: Set up QEMU + if: "matrix.qemu-arch" + run: | + docker run --rm --privileged aptman/qus -s -- -p ${{ matrix.qemu-arch }} + - name: Docker pull run: | docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e239ed496..000000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -dist: xenial -language: python -cache: pip - -notifications: - irc: "chat.freenode.net#pil" - -matrix: - fast_finish: true - include: - - python: "3.6" - arch: arm64 - - python: "3.7" - arch: ppc64le - - python: "3.8" - arch: s390x - -install: - - | - .ci/install.sh; - -script: - - | - .ci/build.sh - .ci/test.sh - -after_success: - - | - .ci/after_success.sh From db35e6404e6a3bcd19f530af73c41c422d054c0f Mon Sep 17 00:00:00 2001 From: nulano Date: Fri, 11 Dec 2020 21:06:24 +0100 Subject: [PATCH 085/750] remove FreeType<2.7 metrics in test_imagefont --- Tests/test_imagefont.py | 64 +++++++++++------------------------------ 1 file changed, 17 insertions(+), 47 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 06ed42658..0f44b2e0c 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -32,36 +32,6 @@ pytestmark = skip_unless_feature("freetype2") class TestImageFont: LAYOUT_ENGINE = ImageFont.LAYOUT_BASIC - # Freetype has different metrics depending on the version. - # (and, other things, but first things first) - METRICS = { - (">=2.7",): {"multiline": 6.2, "textsize": 2.5, "getlength": (36, 21, 24, 33)}, - "Default": {"multiline": 0.5, "textsize": 0.5, "getlength": (36, 24, 24, 33)}, - } - - @classmethod - def setup_class(self): - freetype = parse_version(features.version_module("freetype2")) - - self.metrics = self.METRICS["Default"] - for conditions, metrics in self.METRICS.items(): - if not isinstance(conditions, tuple): - continue - - for condition in conditions: - version = parse_version(re.sub("[<=>]", "", condition)) - if (condition.startswith(">=") and freetype >= version) or ( - condition.startswith("<") and freetype < version - ): - # Condition was met - continue - - # Condition failed - break - else: - # All conditions were met - self.metrics = metrics - def get_font(self): return ImageFont.truetype( FONT_PATH, FONT_SIZE, layout_engine=self.LAYOUT_ENGINE @@ -177,24 +147,24 @@ class TestImageFont: with Image.open(target) as target_img: # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, self.metrics["textsize"]) + assert_image_similar(im, target_img, 2.5) @pytest.mark.parametrize( - "text, mode, font, size, length_basic_index, length_raqm", + "text, mode, font, size, length_basic, length_raqm", ( # basic test - ("text", "L", "FreeMono.ttf", 15, 0, 36), - ("text", "1", "FreeMono.ttf", 15, 0, 36), + ("text", "L", "FreeMono.ttf", 15, 36, 36), + ("text", "1", "FreeMono.ttf", 15, 36, 36), # issue 4177 - ("rrr", "L", "DejaVuSans.ttf", 18, 1, 22.21875), - ("rrr", "1", "DejaVuSans.ttf", 18, 2, 22.21875), + ("rrr", "L", "DejaVuSans.ttf", 18, 21, 22.21875), + ("rrr", "1", "DejaVuSans.ttf", 18, 24, 22.21875), # test 'l' not including extra margin # using exact value 2047 / 64 for raqm, checked with debugger - ("ill", "L", "OpenSansCondensed-LightItalic.ttf", 63, 3, 31.984375), - ("ill", "1", "OpenSansCondensed-LightItalic.ttf", 63, 3, 31.984375), + ("ill", "L", "OpenSansCondensed-LightItalic.ttf", 63, 33, 31.984375), + ("ill", "1", "OpenSansCondensed-LightItalic.ttf", 63, 33, 31.984375), ), ) - def test_getlength(self, text, mode, font, size, length_basic_index, length_raqm): + def test_getlength(self, text, mode, font, size, length_basic, length_raqm): f = ImageFont.truetype( "Tests/fonts/" + font, size, layout_engine=self.LAYOUT_ENGINE ) @@ -204,7 +174,7 @@ class TestImageFont: if self.LAYOUT_ENGINE == ImageFont.LAYOUT_BASIC: length = d.textlength(text, f) - assert length == self.metrics["getlength"][length_basic_index] + assert length == length_basic else: # disable kerning, kerning metrics changed length = d.textlength(text, f, features=["-kern"]) @@ -227,7 +197,7 @@ class TestImageFont: # some versions of freetype have different horizontal spacing. # setting a tight epsilon, I'm showing the original test failure # at epsilon = ~38. - assert_image_similar(im, target_img, self.metrics["multiline"]) + assert_image_similar(im, target_img, 6.2) def test_render_multiline_text(self): ttf = self.get_font() @@ -242,7 +212,7 @@ class TestImageFont: with Image.open(target) as target_img: # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, self.metrics["multiline"]) + assert_image_similar(im, target_img, 6.2) # Test that text() can pass on additional arguments # to multiline_text() @@ -261,7 +231,7 @@ class TestImageFont: with Image.open(target) as target_img: # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, self.metrics["multiline"]) + assert_image_similar(im, target_img, 6.2) def test_unknown_align(self): im = Image.new(mode="RGB", size=(300, 100)) @@ -319,7 +289,7 @@ class TestImageFont: with Image.open(target) as target_img: # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, self.metrics["multiline"]) + assert_image_similar(im, target_img, 6.2) def test_rotated_transposed_font(self): img_grey = Image.new("L", (100, 100)) @@ -906,7 +876,7 @@ class TestImageFont: d.text((10, 10), txt, font=ttf, fill="#fa6", embedded_color=True) with Image.open("Tests/images/standard_embedded.png") as expected: - assert_image_similar(im, expected, max(self.metrics["multiline"], 3)) + assert_image_similar(im, expected, 6.2) @skip_unless_feature_version("freetype2", "2.5.0") def test_cbdt(self): @@ -923,7 +893,7 @@ class TestImageFont: d.text((10, 10), "\U0001f469", embedded_color=True, font=font) with Image.open("Tests/images/cbdt_notocoloremoji.png") as expected: - assert_image_similar(im, expected, self.metrics["multiline"]) + assert_image_similar(im, expected, 6.2) except IOError as e: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") @@ -943,7 +913,7 @@ class TestImageFont: d.text((10, 10), "\U0001f469", "black", font=font) with Image.open("Tests/images/cbdt_notocoloremoji_mask.png") as expected: - assert_image_similar(im, expected, self.metrics["multiline"]) + assert_image_similar(im, expected, 6.2) except IOError as e: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") From 27bf17009c74b739d6b0ab4a68ac8d02e8bc76aa Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 16 Dec 2020 18:21:37 +0200 Subject: [PATCH 086/750] Deprecate FreeType 2.7, to be removed in Pillow 9 (2022-01-02) --- Tests/test_imagefont.py | 12 ++++++++++ docs/deprecations.rst | 14 ++++++++++++ docs/releasenotes/8.1.0.rst | 45 +++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + src/PIL/ImageFont.py | 14 +++++++++++- 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 docs/releasenotes/8.1.0.rst diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 06ed42658..264c97e48 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -998,3 +998,15 @@ def test_render_mono_size(): draw.text((10, 10), "r" * 10, "black", ttf) assert_image_equal_tofile(im, "Tests/images/text_mono.gif") + + +def test_freetype_deprecation(monkeypatch): + # Arrange: mock features.version_module to return fake FreeType version + def fake_version_module(module): + return "2.7" + + monkeypatch.setattr(features, "version_module", fake_version_module) + + # Act / Assert + with pytest.warns(DeprecationWarning): + ImageFont.truetype(FONT_PATH, FONT_SIZE) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 07d845dd6..36f74a64f 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -12,6 +12,20 @@ Deprecated features Below are features which are considered deprecated. Where appropriate, a ``DeprecationWarning`` is issued. +FreeType 2.7 +~~~~~~~~~~~~ + +.. deprecated:: 8.1.0 + +Support for FreeType 2.7 is deprecated and will be removed in Pillow 9.0.0 (2022-01-02), +when FreeType 2.8 will be the minimum supported. + +We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe +vulnerability introduced in FreeType 2.6 (CVE-2020-15999_). + +.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ +.. _CVE-2020-15999: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 + Image.show command parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst new file mode 100644 index 000000000..819bb30e0 --- /dev/null +++ b/docs/releasenotes/8.1.0.rst @@ -0,0 +1,45 @@ +8.1.0 +----- + +Deprecations +============ + +FreeType 2.7 +^^^^^^^^^^^^ + +Support for FreeType 2.7 is deprecated and will be removed in Pillow 9.0.0 (2022-01-02), +when FreeType 2.8 will be the minimum supported. + +We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe +vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). + +.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ + +API Changes +=========== + +TODO +^^^^ + +TODO + +API Additions +============= + +TODO +^^^^ + +TODO + +Security +======== + +TODO + +Other Changes +============= + +TODO +^^^^ + +TODO diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 5c74bed9b..18d2d9576 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -13,6 +13,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 8.1.0 8.0.1 8.0.0 7.2.0 diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 3a8a309c6..78f8d8cde 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -28,9 +28,12 @@ import base64 import os import sys +import warnings from io import BytesIO -from . import Image +from packaging.version import parse as parse_version + +from . import Image, features from ._util import isDirectory, isPath LAYOUT_BASIC = 0 @@ -164,6 +167,15 @@ class FreeTypeFont: self.index = index self.encoding = encoding + freetype_version = parse_version(features.version_module("freetype2")) + if freetype_version < parse_version("2.8"): + warnings.warn( + "Support for FreeType 2.7 is deprecated and will be removed in Pillow " + "9 (2022-01-02). Please upgrade to FreeType 2.8 or newer, preferably " + "FreeType 2.10.4 which fixes CVE-2020-15999.", + DeprecationWarning, + ) + if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): layout_engine = LAYOUT_BASIC if core.HAVE_RAQM: From d093b7141f1f25f0857ce6846344cfd83c029d8b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 17 Dec 2020 06:17:59 +0200 Subject: [PATCH 087/750] Update Makefile docs command for Python 3 --- Makefile | 2 +- docs/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 99232cac9..8892d4390 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ doccheck: .PHONY: docserve docserve: - cd docs/_build/html && python3 -mSimpleHTTPServer 2> /dev/null& + cd docs/_build/html && python3 -m http.server 2> /dev/null& .PHONY: help help: diff --git a/docs/Makefile b/docs/Makefile index d7c20bca4..686f0119e 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -156,4 +156,4 @@ livehtml: html livereload $(BUILDDIR)/html -p 33233 serve: - cd $(BUILDDIR)/html; python -m SimpleHTTPServer + cd $(BUILDDIR)/html; python3 -m http.server From f0c0a0a1f48bfb0e97504f75f66b5c518c85c778 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 17 Dec 2020 06:46:51 +0200 Subject: [PATCH 088/750] Autolink CVEs with sphinx-issues --- .github/workflows/test.yml | 2 +- docs/conf.py | 1 + docs/deprecations.rst | 3 +-- docs/releasenotes/3.1.1.rst | 24 ++++++++++++++---------- docs/releasenotes/3.1.2.rst | 6 ++++-- docs/releasenotes/6.2.0.rst | 6 +++--- docs/releasenotes/6.2.2.rst | 13 +++++++------ docs/releasenotes/7.1.0.rst | 10 +++++----- docs/releasenotes/8.0.1.rst | 5 +---- requirements.txt | 1 + 10 files changed, 38 insertions(+), 33 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 51ce9d085..ada367131 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -103,7 +103,7 @@ jobs: - name: Docs if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.9 run: | - python3 -m pip install sphinx-removed-in sphinx-rtd-theme + python3 -m pip install sphinx-issues sphinx-removed-in sphinx-rtd-theme make doccheck - name: After success diff --git a/docs/conf.py b/docs/conf.py index a8f101141..7a117a271 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -32,6 +32,7 @@ extensions = [ "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", + "sphinx_issues", "sphinx_removed_in", ] diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 36f74a64f..44aa2a795 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -21,10 +21,9 @@ Support for FreeType 2.7 is deprecated and will be removed in Pillow 9.0.0 (2022 when FreeType 2.8 will be the minimum supported. We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe -vulnerability introduced in FreeType 2.6 (CVE-2020-15999_). +vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). .. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ -.. _CVE-2020-15999: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 Image.show command parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/releasenotes/3.1.1.rst b/docs/releasenotes/3.1.1.rst index 8c32a43e7..38118ea39 100644 --- a/docs/releasenotes/3.1.1.rst +++ b/docs/releasenotes/3.1.1.rst @@ -6,7 +6,7 @@ CVE-2016-0740 -- Buffer overflow in TiffDecode.c ------------------------------------------------ Pillow 3.1.0 and earlier when linked against libtiff >= 4.0.0 on x64 -may overflow a buffer when reading a specially crafted tiff file. +may overflow a buffer when reading a specially crafted tiff file (:cve:`CVE-2016-0740`). Specifically, libtiff >= 4.0.0 changed the return type of ``TIFFScanlineSize`` from ``int32`` to machine dependent @@ -24,9 +24,11 @@ CVE-2016-0775 -- Buffer overflow in FliDecode.c ----------------------------------------------- In all versions of Pillow, dating back at least to the last PIL 1.1.7 -release, FliDecode.c has a buffer overflow error. +release, FliDecode.c has a buffer overflow error (:cve:`CVE-2016-0775`). -Around line 192:: +Around line 192: + +.. code-block:: c case 16: /* COPY chunk */ @@ -45,13 +47,13 @@ is a set of row pointers to segments of memory that are the size of the row. At the max ``y``, this will write the contents of the line off the end of the memory buffer, causing a segfault. -This issue was found by Alyssa Besseling at Atlassian +This issue was found by Alyssa Besseling at Atlassian. CVE-2016-2533 -- Buffer overflow in PcdDecode.c ----------------------------------------------- In all versions of Pillow, dating back at least to the last PIL 1.1.7 -release, ``PcdDecode.c`` has a buffer overflow error. +release, ``PcdDecode.c`` has a buffer overflow error (:cve:`CVE-2016-2533`). The ``state.buffer`` for ``PcdDecode.c`` is allocated based on a 3 bytes per pixel sizing, where ``PcdDecode.c`` wrote into the buffer @@ -63,14 +65,16 @@ Integer overflow in Resample.c ------------------------------ If a large value was passed into the new size for an image, it is -possible to overflow an int32 value passed into malloc. +possible to overflow an ``int32`` value passed into malloc. - kk = malloc(xsize * kmax * sizeof(float)); - ... - xbounds = malloc(xsize * 2 * sizeof(int)); +.. code-block:: c + + kk = malloc(xsize * kmax * sizeof(float)); + ... + xbounds = malloc(xsize * 2 * sizeof(int)); ``xsize`` is trusted user input. These multiplications can overflow, -leading the malloc'd buffer to be undersized. These allocations are +leading the ``malloc``'d buffer to be undersized. These allocations are followed by a loop that writes out of bounds. This can lead to corruption on the heap of the Python process with attacker controlled float data. diff --git a/docs/releasenotes/3.1.2.rst b/docs/releasenotes/3.1.2.rst index ddb6a2ada..b5f7cfe99 100644 --- a/docs/releasenotes/3.1.2.rst +++ b/docs/releasenotes/3.1.2.rst @@ -7,9 +7,11 @@ CVE-2016-3076 -- Buffer overflow in Jpeg2KEncode.c Pillow between 2.5.0 and 3.1.1 may overflow a buffer when writing large Jpeg2000 files, allowing for code execution or other memory -corruption. +corruption (:cve:`CVE-2016-3076`). -This occurs specifically in the function ``j2k_encode_entry``, at the line:: +This occurs specifically in the function ``j2k_encode_entry``, at the line: + +.. code-block:: c state->buffer = malloc (tile_width * tile_height * components * prec / 8); diff --git a/docs/releasenotes/6.2.0.rst b/docs/releasenotes/6.2.0.rst index faf84e6bd..1bc82b72f 100644 --- a/docs/releasenotes/6.2.0.rst +++ b/docs/releasenotes/6.2.0.rst @@ -73,7 +73,7 @@ Security ======== This release catches several buffer overruns, as well as addressing -CVE-2019-16865. The CVE is regarding DOS problems, such as consuming large +:cve:`CVE-2019-16865`. The CVE is regarding DOS problems, such as consuming large amounts of memory, or taking a large amount of time to process an image. In RawDecode.c, an error is now thrown if skip is calculated to be less than @@ -103,7 +103,7 @@ instead. Flags for libwebp in wheels ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -When building libwebp for inclusion in wheels, Pillow now adds the -O3 and --DNDEBUG CFLAGS. These flags would be used by default if building libwebp +When building libwebp for inclusion in wheels, Pillow now adds the ``-O3`` and +``-DNDEBUG`` CFLAGS. These flags would be used by default if building libwebp without debugging, and using them fixes a significant decrease in speed when a wheel-installed copy of Pillow performs libwebp operations. diff --git a/docs/releasenotes/6.2.2.rst b/docs/releasenotes/6.2.2.rst index a138c7d60..79d4b88aa 100644 --- a/docs/releasenotes/6.2.2.rst +++ b/docs/releasenotes/6.2.2.rst @@ -6,12 +6,13 @@ Security This release addresses several security problems. -CVE-2019-19911 is regarding FPX images. If an image reports that it has a large number -of bands, a large amount of resources will be used when trying to process the +:cve:`CVE-2019-19911` is regarding FPX images. If an image reports that it has a large +number of bands, a large amount of resources will be used when trying to process the image. This is fixed by limiting the number of bands to those usable by Pillow. -Buffer overruns were found when processing an SGI (CVE-2020-5311), PCX (CVE-2020-5312) -or FLI image (CVE-2020-5313). Checks have been added to prevent this. +Buffer overruns were found when processing an SGI (:cve:`CVE-2020-5311`), +PCX (:cve:`CVE-2020-5312`) or FLI image (:cve:`CVE-2020-5313`). Checks have been added +to prevent this. -CVE-2020-5310: Overflow checks have been added when calculating the size of a memory -block to be reallocated in the processing of a TIFF image. +:cve:`CVE-2020-5310`: Overflow checks have been added when calculating the size of a +memory block to be reallocated in the processing of a TIFF image. diff --git a/docs/releasenotes/7.1.0.rst b/docs/releasenotes/7.1.0.rst index 35e5c4464..fd3627e3c 100644 --- a/docs/releasenotes/7.1.0.rst +++ b/docs/releasenotes/7.1.0.rst @@ -74,11 +74,11 @@ Security This release includes security fixes. -* CVE-2020-10177 Fix multiple OOB reads in FLI decoding -* CVE-2020-10378 Fix bounds overflow in PCX decoding -* CVE-2020-10379 Fix two buffer overflows in TIFF decoding -* CVE-2020-10994 Fix bounds overflow in JPEG 2000 decoding -* CVE-2020-11538 Fix buffer overflow in SGI-RLE decoding +* :cve:`CVE-2020-10177` Fix multiple OOB reads in FLI decoding +* :cve:`CVE-2020-10378` Fix bounds overflow in PCX decoding +* :cve:`CVE-2020-10379` Fix two buffer overflows in TIFF decoding +* :cve:`CVE-2020-10994` Fix bounds overflow in JPEG 2000 decoding +* :cve:`CVE-2020-11538` Fix buffer overflow in SGI-RLE decoding Other Changes ============= diff --git a/docs/releasenotes/8.0.1.rst b/docs/releasenotes/8.0.1.rst index e50596e5c..3584a5d72 100644 --- a/docs/releasenotes/8.0.1.rst +++ b/docs/releasenotes/8.0.1.rst @@ -4,13 +4,11 @@ Security ======== -Update FreeType used in binary wheels to `2.10.4`_ to fix CVE-2020-15999_: +Update FreeType used in binary wheels to `2.10.4`_ to fix :cve:`CVE-2020-15999`: - A heap buffer overflow has been found in the handling of embedded PNG bitmaps, introduced in FreeType version 2.6. - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 - If you use option ``FT_CONFIG_OPTION_USE_PNG`` you should upgrade immediately. We strongly recommend updating to Pillow 8.0.1 if you are using Pillow 8.0.0, which improved support for bitmap fonts. @@ -22,4 +20,3 @@ Pillow 8.0.0 and earlier are potentially vulnerable releases, including the last to support Python 2.7, namely Pillow 6.2.2. .. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ -.. _CVE-2020-15999: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999 diff --git a/requirements.txt b/requirements.txt index 9758f91fd..da5752cfd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,5 +10,6 @@ pyroma pytest pytest-cov sphinx>=2.4 +sphinx-issues sphinx-removed-in sphinx-rtd-theme From cfc45ab9c352e6cd43c9fa8d56e7b100084052b7 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 17 Dec 2020 06:49:13 +0200 Subject: [PATCH 089/750] Autolink PEP --- docs/releasenotes/6.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/6.2.0.rst b/docs/releasenotes/6.2.0.rst index 1bc82b72f..20a009cc1 100644 --- a/docs/releasenotes/6.2.0.rst +++ b/docs/releasenotes/6.2.0.rst @@ -96,7 +96,7 @@ Other Changes Removed bdist_wininst .exe installers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.exe installers fell out of favour with PEP 527, and will be deprecated in +.exe installers fell out of favour with :pep:`527`, and will be deprecated in Python 3.8. Pillow will no longer be distributing them. Wheels should be used instead. From 5c600adf4191e864568c1988cca4b045c7d05435 Mon Sep 17 00:00:00 2001 From: nulano Date: Thu, 17 Dec 2020 16:23:12 +0100 Subject: [PATCH 090/750] gha: add PyPy3.7 --- .github/workflows/test-windows.yml | 6 ++++-- .github/workflows/test.yml | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 91d41fdb0..562b2b7b4 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10-dev", "pypy3"] + python-version: ["pypy-3.6", "pypy-3.7", "3.6", "3.7", "3.8", "3.9", "3.10-dev"] architecture: ["x86", "x64"] include: - architecture: "x86" @@ -19,7 +19,9 @@ jobs: platform-msbuild: "x64" exclude: # PyPy does not support 64-bit on Windows - - python-version: "pypy3" + - python-version: "pypy-3.6" + architecture: "x64" + - python-version: "pypy-3.7" architecture: "x64" timeout-minutes: 30 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 51ce9d085..305ad7ba8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,8 @@ jobs: "macOS-latest", ] python-version: [ - "pypy3", + "pypy-3.7", + "pypy-3.6", "3.10-dev", "3.9", "3.8", From 043d8dac0b5259d73036f8f49aecfafc439f6244 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 Dec 2020 23:42:16 +1100 Subject: [PATCH 091/750] Do not require packaging just for a DeprecationWarning --- src/PIL/ImageFont.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 78f8d8cde..c48d89835 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -31,8 +31,6 @@ import sys import warnings from io import BytesIO -from packaging.version import parse as parse_version - from . import Image, features from ._util import isDirectory, isPath @@ -167,14 +165,20 @@ class FreeTypeFont: self.index = index self.encoding = encoding - freetype_version = parse_version(features.version_module("freetype2")) - if freetype_version < parse_version("2.8"): - warnings.warn( - "Support for FreeType 2.7 is deprecated and will be removed in Pillow " - "9 (2022-01-02). Please upgrade to FreeType 2.8 or newer, preferably " - "FreeType 2.10.4 which fixes CVE-2020-15999.", - DeprecationWarning, - ) + try: + from packaging.version import parse as parse_version + except ImportError: + pass + else: + freetype_version = parse_version(features.version_module("freetype2")) + if freetype_version < parse_version("2.8"): + warnings.warn( + "Support for FreeType 2.7 is deprecated and will be removed" + " in Pillow 9 (2022-01-02). Please upgrade to FreeType 2.8 " + "or newer, preferably FreeType 2.10.4 which fixes " + "CVE-2020-15999.", + DeprecationWarning, + ) if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): layout_engine = LAYOUT_BASIC From 2b319f2ce45586aeb5cbfd7ed16d81c3b62bf0a4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 18 Dec 2020 11:12:04 +0200 Subject: [PATCH 092/750] Simplify: remove class --- Tests/test_imagepath.py | 118 ++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py index 7cc89ae39..01862f750 100644 --- a/Tests/test_imagepath.py +++ b/Tests/test_imagepath.py @@ -6,75 +6,75 @@ import pytest from PIL import Image, ImagePath -class TestImagePath: - def test_path(self): +def test_path(): - p = ImagePath.Path(list(range(10))) + p = ImagePath.Path(list(range(10))) - # sequence interface - assert len(p) == 5 - assert p[0] == (0.0, 1.0) - assert p[-1] == (8.0, 9.0) - assert list(p[:1]) == [(0.0, 1.0)] - with pytest.raises(TypeError) as cm: - p["foo"] - assert str(cm.value) == "Path indices must be integers, not str" - assert list(p) == [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)] + # sequence interface + assert len(p) == 5 + assert p[0] == (0.0, 1.0) + assert p[-1] == (8.0, 9.0) + assert list(p[:1]) == [(0.0, 1.0)] + with pytest.raises(TypeError) as cm: + p["foo"] + assert str(cm.value) == "Path indices must be integers, not str" + assert list(p) == [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)] - # method sanity check - assert p.tolist() == [ - (0.0, 1.0), - (2.0, 3.0), - (4.0, 5.0), - (6.0, 7.0), - (8.0, 9.0), - ] - assert p.tolist(1) == [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] + # method sanity check + assert p.tolist() == [ + (0.0, 1.0), + (2.0, 3.0), + (4.0, 5.0), + (6.0, 7.0), + (8.0, 9.0), + ] + assert p.tolist(1) == [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] - assert p.getbbox() == (0.0, 1.0, 8.0, 9.0) + assert p.getbbox() == (0.0, 1.0, 8.0, 9.0) - assert p.compact(5) == 2 - assert list(p) == [(0.0, 1.0), (4.0, 5.0), (8.0, 9.0)] + assert p.compact(5) == 2 + assert list(p) == [(0.0, 1.0), (4.0, 5.0), (8.0, 9.0)] - p.transform((1, 0, 1, 0, 1, 1)) - assert list(p) == [(1.0, 2.0), (5.0, 6.0), (9.0, 10.0)] + p.transform((1, 0, 1, 0, 1, 1)) + assert list(p) == [(1.0, 2.0), (5.0, 6.0), (9.0, 10.0)] - # alternative constructors - p = ImagePath.Path([0, 1]) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path([0.0, 1.0]) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path([0, 1]) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path([(0, 1)]) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path(p) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path(p.tolist(0)) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path(p.tolist(1)) - assert list(p) == [(0.0, 1.0)] - p = ImagePath.Path(array.array("f", [0, 1])) - assert list(p) == [(0.0, 1.0)] + # alternative constructors + p = ImagePath.Path([0, 1]) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path([0.0, 1.0]) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path([0, 1]) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path([(0, 1)]) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path(p) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path(p.tolist(0)) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path(p.tolist(1)) + assert list(p) == [(0.0, 1.0)] + p = ImagePath.Path(array.array("f", [0, 1])) + assert list(p) == [(0.0, 1.0)] - arr = array.array("f", [0, 1]) - if hasattr(arr, "tobytes"): - p = ImagePath.Path(arr.tobytes()) - else: - p = ImagePath.Path(arr.tostring()) - assert list(p) == [(0.0, 1.0)] + arr = array.array("f", [0, 1]) + if hasattr(arr, "tobytes"): + p = ImagePath.Path(arr.tobytes()) + else: + p = ImagePath.Path(arr.tostring()) + assert list(p) == [(0.0, 1.0)] - def test_overflow_segfault(self): - # Some Pythons fail getting the argument as an integer, and it falls - # through to the sequence. Seeing this on 32-bit Windows. - with pytest.raises((TypeError, MemoryError)): - # post patch, this fails with a memory error - x = evil() - # This fails due to the invalid malloc above, - # and segfaults - for i in range(200000): - x[i] = b"0" * 16 +def test_overflow_segfault(): + # Some Pythons fail getting the argument as an integer, and it falls + # through to the sequence. Seeing this on 32-bit Windows. + with pytest.raises((TypeError, MemoryError)): + # post patch, this fails with a memory error + x = evil() + + # This fails due to the invalid malloc above, + # and segfaults + for i in range(200000): + x[i] = b"0" * 16 class evil: From ceaed2e058c8239237fe1ae1920d30f277a804f8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 18 Dec 2020 22:09:44 +0200 Subject: [PATCH 093/750] Add tests for ImagePath.Path --- Tests/test_imagepath.py | 101 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py index 01862f750..0835fdb43 100644 --- a/Tests/test_imagepath.py +++ b/Tests/test_imagepath.py @@ -1,4 +1,5 @@ import array +import math import struct import pytest @@ -64,6 +65,106 @@ def test_path(): assert list(p) == [(0.0, 1.0)] +def test_invalid_coords(): + # Arrange + coords = ["a", "b"] + + # Act / Assert + with pytest.raises(SystemError): + ImagePath.Path(coords) + + +def test_path_odd_number_of_coordinates(): + # Arrange + coords = [0] + + # Act / Assert + with pytest.raises(ValueError) as e: + ImagePath.Path(coords) + + assert str(e.value) == "wrong number of coordinates" + + +@pytest.mark.parametrize( + "coords, expected", + [ + ([0, 1, 2, 3], (0.0, 1.0, 2.0, 3.0)), + ([3, 2, 1, 0], (1.0, 0.0, 3.0, 2.0)), + ], +) +def test_getbbox(coords, expected): + # Arrange + p = ImagePath.Path(coords) + + # Act / Assert + assert p.getbbox() == expected + + +def test_getbbox_no_args(): + # Arrange + p = ImagePath.Path([0, 1, 2, 3]) + + # Act / Assert + with pytest.raises(TypeError): + p.getbbox(1) + + +@pytest.mark.parametrize( + "coords, expected", + [ + (0, []), + (list(range(6)), [(0.0, 3.0), (4.0, 9.0), (8.0, 15.0)]), + ], +) +def test_map(coords, expected): + # Arrange + p = ImagePath.Path(coords) + + # Act + # Modifies the path in-place + p.map(lambda x, y: (x * 2, y * 3)) + + # Assert + assert list(p) == expected + + +def test_transform(): + # Arrange + p = ImagePath.Path([0, 1, 2, 3]) + theta = math.pi / 15 + + # Act + # Affine transform, in-place + p.transform( + (math.cos(theta), math.sin(theta), 20, -math.sin(theta), math.cos(theta), 20), + ) + + # Assert + assert p.tolist() == [ + (20.20791169081776, 20.978147600733806), + (22.58003027392089, 22.518619420565898), + ] + + +def test_transform_with_wrap(): + # Arrange + p = ImagePath.Path([0, 1, 2, 3]) + theta = math.pi / 15 + + # Act + # Affine transform, in-place, with wrap parameter + p.transform( + (math.cos(theta), math.sin(theta), 20, -math.sin(theta), math.cos(theta), 20), + 1.0, + ) + + # Assert + assert p.tolist() == [ + (0.20791169081775962, 20.978147600733806), + (0.5800302739208902, 22.518619420565898), + ] + + def test_overflow_segfault(): # Some Pythons fail getting the argument as an integer, and it falls # through to the sequence. Seeing this on 32-bit Windows. From 162fbc679bca8c65bf575758e7f5c5880457611f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 Dec 2020 23:28:57 +1100 Subject: [PATCH 094/750] Added packaging --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 9758f91fd..89db88ad4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,7 @@ jarn.viewdoc olefile pycodestyle pyflakes +packaging pyroma pytest pytest-cov From d3702fd6143d3739e6d7725ca8cf82650e048942 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 21 Nov 2020 13:43:44 +0200 Subject: [PATCH 095/750] Remove unused Travis CI config --- .ci/after_success.sh | 6 ------ .ci/install.sh | 6 +----- .ci/test.sh | 5 ----- depends/diffcover-install.sh | 8 -------- depends/diffcover-run.sh | 5 ----- requirements.txt | 2 -- 6 files changed, 1 insertion(+), 31 deletions(-) delete mode 100755 depends/diffcover-install.sh delete mode 100755 depends/diffcover-run.sh diff --git a/.ci/after_success.sh b/.ci/after_success.sh index 762670f10..01889607b 100755 --- a/.ci/after_success.sh +++ b/.ci/after_success.sh @@ -11,9 +11,3 @@ fi if [[ $TRAVIS ]]; then codecov --flags TravisCI fi - -if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ]; then - # Coverage and quality reports on just the latest diff. - depends/diffcover-install.sh - depends/diffcover-run.sh -fi diff --git a/.ci/install.sh b/.ci/install.sh index db259bdca..3e1d64e34 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -34,10 +34,9 @@ python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi -# TODO Remove when 3.8 / 3.9 / PyPy3 includes setuptools 49.3.2+: +# TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi -if [ "$TRAVIS_PYTHON_VERSION" == "pypy3.6-7.3.1" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi # PyQt5 doesn't support PyPy3 # Wheel doesn't yet support 3.10 @@ -48,9 +47,6 @@ if [[ $GHA_PYTHON_VERSION == 3.* && $GHA_PYTHON_VERSION != "3.10-dev" ]]; then python3 -m pip install pyqt5 fi -# docs only on Python 3.9 -if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -r requirements.txt ; fi - # webp pushd depends && ./install_webp.sh && popd diff --git a/.ci/test.sh b/.ci/test.sh index 1396445e0..5a19ec9b4 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -3,8 +3,3 @@ set -e python -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests - -# Docs -if [ "$TRAVIS_PYTHON_VERSION" == "3.9" ] && [ "$TRAVIS_CPU_ARCH" == "amd64" ]; then - make doccheck -fi diff --git a/depends/diffcover-install.sh b/depends/diffcover-install.sh deleted file mode 100755 index 18be4f9f9..000000000 --- a/depends/diffcover-install.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# Fetch the remote master branch before running diff-cover on Travis CI. -# https://github.com/Bachmann1234/diff-cover#troubleshooting -git fetch origin master:refs/remotes/origin/master - -# CFLAGS=-O0 means build with no optimisation. -# Makes build much quicker for lxml and other dependencies. -time CFLAGS=-O0 python3 -m pip install diff_cover diff --git a/depends/diffcover-run.sh b/depends/diffcover-run.sh deleted file mode 100755 index b007494e9..000000000 --- a/depends/diffcover-run.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -coverage xml -diff-cover coverage.xml -diff-quality --violation=pyflakes -diff-quality --violation=pycodestyle diff --git a/requirements.txt b/requirements.txt index 9758f91fd..ea57e863b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,6 @@ check-manifest coverage jarn.viewdoc olefile -pycodestyle -pyflakes pyroma pytest pytest-cov From 9e21ef7338cdf5e09aab3dcadea80988863c931d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 14 Dec 2020 20:35:04 +0200 Subject: [PATCH 096/750] Remove old Travis CI config --- .ci/after_success.sh | 4 ---- .ci/install.sh | 2 -- .github/CONTRIBUTING.md | 4 ++-- .github/mergify.yml | 1 - README.md | 15 ++++++--------- RELEASING.md | 4 ++-- Tests/bench_cffi_access.py | 2 +- depends/README.rst | 4 ++-- docs/about.rst | 6 +++--- docs/index.rst | 20 ++++++++------------ 10 files changed, 24 insertions(+), 38 deletions(-) diff --git a/.ci/after_success.sh b/.ci/after_success.sh index 01889607b..ff91b481e 100755 --- a/.ci/after_success.sh +++ b/.ci/after_success.sh @@ -7,7 +7,3 @@ if [[ $MATRIX_DOCKER ]]; then else coverage xml fi - -if [[ $TRAVIS ]]; then - codecov --flags TravisCI -fi diff --git a/.ci/install.sh b/.ci/install.sh index 3e1d64e34..9372d0c51 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -21,8 +21,6 @@ sudo apt-get -qq install libfreetype6-dev liblcms2-dev python3-tk\ ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\ cmake imagemagick libharfbuzz-dev libfribidi-dev -if [[ $TRAVIS_CPU_ARCH == "s390x" ]]; then sudo chown $USER ~/.cache/pip/wheels ; fi - python3 -m pip install --upgrade pip PYTHONOPTIMIZE=0 python3 -m pip install cffi python3 -m pip install coverage diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a65487d5e..e20296da5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Fork the Pillow repository. - Create a branch from master. - Develop bug fixes, features, tests, etc. -- Run the test suite. You can enable [Travis CI](https://travis-ci.com/account/repositories) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. +- Run the test suite. You can enable [GitHub Actions](http://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. - Create a pull request to pull the changes from your branch to the Pillow master. ### Guidelines @@ -17,7 +17,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Separate code commits from reformatting commits. - Provide tests for any newly added code. - Follow PEP 8. -- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on Travis CI and AppVeyor. +- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on AppVeyor. ## Reporting Issues diff --git a/.github/mergify.yml b/.github/mergify.yml index b37db48d4..4b8b113d3 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -7,7 +7,6 @@ pull_request_rules: - status-success=Test Successful - status-success=Docker Test Successful - status-success=Windows Test Successful -# - status-success=Travis CI - Pull Request - status-success=continuous-integration/appveyor/pr actions: merge: diff --git a/README.md b/README.md index 6c323413d..0408f4c28 100644 --- a/README.md +++ b/README.md @@ -24,15 +24,6 @@ As of 2019, Pillow development is tests - Travis CI build status (Linux) - Travis CI build status (macOS) - AppVeyor CI build status (Windows) GitHub Actions build status (Lint) @@ -45,6 +36,12 @@ As of 2019, Pillow development is GitHub Actions build status (Test Docker) + AppVeyor CI build status (Windows) + Travis CI build status (macOS) Code coverage diff --git a/RELEASING.md b/RELEASING.md index 5e00e5724..b3845d090 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -6,7 +6,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in `master` branch. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.com/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. * [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Update `CHANGES.rst`. @@ -41,7 +41,7 @@ Released as needed for security, installation or critical bug fixes. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions), [Travis CI](https://travis-ci.com/github/python-pillow/Pillow) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`. +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in release branch e.g. `5.2.x`. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Run pre-release check via `make release-test`. * [ ] Create tag for release e.g.: diff --git a/Tests/bench_cffi_access.py b/Tests/bench_cffi_access.py index f9edcf09a..87cad699d 100644 --- a/Tests/bench_cffi_access.py +++ b/Tests/bench_cffi_access.py @@ -4,7 +4,7 @@ from PIL import PyAccess from .helper import hopper -# Not running this test by default. No DOS against Travis CI. +# Not running this test by default. No DOS against CI. def iterate_get(size, access): diff --git a/depends/README.rst b/depends/README.rst index ce88fa47b..b69c9dcbf 100644 --- a/depends/README.rst +++ b/depends/README.rst @@ -3,7 +3,7 @@ Depends ``install_openjpeg.sh``, ``install_webp.sh``, ``install_imagequant.sh``, ``install_raqm.sh`` and ``install_raqm_cmake.sh`` can be used to download, -build & install non-packaged dependencies; useful for testing with Travis CI. +build & install non-packaged dependencies; useful for testing on CI. ``install_extra_test_images.sh`` can be used to install additional test images -that are used for Travis CI and AppVeyor. +that are used by CI. diff --git a/docs/about.rst b/docs/about.rst index acd361fa8..51b583ea0 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -6,13 +6,13 @@ Goals The fork author's goal is to foster and support active development of PIL through: -- Continuous integration testing via `Travis CI`_, `AppVeyor`_ and `GitHub Actions`_ +- Continuous integration testing via `GitHub Actions`_, `AppVeyor`_ and `Travis CI`_ - Publicized development activity on `GitHub`_ - Regular releases to the `Python Package Index`_ -.. _Travis CI: https://travis-ci.com/github/python-pillow/Pillow -.. _AppVeyor: https://ci.appveyor.com/project/Python-pillow/pillow .. _GitHub Actions: https://github.com/python-pillow/Pillow/actions +.. _AppVeyor: https://ci.appveyor.com/project/Python-pillow/pillow +.. _Travis CI: https://travis-ci.com/github/python-pillow/pillow-wheels .. _GitHub: https://github.com/python-pillow/Pillow .. _Python Package Index: https://pypi.org/project/Pillow/ diff --git a/docs/index.rst b/docs/index.rst index eafcb1fec..d2aca4bc4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,18 +9,6 @@ Pillow for enterprise is available via the Tidelift Subscription. `Learn more Date: Fri, 18 Dec 2020 18:51:13 +1100 Subject: [PATCH 097/750] GitHub Actions have been added to wheels [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index b3845d090..db7b22445 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,7 +7,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in `master` branch. * [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch. -* [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI. +* [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI and GitHub Actions. * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py` * [ ] Update `CHANGES.rst`. * [ ] Run pre-release check via `make release-test` in a freshly cloned repo. From b0af0d4076a47ae9612c0d8e946e9ae14e9c4aef Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 Dec 2020 19:27:22 +1100 Subject: [PATCH 098/750] Travis CI is no longer used --- Tests/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index d76389621..be3bdb76f 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -270,7 +270,7 @@ def on_github_actions(): def on_ci(): - # GitHub Actions, Travis and AppVeyor have "CI" + # GitHub Actions and AppVeyor have "CI" return "CI" in os.environ From 924b1496c3618f91aeb9875f7294fb526f8c4d6f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 18 Dec 2020 12:37:24 +0200 Subject: [PATCH 099/750] Show example link instead of hiding inside hyperlink Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e20296da5..563fcda6a 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -9,7 +9,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Fork the Pillow repository. - Create a branch from master. - Develop bug fixes, features, tests, etc. -- Run the test suite. You can enable [GitHub Actions](http://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. +- Run the test suite. You can enable GitHub Actions (https://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests. - Create a pull request to pull the changes from your branch to the Pillow master. ### Guidelines From 7673cb7549e5071d39e76419204c56b0f07199bb Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 14:57:55 -0800 Subject: [PATCH 100/750] Fix dereferencing potential null pointer --- src/_imaging.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/_imaging.c b/src/_imaging.c index 3635d2afa..53a03fc88 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3180,6 +3180,10 @@ _draw_polygon(ImagingDrawObject* self, PyObject* args) /* Copy list of vertices to array */ ixy = (int*) calloc(n, 2 * sizeof(int)); + if (ixy == NULL) { + free(xy); + return NULL; + } for (i = 0; i < n; i++) { ixy[i+i] = (int) xy[i+i]; From c1adae6f7010c514331f1ca0f589f96ead3e04fa Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 15:07:51 -0800 Subject: [PATCH 101/750] Remove duplicate code --- src/_imagingcms.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/_imagingcms.c b/src/_imagingcms.c index 5693ccbab..491866f74 100644 --- a/src/_imagingcms.c +++ b/src/_imagingcms.c @@ -1147,10 +1147,6 @@ cms_profile_getattr_media_white_point_temperature(CmsProfileObject *self, void* } XYZ = (cmsCIEXYZ*) cmsReadTag(self->profile, info); - if (!XYZ) { - Py_INCREF(Py_None); - return Py_None; - } if (XYZ == NULL || XYZ->X == 0) { Py_INCREF(Py_None); return Py_None; @@ -1499,8 +1495,6 @@ setup_module(PyObject* m) { PyObject *v; int vn; - d = PyModule_GetDict(m); - CmsProfile_Type.tp_new = PyType_GenericNew; /* Ready object types */ From 2f48b036aded11467fcef1b9d22f14748f1b8d88 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 19 Dec 2020 15:10:47 -0800 Subject: [PATCH 102/750] =?UTF-8?q?Update=20isort=20URL:=20timothycrosley/?= =?UTF-8?q?isort=20=E2=86=92=20PyCQA/isort?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 459251d77..8d38375f0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ repos: files: \.py$ types: [] - - repo: https://github.com/timothycrosley/isort + - repo: https://github.com/PyCQA/isort rev: 377d260ffa6f746693f97b46d95025afc4bd8275 # frozen: 5.4.2 hooks: - id: isort From fd4b0609efbbc5d2135c1169fda2567bc6c90899 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 15:58:25 -0800 Subject: [PATCH 103/750] Fix dereferencing of potential null pointers --- src/libImaging/Histo.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 050c2840f..66d696a2a 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -29,10 +29,12 @@ void ImagingHistogramDelete(ImagingHistogram h) { - if (h->histogram) { - free(h->histogram); + if (h) { + if (h->histogram) { + free(h->histogram); + } + free(h); } - free(h); } ImagingHistogram @@ -42,11 +44,18 @@ ImagingHistogramNew(Imaging im) /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); + if (h == NULL) { + return NULL; + } strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH-1); h->mode[IMAGING_MODE_LENGTH-1] = 0; h->bands = im->bands; h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); + if (h->histogram == NULL) { + free(h); + return NULL; + } return h; } @@ -75,6 +84,9 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) } h = ImagingHistogramNew(im); + if (h == NULL) { + return NULL; + } if (imMask) { /* mask */ From 5474b2c7d46543e918adeeeddbef4374eb5102fe Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 19 Dec 2020 17:55:54 -0800 Subject: [PATCH 104/750] Update some doc code blocks to the 'pycon' lexer These code blocks represent Python console sessions, not Python source code. The pycon lexer understands the ">>>" prompt and output (e.g. a traceback). --- docs/releasenotes/7.1.1.rst | 2 +- docs/releasenotes/7.1.2.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/7.1.1.rst b/docs/releasenotes/7.1.1.rst index 4c33adf8e..2169e6a05 100644 --- a/docs/releasenotes/7.1.1.rst +++ b/docs/releasenotes/7.1.1.rst @@ -7,7 +7,7 @@ Fix regression seeking PNG files This fixes a regression introduced in 7.1.0 when adding support for APNG files when calling ``seek`` and ``tell``: -.. code-block:: python +.. code-block:: pycon >>> from PIL import Image >>> with Image.open("Tests/images/hopper.png") as im: diff --git a/docs/releasenotes/7.1.2.rst b/docs/releasenotes/7.1.2.rst index c9d0d54eb..b12d84e33 100644 --- a/docs/releasenotes/7.1.2.rst +++ b/docs/releasenotes/7.1.2.rst @@ -9,7 +9,7 @@ This fixes a regression introduced in 7.1.0 when adding support for APNG files. When calling ``seek(n)`` on a regular PNG where ``n > 0``, it failed to raise an ``EOFError`` as it should have done, resulting in: -.. code-block:: python +.. code-block:: pycon AttributeError: 'NoneType' object has no attribute 'read' From 75542fea6da91154f39971b32f08d3ac5b389c90 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 20 Dec 2020 13:00:10 +1100 Subject: [PATCH 105/750] Replaced PyErr_NoMemory with ImagingError_MemoryError --- src/_imaging.c | 6 +++--- src/decode.c | 6 +++--- src/encode.c | 16 ++++++++-------- src/path.c | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 3635d2afa..d81191b97 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -377,7 +377,7 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) calloc checks for overflow */ list = calloc(n, type & 0xff); if ( ! list) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } seq = PySequence_Fast(arg, must_be_sequence); @@ -789,7 +789,7 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) if (free_table_data) { free(table_data); } - return (INT16*) PyErr_NoMemory(); + return (INT16*) ImagingError_MemoryError(); } for (i = 0; i < table_size; i++) { @@ -2234,7 +2234,7 @@ _getprojection(ImagingObject* self, PyObject* args) if (xprofile == NULL || yprofile == NULL) { free(xprofile); free(yprofile); - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } ImagingGetProjection(self->image, (unsigned char *)xprofile, (unsigned char *)yprofile); diff --git a/src/decode.c b/src/decode.c index 0ce381aa1..5c57fea5d 100644 --- a/src/decode.c +++ b/src/decode.c @@ -80,7 +80,7 @@ PyImaging_DecoderNew(int contextsize) context = (void*) calloc(1, contextsize); if (!context) { Py_DECREF(decoder); - (void) PyErr_NoMemory(); + (void) ImagingError_MemoryError(); return NULL; } } else { @@ -204,14 +204,14 @@ _setimage(ImagingDecoderObject* decoder, PyObject* args) if (state->bits > 0) { if (!state->bytes) { if (state->xsize > ((INT_MAX / state->bits)-7)){ - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } state->bytes = (state->bits * state->xsize+7)/8; } /* malloc check ok, overflow checked above */ state->buffer = (UINT8*) malloc(state->bytes); if (!state->buffer) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } } diff --git a/src/encode.c b/src/encode.c index 41f28722c..d3e15fcd2 100644 --- a/src/encode.c +++ b/src/encode.c @@ -72,7 +72,7 @@ PyImaging_EncoderNew(int contextsize) context = (void*) calloc(1, contextsize); if (!context) { Py_DECREF(encoder); - (void) PyErr_NoMemory(); + (void) ImagingError_MemoryError(); return NULL; } } else { @@ -194,7 +194,7 @@ _encode_to_file(ImagingEncoderObject* encoder, PyObject* args) /* malloc check ok, either constant int, or checked by PyArg_ParseTuple */ buf = (UINT8*) malloc(bufsize); if (!buf) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } ImagingSectionEnter(&cookie); @@ -271,13 +271,13 @@ _setimage(ImagingEncoderObject* encoder, PyObject* args) /* Allocate memory buffer (if bits field is set) */ if (state->bits > 0) { if (state->xsize > ((INT_MAX / state->bits)-7)) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } state->bytes = (state->bits * state->xsize+7)/8; /* malloc check ok, overflow checked above */ state->buffer = (UINT8*) malloc(state->bytes); if (!state->buffer) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } } @@ -604,7 +604,7 @@ PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, size comes from PyArg_ParseTuple */ char* p = malloc(dictionary_size); if (!p) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } memcpy(p, dictionary, dictionary_size); dictionary = p; @@ -1005,7 +1005,7 @@ static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); if (!qarrays) { Py_DECREF(tables); - PyErr_NoMemory(); + ImagingError_MemoryError(); return NULL; } for (i = 0; i < num_tables; i++) { @@ -1091,7 +1091,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, length is from python parsearg */ char* p = malloc(extra_size); // Freed in JpegEncode, Case 5 if (!p) { - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } memcpy(p, extra, extra_size); extra = p; @@ -1106,7 +1106,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) if (extra) { free(extra); } - return PyErr_NoMemory(); + return ImagingError_MemoryError(); } memcpy(pp, rawExif, rawExifLen); rawExif = pp; diff --git a/src/path.c b/src/path.c index 8eba81aa4..fb72d1a68 100644 --- a/src/path.c +++ b/src/path.c @@ -53,16 +53,16 @@ alloc_array(Py_ssize_t count) { double* xy; if (count < 0) { - PyErr_NoMemory(); + ImagingError_MemoryError(); return NULL; } if ((unsigned long long)count > (SIZE_MAX / (2 * sizeof(double))) - 1 ) { - PyErr_NoMemory(); + ImagingError_MemoryError(); return NULL; } xy = malloc(2 * count * sizeof(double) + 1); if (!xy) { - PyErr_NoMemory(); + ImagingError_MemoryError(); } return xy; } From b7fb39fff817d25739aa4ef1ba5b2c10089858ae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 20 Dec 2020 12:28:52 +1100 Subject: [PATCH 106/750] Use ImagingError_MemoryError NULL return value --- src/_imaging.c | 6 ++---- src/encode.c | 3 +-- src/path.c | 6 ++---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index d81191b97..d4d392d9b 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2711,8 +2711,7 @@ _font_getmask(ImagingFontObject* self, PyObject* args) im = ImagingNew(self->bitmap->mode, textwidth(self, text), self->ysize); if (!im) { free(text); - ImagingError_MemoryError(); - return NULL; + return ImagingError_MemoryError(); } b = 0; @@ -3933,8 +3932,7 @@ _set_blocks_max(PyObject* self, PyObject* args) if ( ! ImagingMemorySetBlocksMax(&ImagingDefaultArena, blocks_max)) { - ImagingError_MemoryError(); - return NULL; + return ImagingError_MemoryError(); } Py_INCREF(Py_None); diff --git a/src/encode.c b/src/encode.c index d3e15fcd2..57ce42734 100644 --- a/src/encode.c +++ b/src/encode.c @@ -1005,8 +1005,7 @@ static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); if (!qarrays) { Py_DECREF(tables); - ImagingError_MemoryError(); - return NULL; + return ImagingError_MemoryError(); } for (i = 0; i < num_tables; i++) { table = PySequence_Fast_GET_ITEM(tables, i); diff --git a/src/path.c b/src/path.c index fb72d1a68..62e7e15b5 100644 --- a/src/path.c +++ b/src/path.c @@ -53,12 +53,10 @@ alloc_array(Py_ssize_t count) { double* xy; if (count < 0) { - ImagingError_MemoryError(); - return NULL; + return ImagingError_MemoryError(); } if ((unsigned long long)count > (SIZE_MAX / (2 * sizeof(double))) - 1 ) { - ImagingError_MemoryError(); - return NULL; + return ImagingError_MemoryError(); } xy = malloc(2 * count * sizeof(double) + 1); if (!xy) { From 15dd7aef9f0e585d8cbcb36c4ff42cf7d996d529 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 19:35:21 -0800 Subject: [PATCH 107/750] Return ImagingError_MemoryError --- src/libImaging/Histo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 66d696a2a..5ef72e6d3 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -54,7 +54,7 @@ ImagingHistogramNew(Imaging im) h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); if (h->histogram == NULL) { free(h); - return NULL; + return (ImagingHistogram) ImagingError_MemoryError(); } return h; From fd14616dbbe12f477bcd695552659aad949b56eb Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 19:37:05 -0800 Subject: [PATCH 108/750] Return ImagingError_MemoryError --- src/libImaging/Histo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 5ef72e6d3..923fa28d5 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -45,7 +45,7 @@ ImagingHistogramNew(Imaging im) /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); if (h == NULL) { - return NULL; + return (ImagingHistogram) ImagingError_MemoryError(); } strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH-1); h->mode[IMAGING_MODE_LENGTH-1] = 0; From d1e706d75641b6900a632801f58e6db8400be9d5 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Sat, 19 Dec 2020 19:42:29 -0800 Subject: [PATCH 109/750] return ImagingError_MemoryError --- src/_imaging.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_imaging.c b/src/_imaging.c index 53a03fc88..ca4c017d5 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3182,7 +3182,7 @@ _draw_polygon(ImagingDrawObject* self, PyObject* args) ixy = (int*) calloc(n, 2 * sizeof(int)); if (ixy == NULL) { free(xy); - return NULL; + return ImagingError_MemoryError(); } for (i = 0; i < n; i++) { From 889409ded385b40187af7e6aa5c9018e0ef63b70 Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Sun, 20 Dec 2020 22:31:25 +0800 Subject: [PATCH 110/750] =?UTF-8?q?Fix=20use=20of=C2=A0a=C2=A0versus=C2=A0?= =?UTF-8?q?an=20in=20ImageCms.rst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit an color -> a color --- docs/reference/ImageCms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageCms.rst b/docs/reference/ImageCms.rst index 8fed4d092..f938e63a0 100644 --- a/docs/reference/ImageCms.rst +++ b/docs/reference/ImageCms.rst @@ -200,7 +200,7 @@ can be easily displayed in a chromaticity diagram, for example). The chromatic adaption matrix converts a color measured using the actual illumination conditions and relative to the actual adopted - white, to an color relative to the PCS adopted white, with + white, to a color relative to the PCS adopted white, with complete adaptation from the actual adopted white chromaticity to the PCS adopted white chromaticity (see 9.2.15 of ICC.1:2010). From 0a1dcfc55a0f1f94115a5708c51867268b9636b7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Dec 2020 09:10:19 +1100 Subject: [PATCH 111/750] Fix 3rd level menu item background-color in dark mode [ci skip] --- docs/resources/css/dark.css | 1 + docs/resources/css/light.css | 1 + docs/resources/js/script.js | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/resources/css/dark.css b/docs/resources/css/dark.css index 2ed958429..cc213d674 100644 --- a/docs/resources/css/dark.css +++ b/docs/resources/css/dark.css @@ -1196,6 +1196,7 @@ color: rgb(166, 158, 146); } + .wy-menu-vertical li.toctree-l2.current a, .wy-menu-vertical li.toctree-l3.current a { background-color: #363636; } diff --git a/docs/resources/css/light.css b/docs/resources/css/light.css index ae3debc91..04edd7b16 100644 --- a/docs/resources/css/light.css +++ b/docs/resources/css/light.css @@ -1,5 +1,6 @@ @media (prefers-color-scheme: light) { + .wy-menu-vertical li.toctree-l2.current a, .wy-menu-vertical li.toctree-l3.current a { background-color: #c9c9c9; } diff --git a/docs/resources/js/script.js b/docs/resources/js/script.js index d58571d6d..5cb6494ea 100644 --- a/docs/resources/js/script.js +++ b/docs/resources/js/script.js @@ -24,7 +24,6 @@ jQuery(document).ready(function ($) { var $upperA = $sidebarItem.parent().children('a'); var $upperAParent = $upperA.parent(); if ($upperAParent.hasClass('toctree-l2')) { - $a.css('background-color', '#c9c9c9'); $a.css('padding-left', '4em'); } else if ($upperAParent.hasClass('toctree-l3')) { if (!$upperA.find('.toctree-expand').length) { From c44457a627f4aa698827a8349659588c47b907a6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Dec 2020 17:14:52 +1100 Subject: [PATCH 112/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e009c9508..8898ae10d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Deprecate FreeType 2.7 #5098 + [hugovk, radarhere] + - Moved warning to end of execution #4965 [radarhere] From 967d214a5cdfce36e3fab7ea6e3298749faec424 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Dec 2020 17:45:43 +1100 Subject: [PATCH 113/750] Added versioning documentation [ci skip] --- RELEASING.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/RELEASING.md b/RELEASING.md index db7b22445..4368792e6 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,3 +1,28 @@ +# Versioning + +Pillow follows Semantic Versioning. From https://semver.org/: + +> Given a version number MAJOR.MINOR.PATCH, increment the: +> 1. MAJOR version when you make incompatible API changes, +> 2. MINOR version when you add functionality in a backwards compatible manner, and +> 3. PATCH version when you make backwards compatible bug fixes. + +Quarterly releases (referred to as "Main Release" in the checklist below) bump at +least the MINOR version, as new functionality has likely been added in the prior three +months. + +A quarterly release bumps the MAJOR version when make incompatible API changes are +made, such as removing deprecated APIs or dropping an EOL Python version. In practice, +these occur every 12-18 months, guided by Python's EOL schedule, and any APIs that have +been deprecated for at least a year are removed at the same time. + +PATCH versions ("Point Release" or "Embargoed Release" in the checklist below) are for +security, installation or critical bug fixes. These are less common as it is preferred +to stick to quarterly releases. + +Between quarterly releases, ".dev0" is appended to the version, indicating that this is +not a formally released copy. + # Release Checklist ## Main Release From 35834535cbf9c42f7dc454e86f6a0056d74e8e00 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 21 Dec 2020 19:17:31 +1100 Subject: [PATCH 114/750] Fixed wording [ci skip] Co-authored-by: Hugo van Kemenade --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 4368792e6..01faa76ec 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -11,7 +11,7 @@ Quarterly releases (referred to as "Main Release" in the checklist below) bump a least the MINOR version, as new functionality has likely been added in the prior three months. -A quarterly release bumps the MAJOR version when make incompatible API changes are +A quarterly release bumps the MAJOR version when incompatible API changes are made, such as removing deprecated APIs or dropping an EOL Python version. In practice, these occur every 12-18 months, guided by Python's EOL schedule, and any APIs that have been deprecated for at least a year are removed at the same time. From cf26a10f32e82eee3a7220d4b289a3dd4d9907bb Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 21 Dec 2020 19:17:50 +1100 Subject: [PATCH 115/750] Added link [ci skip] Co-authored-by: Hugo van Kemenade --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 01faa76ec..9aac638c4 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -13,7 +13,7 @@ months. A quarterly release bumps the MAJOR version when incompatible API changes are made, such as removing deprecated APIs or dropping an EOL Python version. In practice, -these occur every 12-18 months, guided by Python's EOL schedule, and any APIs that have +these occur every 12-18 months, guided by [Python's EOL schedule](https://devguide.python.org/#status-of-python-branches), and any APIs that have been deprecated for at least a year are removed at the same time. PATCH versions ("Point Release" or "Embargoed Release" in the checklist below) are for From a0f8004aa6230830a0801357367df4493e96d250 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 21 Dec 2020 19:48:53 +1100 Subject: [PATCH 116/750] Specify branch [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 9aac638c4..5fe5a9b72 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -20,7 +20,7 @@ PATCH versions ("Point Release" or "Embargoed Release" in the checklist below) a security, installation or critical bug fixes. These are less common as it is preferred to stick to quarterly releases. -Between quarterly releases, ".dev0" is appended to the version, indicating that this is +Between quarterly releases, ".dev0" is appended to the `master` branch, indicating that this is not a formally released copy. # Release Checklist From d13a3ce7bfb836559830ae7d160c69690eec2d0f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Dec 2020 20:45:59 +1100 Subject: [PATCH 117/750] Moved "Versioning" into "Release Notes" --- RELEASING.md | 28 +++------------------------- docs/releasenotes/index.rst | 4 +++- docs/releasenotes/versioning.rst | 30 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 docs/releasenotes/versioning.rst diff --git a/RELEASING.md b/RELEASING.md index 5fe5a9b72..eb69f2699 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,30 +1,8 @@ -# Versioning - -Pillow follows Semantic Versioning. From https://semver.org/: - -> Given a version number MAJOR.MINOR.PATCH, increment the: -> 1. MAJOR version when you make incompatible API changes, -> 2. MINOR version when you add functionality in a backwards compatible manner, and -> 3. PATCH version when you make backwards compatible bug fixes. - -Quarterly releases (referred to as "Main Release" in the checklist below) bump at -least the MINOR version, as new functionality has likely been added in the prior three -months. - -A quarterly release bumps the MAJOR version when incompatible API changes are -made, such as removing deprecated APIs or dropping an EOL Python version. In practice, -these occur every 12-18 months, guided by [Python's EOL schedule](https://devguide.python.org/#status-of-python-branches), and any APIs that have -been deprecated for at least a year are removed at the same time. - -PATCH versions ("Point Release" or "Embargoed Release" in the checklist below) are for -security, installation or critical bug fixes. These are less common as it is preferred -to stick to quarterly releases. - -Between quarterly releases, ".dev0" is appended to the `master` branch, indicating that this is -not a formally released copy. - # Release Checklist +See https://pillow.readthedocs.io/en/stable/releasenotes/versioning.html for +information about how the version numbers line up with releases. + ## Main Release Released quarterly on January 2nd, April 1st, July 1st and October 15th. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 18d2d9576..cd73de814 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -3,7 +3,8 @@ Release Notes Pillow is released quarterly on January 2nd, April 1st, July 1st and October 15th. Patch releases are created if the latest release contains severe bugs, or if security -fixes are put together before a scheduled release. +fixes are put together before a scheduled release. See :ref:`versioning` for more +information. Please use the latest version of Pillow. Functionality and security fixes should not be expected to be backported to earlier versions. @@ -48,3 +49,4 @@ expected to be backported to earlier versions. 3.0.0 2.8.0 2.7.0 + versioning diff --git a/docs/releasenotes/versioning.rst b/docs/releasenotes/versioning.rst new file mode 100644 index 000000000..c69139600 --- /dev/null +++ b/docs/releasenotes/versioning.rst @@ -0,0 +1,30 @@ +.. _versioning: + +Versioning +========== + +Pillow follows Semantic Versioning. From https://semver.org/: + + Given a version number MAJOR.MINOR.PATCH, increment the: + + 1. MAJOR version when you make incompatible API changes, + 2. MINOR version when you add functionality in a backwards compatible manner, and + 3. PATCH version when you make backwards compatible bug fixes. + +Quarterly releases ("`Main Release `_") +bump at least the MINOR version, as new functionality has likely been added in the +prior three months. + +A quarterly release bumps the MAJOR version when incompatible API changes are +made, such as removing deprecated APIs or dropping an EOL Python version. In practice, +these occur every 12-18 months, guided by +`Python's EOL schedule `_, and +any APIs that have been deprecated for at least a year are removed at the same time. + +PATCH versions ("`Point Release `_" +or "`Embargoed Release `_") +are for security, installation or critical bug fixes. These are less common as it is +preferred to stick to quarterly releases. + +Between quarterly releases, ".dev0" is appended to the "master" branch, indicating that +this is not a formally released copy. From 47085d405756f80f3ec2c7841e30e90a3ba9c9cc Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 21 Dec 2020 12:30:26 +0200 Subject: [PATCH 118/750] Keep example consistent Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index ea6642ef4..a3653f5be 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -64,7 +64,7 @@ Released as needed for security, installation or critical bug fixes. * [ ] Check and upload all binaries and source distributions e.g.: ```bash twine check dist/* - twine upload dist/Pillow-5.2.0* + twine upload dist/Pillow-5.2.1* ``` * [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases) From 1777aada93f00aa09c906eb40e0c8bdfef6e0839 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 22 Dec 2020 07:38:56 +1100 Subject: [PATCH 119/750] Reformatted link [ci skip] Co-authored-by: Hugo van Kemenade --- docs/releasenotes/versioning.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/versioning.rst b/docs/releasenotes/versioning.rst index c69139600..1653bff3c 100644 --- a/docs/releasenotes/versioning.rst +++ b/docs/releasenotes/versioning.rst @@ -3,7 +3,7 @@ Versioning ========== -Pillow follows Semantic Versioning. From https://semver.org/: +Pillow follows [Semantic Versioning](https://semver.org/): Given a version number MAJOR.MINOR.PATCH, increment the: From 8794610c76f0ac040c9ac4d298aca7a65a70713a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Dec 2020 11:38:02 +1100 Subject: [PATCH 120/750] Block TIFFTAG_SUBIFD --- Tests/test_file_tiff.py | 10 +++++++++- src/PIL/TiffImagePlugin.py | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f644ef887..bb1bbda3e 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -4,7 +4,7 @@ from io import BytesIO import pytest from PIL import Image, TiffImagePlugin -from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION +from PIL.TiffImagePlugin import RESOLUTION_UNIT, SUBIFD, X_RESOLUTION, Y_RESOLUTION from .helper import ( assert_image_equal, @@ -161,6 +161,14 @@ class TestFileTiff: reloaded.load() assert (round(dpi), round(dpi)) == reloaded.info["dpi"] + def test_subifd(self, tmp_path): + outfile = str(tmp_path / "temp.tif") + with Image.open("Tests/images/g4_orientation_6.tif") as im: + im.tag_v2[SUBIFD] = 10000 + + # Should not segfault + im.save(outfile) + def test_save_setting_missing_resolution(self): b = BytesIO() Image.open("Tests/images/10ct_32bit_128.tiff").save( diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index bbfd28cc2..5480fcd85 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -89,6 +89,7 @@ ARTIST = 315 PREDICTOR = 317 COLORMAP = 320 TILEOFFSETS = 324 +SUBIFD = 330 EXTRASAMPLES = 338 SAMPLEFORMAT = 339 JPEGTABLES = 347 @@ -1559,12 +1560,14 @@ def _save(im, fp, filename): # The other tags expect arrays with a certain length (fixed or depending on # BITSPERSAMPLE, etc), passing arrays with a different length will result in # segfaults. Block these tags until we add extra validation. + # SUBIFD may also cause a segfault. blocklist = [ REFERENCEBLACKWHITE, SAMPLEFORMAT, STRIPBYTECOUNTS, STRIPOFFSETS, TRANSFERFUNCTION, + SUBIFD, ] atts = {} From 26e592961707b84111315e4a08f4d382289647bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Dec 2020 16:06:44 +1100 Subject: [PATCH 121/750] Fixed comparison between int and unsigned long --- src/_imaging.c | 2 +- src/libImaging/Draw.c | 6 +++--- src/libImaging/RankFilter.c | 2 +- src/libImaging/Resample.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 0b0cfe3f8..0f8c9d61f 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3928,7 +3928,7 @@ _set_blocks_max(PyObject* self, PyObject* args) "blocks_max should be greater than 0"); return NULL; } - else if ( blocks_max > SIZE_MAX/sizeof(ImagingDefaultArena.blocks_pool[0])) { + else if ( (unsigned long)blocks_max > SIZE_MAX/sizeof(ImagingDefaultArena.blocks_pool[0])) { PyErr_SetString(PyExc_ValueError, "blocks_max is too large"); return NULL; diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index a2b2b10f3..339e1cd35 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -1115,7 +1115,7 @@ int clip_tree_do_clip(clip_node* root, int32_t x0, int32_t y, int32_t x1, event_ if ((root->type == CT_OR && ( (t->type == 1 && (tail == NULL || tail->type == -1)) || (t->type == -1 && k1 == 0 && k2 == 0) - )) || + )) || (root->type == CT_AND && ( (t->type == 1 && (tail == NULL || tail->type == -1) && k1 > 0 && k2 > 0) || (t->type == -1 && tail != NULL && tail->type == 1 && (k1 == 0 || k2 == 0)) @@ -1359,7 +1359,7 @@ void pie_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, rc->a = yr; rc->b = -xr; rc->c = 0; - + s->root = s->nodes + s->node_count++; s->root->l = lc; s->root->r = rc; @@ -1630,7 +1630,7 @@ allocate(ImagingOutline outline, int extra) /* malloc check ok, uses calloc for overflow */ e = calloc(outline->size, sizeof(Edge)); } else { - if (outline->size > INT_MAX / sizeof(Edge)) { + if (outline->size > INT_MAX / (int)sizeof(Edge)) { return NULL; } /* malloc check ok, overflow checked above */ diff --git a/src/libImaging/RankFilter.c b/src/libImaging/RankFilter.c index e4f2679b2..897e4d7b6 100644 --- a/src/libImaging/RankFilter.c +++ b/src/libImaging/RankFilter.c @@ -72,7 +72,7 @@ ImagingRankFilter(Imaging im, int size, int rank) /* malloc check ok, for overflow in the define below */ if (size > INT_MAX / size || - size > INT_MAX / (size * sizeof(FLOAT32))) { + size > INT_MAX / (size * (int)sizeof(FLOAT32))) { return (Imaging) ImagingError_ValueError("filter size too large"); } diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index ec35303d8..b12e023f8 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -208,7 +208,7 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, ksize = (int) ceil(support) * 2 + 1; // check for overflow - if (outSize > INT_MAX / (ksize * sizeof(double))) { + if (outSize > INT_MAX / (ksize * (int)sizeof(double))) { ImagingError_MemoryError(); return 0; } From 36dc83e3ac2437b34253bdc66f2bffa4362e2537 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Dec 2020 16:07:32 +1100 Subject: [PATCH 122/750] Fixed comparison between unsigned int and int --- src/libImaging/Jpeg2KDecode.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index b08e607a7..8cce5454f 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -742,10 +742,12 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) swapped), bail. */ if (tile_info.x0 >= tile_info.x1 || tile_info.y0 >= tile_info.y1 - || tile_info.x0 < (OPJ_INT32)image->x0 - || tile_info.y0 < (OPJ_INT32)image->y0 - || tile_info.x1 - image->x0 > im->xsize - || tile_info.y1 - image->y0 > im->ysize) { + || tile_info.x0 < 0 + || tile_info.y0 < 0 + || (OPJ_UINT32)tile_info.x0 < image->x0 + || (OPJ_UINT32)tile_info.y0 < image->y0 + || (OPJ_INT32)(tile_info.x1 - image->x0) > im->xsize + || (OPJ_INT32)(tile_info.y1 - image->y0) > im->ysize) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; From 9940c84b085dc8674e6da09a1ad9c693ba5c3409 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 23 Dec 2020 13:22:53 +1100 Subject: [PATCH 123/750] Use previous disposal method in load_end --- Tests/images/dispose_none_load_end.gif | Bin 0 -> 24601 bytes Tests/images/dispose_none_load_end_second.gif | Bin 0 -> 17208 bytes Tests/test_file_gif.py | 14 ++++++++++++++ src/PIL/GifImagePlugin.py | 3 ++- 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Tests/images/dispose_none_load_end.gif create mode 100644 Tests/images/dispose_none_load_end_second.gif diff --git a/Tests/images/dispose_none_load_end.gif b/Tests/images/dispose_none_load_end.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c94eb1b6e006508839ce1827a239058fe9ac82a GIT binary patch literal 24601 zcmeFZ^t5G=UDv%ewKb$=><57yAQl5$US1~f^PAS2`uTkq z5NM*OpKNaSpoyaKX!1x;-xcr>*kWUQ_RMf|WBvK;^URzyclTM&c+RFqA-z03?_qBO zg66(H&%>#yDMrQyJw5KbTpes|DJgX9>Obq)RH+K&g zSBRvfgv4B;gAg;bU%svmT@an=plNotlz*=Oi=?Fa`ID*C)a-07?kaE;ZdTUrXV0em z2np8KT0d-kI6OZ5N=MJdH5VN%Wo30f^R(_~bF)N{M1H>7n3oqr1%ru6t%gR0bgXo3 zEn~j4^zrdJHFeg@_V(f7lf13Gt;3DTo=9Ha9GN^BJ-uuTi}^=Gk2*Sj$;quGC8^YS zd*^+~OL2EEFF&`icoFvSVI>z=jJ!N2=a!UIFB{u0tzfM(s1_scW<+b`iO+->+g$;vxTsViv9>;VF-_iYfSSC zRN&cTVNpDB*AK+8vrnX0092GIuigK17PqN zwHk`MBH8q z_`F9v>DSyaeqR@cnyV&?kdgRIIxW>xWm=i^`W$PztWtQTI%8}7`mEPf$S*z(zj*rL zxm`~JlWuF>$7a`=+M5hF^3zoCa0pRN)z3b^Hu_1ZWuz6?5{7~iFzdB7Ece9W>6-RN z#k09#*mR%hwKuJgGnm#Xd_WC$U8d5^(Cqf{^i&LRBL( zO2gkJ31G+x^G}`{L{?(n%iLxf+=qO?o(sB zuCokul9c!(T2U2fcuJ;B_~sl|&SaS~!3DtUXQD*b;zkC5rXyQEhX#3ss+Y?WQctzoZSp?=nDx&9WM*}=;IuuBK z4V<%LU_(7G44+2Kb8DZqH;$a!q;QZY{Lx)3Nt}5{uH;N8)vJISqa}_vGDkOb2 zuADn8Yl9iwrq4WO#85Q1vC^y?*`Tg|eK+cOs7n~zX)&T$4a+$Fnq_QF62?GJ@=WK# ztH8tEo!?UXOWm=D)W&d?6exCzi15-va5VnSdq#^>>mkwj*!a@him}Wm`%46qKhRq& zXGdQ@G~d}{R>(AU;7XHgSW%>dK*2vyBzEBPCRmbj#xO{! z$Po`pgqSofem|fOUkpCp02O0}D%PJQP&Kom#t0;#4wSs$f|IdC*#alOsJ(64{kPx0 zxKDG()-8z~%g+Sxu|sRZS!yPoH68jA<&rRTGvPNOA(@ZMMO#vAUARd#E)LJ>0$iuc z)L|BWIFLthvSD=#W5V!A67dr={y^YXD)ULgF*O1wyqfj~J(bk-ATEP9a48XZ$ruu_ zJyT=;()Q*&4@t}x)&Aw@-(=9$kB#4&U=PoZnEI2pC&NFJg&g@I_kBoIh(mt+bC5#! zi_qa%1oZM+r07I(=%6}}xe)X%l~Zqr>tqrMsUI%!(PVLn4b}s)!8F#F-3i%j$w_TT zkeKPtN7p>&JL1Kw#vjYy)ln5kXoi=l5irW=AhyZw-IV`)(AUcQ$xRWz@`(`&5>}FVC{z3(o^!lX@sDP zwjCji(hc1@?Ce>|Mn0q)MH^#�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 (|jNAX~?Dh+tFAmb#({7^s(B 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∈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 AyZ`_I literal 0 HcmV?d00001 diff --git a/Tests/images/dispose_none_load_end_second.gif b/Tests/images/dispose_none_load_end_second.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d8462cebb84b5658c81977a0148cb4a7e29b0c4 GIT binary patch literal 17208 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 90943ac8f..833294d81 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -307,6 +307,20 @@ def test_dispose_none(): pass +def test_dispose_none_load_end(): + # Test image created with: + # + # im = Image.open("transparent.gif") + # im_rotated = im.rotate(180) + # im.save("dispose_none_load_end.gif", + # save_all=True, append_images=[im_rotated], disposal=[1,2]) + with Image.open("Tests/images/dispose_none_load_end.gif") as img: + img.seek(1) + + with Image.open("Tests/images/dispose_none_load_end_second.gif") as expected: + assert_image_equal(img, expected) + + def test_dispose_background(): with Image.open("Tests/images/dispose_bgnd.gif") as img: try: diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 4ca5a697e..95e300bd7 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -301,13 +301,14 @@ class GifImageFile(ImageFile.ImageFile): # if the disposal method is 'do not dispose', transparent # pixels should show the content of the previous frame - if self._prev_im and self.disposal_method == 1: + if self._prev_im and self._prev_disposal_method == 1: # we do this by pasting the updated area onto the previous # frame which we then use as the current image content updated = self._crop(self.im, self.dispose_extent) self._prev_im.paste(updated, self.dispose_extent, updated.convert("RGBA")) self.im = self._prev_im self._prev_im = self.im.copy() + self._prev_disposal_method = self.disposal_method def _close__fp(self): try: From 5e4e0fa6ee67fd55105fc94c7cf96256ef543a6e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 09:55:22 +1100 Subject: [PATCH 124/750] Use disposal settings from previous frame --- .../images/apng/dispose_op_previous_frame.png | Bin 0 -> 582 bytes Tests/test_file_apng.py | 25 ++++ src/PIL/PngImagePlugin.py | 117 +++++++++--------- 3 files changed, 83 insertions(+), 59 deletions(-) create mode 100644 Tests/images/apng/dispose_op_previous_frame.png diff --git a/Tests/images/apng/dispose_op_previous_frame.png b/Tests/images/apng/dispose_op_previous_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..14168da8992ee8bed51ce4e33348f2a84175c128 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQXGlNAwEEw8HgFqz1?*HNJ*tZ z#6Us~KPBV0OZD|r8tHFX(pgoFE|Rqz3L`s!c}FvdGqIutC_d3y%bLaw!z?{QEGv_Sa6$Y}J!PC{xWt~$(69D#V Bs7L?+ literal 0 HcmV?d00001 diff --git a/Tests/test_file_apng.py b/Tests/test_file_apng.py index 2d50748bd..97e2a150e 100644 --- a/Tests/test_file_apng.py +++ b/Tests/test_file_apng.py @@ -105,6 +105,31 @@ def test_apng_dispose_region(): assert im.getpixel((64, 32)) == (0, 255, 0, 255) +def test_apng_dispose_op_previous_frame(): + # Test that the dispose settings being used are from the previous frame + # + # Image created with: + # red = Image.new("RGBA", (128, 64), (255, 0, 0, 255)) + # green = red.copy() + # green.paste(Image.new("RGBA", (64, 32), (0, 255, 0, 255))) + # blue = red.copy() + # blue.paste(Image.new("RGBA", (64, 32), (0, 255, 0, 255)), (64, 32)) + # + # red.save( + # "Tests/images/apng/dispose_op_previous_frame.png", + # save_all=True, + # append_images=[green, blue], + # disposal=[ + # PngImagePlugin.APNG_DISPOSE_OP_NONE, + # PngImagePlugin.APNG_DISPOSE_OP_PREVIOUS, + # PngImagePlugin.APNG_DISPOSE_OP_PREVIOUS + # ], + # ) + with Image.open("Tests/images/apng/dispose_op_previous_frame.png") as im: + im.seek(im.n_frames - 1) + assert im.getpixel((0, 0)) == (255, 0, 0, 255) + + def test_apng_dispose_op_background_p_mode(): with Image.open("Tests/images/apng/dispose_op_background_p_mode.png") as im: im.seek(1) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 6af41af6e..590a39017 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -803,60 +803,76 @@ class PngImageFile(ImageFile.ImageFile): self.blend_op = self.info.get("blend") self.dispose_extent = self.info.get("bbox") self.__frame = 0 - return else: if frame != self.__frame + 1: raise ValueError(f"cannot seek to frame {frame}") - # ensure previous frame was loaded - self.load() + # ensure previous frame was loaded + self.load() - self.fp = self.__fp + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + self._prev_im = self.im.copy() - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC + self.fp = self.__fp - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break + # advance to the next frame + if self.__prepare_idat: + ImageFile._safe_read(self.fp, self.__prepare_idat) + self.__prepare_idat = 0 + frame_start = False + while True: + self.fp.read(4) # CRC - if cid == b"IEND": - raise EOFError("No more images in APNG file") - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - raise SyntaxError("APNG missing frame data") - frame_start = True + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 + if cid == b"IEND": + raise EOFError("No more images in APNG file") + if cid == b"fcTL": if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) + # there must be at least one fdAT chunk between fcTL chunks + raise SyntaxError("APNG missing frame data") + frame_start = True - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + if frame_start: + self.__prepare_idat = length + break + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) - if not self.tile: - raise EOFError + self.__frame = frame + self.tile = self.png.im_tile + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + self.dispose_extent = self.info.get("bbox") + + if not self.tile: + raise EOFError + + # setup frame disposal (actual disposal done when needed in the next _seek()) + if self._prev_im is None and self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: + self.dispose_op = APNG_DISPOSE_OP_BACKGROUND + + if self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: + self.dispose = self._prev_im.copy() + self.dispose = self._crop(self.dispose, self.dispose_extent) + elif self.dispose_op == APNG_DISPOSE_OP_BACKGROUND: + self.dispose = Image.core.fill(self.mode, self.size) + self.dispose = self._crop(self.dispose, self.dispose_extent) + else: + self.dispose = None def tell(self): return self.__frame @@ -939,19 +955,6 @@ class PngImageFile(ImageFile.ImageFile): self.png.close() self.png = None else: - # setup frame disposal (actual disposal done when needed in _seek()) - if self._prev_im is None and self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: - self.dispose_op = APNG_DISPOSE_OP_BACKGROUND - - if self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: - dispose = self._prev_im.copy() - dispose = self._crop(dispose, self.dispose_extent) - elif self.dispose_op == APNG_DISPOSE_OP_BACKGROUND: - dispose = Image.core.fill(self.im.mode, self.size) - dispose = self._crop(dispose, self.dispose_extent) - else: - dispose = None - if self._prev_im and self.blend_op == APNG_BLEND_OP_OVER: updated = self._crop(self.im, self.dispose_extent) self._prev_im.paste( @@ -960,10 +963,6 @@ class PngImageFile(ImageFile.ImageFile): self.im = self._prev_im if self.pyaccess: self.pyaccess = None - self._prev_im = self.im.copy() - - if dispose: - self._prev_im.paste(dispose, self.dispose_extent) def _getexif(self): if "exif" not in self.info: From 8eaf9e7cb7d8c8cc33941f6f07a568d3537b49bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 10:47:06 +1100 Subject: [PATCH 125/750] Fixed warning assigning to "unsigned char *" from "char *" --- src/_imagingft.c | 2 +- src/libImaging/GetBBox.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 62db561ea..183cfb23e 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -1084,7 +1084,7 @@ font_render(FontObject* self, PyObject* args) if (color) { /* target[RGB] returns the color, target[A] returns the mask */ /* target bands get split again in ImageDraw.text */ - target = im->image[yy] + xx * 4; + target = (unsigned char*)im->image[yy] + xx * 4; } else { target = im->image8[yy] + xx; } diff --git a/src/libImaging/GetBBox.c b/src/libImaging/GetBBox.c index 9a8ae1f32..8db78c2e2 100644 --- a/src/libImaging/GetBBox.c +++ b/src/libImaging/GetBBox.c @@ -198,7 +198,7 @@ ImagingGetExtrema(Imaging im, void *extrema) imin = imax = v; for (y = 0; y < im->ysize; y++) { for (x = 0; x < im->xsize; x++) { - pixel = im->image[y] + x * sizeof(v); + pixel = (UINT8*)im->image[y] + x * sizeof(v); #ifdef WORDS_BIGENDIAN v = pixel[0] + (pixel[1] << 8); #else From 46f7b4a439819d45ab727ec87384d5d651ae26bc Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 24 Dec 2020 10:50:43 +1100 Subject: [PATCH 126/750] Updated test name and text --- Tests/test_file_ico.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index a5f728c42..34fb42abf 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -85,8 +85,8 @@ def test_only_save_relevant_sizes(tmp_path): assert im_saved.info["sizes"] == {(16, 16), (24, 24), (32, 32), (48, 48)} -def test_only_save_append_images(tmp_path): - """append_images should work to provide alternative sizes""" +def test_save_append_images(tmp_path): + # append_images should be used for scaled down versions of the image im = hopper("RGBA") provided_im = Image.new("RGBA", (32, 32), (255, 0, 0)) outfile = str(tmp_path / "temp_saved_multi_icon.ico") From 645b10612f351fa0dd24a11c9528c66f4440ad12 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 10:51:49 +1100 Subject: [PATCH 127/750] Updated harfbuzz to 2.7.3 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 178194ffe..fd80ecf65 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -275,9 +275,9 @@ deps = { "libs": [r"*.lib"], }, "harfbuzz": { - "url": "https://github.com/harfbuzz/harfbuzz/archive/2.7.2.zip", - "filename": "harfbuzz-2.7.2.zip", - "dir": "harfbuzz-2.7.2", + "url": "https://github.com/harfbuzz/harfbuzz/archive/2.7.3.zip", + "filename": "harfbuzz-2.7.3.zip", + "dir": "harfbuzz-2.7.3", "build": [ cmd_cmake("-DHB_HAVE_FREETYPE:BOOL=TRUE"), cmd_nmake(target="clean"), From ff9715f079428b3f62b864d472f21fd33e367d94 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 11:17:43 +1100 Subject: [PATCH 128/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8898ae10d..59ceb82b8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Added append_images support for ICO #4568 + [ziplantil, radarhere] + +- Block TIFFTAG_SUBIFD #5120 + [radarhere] + +- Fixed dereferencing potential null pointer #5108 + [cgohlke] + - Deprecate FreeType 2.7 #5098 [hugovk, radarhere] From 2899ca03878665a7c64f394df1e6bd0427e937fc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 13:13:44 +1100 Subject: [PATCH 129/750] Added release notes for #4568 [ci skip] --- docs/releasenotes/8.1.0.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 819bb30e0..7af2e79f1 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -26,10 +26,15 @@ TODO API Additions ============= -TODO -^^^^ +Append images to ICO +^^^^^^^^^^^^^^^^^^^^ -TODO +When saving an ICO image, the file may contain versions of the image at different +sizes. By default, Pillow will scale down the main image to create these copies. + +With this release, a list of images can be provided to the ``append_images`` parameter +when saving, to replace the scaled down versions. This is the same functionality that +already exists for the ICNS format. Security ======== From 26b91815916e1ab25facb4cca199896267b4ff90 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Dec 2020 17:11:49 +1100 Subject: [PATCH 130/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 849cd02e9..2f97d9f39 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -465,7 +465,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 11.0 Big Sur | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | +| macOS 11.0 Big Sur | 3.8, 3.9 | 8.0.1 |arm | +| +------------------------------+--------------------------------+-----------------------+ +| | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | | +------------------------------+--------------------------------+ + From e9fa245b696a11fecf0123ffcc92d66dbfcf908e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 25 Dec 2020 18:08:48 +1100 Subject: [PATCH 131/750] Documented the addition of PyPy3.7 wheels [ci skip] --- docs/releasenotes/8.1.0.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 7af2e79f1..2284b22a5 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -44,7 +44,7 @@ TODO Other Changes ============= -TODO -^^^^ +PyPy wheels +^^^^^^^^^^^ -TODO +Wheels have been added for PyPy 3.7. From 51b813792493818202645f6b064551f15a17610c Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 26 Dec 2020 21:49:40 +1100 Subject: [PATCH 132/750] Changed style for consistency --- src/libImaging/Histo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 923fa28d5..512e57a98 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -44,7 +44,7 @@ ImagingHistogramNew(Imaging im) /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); - if (h == NULL) { + if (!h) { return (ImagingHistogram) ImagingError_MemoryError(); } strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH-1); @@ -52,7 +52,7 @@ ImagingHistogramNew(Imaging im) h->bands = im->bands; h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); - if (h->histogram == NULL) { + if (!h->histogram) { free(h); return (ImagingHistogram) ImagingError_MemoryError(); } @@ -84,7 +84,7 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) } h = ImagingHistogramNew(im); - if (h == NULL) { + if (!h) { return NULL; } From b48cfa747cecd02ee4d76d12f7bbf64e186982af Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 Dec 2020 12:29:43 +1100 Subject: [PATCH 133/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 59ceb82b8..6b733cac4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,8 +11,8 @@ Changelog (Pillow) - Block TIFFTAG_SUBIFD #5120 [radarhere] -- Fixed dereferencing potential null pointer #5108 - [cgohlke] +- Fixed dereferencing potential null pointers #5108, #5111 + [cgohlke, radarhere] - Deprecate FreeType 2.7 #5098 [hugovk, radarhere] From 6ee74e1f1897b2ed38c90767ec81328b3a205ac0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 Dec 2020 12:48:29 +1100 Subject: [PATCH 134/750] Document limited number of characters [ci skip] --- docs/reference/ImageFont.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index dbab0f395..813d325e0 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -8,7 +8,7 @@ The :py:mod:`~PIL.ImageFont` module defines a class with the same name. Instance this class store bitmap fonts, and are used with the :py:meth:`PIL.ImageDraw.ImageDraw.text` method. -PIL uses its own font file format to store bitmap fonts. You can use +PIL uses its own font file format to store bitmap fonts, limited to 256 characters. You can use `pilfont.py `_ from `pillow-scripts `_ to convert BDF and PCF font descriptors (X window font formats) to this format. From bea3745a743edec788e3607cf1f365a494d47af9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 Dec 2020 13:19:07 +1100 Subject: [PATCH 135/750] Updated harfbuzz to 2.7.4 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index fd80ecf65..324f91cd9 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -275,9 +275,9 @@ deps = { "libs": [r"*.lib"], }, "harfbuzz": { - "url": "https://github.com/harfbuzz/harfbuzz/archive/2.7.3.zip", - "filename": "harfbuzz-2.7.3.zip", - "dir": "harfbuzz-2.7.3", + "url": "https://github.com/harfbuzz/harfbuzz/archive/2.7.4.zip", + "filename": "harfbuzz-2.7.4.zip", + "dir": "harfbuzz-2.7.4", "build": [ cmd_cmake("-DHB_HAVE_FREETYPE:BOOL=TRUE"), cmd_nmake(target="clean"), From fdce8453645c95c347660887077de87fa6650571 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 Dec 2020 15:36:16 +1100 Subject: [PATCH 136/750] Added exception explaining that _repr_png_ saves to PNG --- Tests/test_file_png.py | 6 ++++++ src/PIL/Image.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 80305c7b4..9028aaf23 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -537,6 +537,12 @@ class TestFilePng: assert repr_png.format == "PNG" assert_image_equal(im, repr_png) + def test_repr_png_error(self): + im = hopper("F") + + with pytest.raises(ValueError): + im._repr_png_() + def test_chunk_order(self, tmp_path): with Image.open("Tests/images/icc_profile.png") as im: test_file = str(tmp_path / "temp.png") diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ae2559d11..e9d4e4f29 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -670,7 +670,10 @@ class Image: :returns: png version of the image as bytes """ b = io.BytesIO() - self.save(b, "PNG") + try: + self.save(b, "PNG") + except Exception as e: + raise ValueError("Could not save to PNG for display") from e return b.getvalue() @property From 00df94bb7819c6b26aa53cd6ece701725d7e6809 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 Dec 2020 16:16:55 +1100 Subject: [PATCH 137/750] Removed unused variable --- src/_imagingft.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 183cfb23e..5566ee3da 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -877,7 +877,6 @@ font_render(FontObject* self, PyObject* args) unsigned char convert_scale; /* scale factor for non-8bpp bitmaps */ Imaging im; Py_ssize_t id; - int horizontal_dir; /* is primary axis horizontal? */ int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ int color = 0; /* is FT_LOAD_COLOR enabled? */ int stroke_width = 0; @@ -897,8 +896,6 @@ font_render(FontObject* self, PyObject* args) return NULL; } - horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1; - mask = mode && strcmp(mode, "1") == 0; color = mode && strcmp(mode, "RGBA") == 0; From d96945b7c8e4287fb5dc3330ee0ba980642eae87 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 26 Dec 2020 19:07:16 +0100 Subject: [PATCH 138/750] Fix Out of bounds read when saving GIF of xsize=1 --- Tests/test_file_gif.py | 8 ++++---- src/libImaging/GifEncode.c | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 90943ac8f..198e1b162 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -74,10 +74,10 @@ def test_optimize(): im.save(test_file, "GIF", optimize=optimize) return len(test_file.getvalue()) - assert test_grayscale(0) == 800 - assert test_grayscale(1) == 44 - assert test_bilevel(0) == 800 - assert test_bilevel(1) == 800 + assert test_grayscale(0) == 799 + assert test_grayscale(1) == 43 + assert test_bilevel(0) == 799 + assert test_bilevel(1) == 799 def test_optimize_correctness(): diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index e9c6c3149..9f22add24 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -233,6 +233,13 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } } + /* Potential special case for xsize==1 */ + if (state->x < state->xsize) { + this = state->buffer[state->x++]; + } else { + EMIT_RUN(label0); + break; + } this = state->buffer[state->x++]; From eeee980cf7980be6e4fd47b299cb46853ad38abd Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 18:36:13 -0600 Subject: [PATCH 139/750] XMP feature added --- src/PIL/Image.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ae2559d11..94c420bb0 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1318,6 +1318,27 @@ class Image: return self._exif +def getxmp(self): + """ + Returns an object containing the xmp tags for a given image. + :returns: XMP tags in an object. + """ + + xmp = {} + + for segment, content in self.applist: + if segment == "APP1": + marker, xmp_tags = content.rsplit(b"\x00", 1) + if marker == b"http://ns.adobe.com/xap/1.0/": + root = xml.etree.ElementTree.fromstring(xmp_tags) + for element in root.findall(".//"): + xmp_atribs = [] + for child, value in element.attrib.items(): + xmp_atribs.append({child.split("}")[1]: value}) + xmp.update({element.tag.split("}")[1]: xmp_atribs}) + + return xmp + def getim(self): """ Returns a capsule that points to the internal image memory. From 50e88764e83f0e3eb80f45eb0ef1e3ab31034938 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 18:39:16 -0600 Subject: [PATCH 140/750] XMP feature added --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 94c420bb0..e3d252238 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1318,7 +1318,7 @@ class Image: return self._exif -def getxmp(self): + def getxmp(self): """ Returns an object containing the xmp tags for a given image. :returns: XMP tags in an object. From 9947655b939def4096f1f815ff0088e863cfe7d4 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 18:46:07 -0600 Subject: [PATCH 141/750] XMP feature added --- src/PIL/Image.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index e3d252238..98ab7d997 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -539,6 +539,7 @@ class Image: self.readonly = 0 self.pyaccess = None self._exif = None + self._xmp = None @property def width(self): @@ -1323,8 +1324,8 @@ class Image: Returns an object containing the xmp tags for a given image. :returns: XMP tags in an object. """ - - xmp = {} + if self._xmp is None: + self._xmp = {} for segment, content in self.applist: if segment == "APP1": @@ -1335,9 +1336,9 @@ class Image: xmp_atribs = [] for child, value in element.attrib.items(): xmp_atribs.append({child.split("}")[1]: value}) - xmp.update({element.tag.split("}")[1]: xmp_atribs}) + self._xmp.update({element.tag.split("}")[1]: xmp_atribs}) - return xmp + return self._xmp def getim(self): """ From 762235fb06ccbdc5df9e3a94d7a1de14693f0f95 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 19:01:15 -0600 Subject: [PATCH 142/750] XMP feature added --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 98ab7d997..63468df99 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1324,6 +1324,7 @@ class Image: Returns an object containing the xmp tags for a given image. :returns: XMP tags in an object. """ + if self._xmp is None: self._xmp = {} @@ -1337,7 +1338,6 @@ class Image: for child, value in element.attrib.items(): xmp_atribs.append({child.split("}")[1]: value}) self._xmp.update({element.tag.split("}")[1]: xmp_atribs}) - return self._xmp def getim(self): From 2474cc2db64b264cf40d7203e823d93bae2e2092 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 19:52:46 -0600 Subject: [PATCH 143/750] XMP feature added --- Tests/test_image_getxmp.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Tests/test_image_getxmp.py diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py new file mode 100644 index 000000000..ce0e88623 --- /dev/null +++ b/Tests/test_image_getxmp.py @@ -0,0 +1,5 @@ +from .helper import hopper + +def test_getxmp(): + im = hopper() + assert type(im.getxmp()) == dict \ No newline at end of file From c84f1058ea0e627d5f105df6ddda961f1160ec1a Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 19:54:06 -0600 Subject: [PATCH 144/750] XMP feature added --- Tests/test_image_getxmp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index ce0e88623..1d08b27ff 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -2,4 +2,4 @@ from .helper import hopper def test_getxmp(): im = hopper() - assert type(im.getxmp()) == dict \ No newline at end of file + assert type(im.getxmp()) == dict From 4ff554620386a25d7da232646a66d5aaae9886cd Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 20:00:04 -0600 Subject: [PATCH 145/750] XMP feature added --- Tests/test_image_getxmp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 1d08b27ff..856e74983 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -2,4 +2,5 @@ from .helper import hopper def test_getxmp(): im = hopper() - assert type(im.getxmp()) == dict + type_repr = repr(type(im.getxmp())) + assert "dict" in type_repr From ee5d05ae21a570e26f8cf6ad406aa4744307598e Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 20:01:56 -0600 Subject: [PATCH 146/750] XMP feature added --- Tests/test_image_getxmp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 856e74983..022ee7ae8 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -1,5 +1,6 @@ from .helper import hopper + def test_getxmp(): im = hopper() type_repr = repr(type(im.getxmp())) From 08935aeaca4d1e544895a1d6abc6d001b92110fe Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 20:09:10 -0600 Subject: [PATCH 147/750] XMP feature added --- Tests/test_image_getxmp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 022ee7ae8..0567da97c 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -4,4 +4,5 @@ from .helper import hopper def test_getxmp(): im = hopper() type_repr = repr(type(im.getxmp())) + assert "dict" in type_repr From b802588223884e5b7840d01d919b6cd379008c59 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 20:49:28 -0600 Subject: [PATCH 148/750] XMP feature added --- Tests/test_image_getxmp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 0567da97c..baf180b18 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -4,5 +4,6 @@ from .helper import hopper def test_getxmp(): im = hopper() type_repr = repr(type(im.getxmp())) + assert "dict" in type_repr From b1b7d2ff182251180b51729e500c0518e705559f Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 21:37:15 -0600 Subject: [PATCH 149/750] XMP feature added --- Tests/test_image_getxmp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index baf180b18..f8d8900d6 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -1,9 +1,9 @@ -from .helper import hopper +from PIL import Image def test_getxmp(): - im = hopper() + im = Image.open("Tests/images/hopper.jpg") type_repr = repr(type(im.getxmp())) - + assert "dict" in type_repr From cc8070aec5c7b8f96731df865ccf9c9054f8fdfe Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 21:39:36 -0600 Subject: [PATCH 150/750] XMP feature added --- Tests/test_image_getxmp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index f8d8900d6..965e07148 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -5,5 +5,4 @@ def test_getxmp(): im = Image.open("Tests/images/hopper.jpg") type_repr = repr(type(im.getxmp())) - assert "dict" in type_repr From 2f29f1306fa0650269a23a8158e4d99f21179ac0 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 22:01:27 -0600 Subject: [PATCH 151/750] XMP feature added --- src/PIL/Image.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 63468df99..983580fc3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1324,10 +1324,8 @@ class Image: Returns an object containing the xmp tags for a given image. :returns: XMP tags in an object. """ - if self._xmp is None: self._xmp = {} - for segment, content in self.applist: if segment == "APP1": marker, xmp_tags = content.rsplit(b"\x00", 1) From 7968279c13b126c98d1ada52fc1b5343f563a5a2 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 22:24:38 -0600 Subject: [PATCH 152/750] XMP feature added --- Tests/images/xmp_test.jpg | Bin 0 -> 1798984 bytes Tests/test_image_getxmp.py | 3 ++- src/PIL/Image.py | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Tests/images/xmp_test.jpg diff --git a/Tests/images/xmp_test.jpg b/Tests/images/xmp_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b9354f3a17efd687f6d8e5bd63085bf5d415e1a GIT binary patch literal 1798984 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 z≪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

<^zAqA|Fi6O-Q%7;eG$F9oPEpADW51q&X!rJC|h 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

-pU=s6*=ZrdsGO5^@_dnjmo*z7)Djkkj?N3WSu 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

nn*_P8*lROzth{MG*SK*49VMob5yA; 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�HJ-KRiR&3SN{MKjAT~j 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

(&||p9-y1TTfQny7c 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

;2>1c4?R-pg9J=&!%7eeGHZp z8HSdQoV1$0IuL)%SfJ8FTHVG|evI-_u?jj5B$30KF8=^-wq2o!g*iRzxBA5CmA=lO zXkWY+(DXU;Eu?!}HHw){ai?_VM^fCHagVa`MDirap(mE)_hM;)g!u=XY@h-`+;nNN zPn0h6>-EN)9oC*3VopNg2DGmNd8!9i%*-`pL#VgxQ9XxxnZ44YZ1PK0c!! zFiP)X;SSx$%MBe<0Yqln*YA~42;8M2sZec9h$ib1!M@q{p zqGVpxmp6V0%ug9o6AvA?AauVGN{Hb`Rp+lY^TY_wfqY)& zl+J6E*0@ZKyA#yHPmUBEV zRX_3UaQfr+-z$vBSHEiykgRd0-9TrRsaFW{q64$Z7oGRq{g{ssRw035 z`(Y_?-WeRQ>FZg~Z^Z$Q>;6lptJTSA+{|%J9mRR8Ou2I)HCG#K@e+C}rCupw9J~Vi zbe3|&iW@s+OjbCONPn0Rz>YnrvPv?$35#G-JX}q0y zGPsIayh>xuobEpviZjn8NW(<-tiy8i#wo;o#0*p)Dx=t-c*l5WB`WH;A3HeUjk-03 zyyW!t9-ln3dKb8TzWh!@Z%u1X-nGG}t|mg2>8n9zm6{C3Cq+mnhTS=89l?*0-F*4$ zl>oXxMZZLqzB}85b+bb+*$W>D#gAe-itX*|hnTH5+D_5rEap3Zru5z>^imX;D;i~Q z*r$$?R7{0R^~`ed*+(M0iBY!0Z#`CNE8D9Ku+_R-Q}v)|`s*!!>Ce7Xx}V?uR@~fRP~be2$FlJA7BJcpveN)Xn0r zjU9j$LG~bZ^{jxGv6`DeY2%R7lIJxXcKmVFq3IEeAGCyJL9jjU5*{-(#xH*uJhP@wjVVPMrtW)jOkix ztPE9PNbGu)VHFwj{E8i?-e7 z&Eu=)wAH+Bdqw8y*VI`2o`BR*Lo~tt2rl6=6=D%hjq!--;zd^TFNwWH8qTJ-w)Bx&b#7Kghgo9_OkjO$#aiIKNT zgc%$4GB8U!ezrdp)!8AdXU{0$EYbb8^Uxm-Is{t|z4KhojAfYlU!nB_`{dq{)SbS+ zp3CWLON@e?GsT(4;rU4#T @BoN+}Umt2F;(tu4l6E7m3=cbcVCqN`uF+9Qy?uQ_ z#D{x77I`kz_d*&KyCIRvY5NIQrbAKDneq2*MGo9%sL@4YrPZvj>{t?aA1~8J_Xlc@ zzgLadK+$R8ngSidcl~G)n7hCD<;h^MNncH2bmeQ)Nd=5myOT|uTPpC0UZwnf2t8^U zs*#>tH{$E(e>-$?Jftf5RF1vyH2XXeGa>V+G*2Mouc%_A zwj-;N#>-a+#>r!1cm;7J)ow>2KA$neh}iAa;SV<6Y$-JlF3{`1>0LiO+J{){J#b{L zr?B}qz8da>m38JYFfa3m;Gk0{(fqh3rnh z(wY3CU^}mp!shMPS+cs0W}XT-_)2>7Et_p$ElL^d@#4Uk_W*eF<2C|KH_YI&tF%t* zaxma}U&|l*Z&PXwK*^)^R=Cjl>UA+z;nn)mu0k2IHtW_@Y8e`Fip^bY##MJmjHH|H z3i;@^fyjR-{9$6$9g7~n_#UI?I~;3bJ87kKHlM$%GFKwMgPycA-N@o_7t=A3 z$8axKAl2|p;(2Sn?pQ^?5O?r8?Z7d-WKsC{BnIdj_Z`N49nkGe5n8RJ;?{W#o?<_R z64%1zEJu!>XqDi~HFj6C4QuLyX;az9&BXQA!0iZc*ZW|GL?TufUA;%I<=;R5(L?v! zKijU^%?_ivm!77lyOXUZn~xm=W@5uytp$T6inV9420p#HgrBV>g?(Mscj-}=k+y-w zW|;zN5)>bL-Tl2U`(b^pS$kJt=wtLwef0LFyW%OsAoSTyY#dXfl}BVq01Cd%V(JThLA zq8k=+ILet={xZFryvqo7K9U`a?dPnf7mSgTSq8vVFuL@vKTO_+hD$SY)Og&kLbY6W zH5OY!^>b!>FAymlwPvD`n=M^}q@3C%W4`Ce>nLp;;I`x95|e%F~_A_k?h9b(rj*c(q=;hc{axhsRdJB$hB4>l7?vDNA~J3d*rXZ9W>tQfVEw z20g${i*9!s0;QX>a5Ul78H|+OJ;?U_y8Tg}UL8@0k`&e2mo=D+M&vQ}E$2p;r+*uA zApU~ZlEtV6BXC=8HRISYkNn$>`pv3A3;2l6Nuya&*d3tP&l}@aPnWAxQt6CVa{;07 z@aAk}^DtPS2Q~bJQ0;6c9-Rq(Jyo03fsDaR5I0}}>1T1JBh7^SqTeirqATSc`ubwk z`}v-=R>lJMmCt50eXNwzWOXWx7CR{}D1an~A}L60`Dm4%K))10+rikAsR7&tj1=>T zgunp5x$Sj~?EO4uZM5dP({wd{J*bR*i#4(In$3oza+!)-849)}_=1$<9!(}mQ4&~#K>@#~^>FXN18IQnV@9LaPIVyg<_B5_)rVlR**b1UuKqCfQc-Ps3 z&Fc~nZLvPX%h({EaWcXhLA?Fi_P;OYF?)u>;`?&h4IdUSBdV#`#w@gPQc+B$%Ua_w53az>WdRRFhw2)d(b9Hl>lbkAlz;?+hJkm8;u-e7GdH6z%}{SY(oxT zF$Fx8%X*U*B7&3G!`YIxyID7yd7?qj!|i?eYgkK2uIz89WrS(vJgdV&b(&DKtC7 zmBP(>goZ+h2`MibB2sn)`|(B_RP?|}IWq+0^sb{GmAi>+6<-smvv6iB!)m-0=wm(w z?OtY-D#tzfqx36djFK@|6UK#?$ogzUju-IfO3E*BCC{g95X1L2wynx#=;6{z*Kzfw zyDC}6rai9KS;81)xA5~+y75CXFqtI)vGcI=)-l~%hbILP_-@O42lvY5+@8pe?b-FP zGG{dn*)z&AHgXvq@)*i>fBKtEinlGB6Jz-^aIWZqM0*eb-=?RAyQw_ZL4I7#f z^(Tw=7uWK~XKFE8cSYv4MlQ~-)Y)XjW9X&)MrSJ~dGU!}DP?g^D)B>hcv4a$MnK@c z`|Y_MaRhAW+Pl$N z){MlKbu5t6VxE&m9bx+x5Z?4XyDyqqkWYF}0gh zVty{}pRbp*N_>0erZOq<>s=%3UI7N)6M{f!_tNIIH+< z#(M#z+HEP0u>}VTBC|F+!&j0uv0{arjM58s=Pb-jXs5s&fg1~U+C0^p6|yo&PQcs@ zBFSkwn5dH@CZZEqlFfL9Ycy(I{Lb|M04Ku3AH&D+(nu_sIV778{`4v9mco)xY~lfQ zR2&mnSB%kEtbSH{7;J7gPuZ~~87SVA%PmZvQ_LxDdKXf_GsOfPg9rJ}z^NT@Ydgro zU{8=e1w4LuxXpH}Q)6{BuxbA0<85V)<9fzBElVS6hs8fR5RDFK9!qW2U<&|)GnDmuawvTx&*pgZqoSUSw#cn97-i@uS9+y5$ z+*gqvz>b8LvB0B^O_VK-j^5ba%H?kyhCdIA&)R{ah6uhN3Xnr`yj4n9l)+}jX=~3N zXeLtZeLz??#1J~;Xe&4Z?pU{y`NG;-`%^=yvASyeghj7nLv$ zuQauOU^%AjJ-xO9SQHn|8Y(x8{gi%Paeb}-0QE~==Oo2qvz9SfVOSbgG^U`hRWY^s z$fnk(s$z!U8DIfQAt9T=+s|5dk~di%fZ`WU&dnz72kG*!TnNf*jak}_FAf&YqtDgK z(8xzxu5zv`^Sd@)_1Q%!FXEJ1t?;Edmw4nY!S_2Iz!F4Zjh?vROwSBzob;?J?nin1 zg`;$iHEQXs25VJi5;w-pZ!sn_Czq`sCCFZ-jIUP3sKOFkc0dU`h1d?Yiz05ITLMt+ zForM`gUIVc6dGSt>-@eq8>#!VQpTCn*(wrp$733nUQB)L73i$RZ7iH@c`FfGg$Q($ zebj^J=qk-1A(n;KQ1K?1hVd=vGWuVk!>Ya2)_UpeMHQSTCr7Q9teLzNnHssBs}|rD zGcZzy!pj_s>-;)6+kPY-v@X^vq-^!?il=4qCN$@e2iHta>n#v6N>lU3W{t^f&m~JD0>!LI8a9(hLF0bBR) z`el>&Z1S?TFJb-jP^Px46n61htPJ%sRwa39#Y^BCz>*mjywTf=Sl(5Hf>05-JCa!O z>8iE3k}D7mZCfV+yPUnw)DcCG)9HhU0cMp6*wkYG~_Ge25WL zoJR~mWGe`pXGu(wa0%zY9T;BV^H_Il;RU1zkIxzUKeM?_HHFpu^#z*wJy|5TEa&n~ z1(?sF1AbX{%<_o+e}&xgP~l&Y+v)(R8;N0KrgI<=q)EUA{{TES!s-28jM8>#;vW@n zF>z`9Zfh|msOec-%+EeTI?+%P*FKXLNYQqY_EJXV^gC$SUv?Fhzqv-h|r+{BX2Qs`vEBjCXeXYnZ@eFzczZ@z+bXso}CUD`h63V(m(5w5#N<*s~nj z8JHhb%?o-CNIw1w6;vruNf+De`eWp6%&)eZuD{32B6Ux6vfZ+;M^@@uKjIBJm#Hbk zCKyx4(3|%>_A{2}V|*J*z?W$D^$9A=vW}WJ02nAM?Zy1@P32=2>UzInj4t1IYE5&d z@tNpq)2)%aV#8C!Qo9`XW}OciT1%9d;p2iDvKd%8Nk>sdDr){{Rn{%Vs%EQq{DdAwjZKvHt)Gai_@Rt6xlP zO7);V1f2afDikYkzgZlzFNV!x$@i=?9BPvwH$YkS!%bz{T_vvW;57!K)VVu4YF<~r zDSI{^pNDPFl^95uCcM|ie9bCs}?@R zA4&|Q^=_`tURuJukXRwXUL>j&JCJ(IZsb;LRd9UW^Gcn}UOux;cIKa>Y{bhGA2K_61gT!IC0R9DrT1+E@f;h}a$&4Q_`Ix^sM)ynV5@Hx z7;Ka6Z+BV{R`{zmYeenFMiBaFufE`PC){Q!B&Z#4>ix6UTQiN)*ley}P{VQIs){kD z!?d$pj=s`~YQY>pi4^Z1(khhP0!Y|_*vfnD7}t;m-TdC!O~3r7J9VtGnaY(jnY}rx ztEFmo@mI9<=c7(*5=M}{Lsbj~~w#Wu*r^2MJYt9Ri7Z}x0zUN>H z5T7zJKO@$LJ)8<;9N#t1Cm)(SS2nMuYTZmUIMu0>S#gr(anzM=W3PIj4+`XHuKS3uy7yK|Gs$yi^eivE+CVGkMDsrTw&N}40`%S{`mPO-u1O9P1(C5Mbo5eoPxZNVdV$UNJC z9sXI*;q+!CpWhT2ympT6CH(Cvw49i_n8kwi4MApg)7X5}H<&xx!R2xC+Nvx^9BC+? z$`VH%lg|ATxh_zC9;48lSVIu;O3?5RZPJOT7E3Z;P`%yOOgcefq=gFBwY z-qmtz9^Yzrg6q+*dkAurY*n!>gj)EjwcwVuNTs0xxXii0@uH){LL>JQN|R@W0Q8| zHd3wfShXB`cFIv>1dkBicFAoi+kG*H?j{3Nw{Eg{%;gN*Vy|a#w<%?@QEEnj3FyUu zw@wup>WOe0QrHUvc`=3J0n#klUWd1@%Q`VZm1|=Uua;gNFZg@x?n>q_QD!u@BFwSn z?@W?la(N2zqe{~ATjssm*y$`mV6b%D!dXV&Zn=?mlU@5}E3&n5b>AGfv{ZVh2dOl4 zHuU@GOv+cs;S&W6<2Q$n7d7p?IeD&Iq*@n-Pt!=bzcyCl2FFrFh@FZy)m99M(giXf zFgNMPY+qxvPi#9!6_uri%4V~gew3HC#^5ekthDRJAEE2rsZ)kvMAcp1E&W82Q|YN3 zb_UvOle-+VxCAdBU9jgDW=x|&uJHPc2U@M_u?f~ZJz}C6 zYlo4aWp(laDFlZEbfd>OvZX;rzD@pqxImbUW*ZR{FwZ7Z-hR$T#zFEGELp#mOyyZt zt#$PvHt`fGMir2S5=2mfRQc(rVM_HppK8Gyl-Ho?@9J}Yo$Sk4l6h@bSVU_h+>$G= zHEAhTYL%)&>b|9jW|>vqZf;}>%l>Z*U=*kXRc7@BoKfn`Znf8yqRQz#YaTA0`mw_% zNNCEHj!NA%G%h|jDRJkuj3~@x;wza-j|A)wScI`Gj6FJFlnQBqqsaMUyB*jaL85g?o_6xuwrEk z#Hc=Y4-1OjZN?f-Ni@DrwT@hMOm}E>-VTRx^{ssD*!y`%DQ2i8d>#gsT!O;_VsiB{ z7NCk|$5!X+T6oJ1$@+5Zgbf`6dK=@WbIlu)6*(i4f48PDGCFf9q_UYfyCI`&<|*c& zza6bbR?6j})L6WQW}dt>bxP!6w?Uw@bHgs~k*c!u+s?3z+1t7OMqm<28%9W2y$=WH zhnOuXs`MU`!A1W7*EKXs(!;A#=4Rd4<)P_1GDULrMzfp6q@Emmu7M|}OlvI>sF-8`WuF5ToK1WVDLywgkkwmpqLqf7nVNfds?SEqFX>1dlbwV4 z;#Meew~W>#vGvTUnOX95F&Ru^wsQ{^dr;ZRRgxM>92L{zCKJ+^B6wp^6_1p{aLL4v zbJG+F3ZnAYmOh2^cLF}N!#{{SDH$N^ew;^?s**!)%f9iRNd3}suFaQCrM*QE68 zdWC1BWtH*rw;5wXCXx`RV#9E))ut9iu<8_^qqomI-F&7yaUk3C@0VXqY1}njPO`VE zwE5F`e4bzOdsz5y%^qeNQ@wSqMQYcYD);Wp^98b|S!+5-419?Lsv^^}yn9aP3wK;} z&lYV<%3xUD*bDZ&wmJ?x9+SXcj=NXD;^1FKIyMY`no8B;6y69_#@6x>#{rLGScy2D z%WO!!yGAO{_V1od{v@n7a`>*x_lA{dZsMiJRf|(gN^x54`wbz6z4TYNcI8UP{{YW# zDB@M4JFo&-KB9GYWPJ5IH7aAoSz#MW9<*03wr zwUEf#<`x?a{Gtk=Nd%FvFjbF*v$7rNYjC6ev)YSIC?ZHlYUeA%YI<_nY@U*}6H~Qo zAv0IcO<<$UunNf}zY%UIE4+^(c)cK^CjS5{0kBN6vEllFI%lQe6jHMuYdn=RbR@Jr1~wv;tHV+xQ5<0yM<1vOUc%4wcj_vXZ*evQNh_vi0!w`PW>;%B+(=u z*yV}Ccs%=Y{c=h^=;}QsNL#>~(8W!oNN#*u3Ye^Q;_p4VVvEwR>CKP5^C*zW8OsGh z*9j5qF+Bd~IO$ea3n%6?-ZNZb@t3dPqlu|)B!ad2`hGXDHG4VR=>fBrwQd>1$&ITp zO_FtF=65@twiKR0w3q8({D(pF%xx)|RyI6?SM8EoyH{p1naUcb_HrXN%z4Go&A+E^ z#L8~mte8DJjOLJ62?TNaHsukzJY|nJ3VL*N4WKU+Y=P6}awXG7q2Tb(2k4WB+EY>K z>8I0JD-BZ-t1z-O`K?Pfq5l9AMG#9&EKjI!=k3+exOIhM^rA%;9m|J}TYdWUQ&_$P zq_Huu;BY=wT>k(}^7S#v5R!YiYk^hzcR5)*-QK*%;u}%_0O?0&;kk?Lwm#lp7pOIz zTa!tf?wFG%ro~uuhE}q4eOW4^nGmYk@{p=Uzc0`K0E)kfQ{hNqibXoU^~g>-fB9e2 zCDFkyrMyS)US8SOZ^1|4V*{fwIIPxp79cH7or>_RK7@!2QOL1!Pfv_VkL-ks?^DO=>9pNkSyDp%Dcv{{U}2eJ{qph&2BI28aIug#I6me$oI0j*0$T+t;tR zpQX`BtB`87tag*Y_5T1__>k^D;tRV!@h1F08rSoBgD<0NWNb^WZegRZ8)9j-nZ-N~ z5<8DJHqK`CWfI6)k{XqXQdETxH^4pvE4kKcE%kD>sB0yO>do9J$9!MnQ2aYg%m7qD zLz=%pGrHY_?0yrrx(5y0Zr|gt$A-r}wX0fpTdyPKZOdxQTy=sty(cr2R%JmH1BhYa zy8eUs7K2Uj-8)aHD7uyavFXrN5AmOc>vbC6iR)T+Ld2dcpc&FG!%vgbnl~q=ZR4kk z!)gVI?%19&V>1L*c&!$WLa*s#nlxr$1SJ_vg#5w0e~OZRCYqr&!V`hmbN%z_{uF#Y z6Trv;E&Aog(YZ?4^+<8)6md0C>pW3y4kZW;b&0-VD{jm;JN@Z@{?tIfu3&Eo z$X=Mnd-2_eb}>gBkt2pY2x1Uzv$-6YhTV4m0POUL%y2f+Ji{N$i@q>Y+?D+q0<>IY zJV^lW3b5U!+i=dx2e|hne@?9588k<1K|B%;R?g>BuF}^FR$0cumC6Ya@;p9q>8mV~ zNyMG`s(9QFJwZH^fhUA$)-HvM7B4x8-i%>4ED<#Eq_8YSAWu=@n0kTMdof2Rr3|V( zfMeUv=WW6Gtwi&qvznlOzIp2Dql{T6lhY{Pv%gy%GuMX2ia}Ljp7KWJ?3rc@vP4l^06C_uTZwC<9XRXpdY7v^dNy^2^yY%e3!A3#tJ_VEz5OYW(CD~CAyql zRb*>(M*&F_4|=%Z8fKLUJos5 z3(I!q8#R*B*&Lh4YE-W!YPkH(I@aJ@MjBH`QzpuJGk80Yd3ExC#TuE%#nD9wnk8Vo zcd&kaGt_`0Y19x&^*C3B(vjlc2!fc^Om-xe)l`O{1$Tj9R+_|)(n8F{Hp}IHy?L?A z9@D&nNzQ&smEh!NuzY?w1AvuHi9IV>6_u;BaYxVoqrH||>Q#=;n{fy4w&437gk#Nu zH=o6b?1n!I_M)X%D;_*uiKV2_U7llVW}nnp=C;U{so0buRuODnM(2?ysSNKKJCL7T z=7)6vXkiK%aj?@jfu3tp{2i#I6=$T-q;VETp!LD^EG%x0sFCtV{k}O2Sqqb}@CA=w z*ElIoy>WGs$t9R8V^$kU9z87M>%8pk`U_?|6=8|xj&^}y5U&<)Bu3m=4ZP%zTFLHl z@u^E4ayojqICRv0YoV3Tuk$EFU$)@cAJyold&M^!%yxdr=T19Aa1n^|04Y>HT#u3EJ9<*L-* z=bjg>Eq*dY>|%yrRU=6YZp1I9q;5WuH18P!q9L-l%JkisaoD@};(|qZ<)Q$JEP=BV zED^-e2*hxfGRgxNEJJR;Dcf#@PJy?;An*Z^18*Vk4ZI;fGD7-R+fJ)NKSAa%q8zZvB>IopKlkdp^m-CcRXyEjFPwW{RS zI&ux`%RO|p8_DE8H4@^rjCY!E(5m;H`N|MR9HTZ8- zNgOb+`3dFDW)lcK)PpC@zsuHnR>>UT`MM66;?j{(f*IwNmK!tA91+=&hzBC3X$@6x zQ#95$dn`-%fiK$vdJSP&dOLTM(z;4PxyC6U@5VskSro|GtLEU`*9jbSah8<1C){6X{9l0t?f zgPJH^b&FXQTjMA(6lOI||jl%7)Kk4V8ByI(sy|aP40|c#MmNk}nBqAANiCFO9=*cXs zQKjL#DRuCmmm|s86Vnzz$7mej4i0*YB@)z3d~?fc31v2+k|*?+gMz6Xwghqdh$KI_ za@_Cd#{FX{4P;Trq=taLGCJ({o{~jbth5nYUQGdxX$!o25@Oy~SehX1oxwWG+HLFVP@U((P zE@{~9JV?@|e^$6v0b@ItKTYtT;~jpVYJ5^J763mG{A1_q{d4Fvf5d@6i&x110LwXP z-~QM4Q?eQBi`?8Dj81PSBzYQFu`af>&Z4t=WvhgT0iJ{Z0Hofd1T8eBc_hk58DmcX z{)h0-i+n%gu$lB4fZ!S>xi%BA*R{uaKQ|-th3tS zk>sq+8$L%PW#dp8YJy`&QTx5N9Jap2o;c2DWmA1{2T|*jZHvQcCdRFE6?i>PH=xE> zxENKm(W;iQk`6~87`R=A!@%I9jyc8nqnbQm2CLK+qsQ-EV|xzqwK#g)%7 zu-J4=!E?`+aHE#2Z1(#_u3tM!{%03@{w}3e5w#e3rMVH>c_Wcy9MZx5B>A(95h*Fg*#+nb&+sAG?I}+~uLuI;dhZaN%`axf>c@8g}y3Fq31l)gp$Q zLggz$&oVtMqQY5H89f+e-BrU7y?rj9Q>T$w$0%SIiXicx6pC1*0BpB8V*daR9k`{H zxsujhvhE&QeKl(-1eEZfmdR?}Ye2NqP@0BLcqvu|8_P+ukcE+n+;wDTkr@xd;{54%0*RcK^^op#7%81)yK^n*tZ~1BnB%{ zC%NC)ToGG9+v$dkro&yH_>1k2Y3^Y)VqkGcKa9oE$cs@Xq}Ok6ADCBwu)n9N)3=nh zkgpV{nMoszg=5G9d~6|tf>f<`Ig=tJn^l47$my11wZ7nJJZ3JJq`<8GJrEGnTUS)ah;{ysWFuDSbUB@8#eV< z8;+q@7jGkz7n!13f=3b3uP-Xaz=?RmvK`sB@sGJ^uP4xEN3rjB1J^0{ad7#p-l)Ri z^{yLPO|P+eN?A;PT81)}%x*H2&m6aK*;%oX&4-5CPOs?5oPa7hhTQM5fX)~K93FV; z4{x3vwvm-;@Yr$BL;f-A+)T7u7Xz4|DVnN_a{)%hYT3_Dj#?~(Rs~|6wB|J4cqN!8 z2zf{91!BCHeYRl`@c?S%SNpH&n+G8Y91+i^C_7u<{WGm|l4(rbw=|Yt9^RGRMSNGQ zq&14q1TsyCiY&FlA!~3*pew?XK_J{ZpB)lyloJskgH(H;Y?@~9m?WQutT4U@zBu)N zYP9aH)N#p-w)opuHRxVvG!WlYZlEy#2?}N2Fy|4iE|4;<2gi;nWBOA z=OYjaPzW(ABM8)3UP0+rf3^m|*Cp`Xy};}FE3n zRcj^~W`erK>Fzx_04L@k0(#>i3e-3wH~>ha$iN=u;iJ^Jn(}3}CUZsOX1R%$D_A@E zYjs{$htz_uLcTt|x#fu`05gO!KK|Q#;84#V=>m)5`dxcx6H&?JCyr~aUQ}i7R9df8 zYCg$#f(-|5#vM*KNMz{S)Hs}uN}fl7_`GSc6t*J0G-^FVv=3Y+&uQ-jK0?GK93vk~*Z%l3X1vFySw-%(&*~H>9 zi5)eTSuYo^wzxqYbg$Qf#8B3F(bIR5B@e`I3FXj8RjnPVSo-t&;}p7rRV!FZk;`m|X0yVrsZWj$0OSHesF^H6bC{{TyLKW`#To_hk8?b*Qm zFZiZg5mtLbI8|jijEzNxB)XCh)3r2gQJ;3-$QvPBk*ck4)2H{&j5R{Lw^6TNzP;-v zG?uZ^oz~Kn?r7fOVzl;S7Ywzp3b5mD=5Vl9W?0(%XkH6#IdvSz>C5u4+_4>TV$iIM zD5~W8dmnt{krqiJc#VV8`-9&mFXeRh7Y9R6>t5hs+6?*^x2mPg#iTNqprtU5425iL zu%!tmYeXm!%?lm5C@afs5(7wEn!D&vryl1p4XRuMP?9<9KQBzDxt$e*&vym$U7^ik zDP5l>6Xvl~Ybd15g-@@Ms?w3?dV)LJJKgqDSS znCrLkaY<_fBxbdYmOnib-LaW@>{v+P^1G9NJl`AtmtQAcW#{#H)&G*IXBzR15 zq(gBQ4cI*M@}Y+r`1Ixr8GldduI*}lRjRdoM>U4i*;_ATCt@sRXNc4$)tTtd89`ey zkqb#0k|W%BM4mz6tcBb0SE%XV+pbcN3js3%f&8M+^L=#1E|VJDyMqO$GxYT>s@UdB zPUia8&)}f>SBtH;TNf4yYpV$21CjyZlx|H{O;aP5ZzA;u$o+D4ai>`#+9{i%>G>RV zYCIk*6{T@hGS#)c)RQXI1bO~KE6WtAD9TQhs#u{lZgT+`kRuRw*zMq6LQ)iwTJOKN zbMwa{kR)Vk1M0I%hMVpG0Bn(SdKWjRa1UkYn?H|&%p)I_$ZoId->#MYb36r`V6P9Q z^-e9fOOj6xf-ni`@0_u$*CP+T_32{=`>Edx*z8?>KUYy{y)moxE;7YT8|RlPPuIrD z7-;gCoQ^uB>NM=ro`2Ie<3%pMK=%pMNhFLk=^$Ci7tIhoLFxMAVhIwBM5;_T#~fe3 ze2eVH7rWOg=QKZXwVq#4VD(;_6z%G@&*N-kG~AY|OCQESI7Q0czfc5v=#jA_aDBxd z2xumPNt(zWYv2(^htKrHB#oz@EmTzMY;E>E{{Sp3hq0At<7`pW{nyB4E>zR=Q@~^- z$Knm_B%xnC940u# zQ!dP^%Bsh9BkX=d8ljMmZ;xM=YDnAIu(MUqrYdz8bu@MdN?3hS+%u~1c&U;+wDu^Kgub82&qSnSf4jf z<;7|BE*U3+La`cJKlyjOrCq}O6l2U+H5X^Il=NL3<;Js))6qc+Pt$)*!YW! zUSS^u5zet}$6%i+D;h%{#)*IpXZzMs_NcW^;g*QJ{1(rc1(SoQ51M0<;wE-Qm^&Aj#Np$i?wvu@VLOpY) zT0^*+dqd;&zLm4v`?^-1QpgptmF2=^+j7YV~R}9M?Z_hrJB;p4S6cT zV!3NJp;<@}$XA!UZoq7nl3^!?G{cPe-SxC6N-`(va?*hJ8^NW7nO z*nhkqsj0Mb&rXgHP|1d?R>eBmNbs~`xo7hxux7oD%wwUd_3Kw>1Op3}EAx0?B-Th> z*K3g&AaUNiA5Y6BZS?5eOhunjeaEg2_b0nuy3|^OA3*;AfaRWr`n8~!GpVXmOkPR` zRI2fWj%=62^8m5{2<5OlcFfj?@n@m_`1T?#F^*Oxd-2!bA~BbHg<8%}P2}$O z>irywPT0zr3fUx#QnJb{MSk?LOIP9+DKN-51z`j}FG4 zs3QLW#h%#7mMPoB)NstFk=Xjs$1iU(ozTc-DC%7Q0BSL~4Bas$b-#m9ezyQ?;C~(sQ{Fqjn68f|9uAqtjSr@;MRgfZ^rd>U=JQanHH@^0`&S1tNN! z3kLrHP%!&S{6#X`Rh3Pd3=sN(Tz*e)|Lu2V!E;M{Wx8~@K?u< zjyVGYqCg}Z5q$jeb~0(@5y`v4ZdH$QeLuzx_fNUqgwT26sxm*FYfO|9<7nj~z~t@P zix663D$jQbjI>cyI}(i|HzoGl+ogEW$0dMSw{z)#ET&kD=nH{rI34K!09<$IZsq9x za}VZvd}pdAQCj{jGjm1q6SQ$b?!I;i0;*{zb(mFmVld&?;j&m_-l6)j;Bf_E~bGadJBys6`6 z@aB#^;;W9{=cZVap@&hUGJ!BRL~?lGVV0cGT8}YH8H>hZvYoxZf{F_EE8UyoX-?%M zlv~C~w&tUI$0XtEdXasz8Wx7%oiD?CqRC*to z?Uf5d_S?PKagU2P6<8s`K`v`6jMZ3MIa%z^&J}TUw=chh&7bO}SZ^@+gWQ=PXoun-ODH$4@1u^u`}G1_~?ItyZ^6N#nA+JXNQv zjK;-cq>g)*8-PGQLYaK_~W`iv!f2bm3**MPwGvyYyg zBS5F2EtsHvp7mD!!_iVs;DPp(GO#VOheKm7-6FA78;bK{x_t15L*sPwV<5&-uZgKG zs8=D2F~#tACl(aT1dB$0Qh!1=ZY)_;AAhL-?Tt81k6>)+$^c9kIWdU)B0{n>5(ui_?t4^;*Sy{<28io;}_+LHmB4Dpu;d=|LSk z<*@j^O^6+en;w)oKjRb{hK4sGmeaWETE=Y6IJDTYl!p}sEKPG))<>;!pcO5exd~<5 zkdiBM9zY)Fx9=Q+c7Q&HA!bpg(;$C4J9X|m-^-?D(0U6Io3D_QGY(TXm!psnV{YfX zdw}u;bimXo2@5N8c8Qa0!p0yijwH|Bd1+8Xy$@{7l4>`B2dj+Gh^;lJ!Y;I1} zkXp($$mgkvx$zT;PC9(81Zb)A{h+tW^(U^OV!GQO*7T?=rzgk3u*970nhAG5ScydHX z;Wj-_Vh$eVG%ky`i5Tf*xr)?6CB2oo6=NFt$C%`Sr~BKGx|hz{2W0tsG`bjzAoBTCr4)2#>>T7JIC1MS7*E)<4=q zD-pN#U@O5ZWZmGR8w86XP1(e3}aLB#?TJ zlAzgn$TlNwkH0|c$0M&fTA^B%KkX?1*K5jG+P>HKlJ9iyWN^C67pMDsJ;b+=!0G3; zH^-uoYDrk*rHQLFg-@vrtt4f9`}C;eX194fqpF0(vz^J*cWOg)*{qf@7@O2_Rwv@~W3At2_{gcn2hJIz|&Ua@8h150T!fOoHlgn#NY>Qg1rp9EhW3q_= zb%q)lsiTTKY8E9>$^QV|HXOI{(26^kkb3<806ggoarhdE6otKjjzAoBAJ+!(7B%j^ ztCPdw@Uvq(nT%+zQMr}MQPdiKcJsL7p#_Z&?{$c_5Nh^rL>&3a>gAdehyc#;byx>)C+_T#<~cfav7TOZr#a5|$-z8hZ8 zCA##Xzh0C%Dse>NW;P_O_UpuAU<$CES<}cH^}<6H1gj&Q-8#t#nCcLS$))+$QT$#K zwrOJ4u<9DNb5h%{Vcsl+p9hY*esb8x@agi#p9V2514A0IWb$zgv^U30mzt zB71v#^k2-a{J!7Y64C7~4~V2XmH__%DZc*49obsZ>8iOrWt=`?INXz=ARUVG_UV^m$pCz_0yK`^80T#tpQ!%h8(Mx{4?cp# z&0{rAI*F6@uvt3UOyI-hA&z1>euP!pt!W_K7-Z!Vw@YoMuDfEi`^xH3c|dxO#DBb& ztD&?FJGl*Ar!&{!)Oos%1}?TQIShE))&b=WdbsP2200yg_~cjAJNfqOl&PR^t~BhH zNal6&uNTmIbD#gxs?Dc#F0{zj(!If|xeN|UYO~=nxE!U8NnltJa*?%OZl%LPW@h4x z5-;g5)cEKIz6Hj6)=JbZ2)9_S8{JaVnXmR-7 zP(_Y>y?G>gr<%H;5jQ2^e^3L^7U9X|iNa@T=V_*Ie?U+A#YVH$+NP&*F!&uQq{dfG z?zJ-7nq0mu-xqfC!3~Re$GT3FyN!r9X zT`)4WsnDWjTCZYNwkth~b*2&eW!YjczsgGviAu&Qv7uD5uq2!B+bu?r%4&+({{YEz zt5-9paQJwaB-so_fs?x|6QN>@v9O zx|i+>nU2ZmENuBI*&MwbrY|*moys!B%g{`Wm4)dZ2_vvcXr&4qfxg>yt7V8Lu?mbD zHx=MA@_LcZ8vg+5K2rmGPHCKzU9)X$*Q=?i<8)?H&MKgm298+p*^1FurjFJK91ke? zHy&Q(=S5?FY;NS2P~jDfKoAdddtg4b*O|(*XL8eC%jgX=gR3n&cQTZrrE@a&oFxnn zIy+)(GSZ$|2y|Wmr_2ce^kU6*zPT#{M|%%B3K!J+pOz7JyF|xEl}&SdAwxH+pG@DW zMjAF?6{*KzB(;UbCEcuw_~}tlA0i)Ha!A~5-cwxC-chLErH@e-m|V=DA9Kamu*v*b zxjq+6-MWtkZmY<0^mNsPiW&1Y%<`;xFHOkG*y7|(8zV;EeLaX$N6KtBu5krQn5>Pz zmDf2rijTQ=H7-6nNm{m-MQd4m)-GGKESDZfHJY_JA*8c#;D0{b4G20y8M^|O&WVJ2>P*s|aWJgw=SZLaxX{%L)%{qvM@>gKZ zAVT{e18%T}r33MQY(kZYG!4jZLG?bLmLu-I138PNX2t5wHJz~}m2uJO1+W!yIR$I6 zWNg`*ER9&DlG+HRTHcbMBz<;ZZZ@#sboI?>_7UNqGY)+Rr_S;}M(JDl45`!>?`eF7 zxyD+%YMSMxl`QJB6?b*Th^VaC>frc}OBP6A#g~Xa!1dD`8@yn&AQ!5m@82v22VZvz zTuxI^YuztG#1MO<>I>csKPTkL1`9x#>>qtO3SH z7{SRjKJ6AY$GOkt@cRU?6#BLjxD1<5PP%)}z!Wdx`m0O(Pe z*Bs!^v630NRs9YUXl+-B)tY-$+0c3!Dr;1 zJY-r*?v}|<3{){$ftRD5NY;2|l1G{;Hav3n7xk3KlLcB!T%U z3%KYM*e&1J6!$!(bq)7Qz=8Q;M{csXjAG+^S&z$D%i?3NC2CrXVsW*w2Eean+O1KD zRJCg@a!E_eYQ%9Dbz`>5dKNoP^;`P9wOO@_TWK2w3-4TTI}97{R!dm+=P{GWvL>RV zr*Ux6q=O%ty2yzQYlDUA@Gdnj38W0~EN68bM*L4r*gT*fI^<0&jl{1c)%>wPr2EaU zb(U#xSWN?`GgyjFE?u;S_A06*f@!T>Fc^$UI!eQEBMMPGd-P>!ag2>vn=L?Pzk?N< z%QUs4zgJG!xr@e)GRm1e^k!v}#jM+$hZ;a+Z9%kEp=ktZ$A24npQjzaz7r`nHxk>g z{{Ydh$JX%c38tXa*eGz9@>ed)lWAwOk<3d~@&>xdvVl9r3{0yXv=OJv`hLNWjfr@^ zZwf*jDgm`re*UO1CL3*FonpS5mnL30y=e0j4IRmlrC?boc)!qMSkvmMC^ zmyqP*ekEjY8-dc8xHQ7OG2%oKTJlKdyPPMd->n(l3L4i>(9-!TyW?)ww;#qf8!wup zY(v8K4$6E-C}WktUTU!@Zx6UD(-J})d3mfu>HK{@6F7e>M2@lT^_Q0)G#zpN-` zrkhO7MjCpXOkA&!&gbv^LbRC5xNM9N*N*L|WB98&=L-%qF4b!^)Zoj*YCKz9R+(8+ zy2tSM?3mb(NP^0C+hM;z@+fK`+4|=g5Y+|-jeo`@yT{xNPM*fs%HXp4e=4}@wyaC1 za&;z5x=is%9qVLXK~5EhyM+rNbs=^uy93kWsTRY2zuP07+Br(?C;MWTw*LT$YxJH7*2UEK4@J#>+99Mq7 zM-kfdxEuuC4plr5t&AQ`WxP zpq9fG0_r4YB&=|r1@-qQ+b#~A(wW?bjjtZ4yBwL?#`Vh(R)$)XY)N7&vI+9XCgjF#>A0j+y@|$`Ct@t z8_3)X@BMyR0hq<)HMSocLr(V|8@UV~eWJUU(zyCk;k6u<5q*3{R#R5QSSrF-*| zToT*@^H=bbfIy(5s<{V!@$UV+`yG7t@XjC!qeg ztnB{);p<6i%zya1QO|0HoL*AJwe7X*c-(!;aY+9F7$wa>4QrV6sSqI)6jnPCzQe2# zp}m4U26Q zi*Rr9?5V^@5I*FRUQSdFpIvbbS!#CtXX~a`%R0}sd5-MiwAP-~m$WuFP2_1{EonMh zbSxL|T=k%%Y704^NrexLQv}v)s=}gAAOcD0Bva&GHr4U#{d2U$JG}C-A+Co&2p9PS z{c_g6t40r1@O@ z>nkgQL2buaj-&--G%%&{3l~b{^!oJ5{rH#fCZMa^nwpbKW~)i46k@UiA*Auwa&_ur zE}-~H@^OgUCyBWYmYx9xl8Q;(Y|->_syc5Za6Y)nXA=!XQE~;-8ub<^ zs|N~whDVJ-vB~xI_Qt~#N#?K=e&An!P`0j5n>&8kj3Ida`0bLq z+aYGwn6azznN3wN(={pI$73|NsJC))(UJ?5V-a1ByqOP*SUo!djA3GC+yZ(aQLJ-7 zcK+V^G{xgk>Yj3Hk4}AZzgNcE%VV(p#@4!So|wCqpYyEdBK0`)R)00cO=fDgqAJtL zg|%KVlEUIdR$Y;~Hpih7_=E2jtd6|#+Ztl~GkIFrCGpsi&p8vIaQO{Glgsxr6R&Z$ zWYixM1~QIvj%QEiF_m#v(l(O|cO#K9SgUFpT%-#UEU6%7J_zevhi%Hh0l@zNBQ;RL z6<3*nVt=v6h6_Eb+a73TF}NK>kXUF&Hojk8rROzcB-T zfdi>4xRKkNImCh^VP5=n{{T6YB_4)O66Nt)eudbij^=IS$H&QeK|EF=c$O)?IzL*c z4cS!!A!XgR14;gEzI-ncfdEK$W{r(Sh#0($90rWeMTg5M{J$@z=f&8^%~v3iSBEHp zAwQM+P&Y0Tqm>9*Ks#^9)#p^_*9F5rmCjdur1*_LCX_lawHlLFWVLnUfYo!wYNkd* zR~stB>E^Rn;iXEge^S5dBrxqDpaWARzN6GJmz zwQq`(Q)Oq(WGW_q)2XIHK?JhF1hU5k_$y=EyXix3<4ugi&vm_GccP7DEE&cmTsqIQx&=JKYD5UNcu?UNasTJIXrSFhT% zi%e;pO*piO#^*`x~qpZtT`dz6kG%@tmrGHvhEx0T|+-Bh-k|@*s-m&Mq>?LO&|I(%a6)clO20e%MGgbU@%axiLE6HxjQKUVp6#wN~!Xp zfaTo5wy3Z<^!+nltu4t*{eN7C$#$}Ycs#BXM_ZpnWwNy~R`UA7N*3Zt(yB{Rtpt}B zKRPp6B*>v4PkRscNHB(~CJ)HI9t#mWQBh=|1CX4N-W;QVf5~ zs`1DqmL?T(Fy*lpuT)#AlPtz7F2`^YwmUBQP&VV!F;KfIqVd-(=77)|rF1=QZzXu) z?rv)ZejI*hRnfUUe0Ema{1?Q>h=(6WYOyS6i155{?obDERf))?SEgm>n*QHkMU%wH z#wg!tAam5$d`|aL{*>&T`b+#>tCZ?FZCQ^oeKqUaftB|9kf>;C{aQHWTzu93%Nbf$6W-KK*JUj5w65oB{1 z7-fpZ_^RbK40$YzQ@d<&m8FM}MdJL2E{v7hcDL!8sCTOo!K(+;EWVPL3z%EDZ81KS zHJW;VAC1LiDrDr+ca{i6*sMkRG$gHD?x~t!Cby$YJVLhV|Jcuch%=immy+HfU2#^8$lIN_+@Cu` zAH&|WjcsDX&Cq({hx6OIbGSD(1-(mFw{G*$x2>V9!3J*b8pcwZ*t3?hisLDAy|2rm zjwC?Q*WO*@PHTp`Ebe9Uo}ZQiXG9lRp`;PTCc?v&z z#|vPH5o)M=UNWxf3pm?3mDM>d2XYMAv0vlznhM0ZdNi&vfoN7~tYqn0NDSpwrQpS! zu>g_@yEfvK6`3@5w4d|B_iMfHrQuN;4`uLi8 z3iz1}8=B{gO0V*t53mX<1uifj5S_#W$vIa$vEJ_PcGiwlx7s_lIgMkgame!N!)ArL zm`yK%wDC<1cA6OI#ddqvR5f!L^uiO(n~5iwDv&w$9-jChyq7=@c|N|_M}pK{>d9#Q z59BLjw|PxVPOeHwvbbDz=``uTW=QTfL9AqNWKh%=WBSlUVAp%WCbN#`vpq_aZMzThtoJK?*d z*Vi(E2WX}A^!esCrLE+tlDm%0*p)JKMLc5c(PC}IwPb~n9+hjgrkCS6o=lq~j$_my zgO){`<2z#Tq+kXcO+J~)TGROqmbldzv5cpBI@+@!+K(Q&+SbjPu2Zx5Wmm6f9_XbA zWR0YeS}=p#3Kn2&^ykwINwHgM^dgUOiVpPmQR+e$C6DedI-Y98)g-Bf%SDLG0QRBv3e!w&kMF3(I00F*bYQzu^P$^{D&7B`t52)tc{EcD~F{ z3gM13Esd#aommp+dcwFimRUv+4mAda+04 z_>Dpw{vvnkH4I!t@2NpuNI5LODroD zOil&s!Al7yq7auhejLv&cxPU0?sy+lQKgt@PMUa9DGLH9b6v}SZ1%s0^zv!766>`Z za)5S4RbZttuNC+#BotB-Spxe3nN*$aW#Ts+qh*Me<(*=;x)S_;Rhe zZ!j36yWISS3gsMpv@Bb@HEea$7CPi{+q*g1=vKVUv zC!%4mToNR3jM8%UP+ssY7nE%R0ML{HA!w zlDySmjwOFeWAa!G9i$Av1>H7`$w8@T{{UR{)-a3Y6l){%dD!wfnqmw@So^lDQo2#A8xbOS3Tfc^@RKl1B|-cgIGdRDyY|+fZ(uB4kJ~ntA!#=Gy?(yGu*2$q$!)vI#~)T2 zQ(&@>8%iwNk#3{bsaX_5B$e(?NE`|FQg->6m}6Ug?+3#SH}&tD*`0q=C<-l64oV2( zjWV${l95A3+I$;hSz?A*?MPg5k&&6lBe7ruVVEZYj^D1hps2RxxIbLrCU-fT?rXlB zz(JK=G3v!zIw;NR+|*ff=o^@tb8(E>NZCW)vA5|d^oPy9-y!kO;z6KRjU)n3Qhx~b zKiFr7sNJl6k*|~y|(9)%fbr--C|dU9Vc* z42N)RMUev1G9gOVE-H|*0{;N9Sg*=CACzo`Qv=~QaU!vqw&j66^WKLYqk{{=3gOU{d*Q}*^UJG{FU;) zwTEIieSiTK6n?+(kA}a(bkR+$0lq0Rf@`7*;aAvn&&z%#uao1G$ufev6h1{iU30UY zuct0D6}MX?_;r>6HL+rGTh^?tA|+Yn3ewL>46H&TbADTG;5S~%>ef^-%?|lHS8R?g zJ4Saagj(kKylOsDzB!mvg_bq0tLsYZ4PnkwTD!qjhZstNeH7w1Z<&b)pj|hM=8^fn zo%2qyP?U^uU2&nMbsE{J341Q(ACyZIMkNRvc2$Znu~$HzHs`qnZ`Bd`cOVooMo?(6 z#$|lm)l+P)S zUUyO@TJ{PaKM;^sf6_?`hXoH6+>N&fq&Cv*srW`091<}Z+&ys_hGm(O#ONM6{FKb( zgl(kU!|E>K$Rl?4_S>&JQ>k=jKsc^*k~02l6_f+Hxf${{X}HT-m?ePsM+1Eb19W zj9+qb`sNv=l_ZW_PNas`HpEtzNbEnuqvGHj4V8UG-0jzk{B;9q=J;l~LI^5Tz1X5F z^*QW95=bDU)iUYj1hsG7uJ%;MX84G$dWC9ClE@JPJC=ppa1RoFy}SXx&4ThMV5gDO z6uUv7Il#=E5!{g`Xu~qaERtH|T1ybA0CJ8Me^G(q$C9W4M%#4MMgop$uCvEuC z742kYwDIsIidGW?QSU5hIFYk>_S>n=#dXwrbjEE2V5PiGiC}_gR!c$~b1|Mcgmr9s zaDyC1V2dkHA}Y-4+mIX&lpc`Ufw-wXN9UVVEN8qz)RtJ*?ON5WsB)5+=3Uxp8McZZ zUXe1&%EatKuKOLf9Sa_tTg!s12qA|!Ni8;k<+73F9U_fYXBC~ADAm?KO=Oed=R?n6 zjHkl*-;YL)qsmxw+a{JWO^d9CXz-3jiSrS~J4Xn&TJ%=tm89hI8lq&4mM|PCBa`l@ z!S@A*Syzt_$=Hg?>zcksM>^vrc?5U8bwBjZK4*fIGRkF!D>If@jnqYtU>{-!w%&S| zQK)0UT%suX3{HBYlS33TS_>0co>)v_MRh2$I<1un6FrGlTYgQj1IM2SsAQCe8%GtF zBB-Kz&T4V_E(z#$u78K%RW_@__sG>1k!~W$`=bY(l(b9h{mEkF93Z zIHjFslNkY;dja@DB={P$8Tg4k85x8v;`vYIBOZNQfLLRZB(N-3ob5bPR*j$0 zl|q(PZfFORp^seeR8(<|1K&5~#?JAyzN8I&*A*k#v`s4dhE18c4l0Am zJ9Q+CPwR{-Hj3+!SLoD&C!S~mM=Y?lOVCzU_=yu_u9aquoz)blrdg!&a#6a8apw^GDOlu;Yf13mwnq~;O;Q6{{YJp0VLYi9Mcbw zs_o9iqt;1Lj7+>9Ldf42XtGBXk~3@q?tjho=+L4N)!XZgJ*4$GV^RTHxQ=I7sl>3B zWt`Xb2@we%Ctz90jfheP+o<#J*GdaUO8zY1q&Fip-zONA;-x8CC`j~Y5r&yY;uV>c zIGC{Uzmx6%0PxDC>fX0twRH!Kny- zI$%z6)VYw+s>l2IrFwD86l5KhWNOGHcPihw1!dg%VYu3u5n|{1;O;JLj2?##e9s&* z?NLV>+=Pu2$6`JI0P1e419>|F+*EJm4?QwT6!U!JXs#Dk$4eB6Y0y`MhmH#Ijs>KO z82wH)xibF%)MR2$71@YZAQ8~4i(7h}1}2VbHUiVh9lzE1n-6AlZZ;1xq%O|S>c$yk zjahdAeuLaD-8aQh2n1KA3vxPPJ`WZzJSiLkq$W0q$iytXOGr5wmNs{I_>I0+^T_Yi z&nD7E*~#5_zWFJsw5B^DjkAEy;V{~(M%#=-8E&-3*82oRj=Vf5T%Rs21+3{4Zo7No!UT zw`a92*y`D{Bh578hK<$MPU@EBZH;W3lF9%}K0@{S55fNcjtoLQKgS`i!d2<>b?x&X zrhQ(M;}L4WNj$Q8_WuA`z-?zoSZNJedrWKW22VQAik5H7di{U>K z_-o5M$GHLgOUNGQxcvVB<`S+H7fwH1>z8b`4Q%a6D`v6S-2Gb=qlSN0ybWSqr6j~X zO~r`VzRW#9TVc50Vm?wYkL$F~d@0xxMNy;rVo#IIjzJ#zar=9uw9OcOJPm7FI7yJN zko4(#v?F^aJ~LOERYg1`<;1d$$U76ip1zMo{{T|{EAa3lo^nDWB4j;#5@wa(%{ijetvLBJ11O;jYFMp2%eg(Pv5&y#G<;cnW=B^+tZn2mRPTD20h7lYGD2!eoBY{ci#x*eRc7G} zk09~|MCbn8LOx${J!t(5rPK$T#3UmDTv+LryS5>Fe+G-wxheHkJzc1&r_IlglJnC(4@<$Bh;yXPUO8)E4Y~turq)jJalG>2Ax!oC&ewM{&vH<>`L8 zL0d^AjW`{Cf8#J~9`9)W$I`K>^1al|XK{M^#aMATm#-#LwwlUI6B*tKs=#q6rz<2} zr%9R_`TMyebJ7%y_yO&UaL2dLwPK=SF6~04DvD+G_aEN#W3o9-XQ{K-tYvkKnwv*t z@$hCaw&fagAE+n4Vo!*pB`UaRnk!fnUHFNuGAY3)Od5B$V(w?6tUsyQPj<5rL~BXpH$mAf09bF-6BTlMMPx5<02tt^+zZH1`sO7m+B!gX|s=skJE`!vxOkj6HfTj%%m<13W?_wNoHFNN=<8h{2Nm!d{Rx$H(*f6lh`accj7ve7$=zqRO z-X6Phz}s3T6L!djCTRDf(T5g@I zS8>1L>|9Yuan`dKTQ;WEI^P9cN(OuE*FL84V@l`v4a>dAKLk@mB zLd|FrNEXd3HMk6Te0{ia>e8iTDj|PjPV4{$@mt8Og{+?S{)TLZl9kACvXC;8Oj*aB6DhiizT7xLo>$q_ew8d3+;y3D} zA{HA+*u;Zf$8HaNj70kZbvx7p&tu$QrdwT6Ur1=fgpXTy%Ta0FIwO)iZk)4w3x&jH z;d!E}%a9Xdg`9vzl{l;{&mQCFBgl!iiH7|_9DW`v*yZ6*fLT(MH{$%dVO?!G+kBKW zW<)qA$4ACXcQM#F9>z+YmRnR>ThhX7+m>S<{*`xSX+R-E9lB^`1n>twn5*#s@BTAG z8-vp;K5E{N(HPwBsl!g=PuR;vJ|^7PGN@tLm3Q(7C^2An(N10HxVQt%BGmm{?+M@O&5pOy2nhWky&HHmurSM?PItwAI)B2$HxeL*9%%APqRfzqXNs~oFL zpdU}%_sU^JWR?=;TK;)Za(c_Un19OU)j9(ScD8YC&!cA2TB1Eqg2<#Lmf5R%;WgHK za2IERW-%h5;24s6WK88kyko^>v0U-oi|dP#NmB954xe=s{{Xk4^f@_({7qNRVX*~#bgq(*z&5Ij_wAV)&jAWs zl1UtN?}t6R?#?cqc`8Sr!C-4bw&~+^<&?AWF?vX?@Jo8`Ivx_}*H*l#_)LE@lsB%;ysL*4pVklrO&oq%RWOyk^!?$wg9u~ zez{aoMCfIi>B*}ep84ysJ<9w->1RH)Q}vGTGh%UD_+!*MIFmn$gJ3o zgpxzVqrwt4alrfT8jkM_Y-3R<;Pds)c~WVPo@t{KmX7Us>Fw{AlT`N;TV!R?xO^6i zT)hiWRI_sRCbNvMhD94Z(@mIy87@H-VY!`|qXXZL`@TnIbW$xq>(CB59BM`X0N30H zosT2@Va;CDX8Wn2uViwa%a(?odv!0=j|EbL(9#w1#El6r*qe z>16{%8eKu~$*@4G2e7Wco)l6N@~nKP<8-HKX?!eM+u8W)HOzx$^$te8 zs!*d!@o!Q~u{8Cq1(hC1YnDKtP!E(D7Bv(|1G)G8@PstRjj85`PCskIICZwPnhf16 zj-A9`(k+dS)+XDpVwQ`=Qz2YPB~)dJnZN^b2~*P(#oGQPd!}w*3UCz^jR6P1k+F zJ9VsS>DqgY|haseck0+e!BRDYPb+#pSPOC>piyopIPsnT01rXm{fwnOl+O1rP4_1; zs`VW_T|e>pY<=u!=h*s{E8J(^CpafzkzB#=$DQ%P79lAX{ZxTrvU&qst!S)@F zO|Nefcr}5j$JBJNc%$kETx93_A7fGXLVW6KOdbzaNl)SR4I!p#OL}_slv=Nv#M+WS z`K-K=Mg*>`PQ!B;J~~K=QQwdW{9JMf^!ep-N+c2Pv&RJVAo}}`*<hUF$d049wtiH#gjF)L0qdS+U=i56}Bu0W20L1*C%h3D!Wv0yNiur9n70is; z3RzsGD5_PpS`0-D?j-LZMVe$A%jyOT$LBi_3K;pvTIzhnbr?{!{v`5)(EIvjGS#}f zxjm?ooqPF5)>7ZN@@e~z9aCb>I<3NLnRS{6rt@-)M$J_PYNlfw+h#JlH#*N@BV<=W;tcaot# z3I71co;~}6m%|H_!1osomBL=PTRDrhi%R~6owluoTXLg2#f{3>SX^l%mQfnKL0%Az>_JlH6AY{dnz{d|1AeBf&y7PcS@+ z^d6bi4$%G+ds(0oj;q7rGWl$ws~i_>YCHGxO4$49>O&lnT1FWQ6(ew@IB-0Van<4o z;v14HW5GRtL7qTys94+*pmL)64?~u72bR%~X6By3VzC(PmKqhQ1a<~K7z9J-^k^ze z%}YdEbl|R@e*5%RWL?R&haA^zcM!@WWgyj$PJg~eNsZB3V)AF^!%(j^lOz`A#fu*j zV==UCI7nv({CwQ0K$0EC{{YcyV@ox`>saP2kM8CO+$;qzbyG9|Yb`dMQtl>e6$09i?_vl-J!69pp@r4*$EwmpuKAiW&?i*HX z482=*bf&e|ts}ij?Ap|kS2;@3#q-#Q4y_AUh8uem^Q(nE+XK-SW=f6OR{6fC+Z9L) z`E7`y=sD|x7d3x(^$wwYRxeX$v6L%Yj~9B?CC9^;+G{+QH9jvdT-UR)V;sp6CpGei zZ~#$xnt)~seLt@~v63pp2qSZWeQ2BX_ZdHu?G^)4OO%^dW_0cCZ&u}7ILw`dqlvjJ z6y6~OnP#B0)!?(~unNvb=yulDl$yqC zS(vP7tc^(~%Ed<|le>y~^14M`Xwt84UUq{I2%B&3zTV>Mi(BrA_x-Wzk17eY@1h-9))r4xmyX8T*DRw4_0_8(pH#97JQwVttx zn@nBD;$?4%r<%$vc?y?qq+YBoim{KBTT4K*GbbfpKF#gcg527b{`kiWCp_G%Walzkm3uC)Af=)GTs5|eP_FTsz=Q(5V&DTv8pIaNP+Z+?m| z5rL~D5n%dyjx#mrvB?}sDMIPPFX6xZO?E!`XRdVCwtDz{#*yv*KMUP8u^v0(^15PN zo(`<|$eO{*#V#@6M+$+KE^3Ix>{NY8Y^*0!oD+l8_6{4Qr4CYxp+uc*-wew%fMCUzm> z`>$NcO!`=%nmL2arkGW6-;Z(mW~M8(vG#vcL#ZfPzmd_eink6YPW&YKTlmViWfIRg zwQJ%enNns3NW-rMJ_p#m(eDk^iWU22v{35ggHxs(QCiqvQhL@Wdsp~?&@J54g4cSE z){&nja77iVWUYdWFD)xzVxf&b9)FDWV*NMu89r|tx6>lnyGywTgZbp25qC#zk&_7| zU!vv4)VYktUnPBTxyn&#_!e2G__dlyFWPz9G)cI?;<%Yy5LMkt0ZOPnX=BL^$Jf`_ zG;rGjUr*Zx^=3ls3yY_xGITG;k*f8w(OS1#9UTi2N9ogoDsxmrU_9lOUN=Wmw)_1C z*qQ`m5JrfM+&DcuRx1;<=U(VYFuJF@de;*^FCl!{Nu6S`jEYZC*Qh=w4~Vf9DckfV zSxU?{0PXD1ks4`aJwJR#nc6uuXi|{9*J|%x-_tzddt0kCWjHCzozz;^=AVK$z}>lb zA%df3Ux$(FCS=#O>snJGkA7>CxN6GM@#S{l`AOnfFW8)!pi$ znttZ#?6!{9I2-Vq5#NH;nrkDAf<;7@oxx%f_9ApL`k|kQ@k%GINb<6=u!ZCsR1LF&aPqgj47g=+Ppw4<3LF*p=W@P1yuo_OwtE4P>7{{ZQE%_*mHi)sm_&Ab@AlGXUR3n2 zWmxzQd{s`w9lGmQAr-)^uW@L|m=bp1xUMXFU@vi?hXdO!L#X>lp3wI-z7rgcdbHK+ zThjTThygNEJ}(sVNBM>5$Y_ZGZoH4*qb@F@lE+W@_rv&nQEC~ZnouWIB~Pgx1Abg* z&%;iq)|t-TX}rF+(zqFtWyzNe&sNDz5{e^x1x98+mG% zANM%1`R9)xiVn0{J09z?zP0E^TU}eObiR?(8N0RL9ZxR<%~rNiR)R-P>r|8A;E<$# zl(5G(+oXXc+s6LgGkI9Nqy|0n(9*=8X$`365CJ2-XA?60(tCjLi6msDxW35Gg#YoO_z!Khp7vb!BR^8*bUcuR3ScqY`ZMWR?)dOzg zK*cx#)POd#Q6tmW^2X+Y(!JoZotp>S+nC%0`0$o3Jc4YUMza74(fmz1!i&y9ZZSFa zkKcZ<+=hoBV91LUimW{6xaals&wa?#-P9U_3dyW>mX_5Na1iDVT@G_~pHj&Ln}+x( zao-DK+?FFQ!foUO#@}9=6-AOw0yy->Nea4Y(@>xX+yivF?d#7$l6{^0LVhFlRzFbC z8H!q#O%r;k$=BB~Hk!)XuJSkL6{MM6K~am1S~PkP9Vw9_Rgi0oxtn);b6!sJkFF7Kz8FtAhNCUPD$|u+5z;u!5he==;U3EWZwqxw$6J`_knQQ%Sz$1T2m^t z8`aVJ+}x{*s`bpE&Y09^!_sG8nJfhorpn9wB*?@NP+2{D=A@%j8bvY`nHY~RM)bd2 z|I?@ywWn#cew??MlCBR*3~j2I?0j_Wi=L%;mLEeETEE1l=JhO(K(_$pn{g-EWt(?~ zib**`$+=M2GLv6FPs<3c>s?E!bncO{hSSvZ6|Tu*9G;c1WlT;#;oYxR$XmH#emNeL z2#+)RvZ^N~KgVn!we`%9>~O3BK(35R40Ad^NADrbeGrf;S(pZ}dQVa5YQJl&L0U{Og z;PU8AfLiQcRXB-{h5({KUB7~q0ng93<%Sr{gWkEOqR@E^rMylu)W714Jh>}4=_yc_ zjP@%_C+7Z+O)|#o26Sm&P9Tx8w_HaTb%Kg)v!%ooi~j)FReb&Oe>3 zgjX!$>Ridm1?XXw;b78;y%-ia8C}pZ1(cQ#^6o6bRPl>Zx5PWRAGT8Lr{ZR=f{#{O z)4HYSdifjl@;YBJ7x<4WetUM=7cr-rq_KQ1KOGvFnyjl`PY*o2H$~JA#}bzCB{i#l zquif-Bkb39?&mOCyI5mzH({e=lvC;(nITlq1YSWTHVi@0M6BS+b{FN>^vej^cCMy^oo?og21e#nDNQWns?o1*f@12t zkXZ=!WrEFHaMV?J=OyEbJ-%bGFZ+DoBc=dVc@xX#3-P> zswv~LM;(!&+$@dknzd)gY3)Ao*lEO83&WJjSb?d}TOGtJSQXV+f>V+6)+&IcvBL~R z>$OdjUc=V?aH(|;QwNr*i>-r{ev)0Wla9M%^wqmo6XG3Wu=2|1AvC;zi|39#wk!_7 zfqDRrn8i?Jkxu|0*X5seUb56!$`>@=Geg(z1~VZVTek)MLyoVF!rtL8DzPN!CbJ!h zWc58a@(4dS$_HAKkT-7R_QlGI`&0k|o*4ah%Au$w%EP3u zsP^Mj;PtLnOpInY8JaCCZv{I40LoeTIV_a5l*QUkFDgg8i6WQwBy~d-y~p&;jSPUQ zsN6Xx+vS$)QBQMB_U|8u&>A~bcV zt8&C%QCo@R0W4T;(GZ~99x#^VNdlj}Rj>ztTKB?z8K?V^dsF6H8Bw(U3YJxBWU;!s zm1v@|i>%cx3z*w}@={TYiX$(D_=8ae=31c#-D=!#88N^t`l~Jw=1S z<0Z#E%`cJy-^Nva8-$c)DAAH>agUIrj)FYInVCx}GRkitn;O`I~DYOFI4#}xF&E<0>4~& z7rcfXS5A1vp0vWylNE9;ZJpFIuf|uujkSW2G1=R1Rz#~lKDM7~F8LVjSde;4AF99t zc>qsD+ra8};uJzz6|Bj9JCW~_S}zOR$iF_Pqw)U$kzJ;&@ zh+g!afsPT$NhJMm${dDYx)lcM^oF0WVhLvjtHagF2$WBH)sGZty~YPZ_9% zQdX3HKgzl6GRffdo+C!$s#($&GIk@gB(~?%uc&028+KHtQ{BqJ0eC4_O5+hfFg z?uC)>jCqYoHTXv)di?Q+M-7vqt3_ z^zNC`+3B$}9A-MVsah#seEoQG_U+ADMYm#{c-8e8WLVUwcMtO*8-2h|&>V$^0rHn*4OC!}17g_>+{Q=VjnVz#gs^ z0pp<0CCl#vrJKC<7GCYmEu=CUzSvq7U}>`Qv1zh1W}=zKyg>4X^zQ!JjOQ3)B! zl7T=Qg6;@URlfaeDU)cH&*Ce^diMVSIUm|w=C{^a%+4O}r;}1*F6tJkEH-e*M9+uB z){IKDanK4s5t5ed1aV}YnIT}qW^O%eNEdTPJu8eTU@rh!to0=HziR9+20O9aoj;-l zEd7mfldGhp%B1;BJ)E{yc=8rvSwAGh)rzr6YGdn#CPZd-c@!*%VtUmZ*3SfFWSFKz zBXSYP9sBt&?!T#VCxHmd%RsH>BhS;@kKDj+tRr$r(J)ERM0L8=Lxjd)8KN z*pBUKA(F*rG-ijBO69c_SvoOke2!BMYL&;5TM}W~%iEr<`*+qb$CNSGm=GJu1m@kr zn~F8l*XM`IM-)!Pl)ux`v7MIg?mI&1eLJmH!a$Ba9d)1k5~%^-LzMK?O3T9Rb!6Hl%4?e?|zuZ&{Q-=L$+r-g2H0qk0}E* z`D&CWY?Z2}CbR09Dx{X~Sf)z|<174#L7lYaEU-+OW|G)bO+o59^pQxZy#p zY8$${H2PM|zL~FiVZ`Gw6>Du2zx^?)RFR>z2t^Fe@~gXsAPtV~B$gLLxA(;~h^P^O z-g}e!0i5srO!l+48HuyGnER!oR+d{(CNJ_8xA7UgHN|@A6>MW^uuN%U=NVlrkg%&Z z`;Z4l+^e`Ffs;bX;zJ8=JI@u+bKLX*XWrNLZFDQoqV&$N!go=%ZP~EestVf5?6B$0 z7UHAXj@=2SwIzGB>`%JLvBVd3M{pQ%$itDmQ8iWH-!D-d#KNn#5Nx-)o+~Wcb`P`~ zM=^%UXPVK)T!WbM__N>{{ZQ=v@WC3(tH&xUIu9C8Lh`;G~SLz)pj#X*!cvl8W`jx zsbwly@zg$GLiuZ@Vvgp$?dQLv^TV7)Jt^Ak59b*@K)Ad;spZVWJ-J<};w`}_j!b?U z7K~n6m7|r^nOkr{*e?;*k_arKhqq2M8Mcs)#h7ttsk{%p-K`m^^4UE-fUgEuC4`F~ zsH)htLcT7othP=`V3G_qoXnJJ%aFBRL&8*fPwFf2U{6SCQ-x;Wi@aoMBcXWL@V43} zjUK<3*US2@3%7cIHIVKX<7ByC7e^mv;@~i|OIc<331*Qb zqiWpu5U8%gG6i*_O55PiNPI80^asc;}^7X--}{0s^;TNN>vZDq@WsHVqByW+#3L`gMDP;yp zQZNAH>+{3h)f`Ry`(!NRr_~khV&toutZ{bnIXrCzDLyW=Piqxg@}a;u+jE4JqlQ;^kK1X?n5IA&tlzsmX+ej#bPTn zEt@rxS&;LFHi<$6@&Fwg#zHiTzFzr~%%H4Cpd3*5{{T5$2ja^@<}}`ZEBYfjhhrto zRcUaT>GM+RI+dnhTJ4G0#U)em5JzRi#IFKlRxRKGX4-tdTKw~Zov6e9;qB>!Igi8z zJR510(^w2_(MOL-ER0ndiMe1?iP@=Q8k0u~qaappE&yf++!4s$RA2{8CJ*9B7V8$+ zzWdqN9nr$+{HB(R9g(voi}kGJ?OUUX)Av+O@b8YsNmmy}<;Gb7mNB}R7)4PkO;UW8 zKO2-6D_WJu$O+(#WaY>r^AP@6%}IQZY*Hr0@n#kZ@$Oq-7_5b6)zMWMZd}&(`qQPwMKLyksbLyHVDfwkpNsvyz&6HY>|=cs)wk zoORc9GF*h+FX{;65b^Q|1QHD!GXg<=zTYpNVMzpN{DkT5f8#f>_4UmRoVX09a4#$k z50wy`+sxth4?a5{)(0^W}$Jd5kgBM%*ZTSlop-C5 z4+E#lyWqw@urxAuuU^S%oBB)gT8*dZ=N>4kL0{LgG?y|s+3T5ZOB_}pNJPZKBxyqx zAc6p+o{4I`aMX${UzR+2;~N9pj8=rwxQ#WC)9ZTnUK>|u*BX3QrEei#rPh*-d-iY9 zxdo}6A}=&@KJ3MtV>J4>v2qwyy z^G}GQnXLqbv{=}rU&t|eIJXGG6;1E${_ z{vNe~!{GI0oMk+X3|-wp1+6xjEA1>8Yk4{;AZlQ$s?KLgxD&-eQe^3kz~`lXUS}dr ztJEAxcZOW%tI&BH*EJt+^ae8xlxlbEU~pM%>{(glsRPK^b6iO-K&wh6k?RtnBXpB; zQ>?n&ssXC!>-WuNwuzmM8=;na@ZEa)_Qj&i>gYB0^87XuxW?SmG<_d|h(n3Sp$s4^7WN?66>R0>#aJ#QJO z!KIYFRo@|zitpyu@|OhmE=j+}#aOC061)44BB)n?o(fn3`E$p}4{T-Tu<++;+MXNO zS~_PRfJkoOX3U?+?n_cc5n7qx#YslA5y%}HIOdEpotT2k0HYGYRA)&`=5v4BDVKOV zeW`U0A57*fXCT06+O?|Ks4;LhHy>h-Lh{qgQRQ^7Paf z{IoCf#WSYu%=UUw?UkRiESgVLoKA_yuhz%+ov-3_yvcrSbP-p?-+W=t ztb}^9R^exL0Eboc);t?ol=3|R;~O5Ma)O8y0o0Cp^!a?U^UvRHbK9*KPAF*RyTPgX zWUl6N5*YBcV6$pE(_`%Bs?mbQOnx@H{)tt2rDq;|Zv6!^t5+nRm_?O{R5e10Ki3dA z&ieP~9h(s$kFOZH?{{Ygn`D^y%c;mGidXHvUzQ5)Fxg2l)}@jgBQs-3i0ja0;X0S&Z6%2VIA#djV=({~B+$l39fRVK z2|cpdVEePF^(2_)(wbW{NpiZTrVso_tg$S$?N+XjWi4Z>!D`IYRBVM6uO#aHmSizerN4P9Db9b zs&uWaji~A2G~aHt5VerDnFop}nw=4bmmiD9)JeRciDdu-zb%RA7EM87B3-F=Nv?k` zxtbjmUlDTt8@E4*js`UU0O6yfvwgw*KMHZRWSg2N} zj(iqFoOIsv*|N4JhQc)J?hIi{l75CJm}n(sk%4vyPXgDgU#5B*)QjQzS)WZpK}rY} zch@_6_>|6QojZ%aU$~YjoltEB25r0rHYC4By_XtYd&%)WYoEc4>f|v&3fuE~SU+Wt`xU4;D|K- zj1g9XvP79Ig=qn0C{hxe@f(09l7IlAG;8bIJ^eHZ9|RN6IHc8B$ZJVf)u<@WB*N61 zBTm9PO07DXCuexx1D1?A^2!euZ*k+P_nP9zC$HB`^dW030poTK=QP_|$w`i_F-(of zE5!yKW-wot8DWxdS2<;hM|QnFndw9ESUr3u0NAFttCnR*GibU{U>s zW6ZucFfZxqSMj=MEm>>Xvz4zCM@|a%B3P_NW*Fcp@sdc~Ir3FwyD-~v()s{O7DM{x z$Kpp)vX)D#{`ii|X(_%Ui70(O%~!$W&PJ4!D+kSG7Fk`WP{>%Ei!jvX z!E)JyKc`j_dBy`w+W0ZS6K-lR;1NGe9&oXuHKew?$&LFXg?0MsnZcRO|Xj?8Q54_7|z`wlbn zACCM^O=BG_a(%!&pZt&b&(KG0DPu6$zG)lA139iIWSe9zUE(0u=akE=v{pypW)C17ddQ)-;Un z00MC@KZpoCk&bw>7Nx2RC5ElUBxpclg_U=ImA*t9aV>8-03;U2u%;RU5Ko)3Xx9 z`EpxK<>$oA%GTnC)Fo6!DlCFQ{#iF?PfQOR`+axn8Ga-;qXaugT%~lORQb8b&Ldf4 zW1$pMSQe(2W|sB?`9Zk!{$KzTa1mk48%>r6})&B9Rm-i@}`kvWht7 znVJ!2XY(DoV`X9NiyH?{E~*j`5 zAoS8n90>k(ZQEwp4fZ>LdV)O+(#I(vg*iafq7W~fti8nJc7{zQrCjn}F%X=CymKH> ztjj#C$J7q|kGMM@J$$Ffv@ILy;DybM^|Ts-<%^3MK((Hm^sUJCVv?){myn89Sd6i_ zVIY1a8Jlv=;Q?ZNdF#P2%L=ke2^sA8k(wicSgg!WG3zVE>cSkNLd_#ehnk4@^$Q3f zX<2q4g;g7p#B@3xG}B4_i-%~DETXpSN#E(4l@z!SLh?di)K0>`I0irm(G zxfV7gh+~{I#o_?O(Z8)8>h6Kzm6Qf&VmEbCJdL&_d2%}q)^XyikTGMPl4$3ds*i|C z1g&BOZ&a+4BEV7r?-Vh9tcqNYL3Z!}8}%fv8DDo?;Y9VoDPCHMBvzqwJjIH)H?Crp z=7={KQfX3ECBl;b0HjyR8-UB_9!-PB5dZ^YA~Tn&8*oZ1PLs;zz9h0oO0qnWZc(-p z!!ICEtefmWJ~!K~k9OJ({&9T><0k6KV#Rsjo@&CJt0ir|a#~N;?uL z@%!N_l@?Dqi!Z4;MOL*-HYF%$Z&p}-8Wf$qQDnQ>R&Pvl;=XwCJA$AC*GHs~*_A1O zU+J3CEqPBltBuUij!2@k*;K6{`DMi+m7<)+U1W`INP<}8v|Cmoez1oL23*sv+!`}J6bSQE707(!}W zC!8P5={coDERtR-WR*D>#L+@R`l}MTlY0*&e>(;&n<&_9NztczJn@M#(F8U@Vl+Na zC6%j-tpSe3+2i7n$15_=ATh-EBaOWnJv4~%b0FK#@z6;bNZLl>RAT&fk+$DB`@(h` zS51JTG+&0^#$E}1TGTC5x?fQSL z7K?Epwi43Vk_a9dT0VPnP_5z7>jcgt z+DAWM?*qaxhGl!enu+ig>D{QWVRHWf6$~_QJT@y+sT@&6&W1Qv#f*iy1A>FoR4Maw zA26V^D>@zmfzPS`02olp%}i^Y`Kaw?D8*i-Ix$>>hpw)b9iEc4Xo}W`-ARR7lBCY9 z#h8KTa6N+3SmeFWLnvopqL#)+#gUgL_-L}1C#6jUuPn|`h^!UoW171~0ss|OFaz#) z;zym9%s_ph5;|ghQc8ou=B--@ZOUSXaZoIk+Wol|V`qWAIHQz566C9ptWL@S+rZzg z2d3gTdSlbfc*hPN2qS_8_2#nWM6yjB?vTWz)eyxDaj{84@-BHOD5HJ-wmNRW1wU7n zs)Nbo44J(gQP3*w8^!@4{Z1+j++-z0_&6JvH zqJk%^C4xS2MQu_7B=uDJmQblAhhu41g_z8e2)P2PPslj~$HwId#koI+6(<6RT;7v3!U0;{bdi^knPjqLiD4*N)*emi zlM0Znx`t=ik++V4qf4-BHX>+-7m?9ctgIH9nn{*0OmF7ONg>!qg$nP;5L@N)4_wT4 zo2+_(I$@=3MWWFlVvQt=8i)m89zn@?D0Y+yBL4s}*~$=nfw<~j;G9365iT>P_hUEFdf#~=pY=cK78b#u?@R(Fqw%w#LTeOMo2 z@l^2iPpA9MP{djq_r%YCe-HhX{7UFKG=FwZ~J;2 z{L20%f8kHx&dUtGs=(XGcYC$e=CNTlwwj^_qr+n%ke^#y=-4N-k)iPMc$&>WilTUy z=7Yffui)Rte+c-&i%#{X*H_?T0+as$qjWduX!~cMsrYGTGie;UcMbT5ug~(zm81JV z+=@y0mMWEV6?jHKTwWIv+t!^1%S^>1%VtRB3?m0-0l%R80LxTIIpWC^D-cB-vKO?j zjuPpeC*023+Q@3HK@2-jr>3!3w30&0jatyu_1YWrylEi@V#-NUr`w=?E}v4yCO~g7 zWtKGD#8vdik8N}Zax~s|2^VN{Sq$zj46HQu4{STF0HKz~%U&p~G`O6fuj^W>((I7@ zl7WnT`OpH0IAu0!Aa+e|iKLyr=2KBTcmr-9^0oxd9Rr~N+uCDBOcO*+dM zJy-l+BY>Yx` zH)^cF-Kjmfl^VO)iCq?68wOuLFU$|&S~#HA!9Ju}_0X zk=W*@3rIz%pnH11P2uo&mPwIkrzK~GS4Z^WZdH`Q8oD86VCV=QS990s(*FP)YQKl2 zgZ}`C__J#CfO3+9W1fM!<8_Bb3HuzxsX0Tx7JZlQrc)tfFM+$3$Z1HbOB@*d4ns4V zix(`D)s3g06Oy-Pdxb z;NL#^5BNIL3#Rd!-i~_(s%vMm82R{F(b=S;GgxCJ=~~;`j_q3*jD0xl$dX3VrG*3Z z+^X!qs6^r6GzdL-JRf{Rp&F2P0-Xo9sLN%fb+(ko+Q?th^4Psh;_>vZrMXg-%wAq4 zmV;cABaXe6p59X&p$h>bNg!on#Ft^dBe7x+l#yQCb;lLuYll!t9=_RZH0>Ov8rFsf zF_6d`*rd0Z%xW7o?$XIvD{0*fbRkrR!LERr8AQ90%|U(oH;;znr+-`+*h>TmG7UDlnW)7t6`<(aBc4K#K#x2VR_93@)Rs-{v*Y*hu5>e;bZ)Zn~bd?^YF zfkMe0lk`7NuV&kV<~gr#Z|jR1{n78fMf8pzwK_MmE2S_qQN!yiY%b$+T45)iy^8dv z%hRb^^$4WJ$HdDJc;%aLLT;)xWiK*Psfch$_V>jYyf_}*iTZ#=*gXzdF6Cfwec8fg zw5ESCrs&N={wg^BD)wYGT(nGlo_{E!G^DYVw3-8*Dcn8?18?Mz*(p*ip>U zDMF;~UVrBi*dEJg@R~;EA6DdPcMC^W%Qc!bF!l3T7^`CBv|sZ}_{?P&plsHbL~9(k zk>cHymU6uqKqC!5HPH6f^ck?TWoo+W2kBb5!U}X{f5_v6SoGwfQC! zQ{h({iF?tpC0kbNW0uWGRbSzgcIJngw%+P}`!}SVab}H+%?TU*)UjK79BOC}#P4KL16hF)WeuO3}uPDwG9Jad1i zZ%og!v}&%6!ym(ky0`Hulhar`+S37u(;60q+x9EnrLIlsa(VpGGR5(@h+@fzqQ|7} zBtN1FDnZ!s-@H<&83+o;zh86m#)!*a>)bo`uR-sLrTjtniz}k_4ywuOJqt9Iqk3^t z#Ybq@w35veQhI77mRiWkD3N4A>TSCEn}8Q2GAt%S)=2~R>+--r9$kPQ6ra*^e4Lo=xISXHXo%^i@thKAL)#k(t0%0ngWg>hi94CL-q5?9ZLOo~vT9&`D9 z3>`bQDPRcn{@*<2{{Vl#4VUuys&>uGIgEPETGcFu7vZwFxU~b-c&|laG8LniS&J!4 zGuX5tX;X4bDB4M4K+Ca4@OU-B^~;ibLKu@79FF7D7pvR7Q-Y zTEtLe@vo1ti+V|G$hIg~tH>$dDOCKtcTh&|Vq{X&A1LY19At@5xL6m?ZusY)^@{qx zhK}y%H9n}w=oZOl@$lAJad6R*>r%qn#tCgf47O|h9eTIuLo|jqG7~oJIc!uF>4u>M z(lU~7%6ku&<&M=IJD6irTyi_#{P)hP;X47Vv^Q!Y#^rMqwL!C{x4EYCaoN+BsyH2r| z!p$G}dDoS+_Nl3@HP&MGmC565&yVyoQrydF3o+Ap<&zPSr(Uh-ki=1=uM@lsc`HUY zBcb!GGNz%+5KR%(f1EhdF{w#3=oMIUx5fJV98&gswb+auvqMX1{Z*(AZc248>kUPT zT2;(d<~F1=)l7vcDJ&}kE6lOQGqF`F0A)EEAyokgUj49K6_L3F^dDc}3%jMSJ0>+n z81otZPle5BxTA*NFEfglRAS)B#Okr#O5TV}Mbt{bM4u$(BvyzXWcAmlcQQl`fn4@J z#|^~FiwvqR?}OLoJu~i{?ni9OBu*=znY~rQOWFx5eUhjt3c~ zF}fMAJruqECVX_ZvhZ9O+F0bQ^^(uQqAvw&5UWQgADPQ<(*wH*JO zy~YWnCYJZHVow^AB7;s? z8e1F>U!DXrTyZ@Dn@H!LeUGTbcW|-Vw+WlaX^Yv&@fv#DPfFw&+L?=5cQug6hp!E& zWR9(*x1G#ZJ5MyrR%Pgjv#ZkAT zaoR&#Xsk952Y^cHg|PVQQ_yscI*&Vg#{?k5Ssk>Dp2rGf!ePukmupWJ|QB8Dj{i zh(#OqKZd9sk#_=pdVI3SpT=Mqfc4wI&mib_TSw;grY|*y!r*Xuyfw>W`JS(>sNOj1 zaHsHQYSyt9YeK>)cN76 zbmfd)YNlORr#}clYS` zI|NbYvDT<@>xoc`&h5e7U|&C$FEtzYUqoc;P{4NE^IT>|bbyUHYNQd;$VD@6dUTO% z*LrS*w2SFTD?(77QHLi zR$1`5NHyFU+>C+kM!yRh{8S#6>Bbn`5witfaKuuU)Hc@@*Pge6#7q=_KT~yF4k+Wk zN>%arxHWE}mJDS`@T)(?y$cda99zZdMd@7^4q~%JRoV z!4#Q=ihSvw7~VA!?Kc+LN!WDf1)2r$7sc8^vDENId*UM=95Xqbv}MNH>9lY`IRU8q zQ}}_&_Wp%>dHgku(c@cEVQ{k3(ip)K+4bq#Y37o|qcamkz5w(b?yMWbbVtPUkrpMHQNo8mmL~1uHu-~Lkho3nLq){AuS@f*COhqc}1hShR-DrB= zb6*?yVAPtrXtfQEO@Y;okG%f?nCcoG!Syd;p<+!5@|k~)Nfvlr11h)*I37HX$E_M^ zDOkw6JFspqCX!gB@!?qQ>x4aP{AWw+_OnUe#Nsu-Z?M>$-m9!Jv?a{h)VhYnTNm+( zU0&rXrdaOAQB~W3f>e`o2nb0no;7D(Mx93|t)I--_Bg#OA=4c`q=M+6SHEF@KI1D7 z;(N3G@5jzHW`*u9M>C9RMd(< z5~Q%^tFZZJqKg)$H6B!I8-e3-_B>%<;dQ&4uX}f6E!@pPs5^V8aJdU37k@MPUNX*B zWmrx&#!9`2mJG~yEPkA#SkRKeLHhMt@ux`(ZI<}I@!vd@-}cG$a^Km2{9WtV`(f{L z{{RxXPR(1!*X~6$u?B7sf5e!KO!lfx9|)qgb_iAvU*XtBWq8rq5GKHR2c>Tt%3U70 za={|Q9EwYz;}kuz{6S(hro79XUCUYRH*u=jy_d3*j7`RonjBOV@zyCvJv;Eo`#gNu z5x&Q8M_m*ItDZ=^`J6_lQbf`0>r_Wd1J~c*HnsO`^oFADHXA#q^ByS9XInQoJo3Gswj@l-Fkws0>%nTvcT}#6YX#`r@~p zDB2r!wOQzLPg3dqKa8qn#^rA1@s*6$Kl+VhC5mvx2xJXICXEJSB=tEFUR88E5;q+w zlfxdX>;AHpWRryyc>26k>)O4I?xvlg+dPIjbjGU6LY8Z4I4Hds=dnp1NW>TFM`B2# zxa0LAE?Dp5@7Bqw5^aqEMp1t}BGU-9dWj?a4OQ)3 zzF6?P+WybxGnn0JJ|4^G-B$YLpv6ZRuRJjYicE!XNmR(JeqU92kUjSu9_W$FB6ITo z*;_kL7!w`Cr|FXm-Rpg+qnXTVeN#(4prV?&uDLBgUlD5p(<{I-DS29Y_SOkO3a8SM zPTLKLCj{*p)U9Ip?N^H$KN4RPPNW4}Vc6DH-ADM8z}wWAEY^{yr7}7rCw^=`tjbu# zUXxR$+qOUCUO8l}wIHD^sElmOD#okeIN0>9%w!%wAR@i*-ws(2!d^B%X-2X-`8~aR zUw%aN#7fL9b0Slva&gy7a!_gxs09WExBZ38Bd?DST?dUh5(M0 z*Embz%)8d(Zny8y;>WuEr`CPQsYg!XHHMos^z}8fUJSi!nB7HdIbJ0q^3C~|!d9nk zr2<6}a3{zo9Mx*jnf4`HL<9Oi=(wt5>q zN7r1acKe(7fv1_rU}4Z!PULwM{K8GHQ&zCGS|0d=2~_nls>}QaOgmOFdGRr;%8QOS&jwux11foI(ar`>u~} zKEA$6M=uF*0grGTb-!`xc*><(e0&)C6g3P9cI}0dVKr##&op%rMD}Gxh`|%e$L3Zl zyhzxe1En6IDeHtk4Yw`R5#83)IZa6xLWP{fO(rul47q4@-lvmH+p!&vEmnMo!OkN{ z<3gaMg+!irVZVhJ>`5vc)`k1!r9z~M)rtljb67od@a2Tmc=|Y8t%$BgZj4r^yH`J( zjM$1o)#QOPHF7BatWW{SGm=isJ-RT8=V=^%c_K9^U_rmzA~K!5&vt`JY80oab$y&> zFBL5KIyGcnLpD9C!hI>++p@Wfu(XjcsS`VfL%#cNI_C`%9&F#XGfSp{rd3ZYO?CnO zYv0p3$&aVreR-{yTDs^RT}=&3HZb~w@;au>Zt5(>gvQy5z07++5OZD+w1J6YH*T~n z*SVNc^{=6l>mSC9#T%7iC|?8QeQ&-ryOH1j0K^uI)wuj#3YTiE>1^Sp9zze6kK-?_ zXkvjx3E2E>(!<=y3w9xm{fT{gE*VRr{CIsd*&K!{dy>+m*}L@c z7V^nv+r$IBCdH`csa{SyhLAA(o%*R+<0J#e%bb=Je+UO~W%VCFOpm#$^yPg`1Q6n~ z*^JfNd~G%+N0vYxSV)-&Dq6EzI9#ZVEQ(lo0DZf95JtjJu0Bo6;g?~%wg@$lX{Rxee~WP9t=rmn9gEhOjNU4d6MPll%fwkYEz2C7)udoR8-e4( z8PRtrUN}5+l^Ca0(`pu)flx(QzQlXxzu}L%J-zNenbkUb@askzjZ($Dm26!395k6J zp&zRyYLMjY4BjdWL3kp|zovKC^!0ajQWAhZ+2zMBnlFgRoUD>}=m8#p{{U>TUA3DF zi@@gc`E5UM7pd_JZh5e{Em@Sir++oBvT~`ESSmvm3$slrGYMIcI*0SuJ=N{D{l8pv z5lJSsp`Mf$R zNZ)9tFz}T&9uyPB8{9bWS!|*i zbg@Sg?U7f9_Z^7Gr{SNtKZuQKS@cy5ZU;%?am^l1)oji-dGXmyJ(xni<%@uWws;LI$Eh(RT(T|SQDdkhwf3x={7n8Id+naPLtl3DB^IW) zMoK_wd_0!0mZ&eJVzFT5`Fhh*xxknBg3%B>633!NETvuS^Xx0rJ+={QbZZkZS&={k z)cS+ijCFRGvATC&=*n3AP1`G4O`xih=dRAX z1RjLC?jV7%9zMM@%hNo{8XZc8l-}kYhf2Q9T>kmH-~Q3}lUeC0H13Pk^mLfS)Pl`Y zwVu$*(Wu-P94DHwYOz5IgCb1CGabMHosAf72I}+G)1(pU+eZ%p)PQd4yL`{CEHK&& zx;pzv+rupMYF5HiuS)i)iyLQ8RLjp5XZ7J$mQhzBS!UpkHEp>t2l*J>l5dO1G>F=I z(mNJ#Id4x}zmUAiF#^TPp}@j3|}2Q1)l2T{*apa0aR5&jf=L4I2q%b1*<++}&|*@pu)O8A&0 zj+BVI4t8a)dSsONF2pee4Y7Gvv#w_6WO)^+AA#*^>AgRnhxM6((` zQ{U4uNi#(xT-A-IrJg$bV`ofulT&B%_-wYiY#g}U#y*w0I9geOR~LX<%F$C2<6u*i z)fOT}4D!W|QciW!8dwS!ZuVx_A_U>nnq{`}ebNRe= z+jVi+)WN}snhzB2v~gRvI-1^}s9lLsz#avUp4B4QyZp^p50grv^uYsdyE1#%?A&@EL+*dZDEoPc*11WtIjv9GtrMrPYgYa%8;hJ($z}3cHikJ;)?CGi zjzCdEM=A9i)OI{n71^>tKwYiPwn zwV!kQ9otx^(lKN(nQcX98(i7Oh$qiSb|_>LwG5@XXY{MV97@Fy%&)sB;zzh6OEs{J z?e*=SZ}4y658_XcA=GHJTXf3ZSWrIWz6NEe0INV$zxJ2$Nm`x#FPY9@>**6>wqFD) zNrj_o{Hs{iqe@(i(^9EvO<>C`T=>Rz1$R5LD}vTUr(xgIJWt|Z;ZKQw417n!_@e#e zARq!d9^$`z4b-~j`$>Sp_QOFfD!Jj1IR60gHJPnvE7XPtc`jJU599mrF+L*;5DP|7?Y7j2e*UYQ}OJ7=xx+_R%F8LS?W#pNqK zdw1lwZ#k?pl#_clGgq%=F4l^$Njb#O#9l-P<=AbuMygwIe)x&Xx<89c8uPSvuH^gW zchH$TeY)2#pc^?3v`FW&?DFcH(_?1ExROs!DYCK(P+7iT(TMt-BVtbE4xYdvEI)3U z&`P?vKnqk4UcS|gOHZn_mTGzM1W#idQ8D$XB}(~Bjw;SVd2U0B$UZWjKqXo@)eRM` zmy*9HW(~huHnmqw?-7@B_cSl$IltQ{;IG~7ai{E0iOI)TD;?E^COJD^jSDlZZr+f` zW8;o=N~+BORUVwL^PTokvs>uhjAKI88v{yyjyv=xW^UY#vzntl4!YF1`&{eTmk+&q z87eg@78az2y?ZjwO`1AAQefAm%+g{oH?}%^M^@pY9WfBs zhQ=-NlURAg5m=AWb%P@lwUKHjiBtgXxd3?B63#rQp&6UYBgWr=iv2K0T3|F!Zz#*I zX44wiUFzD{X~eT5Me``+Pl7ta%+@{eJ|Ktz3^wdV z{{WNhGMo2PN_X$SGhj8YkkZ<(x3gejsb3v{)c3UIO0+G|lHbMT@zb_S4APm&K%0C! zY`-uY^lB8xwDu?Z;!HC|s*-kbZUuA571R3RZ(#cqs${WaGu-U;?53(SL3T|kM?aIj zSMy0Eu@B~1hM{uBDx#7J40XwpJ|J>F+o0_%Xmrn7F$_^Dj+woCFC6^NT|AyQOa``)$@(Ez^uZG&d;$>yJ^1 zZu!TSZ4;HLfYF)UhF+|7GV_WvSfg_?_8eEOHCozm+KSy`#wU_199Pl{$+rM?L`d6+ zBGisDS=-Ma9T)@tPDJ*O#R5${WZhev~$ucag#M$4q1pEFjyCfO=%khsE2-=;VD*m%pX5 ziAc$IJa#i5Lnm%&*=al(EUkzpvuh@+DJwKVB9)uv@H#Lm?&~&Sq#+M{3$8i(>xCL) z3wsBwBgo-zNRb1vbkBPz59@Q!R6&3 z2@12Td48!^Rw!<$lV15Q!Qsl6WT;#1Ky>+!TwM)i+sfGNeudVU%NmDNW9iPYWArWy zBVz?p&C4w{26_X>zvMeO|-AMUFy2jN+l1a^Kn2m};r~uysf!jZ)?v|R+ z*cdS@q;hy1U0WBi^e$Hs<*eeq7Oh03V;zW^%(ikO$E=*cSz?Ar$aX8_q#-O$!B}lP zi~_Tp+x7Wpyau(vPk{9CnM~hs^$xD5kjq@lFf9j@Y)+CS0z^VMX>VI zvX$XmH!zqOF3V)eUm}y+_2r!-*Eyqeg~qT{&LfNJDD$5H;QGv{bEnlw}pxwW4@9;_R$QBakDZ zV#F0HN4^RZUMZ{KR%v2&b|W_>m&9o6)pd1Dl05oMe#IYAZ7jOe9@kyet6iNf|846@9F;l8DyK_hxz1AL*#9zrm~u5_gwl|$zvitUOn+N^+m*sIdXh=w|`d|e8I3qDR7j~w)RXW*jqD>*?>1{ms#s4Of(>Pg6rjJ(8oU;LBp2GgC zBKy;(6*JQzkWEqde!pSC4w|h0!tAw3;zI9$kVv3 zp5I@dE|sPcs@Xj+x6jiTng;%c$mO$jv6x*cqVZSSohtrWXI&P zZVX{Z2_s+nu4MUDd+4st56hs+79drYQ)q9GQhNe1-=X^x+K$)c?BukC=&;u<;_`N_ z!wyKjY-8QFrqVz%73^Pzg@TL8nq`V(2yQHPJrk7#Y$J9UVu;Y6z$-R0Sia$E&fs8i zRB0U>+ninOO}p0Y#ZqWB^wP|U7CyB!lj0?$Kvj{rE39Lel6LC|c2Pr)?STf0t|4*d_tsI-|4#Hs)61#xgoYJ^52-NSszcc-^vG%u4;cbCn=jvAx96QA)WuELFwh@>N=maU?jql^!2ftvM{!jx!`IOvmQow%hg8)I2j_ z^#1^OasCo!1V}%r!|v^7vXnHow94tc9&Vnct2Q<|xf7-3$6=}4fl)6 zk=-J5&3Jg*mrfg1TX+}k{&Fcq#4m+^i=UQMe%#}G$DeG5tgZRnI<6QXtB}-L{B8qK zX!-H4G^=h+9}S<&^0@ob*^a!EY>xp5%y%QDi4sPm!5^km_IHLo%g~;0t@iw}`P;1S zyP121itc0yikBB&yccyQO=rhr@(m4pGecR^Jnx6qIUK&E&uN?{3}4IDn(b1n$;imIA~QF`*z%+HylG$n0DW3?Po)T10|k~}LR zW>PmELCIQ}BObl8q6`DF4o81ao;LK&d`1%HTJ2mi*!ZwX9W|wJ6F+J7MNi8u%Yel}Umr>u z@<%RTHI>iDky)`4Bz40BEQfRK)OdYI6dHm(LsAP9Y3p^bO>%KkIx9WP z7qT?tjh0!&kVo+&XH_J0#dLB?{v+4h7c5dn5gZY>_xWa|xUEU1^xk(jVWbx`uUR06 zAq9+;v6`IAN{eJu4?axEAEK$~*NSx!gR>N3b~bg4yo?D@It(3*>XD$PChY$Aj-5K0 z=(L6^&R<61Y2;?Xz_%zxhR9*901DYS(SefW~1n7<-VU*@_O*WHAujxl0-G6)RLRENoN< zXEHPJ;#9T~BXL8&_|6h3i33?{vGN`B4o5MK)3|#UwAM>cU(!+9zgrchbf3UBP2RbR zIpe+M;%8MEr{+~RBDX{B#tOZiZpoAd0C6Idzp5Ya21a3gDf&4tuifjICHD@ zu4e3Zv3g%Q76U&}H?Ks#64XIuvmIM5uYR?aj*c?9S&O7nBcz;>NmlCEg9-%E&putTu5Idw@tBV1WUw{yH1OD&Y@ALr2P#C_%aF0k z*wk4&iDHXM@iJ7J7WHK+#QdrpYhrJ$)%spYh5Si2EgP$@pbV>h*VbLd)HiUQ)6*J5 zSzs}Ca=5ATntKZ_DW|83nxE#M6L`H^`Ami{Cps9_q{Xdq62`Ge%p5kmM$r|&F&~yb zD5Q>XWj1d*zuWpbf5aDQ@i|RpqiN|&7A;t*4w%kq8yUNFMSq02xd^I4o*?6VWov2c>&IN9RT`tl#qEf?^yj8F@%mdrXl!PT#$_m8y^X_BvS?S+ zx?1)+v=GRZC1dF{;&o>0pgJd!Pmn~-N^Jv6F?KA4juGj9H1IJ|}K4h(mr8Sxr% z^&EI?T!y;hZesFS47B%|X7sW+>(|Xhxmjyl1&o2~kh>AO02E4+Q??I=Y&-FI4R^HK z-%jBk?hCzDXVdG2T6D3RuL+FF<6xJJaAzxB)cD4)CCID?W%Oi)rRIo3A5BX1Yy8Tz z!wOBdLtiKM%EPR?W7^*1cHb?p^~ZBgppOqcxOv*7IbAJn(p1l zV&cE5=lHX3t;>rderr~qGablH9f%?}VL}6_U<=r(M~x4Dz5ZFTyGDFMoHqjh0CSFh z=IK2>9iHrmRcKJ!<{&;1N%W7>r`cn!20H?U@mK#}Qz6Gx0F!EVk4jPSW7HiL~A<4%+ zH`9j15;S*UVG}m;ow*&B#g%vMvOm5(NM|TprJroG_*_j4vgH#JZB~q8lAUZeD+`aG z8#Gkrlh=wREXa{T>AFGy5yXXEeqf~Pg48dZ0>CLGS@p`NtMxvgj~S?S&aJJlbRIso zpnMe6@OkP`&tlwYEJHOca7xi+so$PCL??MBm6R9xwqAxitthh zBcY8RhSBBq${7(u$jqiu&<@0$Zs-rfZ)baBt>Er9jc(%E%-yN^d=cg~rdAyrPaRH- z^{V9av@*3JX`?mxR9M+#ddv@zu#>KxlrHwYtLgo4BWW0zmNX1|pXrD6YIiIALuQ6l z%p=CjlM;+`)@bKTFDxsINk#eciuD>I(#afaT0~_i-betG!0?HpqKBcubuqa~Nel-! zfF1qrhPl%Cqo<_QEfmqhkx|olTd@k2RoNnhSUC3hO7SZ=oNI zI3v_*1xL6Jq~hc7<=EV{s~5GtrLA)@sc%?GWXoE{<+9XhR597Neh}E_itZHSu<(_5 zo!m?$5~}U{wUj+H-5?jQU)Mw-HRFJD`;7ZIR)ZgRD4 zM>T0Nxo6B|g}U;S8m+XshN*}w?>I?)D+8D%c^_(JW2Mr@Al6N<1gXq z1cY^QUcE4z@xqb8ue&j?Z`H`>HEsM}dq0kvy=kU~zB@ZUGarw}#>s2`S~~LB8xstm zGL6dY4@0Hi`aNI-EK492@&}*KBlt08msJ@(P+j-MCEb04#$oGYtiy9uYUZZ~Lr2#$ z<+1r)IGD>H7&1*$AC#hrfJxk}Fikg@mT z@BQOscegz(NcXJJ#K913;^iA3ZxxQHC5o*)ucbZZT9d_@vl-!7ENl>s$Ym|j06z*T zJ-Xl3U?!41)@=J^?x5HBY}OvL(#pK{rAl#{-veqZt9KXZNk&Xbu#Sdztl^z`fMZ1q zu<09I60$G&qw9}?7gw#cFbgG(pHxBn=sjNmp^nK@31cAzgs6AetOC&kSfbn;aK1h7 z2yQ+Wz_F_jf0)Dh60e3cB9pty?*ViuufM9;~&e596m3~Zc*`%7S~U!Iv%n4US~_2nqcBS`inx5_+kifW?K zX=ag)0pI*&+KqYhM;P-H*VE;l8vGFUM)sr3V<_0gPk$X&%Vcx8Z-#UEzH#iY#AK`q zRb-Zu6!ahfGQ$ce+vYp|74h9%{{R!6f)nDg01N0n1$XX#sx?^9E3(O=$5g`Np2|kvlyc8Mr?qNzve#;Hhej7~g& z^(2qzI_J)6CX?ctzY4$lsCoML&-0!C0E^fBNHhK5?iQtve8tPP64i(zVP-xl6(leO zg%CPdRY1i=d=qWS8}GlD@IQlUJ}a$f)JR@;Ah9>po}VoA^%{iJY0x0#3IqIQG5jv} zF8*6mVzt%GRJna?t@Py__8$$Fh9G-q+siS))-xG$k;2qPS)O3~xu30^k!k|<>mL%9H=AayM%-c7z{B<;99PWR|OA*g7S zOy!uI@-=WFb`hWg^5bcpA$rI)ZB(xpBmx(;Wnzt7x~Yt+xeUysZOb1UpL65blTgg6 z(FWaqndbW<|DMQOpfSF@mXDYNY5If1n~+KdE2Bf!^G0DGVxc=ZL)UH5van{xrLS%oeH$^@ zF$ao9Tc`+-hS`YT5CSXiPk?s+07q)RCSovxq$%~p#}vDpz5->l($;~ZjWKpOMr3)u zDzwwFVX`U^{{Rro$_LB8k>}gqm-w7hMYb}^)#!2Y!6lO5ZOZekZ~kLBuVOc?8%H9{ zsk{v1lS#;cV&Y;g;aF@o-+sJFAu=BucIUkHA+%kjP{cM*P1d&Tm8LVSVcFxATrvkI zaCt_dPTo0hx3hmePp;C0(|D4tUNgpRz((0xb=H-zJ!t+C6@(ceZ$*+t<{UJBSDH5A zwL*GfR_9yX`_$}`9l&g)gu3t#z<(Fkisou#9 zajPYP`&FUT?%a19s_uQdvsa;)U+{n8EfEAWX^CDs6&GXQjDNrJIjr zOoc2p+i=&&-N{y(I-=G>;^XQRmzuPZMJhx}qfoDFO zQzGsw#~8CX+@u*vCyGgHrZGJ!Op`7<6X>B0SWwo;v<# zB#Ka5hUt;FspT~N*3GxCcNgfzEvPA?*@I@UD@SIm{te{|09R8Ikh_9L{drPAyNW#q z8CLDpwBptEN-VNY@KY7+lF<)TG;x8<`d*rsu$)!7Z|qlP-_MU0R0W(_;QD5TAl>)P zi?UOet1NTYtu2VrBFKCq-VmMQXY`<$C}n8&U71*o!wvT8ILa$|({hXBr|8$1L{UtuPH+q;f*+OC7Aeazn~B(-+WHtzPn^TMpWlstX_y( zJJkeM3o=5Junc`7sQz{Y?g-`JfwtA9kXZU-(I|UlQ^f_Fa^ht4E4rWgh*_86X5_*| zNvxKU;WDY+b{nZX>~U7EH(_UJ6{qK`ZXB9SyyOoXLpLcRg;#i{kf?~4m`52Z3V7wY z3-8txMH^0b_Pi&$9+N8L!_2WYUTnk&V@KeIJ4*chQe2)7%rOUT$mu~>cRew3l2@(| z~Tf*u5MMxfPMPf^RX@?k=F7 zSt6}w!zFkORjeB<*4aTw{we)9$V84FLz2cyfxgG;hSTZp!VXS7Wt7!1#-(oM%azm8 z>4|1|y=iOwW?n;L&38b_>Q;rVDV9lq2Z7}rfD$;S`}G;p1e8vz)1V(;U(%@OJ9aD?VmBNHTen{rUMGDZNNoJjG&V;;Mjs3HnvJ z*;L;Z_4#8HQlo|(`(*glcQT%>YHuS+KNzHp8weePFxJ^WYSmXt6&S$Fyi7LY+=^bgJa*y#-Z#T|VM#3&|x29D9Roma{$Inuk*2wkr$w;C` z5#nn~jTG`IlFUo$6tadXA&g8!kh~>>K^b2K=4Bfctw!>v%Pi$3;UPtqr!nD2gt0;fm#VtW?JT z02GtUENRTH>i(jU#C)m=>PX*v^1DU#5nO&OiAa^KSdP?R7X-DVXA#5_NIft) zuNgg9*bwJ(M3Vx10l$~80Z24&0{wDkHmwuDhTQjlE+$9~mYmH%LF5Zx6~aV;k#~&% zW(&CkpkPREAQkfGG#VXp2Pax9s?n@*pH;R9(ZyKKAl^lki4)XC;QOB`_amcC%lTmj zuJ|ubOs*nln;&*crbTGwdcZ12QPHC@w2cnsLEnE(d=GQB-5jySC<0Xmx%}|snULC? zs{P6QB7PtHm3u3jeJzgB+Tv3sm~wO_$zya@e=cHnuRfvExJjUb8aPZL8`q*i-AP>)O!=udmH)TN@CS8@dY=p`N}8UFTpI>En9(UFbL8o;V3glXgOXRKNtHtp-ye3AxwrO65XyfA2P3cPyCH2)`kx$tE4e@;k#np8` z4%BWPN}d^hYuoyIXOpXiqKNN6$Ve7CarNIUzMj&!2gm7cH{7d@o5^A4nzh+#$1YD* zcEb?e9CMOvrw`#r2 zOXI6itye342r~-5^kB!VEmDLvth&U>7Y5ZUTKxoO*KwrlH5Ts4HTHX`j>ne1Mr%t1pZ z6oN>LO3|czzJHXU`K?d=KK>rnA>E|#@BaWE*)v6@c@EeYcd;V!K~uV!8rrT%JIk2H zL?fvS0vgD}tp>W!gI0SYfwjN)NYB($P z1Vd!AUP(*s#Z{NbpQ8T&r2ha6&}*ZY?Xs9b{5*4h_4?x`he+re9o{HC54J<=AN@hp z`U=()2Z;R7P+}J(`N*$hu+?>Tdml~CVkz)b(TcS#Nh@P!Zd_6u6UJHF)Yy~y^2V_w zXutN+YmU5e{V@<-vXe!>4fN-=_CA?kyFa8m?Vxq;nzxk0Rj=B8b`s7~3iwRMGdoJf z1uFty)3vHic54(R2pO+Lk?`31pC}CY{EfBO?#Lt&filR*CXK%EH4uF}{{WGl8PfXO zym%Tv3#PR0m(OXLtzNV>HnGdz!P@v_$QrTK$>GuRwz2jr#}vsL?K1joj6`F{S{Z_< zHTw1E>+7a$8=aK#=~!Qrt=+v(cPC!9q>oL(nZ1k2On$W~;En_~?ou}3G73_mcf z6hN(KuN-WQer`@1q2|~IA$Jl_%x17tO}5`?9-T3re@tW~)An$*^Ap>ll6-sWNcC

5bh41&>h#t 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

op08& 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%0AH7;VAi@nyjEJ} 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

Z~VBkyv>TH|gvSAgO5Ru4$Te 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

GlA`o5i+QJ6cK9TJ>OABo0+mfnZaAknF{R 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

R$w~quh;ww$}9YT_WuCe zud~mVu4^)gwjo<^&Flw~2_Ozb>Ayj{t#rnSfS||Bb2+1AMe7Kdp!+G`ZT1be+w4z5 zCPLe9oMUOERop21X0IA2YuJ?oB94KOVllo9 z(ja;SdS=yG@-VV|J#w$avGq9hF@5KI_ zc;5%#e&}M_7Y`AqtaFfv-A53}sdIoo+ojJB!*xhgRq$OLh({r!Q;dt_KNNwtMXP0R zQSFSHAMp?TY)2(u{{YEu?@KjjV^Uf5&ZL#AyN{XU{{ZSiQiC@&5o4d}3NjHH^mizJEL;%>MwybMd<}R*x_EmhS#c@#H;yeW>S& z6b+GM4}64V{yg~Ui=h4-m=M3hzYkIW0IU(O^jvKJ03G;}ZQrRsmlz#)@y+;}-d^ z#4ma?vGC1zLtbR%lsMsUQ)R3W(hdzESGMJjiu|r}xlE1OQHwvs+?r=XcHFRMVyAzsfL?g> zYBkOqexZu{AM7hPaC4=AYfUV%6b<^XH|Y}WHsl-19freiub!dRPpKzym74v|H%lpG z+CeP1#i^$&OBioU*H;S8KxI;PZM{D%RX{&}q#h?em~E)$hXiJZL$-OVqe^GxeZ#h=VXoK zhRjYxg51&gNd3tp$JirnGWBz0UrYS(5{uL`emxk`W%BE8b48|nJ z;pjVFt36&Not&siCaP0y(6D7cQ|?xVKs4$1wZSKkqlymuO7K;vOU>l)|umrhO5btw%DyV3(pyo7fjZa)1`UrM!}iLPc)8Ypj?6BW)R{dqSG9VU480uWc#GJonA&n%s~xGoZ#(U59|)gRu&~yljh5`5K1b!8Oj>>I!2nqI%eg$dR`xPIOLGNA;YQpBIV|#1#loGG5)Yo5={}vF37FdtUVl-T@)CSD{!@Yr z+AEqDJE$@JzQk!Z(^>pcxpFI!nufgXW=j?gV*ri;W-bokdxrkL49^gWPNqi=t-&1M z&ld3`G*bTn_?(aV%HN&uMI3%w?u`Ec2lp#a{B|!PLlvp4PwCaKJ@k_s6T?mcVdSkm zu6Z{eNgAdh3tYr>s@;K=8&iTg zzPY@YI+0tCACSvS+Ah*!G5UW@*3wu^9(zbyzh+o-76s(F2%e~G4De)Scb-WmiIA27 zxHpfdQ^~({qg3r2%0CFI{joeg_ETh$j%t%>Ox=uyHpyB_IzDP?CX&hH?c)|!sUetp zR)PSyn8`yIqyTa6)`2`hBv`>N51PUKy>Y==KJ962cFD~qxSZLN$ghrdxtE@3N}@$) z17(k+B$eigBe5hlV>>^n3E1*KZj#LLIG{nUea05RZ=bJRmF|~rb6U?uThcf^RN6Y1 zqa+h*sHK){gJOd=?^etY8~jWwzXp&pfP9133BZwFNVjwNdtbQ5!S`g4mi@A>=`X{k zvF%0&7pY zh>Hr1pwm5!J9qf7iuRn! zS=8OW%KlA5DIHo_stlPcHe$J8QK&MpIV|_#UM(l4N#F0VCf3j~*j8X9BccAsCTTWJ z;Rfcf-z{frbtamY$iis)*Kzua#WtTSXHrti*wbqjnR!ur7m|45r!27U>++TW`5xrN zW1Q|YkYOD*&};AW#~Bn+Zb|7`v8+2|-QL&t33c9`$Z1QOYgErt4CXS0h*u?uLADk zT9%!CIVIfGw&^uAWS1pks!dZKWSSzXRf@1se2{jcFtU|JVy{HD;kLhCzh9jDRn^=z zDyZx0l37a8WY(>W+Qz>PG>vi!PZhoiJWR2x%6`}U+Co;72P8*AQ8X6BLZtqnZY9heD zUaDI*&#VQi7);o2$!%I<3KJu601d|DV8?{QjV!Fb5I-aHBd%d+#H$tCoBBDmsqX5E zx)(Dg>bVS7a&sMgCJw#qZZ}XQ@@%NM>(Iy!R_(Zpv}G76W!u7o(w$?pRbW%OqD6PH z*khtW;xiCDFb^lC_Pj#Vv8*z<>KTky2e_EI@%h;$l8#d&rUp-6PX!ez7NR`s*~OX1 zG$B|9Ay4k|S|g4=9pNiRfDK4JM`MYw=0p$83u@`?J+bknd&8uzU?I?tH5_+wUcA*` z2VQCH!!3v_3FE3QW+38aK*VvAkt7}f><>$lDZmmUmV?&6wlWw(DS7xy;})8;6R)w_ zds1Yh)s!(-ti;hrCJ!5m#+r{tz1v1xGhTseJkqSF08{~Z0lO2i7MD!af-*;NN#`*Z zrUh5a@7J8A`U6Ft=u3coU8!=KvPd;dd5p|jdX);5^tAZ(t8C&eRJ$d3-}43J&%tF; zzTge~IZ_=ntE2%)9BwDgf8!>eStRk|E)`qK2Y>$nD)RGDeE>5PrWS>`^|-^zZsM<` z@XJ$A;odi`WB&lAFXe32y-@L_Xh={&4Y!^vs4)1H4xe`^}(FC zarC!us^Ky@x{0c?I83y7^j$1dS=!QT|pIGeM`QzONMHmwl?co zqaUvfzbmtP%F0f_sOw~mMpwl>`z6yC#8-(r1ZYoyGikOkP7lYF4&;% z&t`O1qP>gD%~w%U8g?6bs@Jiag|K*RO}Jtfpht$QNqW_lMDsFuSMYZ|Xw}OO={F&v z(2FPK+Za4q;t(kOZQHLtxCeXj9oW9%LqoLMlThQaTA0U&lP6O4Dl0MS0UFkNu$RAB zdeK;gSzbnDo0;*p#Po*KOzt%?#7tn{2B_d6Z4`3E=Jx^vA52nrJ74MCMsF#nG;W>l zZVypSmB-t_K`t*JR+X4&Ltc#Ly^9xGcY=I>sQ#LWw?t9(2cbi$mC>hYjA4z@HV662 z3hCg2_l>0}8sh%|=Ls(Nt0ky2vkgBr9^K<8E2scHV|;6D`EJFsX9)v@OjskFbvW3A=0R2_ahBd4%knbm;^cH*LTk!MQ`aQSN zy4Nj_*ZG{y{Z3XZn7usXa9q^2=1K27I|@z+nNcSVKts;zvH z()~R$WJYg@eXutO2v2`g&LBIn*go6oeMN(lN@{d&(tx&y| zu&pF<%V4bI)-DI1VbY7uBhY2rwy0J9U}di5plPLI(r&+M@A>1~LR8khvd?0)wLH{$ zNaVv}vDs|4Zt$qlL3Y)NDc{D6(c7mj2tFhwc$vkPQsqYgI@dtpmyCc73iSiNOhTPJ za*}M4YqffO#v0|T>fB~{YF$yM@<-w=&q|&uo~o}_)<*?NM2lDQUBwBd$jJiAB=y*o zP03Bj=!9{Qfn^(yTOB_<)3wxuZz$+%x$k&Oe>$3PxY+u-Gfq;+<+X)#Yf)FbHCj}j zjImd;EyHRabz1HfNi#f4AZKt3c<57mw2-u)a=pi|_{?CVPY$9`Otu30*GfO{65ZDC zFXBc##r#eX_WuA%HZIKXi_7E4C2CZ)Y_ z!yBK-&+ANKxFqGoIz=A?YV@(swf%puG6s`Msp22KW+VLZ{j*i6(ZhEa z51+Med%8ZXXBnmOIL%HoSgR25WUpS9H+btClFbuH(aEut0>JOZPA=`z+I{PP>sZ-T zG!aD)l@x;Ai9PQZ`uf*y@7c%RkXG>@U|X0&MU78@)OHy8qBvGg?QB# zIEwB`JM@DT18(Yr3ATuO<=OP z`*@|QRcNKCaPMfxji(~jX%-g$0H*wj-H!b_R8(N`Sx-_s{PW7wokVg<8~~+`(mJ1> zA~p2#=^W-&vNb9rViti7V*DX7U>l4 zt+!t1-~MyZlt;Zc72d*!x4q)qTjR99e=&HiUsjf_{{Rr0w=s*P@)${MK2s@-L_hO) z;@L5APL4>C<#@v|0B`M*#U`Av3Z*LU`hT1hm6?1EM1X8=zdvlH*^CZv)wVL&9R32| z#Y>Hry!BWmD59}65EvvlCe+#ClCw0qOOxVkWaW<48Y2~s^rK8=)Q)K3lhSiJa!Qa1>5;i|pa4qWZgCCb z9~wt%Mg!Y{>z60+_(ylt^PCfJ-O+R?SHED=W=qGF5ULWx_Dh% zlv$;d3;rF=en*+qkm8oJOD1*hW8{F#J=xT<*jEmb?Z@lVnGA=-eIo?-91lV(JrqA< z(t$Y&??B&GWBjA#kyLQ{vq|E0BWgVbh0@xmFOkMq!fDHY6Jkq~Lt&%4!aOrrrM6xx zZmjBD!~*kG3J?#2AC(}Val19xdUNTDK+7q42|9H{=Jh>~<%C*`@b}y$&tNqUkkg&N zn!cEPj%Kz3?fk#y^)q*?M-7~Jt`;+PNGQm{AywLEt-YtaFE0&D)ANeSbo|9EN5k z#kM||#JF=KQOrQFS+QRrqDiG25;p)2KJFeYOXZX9kJVx)^KFJg4Rj;89SQfx9;4IO zvbTRTKaf|&<7%W)UbT<2XE#!LR%4V9gEy=xNf8AcmI07>@xMTzQJ`FKRC=CF=8o35?46v)<~8y(nWVMKq%@(k52bR1HEBdRmgT=a_XlDW>lKTE@Cs&@%5-Z2FFUIcc_w;0_xnu}Lq^IDe! zLqD9UK{3~CW%TX*6@b{w)~eB?sO}tfm&UWaF4Z{+L~OoC%hAe8?1jRUXOYc;^2y|p z=hVELO0q9b-0^qySoX1*)Kp;n^A~9|wlS9NS<`jnvMW-_B3C~NjIly^8agd4d6+Ee z^E`?^b>F}tk9gj+D-BU!$s=t-1)j8Wvg*$N0QWM+zo(AYcdux?JoS+>xa>Rb&B~BkecMquN<-=Rd#R>k8W6D+|)ON>&7!s%^WCTRSpeqKAxu@8e6vgv0AU3 z$YF0_E9$IjWU*Py%?enUu=Q(FwQfYzn5eA!hNn6GLiZX%(-aCv(W=s>68w96l=<S-_*8T9`C?yGnr$m;H74Vdm!v!lJF0$9lh-*QZn0_<84HIWMyo`tm)kjlv_x7hmfgtDM@bgs+Hz zuW>+e`Fms99apBbz1)tB)OVr8{2oFKd~u{%JX>I*m(rt6R`qx%b;wF5B%RU{Szqhc ztWrAeROZh=>i|a3ENr9s0j>@DpOzaP0FvF_}xA3JN!o(?+UbHuy@*>P>&nHfYAVgG$Pb4Ug;l;5Hi_ z-5jo&)K{={^3*D7I5GGvW)CxZT_=*rB-SD~a`oo9D`YX{SdJcqzcJhe8-h&H+OAf? z9X`KonP!bOBWWbYrrNB0y${bJuIViE<#5;yciX*No5|p%mmP$f_I%vOE=BCeJohyb zPg2dAuMv~s%z>SP@niB1oP-_4Bwy3|d*I5_BqwwI+a1IXrutX6u3X(4hq;c#XrIh+ zm#yZZppbkFbn85rIz&wzxZ{wPd70t1?HK@)u_60-2rLfja0m6t;XtV%*cCU}9=`cq zuWA1N;&sMnT$aXS^tP6j=UiSto<_&zi(qAC#fmtEOnqC{YA`}cXJIDieuRxZC=6Ns zdJOb+Dm6uP+EcW$^*mAa_0Rv;s+OnLy2|I~T31WzEjw2$1IZI*r&O&4JZ+&Qu->s| zCzlyL`O{?d)wTh=?XeCKs;@Ew+l*i;zm0((U(+6%Mhfv+e8xhqpqC|%tWsLIk#Y1d5!mm;K60?#w&@PQySov{nHnP=)B&M}m&EyKM^$?DSVYRvKC%;C}+ zlVfZ+cx0WJvZD?$soVbmZ(7ae1XZ8cHFpH_5x8;l$*k6?r-{V+xqJG584*bF_5T1c zbf~eUE{M`YWXdLIc^7u_zBcjasYyM7%uovjU&e7Cu64$h#O9-l&aujgGF6fm(;7x` zA}m+Yt5m;cLIYTc!OBi3`+?`*ZkUlu%2^^5IkSeUWq$+?Zn^F4lI!?y(9_LBJDG)z zniS%*jmU~v=q}~fSfHA!WG$s+u;nEsS8`oJsFk_4F8DlmNQ`+)3xEgm~=>0ciSau5?jLl~A**GH0$)0PsuZV5P z5(%2cxuP@$c;_6I5UUmYb+I;{Ss68MS7_~+UUZrbF^~TMu5Qn#`MlB99fo~ZjKt)- zk(1OK!#g$_x8~YY2acjJRqszBdlhLGtgp|Myjp2xBy0}Dp^8#3!P=GF^*=l*qKHc3 zE>NBc>+|*)AE>)4rnKe@3qqAUI$DlDCN5FQ(7*9g)5%L2k_!2V9c4?eT(c^wAsg&A z>8mTqNnjjxIH!44wyXK-hoyI{L}YQD!A)&0o6^?i$5?7rp~-7VaOoDIu9oCuE=mZ4 zi6Qvt!i7?S{fJ$T!RQf6vn`tFPZ^LCCojV8=smj}=%$*+UeP_RmdYDJ1=_LCLU#Cxn%wrSl!~l%o-?xS^0C`x`t+pH zvbm9%1L=qilMU6iM>p$OPukoSEqhjtj8>}2V;3EA!IiAr$lIGMZk3->%-)Vr!;e}L z%=-q49zlQ1N3)$CEy*-Pp8o*jDksV%S|Yd@x$kG;`uA|M7c*MZx;8ZCI~^=_v9V(k z&59HPNh2gNq;m>&T6Z9a{re5Qx(Me;TWorL$U6T3a&a*+h1N*O@rm#K225Mh_Pb-I zE$b|npnYMR(i&DM=-j&#4W8io`b8LEzskdx>c;NAg z)oPeCQjPA^f4(GiZ{m-*TAw$D($w_kRqx!9gsq}s#n7>GF(0D;0GoVmYja0dFnR5~ zKo6Ip@KI2fkwqS@c0O5DD1}^sKn{D4o>>^b5ZCnXGd+XO(xs3800vdDa{gxY^f7YT z5lIw@Lm!Hyu$%cw`EU`&Pc!FlBYjxN@~hZ9gVw%h6XGPBW((Xd(cJ$4VT3)i{6;r* zG_B0$o6-3UeXJ%z)kcFMX2u$gnX3H5(Vrs_mhFpEI;#l5R6G3LX^X-lIVJ^&>N)7&?Uay*aQu01NxYaw3~s;|XfEY%9(E#RzPvpx>H+m178M)cLFjckQaRM4)XJ2?!TGD!)B6Cn-`tK>FPMGL#ktrE4OiYky9ZpTXv>MO}l4! zAXyNjHyIn43I3$6!HUUX5Ni0k#h9JEDFLXrQ9ZF?b0eC`YWrGCNNCLMtc=TzeM72p zbk`ZCJ|BXs%=5-7rRz|B#fCLuupE!KSimew^2(uz@_=mPbl`H%M}n+=ckT1bH;t=g z;p>Qz^_9SFr>pWr-dMn`IJy;0YaB_UTG(WKjO29J-xA zP_Dp_mRZaM7<@LLr;d!2T2Z;-?#w(*2~G_ES5Uvwc?`9?i;2*?aetFq!G&D~=FsyD)OxQGL&o(%6|< z6&Amz>y0uJ9Z0Ttz+F4|uF|^4C2LJv#ANZfw6c{cS-vM6 z5D!Mt$fI(QYpympM4M^8^!CebgUMpCQQVHE85U1LW_!;KNS0X9Ihf6}1S=F#57?kF z1J9GviDud6ClbIYH^m;9rqrG0?fskb;IsMcTnNb(s4(^IwS2EArFNQig`kejr~pvJ zDlldD@zc}B93*Fv*0{k~iw_Y^ka0z+wO%7sWS;~1rkBOx{a7v1n^3H@GPhCpl|LtE zSZhF}>;W$u9rpnA(5)0?m2(S3sM>TC`F;;41blkzB^yg`2OR&gZDGtZf4oBbY3hJuSyAZ>%;Qp9i8yOnb zl=}YwY}VA>-^Wu_r({{Zla{rbHDl9wi9~Qm3K<8*Shh@2K@d_&KQ%)KZSzCQW_#2KB-Vc zF!ntZx_MGlFw~-PKvkOm069!drWnXlp?mxH&CkUraXW<~=?r!hPo^*tW1_iM99WXR zYVF5IuGI{RWO0wC2|qM^+mDThj=M<=UJGs^n)$xj8I^{m*k8B#%)NrwnzI=kIo$Qx zDAu7gl3&l&g53EG#1YpE3|X9cjVF0yW#W$*;x--u_xWGqFX7z>#-aN*qA>5;`mf04 zY_LrkX(OXu2TS$Kx1l@d+fL}M>Ax(>)%Yn|3z~u$Y~z|qBV|+v6rf77px{4t&WA1ccaWi)7gd*l!B@~Rma^V{p|`#2K^TJlRSo7d&di6dy}>Kat? zHIerlBvw(Y+44a8vk&y^<8>Mxev*#6;SPWfSuB67fWbO8(-o2VX2sLYf;@HTByA)!ziV{x^n4{N+C2Gl8n|G>2m$n(WKCjy2pT%tze$>g_MY{w<;kx*v%ZolgZ`$H)(_ z@YT?TcdF~b8B{e_V*4$lwFWC*_SY?i?Dlg6^G#Mfo~y)B!_1{N+IVJZW{Lu!@{K`O z18?K6pwj;U7JO?{6rTkA{@z?IZ1^DN}{ynGhbn%#{s$e)^eZcp}31y7O7N#qE>)$QDmDdv3 z$4s~YxVkhk_1-p?rEG2yEkz57qp2-(>k1~`{{X5HcjMQhAqZ2%1hMNz&M}RG0qA(V z>rdgEL}awzZ1C9~L}^*nT9y%-%g>JvY9rY^s)$*>a)}WGlX)a=ew}|X{{SBRWc**_ zx{(<_WQB?)`*2U|o`1w-+aQHS1^&JAQ@J{pc(Qf0C!3{yyVUftb=Dc$=_$ozzS5+~wt?6nV!-dWU!m!=@@h`# zbt($=zfYD7vu!&W2=u{@*=vQ>I^P|Q)jDRzhtt<(Y+eQ|?jH4vRp%vI3e{~mSmceQ zBlWjJgb$mmW(}uO$ieHaAFtCg2+YNX;o^4ArB~9Lf-Mt5gqakdA%>n?^>;NYOCr{d zO|BTdxhC+rFC6;{6G9Str_@;ms+RrDgNU)>S3m5 z9%`{!W3?ua(OtLFlHAw2!7-HJsNAP(6{wh_i3c=RU_NcY0Y>|KeY*UPPvh_6Z;$JI zAA)H1rTP>31iQyNps0RSBHOxj30Bblp)l5 z);aPy8!Hm5j73_t>)0Nv)=H5G;(|CN@;H+Fe;s|smKc>ljfhWjNzY1Y6b}tk&EG9H zPey9VY{{(eYijyCNx@vtl#(Wyo>^R|h`fxlMGbPx?#fGj$6nr+Xjlk-&SaO@& z5~~$c$vg}=qopfn+nzT$9(Kius-!pVPV-TP3#`8v#pkZE+EPyv2>^Wuw@qzAM@q{= zj}^{HW0gZYSmzL(%+Z!{&6l~UwUcDyxng=4=yEZ`XAuRd6h&TzG@IpKVSbKD8}u&0 z$Y`OZQD(Z=u5@R}qP*mH&JlhmG>33>#pu?ghaomrTO%Egtd)Nxq_IlDg2q%>X=Dw! zb0zhj?y@ZaMJAR;+|De7{}cK-l3mhR4D8HC1SH5*{y;b$i86UR|~ z0yrlD$)-I1gl+!-n3v$9CNt_8d|Ttzv0oDS)LPQcmOgziKS1Ax%s!dYdLI;ZMpR?( zQC38fz2(Qe5R%3YRbFI`5sHOob?`U#`g$5|(6o`lmY*yA^W`kEH0qSXu3Em7V=o^e3jPDFXFOsqF%iUo(?Wc9cA_H+E4*8llxec)bSaaokN@2 zX?g?gg1}m-6iMrVx|_0{s=uGHtEk_7Lw4;d^U|Y+hH5v~86{H9Xz|{>QWn{~jhE}c zy-;g4Y>_F4Vh#yvBK^H_X&HrzhU(pKELGh*qqF!bntv;ggkkByT`ytcmR7W8NR&V& zwGQ@Oe!FgW+kL+CB$LDoqy6dVPfybY&`4OZ?~ADPZ*O!p9M)F@jIV~CwOLYobt8sb zcB!JXO9Y}$4$>cBcO{7*)1zjWQt>OBH^-nkg^Dc(J8%<9YArje^ym1`RAOd^o<1vb z>HRU6!DFu&A)`CTUhLBP0>yW>SCB4#Kz#JMbf!6^*37wzyyXM{{UccX!Oq`LYn9C zeb|IR$%l=;QCSxs;+L}3m)wz%zQZyeg2Qsna)in$5$INKNLeqU!FKyHQ{S4Z;hi+M#AwU0d{apb zmZj9GG{}~}F`41`D)7XTfiy5}%&z1QnR-h{DsCY`B}1gHbS;xjE+gU+yXwsqSVg1*IB2L`Tz<3P&x`2 zs2D~N0p$k2-VkK6l=67IUR5#TOtxOot5OVWMPl>XE6P&R(^uRtow+}NH}~t#`#iFl zKtFbZ&E0;7JuxI`)j)A~i)@yQ)L8td!{p<$Red*RGMVT0=aSR=U=lssf@Fw44Nyh42C0k4s3#;`B-M?fPd- z(UlekGVMpAG+ri46spD&3k`E3)WnjRixqjpM*#Kal~121&-2%%AB{7O&E_J7{{WNQ zJhs@RFdkf5_c!qyq_j?x$Ld^OjMW;VD;Ch%#^W%v3w5JM;@7PkD5AQr{>cdH?JvVM zI+HRTL}vY0@ty`O8z%{hmzF#S+Y1Pt&PiM zp?16QLTwfBhEOP`>O9Wmd`S$5UT?kM9z$JHd zQ~f=&8aY*nj0(?PoXP7Y#~M2S05OHt7Gjp*p_9kGT5(AJqq;`PBf3p3Sl4G^xAyVU z^%6lN6Q);1v0(FAMQsA(8>{ugDd5IKtnqek>BPTodbS#++Ww5Mi%54es>-T1^@9Vs zBo;e#!QwWZ)h48|W7ppn6$>`tF0o0dv-*iUgN?}P&eYhsoykLt^y@C7Oa!ry)iM6jNE4az0G$Y86GPUq~*usY)@@& zXCcdCZ)EF9RTX8lzP)K<73EN*Mt2|*Jbm&lKAF-m5xg-=!k7c8wF^QK`M6Q2h*aOWs+7Xv4cZ} z9C7KG3lbH&h!W%nQ>OKR-qEq$6{J(B#G-t0!eP2e^H|{OUVB6c5U`QQlQGk zWAOl6vVHyWa-$Jk(aMFYe-6F4#^6PZ^4ZebpC^9)Ya1*L9ecE9y6n-#kdceVAc>sp zq;LItCf4d-Q6m_Hns5S}=xft45tS7K`GyGSPTbMQVXallOD}gd4tq5`eKg`_jQ}TN57-(=G36ByZZ>_fW3P2jVDxl!@Lj>s zSFm|#vYx&P^&;N2G!_U7Y>{9!N_3-fzT56TgMS3uP4P0a$*0t-L{^T_2Ord&SZLkp zNe_rl-S>}9=)c6jZncCp)%1QZRMWM8Ap=DnPluG6>1n55o6)BvfRnb|e1bOdcfzB8 zvufb5H4;WtW0IJ%mg)|E$uXMi52-tEmew_QlD1b998_#Y##ESJ0Lwr$zpTPH^%U$- zi9dJQclz}pdhj5VhfcoLpD(D>JaRNg@e`k)ANYj!U$mXL?G~=?_KL$A+U^P#Z0BdK zY3bC+-IzSG*uPa9(w@O~KRYSpqi#cC(vQR^_~xOs8tD|nXKA6h0oWhyo}PiVI$4!f zkA>;mKPDG7247WQvz5BWD-&)~5KF}vK2##M{{Xjt?myel5Jjf@q#jUn+?Ga>%NETT z;?;C+QaDTSzpXMorIFbdILQU196a(>@v-sImD5U&CXcrm2+tcUA?EVy_Rn8h$C|G8 zL{{s1LRMGe?BR#axA})7{2luI{{Z5;4+2ogr^93VXVPfr@qn^74DWB?xA9EYO+7i6 zz9W?*jMr&pQeIOf45&7uhT0AnHS5`DwRi7{8{=h{3(7Rx#pn8=PaqA zI;0UwW?2Hn!{v~xY{3h;8*E3+4#4&Ce--#lVlT8Hv3&8|g_x+s5^4y zDuOlyb^Aijy1fjNXyg(_D7vc`=x-#`mD9@`Srl`spM)Ryk4KNrQqY~%%1v)c+nT*< zIm>sf*o;dmK?+BC?L5ir0;;Jl=nD95C&~D~h<^x)lm7sd_*^L;#M6?10d?tBpGLnE zO-lWjRUs?+QD`HseG|r$am{|xroq!9&BZ?D^`(QBvElLY!%p+b=!UlK?nTXZSU3Ee~SH`CPZ6O zI{IW1>6%F+BaCO`vyUO(ANT6^)2Iq=?<6kZ?y4Ck*!kp=8#b!RDo~YViX>(s=G<{| zIG#aH{s7pJKI5$a0OP@p#Bb&!(-hi{R1t@IcT!r%NoG`Z-Q)~nLZGW33OFy26t2MR z2fv;Af5WuDW?&glm!>X9-UtI7*dE|4slwFJ!Md|EsRi4ImE;Eh05Lv4uU}slsH&k+%UDmzFy4UeSCpG|-p{l`o?=aNwfwrmuLDiV0Y z+-|k0kmB_$?_J?yq;CyBU|`DO7g&?sl!JCBDUC32PKSV$#WP0P7oV$Hx2x$pr4`X3v^9*b$UZn(yj zg{tQ)b_%pu>gKF)tF@STs0sjGzF!CH_x}LD->FM=o5|zBe6*NRJBffl^ zSd!$^O(U9!rIHvGK63sOck#I6`@fI(yy~Nt1&tJVzNY|0cUkFz8H-`Sl9Ml}j~j3V zN$Ei4l#q%?76-xKVmW;`>S%|H7fVEv@wH&imjx%5vVZ?_o>I6S90LF)Kc`w)>42I+`SGAkQ7qKJn6ge+nd)iZ72T#rQuZZ zJRA|n$lt&{KS`^Mutp^5ploblM;+p^R{X+aUS2 z1-{#F@t52qV%$x%C)hv zySg2umDxlkn{l$YpOss{J~#gWb4tj|W={BtB31!cia9Y$OJu9rNUSVhut>XYAPfiq zc?!v~JCo4KC~g2C;lc!KOhL%pi?%v{LftVrP1Rm)!bm=>IDjAD`xDnhg~2NOP8{

6`)YZbBfYQ&I930TUq5m0ef*~xTf;yuRR{db2|xlRuLPa^X3 zXb-~9Z#uN5hTppfh5w`QlKArQONC2@FhIkIa zcW)PVE82&*Q|jG2Zdr3#YTqAfr1dUGC#Jb*7tB-*x~3tf79!R7a}E^H zAdgH~aC$MLohtk=UhcL}U*T~Lpah+@!^bPv;cj?hp=zMxN*g&lWHpIxu=!Dg5(ea- zu0E0|w9`#4pp8Xw$6r%J(+WpGv8-a)o^tU|-knA*;Le}z?b-EeYFxe+T{)7}`0Q>l zQ0CO;%3gFyO{$9!GD3lO=eFm6X-11rBRm?7VvRXK+rpA>tq()%l$J=+LP;A)uXFw} zX{vt#y_(MJ${E@6^|b9QlVvkGdVv7}VW=W;BTF6%ie=I(`dpzniv1#^814pQCR?kt2n6kPe@m+pdZ8RRA)f6*1 zd~Qa2IUFuX%RB*0a3w~o$^@#_U`1FGNnhnVv1MJ!=!}pwNXtS%KU?pDSneBFHmuji z<*VJ(nfH?uB(`l+f}|FJw_=OOBx!v9#s*?plprT!5=M?m zmOu~=o})5U5u&}__WJt%#Zg+*82sKx85UC$k+UO8GnK3*OonP?c#U{JDXv;om3e>( zAS-SF^X?HzgwD{hPOeT{*=S-!!Dn&RnL}3f zei6MCcokSM*zVhVcpW$hx5&<>_WIhBm(cV6AKnwXLe!K6n=?pAvXIlRN$EIc73+FWSwlv)-tFYH=V`IuSl(fBwdACQKf(I|Q#Wn-qqAWRufg}to^DzGa#OCf(CnlK2yu#aChB>TQvCcT>kI}I@ z{6L6?yYVS6fw%ylKHV5b1xn09k;48VU!NlfXjW!oF0b;yJ$3kEO>3vBiwGS zULPZS9j|cuH%%kShd4*ZUAs~(L2J_5&8t}0=R~b$Ckh||H!K;Lk8Zce)Vc$vc^&r~ z1P>_fM!C!yRZy?VUA(dWnVQ{QW7~aZ*gYAG(phaclC_M*8o5bjr+TC}s>=i!O3f^d zHc9JOgmYqd9D(uYrKf``7S%k9Et6xX9gn5sBnTB+E3h+jRb9@@Mr?*#HytGScddI% z)@a^pm6|hNSYygwSfh=-NXz<)ySK`t@6vZh$7;vB(Z7C}XwO4vqCbCsulP*pe$VUl zrIpHPeRGr3ma=(hZRv-(Wi8N)79xLII|41>mgK%z4nzWZc_VJ9dEgPE>LLyY;-U0& z8Nrm0oLBFRI6GtBjW3|HdaF5OM&z}wn`)1Z)R_vuoM!bENStz9!AEuj}H2?0d7i}YBi>fCc+x6 zM=@TYmie`QIo=pynb*Wy@+WVw>r4YqWbj;AKD|fF5gg`7loRF#kH5mk$>Ng{Yvl%6l; z+Z{3A6j6grFPvHTFYw8!Z^PWo#cEONYP!Q0TG^{^(qwX!?&E2gp~iYL0#*{^Y?#w zPa+?}2nX}-aP<%NbrMHSApimBGTYmJ6OAD5YlHqPmYY`+?UuZ<1ZqYtt|$ zlF>RkqUlVQQpQg`EeyUsJg%g+j~v+hR=yrusg*<$U8fsxjFkhDZS);;Jd>%CD8O14 z7y8x~(;Ik=bQ;IDX=)6g*r`OvM ztgjTM2r_P3V-P|sg$mz=lJx7SkM~RvoraF4n*1UBrTu8#%k~bxU zfq?<`1Ajd(DoEIGb(D1%!Mtp&g=5*!fDh&005biUI#6dbSjcr2prf6$@piFL*|DiH zm9jUi$vwF!;__3iTGf?XlcO^%d`A)EV)cE>BWUuCsn~G}_yt4jV z@Q(qqc)VgJM)@6B`S#ozDD?%~Oi7Im5p{VWW{fVPQRQYJUuxqe`;k*$XR>%5A)qnZ zdr4~?`CRUEEcz+!;jP%mS(f@snaOQe*0}Jo<6nv5$L9N$uANMQre`wT|vKKggt37gIK{{T^8sp|Un8Vowvz+fZO*tIBSTlQ&PuPoP1 zt8u{0-kT!CPT&EzOL;G6iC6abR>F*f2e5 z#H|`hi-SjQZg>E($cwFqGR z+D+tL&mcD)DUvBdvMVP%hUfRkK`7G_>TcJMZ_g{ni|s#b`>1GZ zrPLUHSA}{;Z&@cu?ms9j_VKyE*ANS1V9(I=D+M`Ql-CXkZmU&7pe+}2+GP55fT zYrI_u^T}r!sI=Y=l^Z$A8B26OG`B^8vvy~ae~FV4-jecti>~KlK^*|p6_QC2e2jWl z9011(!M}H2eY<9^ru;lq&Z?#%UHV zUB2fR@#RvxN^x^~RV6DBB*_{^cRTp%$fX7}ZwX4VAlb3`oE=sF0QtJs(z}Phu=@W1 zU104;cXArTElUeuQ!jA8Cc&TaE@E74bTinj;Dw=s8wNhiTpjJLc9YcIc^|I+1dRc? zq&ja3Kjr4Z#YUnSbn(c3`HxRU>~AOOC0jWJ#NjYRz);Gs^-5uvPDhdYk+!>O6ic5?$Xws&C)onVA%=s z`0Na`9iNtlMxsFKWuRX-D++S}@#t!?R01Rpo=9VQJXbY}E#Oli~k|k?EVd(=XW`@aJ!K-!-A_+?N@0m1}b1u`=VA1L;C)!^(0{muPLsmP}NXpFtHR#v^<#j#JEj>iEU zL77O|x9Cj1Bab;P>HV((A+%I$W~x5}k!CY<$USGWhpblPN7LiR*~bz;}K28+p;kmPs362adm{3&>FlQD+rEeEog< z;!`nz?)@C>a%miXFIs7gTwbKvTRNgzHsZ)*eOYsp)}weV7MkiuC2E{xK9MJVfITgI z0*@rD$zy?6$K{ThK`ROW0K0tpbJOw|U)vYOS9>s|SgVs9uA~-{aC!Re$@lIrxas>$D>U$H@^UeKXr1aKi zrTL!+nX!n?P`^(lS252g64DLu%`GLRVdi|EPQ?Uz?;9CmSp1$qZPZzOp?7uTjCd@v zSaIS5Uf%tE22y;_WAxC-X6jng`Fe|%%VRPa+xq6z*74d;QzG1s8*z>0jcVMvZ6Zjf z21!8k^L*WJi0W5v(Eh`d>zd^YZal@dh#UehujQC>eXZ_wcGEgzPe$5TH=VkERZ`L&uED5Lmyn23EPaO%ZFaUdP~HHT23OXV>7 ziv7kmSs~E0XvW=#wO?<`6xsg(!pC?uKCKywo%V>;l5sfGS$gwl#SC@bn!RiBURdqe z_*f*7quth6nSfKU9crC0Bpok3$l~!6>O5G~nD&~WeqNbtBkkSVIHRl2ZkC%EpD~jbx1n&k!xh2KjvSsR{~ZBvH$>;v{g^ zPjB~uns2!H+~$_AQ(9my={q%GF1d^OsuJT#sWo6?iz8ahLcDWLA}TD3j5wXV^d|Ua zaDA(sPS#1C18xMKgD145ydAhMLxq*ASEFj>WtL4q_8_-7{muc#QW6R<$Lb+Py$SaxII{0wZch}t;PGSKZ6>Q8(R z?T!ySsx?j%0o=SrEkLp1GP&$dwZS!7c=?{%No4|KY+R|nK2`MClEy&F%j4xHpolj} zmb5w^bI;UEBDw^l3rYbVfPZ|N(LJlVi?6Hy0LM8@wxYsL=Cy4-kIzY{Fm%xwZ~E}V zmy%5EGFVvAMQChI98P{s_SggJ6d)0(@jH?^$I4jil)&2|QRzhd`(mF*=zVpfe=yXV zHeFMO(i7azT8l?deGPk2Nys!9%wBE3Gr(WEBiIf>V;?d1+oegW0)*iU*Ixeswo+?T zI|%rq0czv(^}-X~y-VG`+~$));B#H0*E)M7(OWq+sekjCS9s=|OD%b(j`mQ}jI`oF zVgXAQ8}HK)M!p-C5+imUzJA#}E#T_s($D7N)b{oV`(_Tt=#5jLu{zT^+*x&|rM-}~ z9vd3jtfC+cBMuGQpMO^ccN-VkshN7`OtgasdAT8DP7?t8})1PwHJa z2B3!>tUoSGW}F7Cm3K2ShASKuY`?^O%8tNq!*RCVApebDF*fZftB9>BPBE;CzKB*Nvk|e# z$lF>-*TEi~6NuEGviQ=^w8-_e4k&cG@0J^0YrQ+$Y@QzluQ02S)S9{&$$d2~+p&7N zIc4~~=4y$sD^igzGVFHV9k{Cx2dUx>Fn_bRkb3_BY$7BYWY*5!Tl~#-12pk^vZjlm zxQ%I<#pEnyGLY26<*Q$lH)j_`axk1VXfW}?Be1xs#paOwt+-}9cMS^9w4xq5@xebl zPR4m9)W)P~%J98DWd8t+e$dzYe;nC+8T(Cd7SPqR4rfUtO@D$7vAl7mlNL|=@N zqdKwJs2^NJEK2R8ee(~P!cg|+`(;e;pLBKaZ!>y-S!35wVDu)e$;~5=Si5DdeJ7LBzzWK;gJyzfu%uYAgWs^u$7?h$ zH>wJUD2=mhPTo#9d}iI^?E@5v;z-DBSA6rKE#mvv+M%ECK8v}5n;&LN%?b-O7Br4H z?0ifyu!_lPO=kFn@Vvk)lWCia3!>xg|@-k#M`z4ff~#lF2fr!IyqNerb*iolm*; z%O#r1{$+ZE`WsTFQ%}>DHp*ATWEl%ZE5Qv}W3O7Vn##tk#FpZ}bK`!O;iGOWDo=b= zEg@s#A=r8!d~j*_cdRVRxuI7XF-US3E?BV(rI6Dti!r0ThDDK=<&&)P+YU3Hzz5W3 z<;s|5u~H2~l+zZYMiR+xcCQ0PEuL!x)#Njkg57luzQDOY$FBSzho%P5_vAN_&}jV) zLe@52E0L>@^s*^#&O#|GUY9+_QcM=IQpWeDgPGy`fg5ZN+jYJr-t%~I?u_!5E2sCv ze3qn%?bg%LM`m`m#t8oaEO;WTU)N96v3@8S9a1H3Uaum<`}Al74dI6#xFRt!weYpy z6dAoCfY6yZZ&qz3grz)@Sjc4T;pVj{p&X4hsHC|cC>CoLT148&t>u!fq`dJm$1kgm#lZs$mNo^I+hzybZjz}a zzEwVZucL*&I7wMW8sf5ZwI7HLE!-@m^)xP?yCr;GF)m(wr3+N@QL3lP{-3}_Uc*j{ z>?Pa{ynVK4CW?fu=IzfJLMn*&u^t)eM>VzO%}v~VzDq}8F&6Q9Ttu?uGffn(_8P-+ zmc4e7*&}3MAhIsNct2oYxu-2}>4_1nfHNLJPa^mJioTbV+E?SHN=FB&&^3m*vceg0Vr z{{V-bac?bD>f3pW@#L}NA#Pl@T;yV*lCdF%3nkJYUSN_QWDiYu9{&Jt41`bux%RP+ zP%MNagWD|rGqajAL*eS?Z+8;ivc+{+ z0#F45a!KognD;1BTC;-!@v{I}i?4r7ed*nALsAOT;HqFQ;W6sz4nn(By&IS#Sdhge zs}n~Oq5a6sztg2|0+!C~=7fOG;DT^lQ)FmjtsP^3On!R-SgF;>;<2>zS75OAJugC< zt%J zNT3VNp}moDv%<;RgkIH?hHX+i+aAmD>3fhvG&nBQ0w%+n@@}l2?*M^tOKhN3xB-sq2fOWhlJ`8yHUEQB_pf zHZyM$?^bh)^fPiu&ti7D9i+CNpCZB=5Ag+AB-_h5ETiq#SAH`IB}qP*C#k!Ma%m`O zSTa*-OqI8=1S<>~6uCyFh}o{yxQfwIfvYK;VRwe^hHS8 zR!}(PkbU!@o`^}|8wYTCKbLH4VtayeIV{z^Lxzs#jKI+p^$OU?TCtFuAQls1C5j$G zI`PKeGR8}9_UKV09vUQ{{i?p4SLcNzMj>Z5yW7Y|_r=C*C8ITwOs*P*jBX;Os}-Th za+VgC7jixZIOxcP&lE^UA@%_O098-opm4*^Ij{GIu@cdVPb72xawAURyBFF#k;!Te zc}q~(iy)auYGnmmHE7FaSi>AqdS*XPuq2h_7!kLQl#Q#MHpiwar;}YyP$dZTHiiPP z>%KX&{{V?j)>FhhxH|_~SDphSE)KF}Wyq|7eI<$r%SBEy?Zb<4J0{&aJwBnxQUV`- zD<@>iopjgT+d}!#r?Ys}}JUv1O3dQN%Z> zM-lGau<*nr@zkuV2Bu_EJU4$t`FwF41K28T4zk! z(>kX+PfpjX8;nLbP}-w~y3??-%`QGTk`n}~!J5pZvY$Urfj%cN@jO`9#lEFMKVI2o zOB~Ex*Z@`f46r&sO7@z@KBkDlSI1k+5mhBgRf$vs=dO{Rf~W$3?VJYzYmBct*R_$}lI~9rozz0Lizdwoso%MerwwQT zXtBvgIQNpda!j0t#GaKbs-nC!99K?$cxmECT;KP|?Hg0OSvvNrVK7v&m7~6CTD5L? z@pPIXh9hK3E1|INr*;aPjkYbnp1wQdAH*LA_&ZjnV$xUPUo&MUU^X45&+V40PWA&? zYMNA+PIW?pfLrJ;wDjk#bU94_01-Ja$Ht$j zJa~O2nbfr;sVZ5W610_}Kl}H_*jeUqU%>Rrown=lJ_9HHGm+9wJkX@qz-tHh$=l)) z7bwGL<(z=Eq5Hk6_3KaEoKB~nmDk%RYf{H@lo*-U=a5jLX(C03)FnV&&f5{!=!-6a zVph<}5F@6|rpM)%X&NFce;q-;uDNu(M>BTcKZV5Tsy03&EE;*UZy8BV;Gi40zWvg#F(oHX&?T>sk_1!CKdX1dN zUifL^!p|?G`HCJU<~*J$1j{MpRP3bh*WtRM{7L)`@lO^q$4YqxhXsG}Z+w{Ij~^-CZw(r44xF_*m${ z1x1f!KqIV?#}^daa5mhHy!HIiA(K@kk}>lZB>rae%aAmaz4Wu3)%s=XTaq6x5Z*(}&1jF3W#;=Qx! zV%r+7?to>xr+W>lbp%>dBc|=;W20GfH3jOjSg#$ZNDECZqaFu@9VsD5kskOYAgYPg*YY=foqqlB?}hw3;IS+^Eh?ggs{@jKNzYCVI-)4=g4vGIcOOg3R_2w( zVez<}bX4tF)fuTEFcfc?Mq0>d#7LnUdm*1HL@7^eLPH+-Q^bE2+OtT5OZN#%;(DP4#RGp z;>HT2MjAf<0A9G5$sTY(Z%j@__#xEzN?58{{B2EHpUh>_8uaQzGz;iUyo>9xhEWW` zeZecS{{U`9ic>6*u}Bnm%EZ7GQol2nk5u+^8`|0xbiRty6rt6S>D9S%hCcmR>|@o} z=V{Vz4K(ObkjPK%=`pHGBa(LEnyiiq?Oxd<>Ysd!82DiJ%Il^mYnn7s-zSrMIegeM z+RD+lD47i4989-_a)hXnlepL^1AV&mnj)pDFe!U~T<;ZRAQNW3j&+}~J*Vy_d$+l* zH?6brR?}I_l6)`aC*X1vaHtWGVys0B5?7Da_kD;1*p9sP)@b0>EYT&-syIA?-Rxx& z11xcHcMq;{>2pEptTj6Lx)NQLElXD)R$93WHs`TDRah4FiK0^*&BcCaX4nz^`rjGZ znTP^~o8zu1D>DNB0E-(McE+j0t;ia#0-&i~>*2m4)2y>BaFq4$w6P4xcR90ANjXh{pUt_VSiq9WSmstBKRv&ogd%x2ow$)WDV_FCBOd`Qwnm zZCA%11-^r#cAa<42gBL)>CnFhy=%T2#3c*i94d=Y=q%m${ES)DSu|L&mh(5@$X$7P z9&vC-D@s;Y@?UMg^FlVK!cgQaeL{-=0GvaOq>JYXKQYwx;k}5+Xr$D5Sp;z1yN!Y} z-wt+DUd2fYH>eY0LU{4NzrF|{;#l>2CFX(t*~4UjZuP;~wYG!O)^pl=o}IITtzMLO zvKp5+Uwkb|d54OuQ@D0}5f2`k0?F^=ezBp{w}U*AhAe0*_4%A21gk*u53VwFzCRI? zuS+|c%)VX=C)UK5R;gW{b!G+xLL}MY@x{KI^d?#?vBk6wz5f7QGL$xv&S%zA;jQ4a z_)7FMxQIV1mE+V@Y(-XTo{=or_@}Voq*EU%ci(-%JM0Slc{K9HDUld%`~+X;h>=4f z*a#!Oa`P4V)b75R&&%2UBY~-znk#cr#cFKkO1;@}_1;Ebj>-}0tW&53fL3DPZ>fCR zT_=e8+4T&uo=Sm0`wwhuee7WD^MT13J)`@VkkvM|CW`KEp1GFEz;9Z;n_TunD6(^I zrZbBZr=?JXFA$2}J%BwnW|bs|QKi%Y5dwzLYv=2NhBt*A0uQEKZqRoRMB)2;R~Mx8 zj(<+IE7mF9r)W)cCbrXyJ@v>iZX$5pgR5`1@()u=`i9g>+O0x0fkbdC<&Bmy#TXk} z%-XZLlit(1mi4V8a^`Z9%T|PWY_+6J?K8ui5UmZSwkaOX1>582sLsmi_Ay*>UN_m#GLoCF9#|+hzk} zzTVvvXo~6BOh^#W~c#*mLZNE>_%cW0=V+NF+eCQn~cTk8ibJ zPfO?=j-J-}d}gB780u|OcFAC03s&W+B50Exa$vS1Czt;Kblmy&KVGMkM-iSjNZB;x z*rwb^xENEI^(wm%arJr5Zt3amKikXsEWCH{SbWxcc``Qi%GaAQ7S>dQ0_rNP?T)6N zO8kg;?l$qaUYKUox}Oc&JD}Y=wmCG?hwi-uTcK1eWS{h#mipqKwXPo0M z3iD)QU;&W~Q5kH`j6Pk+1pfd-*P8)klT`$>GXTb{a53_RhEy@#5siB*2Cl7JO;o+9 zG-Vo4Lk1%?%q^?gO3BJvH>ygnW;(_H0L(`k+#FCQG@E? zmKZ{5V^ig;zn)~Ix+;(Rgy9cuJ2jE*rW+lKv2!J<-f?ElM!EX3Q2f9dW`eBg`yoPn zvvMbM=ii~4Q>m6ok}(?bV0W(P7^Hv_MjMA1=W92iua3aYR@cNyA_(lmT+3dukH-sU zHC@#<9yj`V-;UiJaoBkq@Q&WUEL59!P$LcLWTLREU1EbK)Qi@ZYVj|uxe!A)rwkvr z4M93g3x6v<8nEFUl(rQtsIRshkH}Jn{V)mOerYb7h(7N{klN% z2+%Mb{J(r34QlW%t;~Jcqq$=ZV--r@s-hco#xBKg)?&g=TtXu*=Wt2s(rMWllXA0; z;Mh5#g@C7w^_O{K$E12*DCb);6`Jj`zlD)S($Hb_rnaV2pw^G ztaNQ{Pe%J$wJm95WqS&-B-R4N%KofrC#dIry@!FnkGX12%2iYY>DXdfE6sf1e{1u) ze?OJC{t;``vN~}EOII@3wV*4q#!+6phBOjL&E<;wj~`Gv-By-;I;!e`DExp8_r~z? z?^-L0Ps9&sa9zjB;B`*0#I|n_NmiCp&MLICWhB02*=-~oTb(&}0G+%6=W*kv!z_^L zdTKqZ(PHD@cI@jAHlgP%61&Vc*43Siw)ASN4 zN{u1zs19^Z^$T@MlOaA~9%r9(vcbx1tuC)Yk;qhq> zKGaDyn^mH!q(cVl&5~$?jl+BF2yKDdZG1YZXOCY6_^s3vK;L|8X!QEBvr0`+43USS%nNX13c5vWmm<#_Y|_Zb zV621pnEd|$18$fXe_Fu0HHTPS^o-(aa8DaoReMH6Ajsqo1Caw^^!|U^Emo0bjh0I1 zr?y$AouXjt+b!2?d!>I*Sfi1~SaD_tS7kDi@vt7s0NID}x$*rxes}RNhqj(Zk8LUa z4t*|~Sm%f^{6{-^_-Oo6&zLw>zmc0Cl&Z)hkt}**P@gvvo0SJ*ckn}d9=>vL(M3E$ zFwn5{#w;i#60hPJ`gr^#{wp-jZx3HYYk3nPipoPBRJS(o=$Qb8c?VWi9DSKcQSGok zI{f!rqM8W|s-Jgfr}Y_IAdp?t{@GYR;%EN=3{4~6y(@QB>6*2y)|NRhW3m+ESuNC^ z(b*fCr<5CyJM2jFvGdo_e+qvU%kX)=&n32%{{T$$wHi?5d3@tP89mAD&aM1D>-5t- z&cS46(yMNI%a@^2XN%07A+XT|Q6SdFhGHj$aB_Cr)}3*k^rvFZh7%Pjz(NJ6b*anRzZuhOo&F`KDH%7obgsh#RSZva>D)4$dP5S; zB`dMpS20Nbq+X&QKoA2dPzmHv_}g$d@_wBe_>)`2iRCrVu6e^xOdZ7>I$ZQoK+r=O zm`fRqk?vi#8@C=qa1Q=`&iizuEbhn)P|lGM1|VZAMq+F{3hBXG$czEYo2Vd?!;tw@ z6ZY7j=g(f|jH8wEoz9OQUroLFc|ObM>)`Bq_G9>dqfkLS zCV7%-?|=p410SR)LyWNEKUUm@*~uruc^nWogg%aRF*B(^IqX>Wp< zI)+4$Ji9Dx8)BsF`;CJTHrsuN)A&}h2GK}Vk1wtgIAUwAc&`kV?s`&J1~|5oV%&fL zuesf~Byr#CR35vWCpWDm{phQi5GykUDvZ)0snL(NelcWB1z3dX-g@wieC_Z=Ks zl~-3%1el_`nybr`*jlF_epRB9`Zk%Q*fBobw%fo^oX?&A0Kf8cYaUXjLM=sRq-hv5 zI-F|INK7VqnOZ{w1_$K`yRZeB_9tR}iQ93%Q$DIj8xw(e)Qo;1ftOY&ZGX+TsHRd? zK4a=cPbJ)WEL4q$llA_98Uo<5j(g+QLIq3ETij+kU+zAZ??@EWecT&Nr#hN#lxW zc_YRXWjsh=kd+-!P6eVv05egD^g11J4od z?nvv))j{HgC0p~v$`(08uJJG|PaqEJ4&!6)fAiOgD>O`@ScVy30$xDK3t1A( zu&I=!ai^qJn}d>^K5d5E9rpnL0PR0*`maZ>F-Q!jIij#Y!Tf%HoeAU&VRwDrM3>}d znD6r=518>gYzNToMmZlDwO{{U|{;u?)GJK$PT0KY&$zt*tT zW@`)yzL;C3G8d|C6_v3exnQ0=qvD%?_gO(ry)@YUc>8;vp@Ufrnv^Ki0R2v5>0}Wx zWxRP|wKb^n6y@}%nkgdqc0ka)D=!jKP^+^>K^%76j~Fxj zOKVDYd^{h`&!F_rs`yvKfIdF0Xph1_&VF>XUuiXucQvupTB2z(_Vr7x%P-?0Bx{W7T|E>GZ7{8r#C0uT`^CARyM?t~2yC_&fX{2w=x5$PB93c2zgBGz_ixEvFRf63zwi7R-a7rwH*Ay{{X~S@#!9Z#-W0a zRz;;y%MCEHw<|n(ByI-dbWd^TbM@+NE}Cg(joq$S>+S9H&!LA*kO6gdpNwC{cXf3y za5M8`XuXT`-L_WDf=)jVRosU1N}o_K+s^)eoqoUkG4Npu9ZbfSxE0^mK6~Q2(YVBo z)2=1-{{U|7NSv0aNzxxy7-#1nG~>nP-0$??+v&ewSYzo&K6k|}_^_}408Vl-#U!~( zk=23Vk>QdV8Jl$g9r%sPuOYXee;)qAK^(4XwVVN?r5_UZD`c+Sy+~Ldi-d5{q>Nj4 zl!GLj1F#3}w^X zcQ&c>!nO6qu6H8|;|&Ub80C-8>5zpE<7VVH9C>-@#BE1+UrgXZII+lS)wOzK4DXGw z>FYFcDKQn|70&Co%ycTOV7>tFdg1KHpBUP~@A&gbv3ac`6W@$Kr zPruv$0J1C^hnI{s+kc33$y$|fSF>j`cBo;PWa2C7^~OhX`$tamO&qnUM;ejyhT?gut8(&v!1p~1M<(DFFh_Hk2s?>xa(bo) z=2k_Q9+l*glXQuhmE;5ZfD3yazP)WIyW=;T9=REx&{<2awDJ^Sg2i`P36qE+8}`PY z+cW*Q>s3{VA+w9Jf-8?q{Sz<9XRQrbT7P69dA2% z1CLy@IWEy*aBx_we;<;YJ!xSxREi#HLHHxdId41>QMV+3I+`%VuF|G4-`5O~K{w7Z zaQ^^@EJk+-`jKBRUms4SevDIN+8Wjs6q%-34;6J{r(?N0^v@S-EPfa)d*4sX1V_5) z@s=aDU9QkLtPJ$8b=C96v#A8#82{R1VER%8z95E|=? z2&l%#e7aqt(Alb3uZh+5@Ri<`+LS*oz~5OvEv;fXBNAFW{Lf-h`%}Q>^w@2ZBnsbh zS%DX1b@^u5ZYq~AmM22i%<1az=?r!;WP0S_raVmN7u`Eaf>C|Ax zCJj5DJvjRM{NAh)c^8F~_P<2wOF3Op+)Tc!%Tt#D9SQOHMwv17s#jPQ&Muv3`PL>? z`M^7}`2IR{I+E)g8c1Uj2e4bO=j)izG@*R^eqUc-(b3wCZP`s(r!zyhHm;=|H%c0| zntHNA={kD8yAeHQGGri#7H0B59aE@>UYi?L5{7fdAF3FU3dG_)*4QJU`!Aty>I)i? zGBRrF*KAsw3wr69WvKJc8g!JzBa%6iQbO(q!(cjV%{m~Bq7k?pft@HVCz$b$-ASb> z{O!SCTs1CGs0Opf zukFqgIW8`}xXw}-@w3yTsKu{R5l%=}-0&?pc-N7nj30m7!|DEDjpRj>ZiPi zmtY)%4;fZ9N8x)*Vs(BODWbdOmceRT5@Rj4oi?Sdj>y0+dhG?gbXE}q%^H*pKrS}l z_@__tf>KEJe+yUB^Unm2d(D@`Sgnm;OmIGx?UuIB>O6jjT9fx58}Jk6fok_Bip{FR zoyj7C^ZYDOEPR3V*L4GZ_Z@liPpgU;+fXav=D;JF;qb@xd`L?WeC;%w(dV? zbuOuwA7agY1Dl!cB4Tf5F;=VIifIN`YSr=I{(EA|tc6*)g&S-(@_kJ%raeSarCy;= z76Ie6-%RQEZ&zL#xyy0*Z||PF)NwT_@wpf<*s0;GhMHua&5Wip28t_&^~VuN*Xqc2 zAdSxbPppC{4*3{(r>N;iwGVv7BX+@L*C*c}9o^3940YWnsr4^!^ZBfm$%HtIxMY^x z*of)NytXb1j*(Y^JQf?0eTe%@rIS$YJUV@3af;+O0Q|4lEGh&=UHq8?g6+FD<8&P6y#`+1g^Z zT4ChvmAkin(fod1%ja-w4UFzN)|%vT+OjC|h$WSx5?9AtuBu%jf<3@c!Mv90h;+XO zlWR;BP4LQZ^%z>0hA^QC-bZ2jXHT>qg6>wK)cR{Pj=u(&(t3WPU(RV+n#I|&m;E~J zE7UhgYN-ROFEAKNN!Sk^AhwnPs1p+-o)v`(9j>xrBeV-1+L-k}+Z=6w0c$;}=+xAC z2<69199Jl1DT*GFJ$00t_B}op64d8)@$5G1%bZB58yH5@(1U-jUa_zdhONY232C`0 zW3zcjhgm_C&*kaxk^o}(N-;q!trRN&-V6w+Q7%070^jJ~#Vx zGU-%NgHumTSM+Y9z!6p@K^P)^ zim&;B@$}r)+!Jm5b$_QVZCysBB21qx7 z<$B}uIcw_n=Mk9g)l|fOU!?N7Zu8qDW$)UjLSTc0b1fOxth2)y<>@c!hXY_h9dFu7 zu$y-H$n@*`e)v%WS>hn>^zVll`tjp5W+yF`yDp%+`Fj3MeoD8kMESLOnylv&67C{0 zg(HwV6$7q$H#u04AijAWE7v+SW@4qd2cMQ~_Gh@c%~yiEe^zPRII&YuS%x@erC}z& zPAJ|liLYA1Lb1HkBMu{eBi#7ulf@iHFtY<|>(l3pbsj6n7vUAoZEF2NLrdfAYJ47& zy_filbZpKs+$>#<cl0x3Q!9ZI zaa}P{H-0-v_UP)H9mvL5$qn5r)|7fwxT>^XjB-d9)Fgws0Q}xHKGj|l zX&69x>E8|Fb_|Td)MIJ&c96@}{L2@fpHtJGOnOtrV=h9t^^!+su_`od_5`(FKu?g4 zSHS4fH{Z0wwY!osYECy$HTmQ|M^NHBXH!3@s8qe2n=xXXS0}ZauVCBBh*pw86&B+x zNl_e!ZzP1=@ATH)D2^%%MAZ-6oN}Wx_^y8n^!C8oJ<#orw!<;a>S*(F*3_|OCB{Wu z!B(9aBzURO^y|LTO;9*?eYV_eLD-IfCZ;(f@Zh6I&FXz{mCCgBr&8RheYd?bI=# zNjRB4`|Qz1KpTl~e?gQ_KiP;ot)5Lsb@iSCgcofbG#ZL}d8-+u^j;jC_wZQzUnEgj zVe+G{#X{}3zn~gOQ)bj=Bb~fgrzbXf&zcnnf-LkG=rFR^U|UP}w>0{POTN2G`Pnrd zCoiJr{{RcxS!Aw@j7-H9w=Jr)>qdCJbIiG6;P~1}oy@R^B=FpDL-~RAqtg8|G$KEAoB_-^jcdL`94Z3U=s*+?`#ThYep_>Ljp1&T2d@szIQ#8G82v7{0x zjK~?ow&eSspDvOU2$7r_!Lo0Y`F($cOCrMRU|%Tf>wUl8TO6)`E80Aj$$NW-)Y_jX zX5gAlDVWrsnd#`^o}woVJcw*0Xk|`Y77iP7K>8`FXq6@?i~j(a9&gVbv09~;O5=b# z{PJ%F-A!#qThr@mcxsihR&rC~@@a0>x_W-Kgs&UoZBR(7#U;wpGelkFVDGbRzTE(d z5f0ehi5+Zp_XjnIc|%5?QCxfa;KgjdrSBF8QfcX?T`@}{)-k$!QE3HA`kpu`vl~yt zoYiaAnn&`=+*Ut-ewGpijUVwf*;eUT#+h{bpCSeTS3ajJj(@eC)9rN?=c#ocap_+C zqZ=G`Vf>$0Q4?hA*j%b->s6oPBB}_4#3T{CZ{u%nj5d~8<5*)zn6=&cc&|;?G)WZ9kZm;K-bHOm&>hvFYl%ekGqPJ?k|dI`-|@ zNqNNSWtGh{}o41*Y7c^xHSqW%R$I!Pt z^1h(-Pp2KsoOKeZhP9=XJcuLU6PDy|cIlorqDN4Zl?A!Dd1O!g11iV;8A4EuVbHYd-CA82MEkO}SUl}3&dl+o*WBds*$8FSc~ z^t_p!5b(t-Vdc}b>|^jyS&C+PrOdQkE6Ec^?XpOlO}@bS+oD2t%e!l-0{364Q88x7{^+x=>@N1z#>jb>iS6KNE;58 z79EB-EmZSIj(v_}lOsk~mIIGrmOl@p^!7DVA&JwNTwZQVck4%Dbdp?y%M_1lC!T0M zA66A7Wk%()vjNa=V4)0zt#s{ywONZ1z^~sma<{V?syW#8b|*^UwA3)sY8hJ={aGTj zM5M;p^pMFyvzU1(=0XPfj{Z8aQb6RhNi=#F!s9qVenNjx3(L!R9qyn9@3LQOAqS)W=Di$eS1>%VYAG%Sf=a@sxO^ zMGmnyC*_eNS zcT(gr7)Qm}$> zLj1l|jEsVLJVlRpJ9#71jBcVcq7VgEEa*8O`BnZ_GFBeZ=sVrJ(zvRaEf<5IE`BpF zl+pQojTv$_FqaC!J~sVH{wn4yL<4b=(Vfqo`l+=N856^m%BU0w75R@`^K^ztMy2HD zQg+{G!%@l=m zACu(tnYA0X$KdXMzz@{p;fh^Lw5o-+@K2!0ta|B;?{;cu>Gwj8N`?a$kHbxgp4LL< z4JCo3{SXc?73-boCjKxI2s1NVhj3@4g;xo6MmeU^@k$j$R#rknY zYXG>~Ig627n%E|6j4JhEqmPo(pz z^oG<3B$^W7x#PM0>V^iH#q>@2a45~|eoPnbepO=vY6V+<*Y+QR6Vx`Fl{{`kr5E>d3e(_KY-PwQUPYP}Ik?k=?OERe@yNdT80k%pX4 z9chS-{&Jy@GDgFqZ8?A$d_<90ReD!n*CG2|$@T)E#18BA9mY5Gb_=-GzdU_wqjB1c zA$l7%@w&eZAjIeF)2fP;q{~y5J~nP#Aemd(p-=$nOe0jNWhhToJdevNB}}oEVq+e? zzF#ibWddlbIJmTvLnR9}XBJj0Tu)94_6)wYgsTXWSByri+=1eRvE%d|Zs*{JvITxv zx-q9 z{{Tw0idct4CEeM#ZIw>^x}rBA8<4DQJMunwGNfvUO(TyLP5Oc81$yH$-b*W#w~w

^6_qz#&cJn|7Trz7f4l+ai^4>?81Q@X z+YmaZzS>^)uFK%9{{V&a7|KnFrxU}KmlZO?>o;{`FQ*uV$It2{l za*{dp?O564FbL4teYQvR%F*2&QIghO$f2RM#*N5Xs4+4@lE-6dLq|{Lp}g_QiZowI7sa-Usu-9>xCb7C%j7|fTZUsR?paH%};e&XmaO_814LqZKZn50uub$(z zjHX%-vK_7O^istg$`FK8EJX+;?7#wg zsU%YvN%ZE3?muvFz9Q{8{{Xd8so?h>*=U-#Zo7e)nXDR$DgKDPzOq&1q+;V(-q8kKgJ5N7thTr5+l^ZhboA zz?V_HgaJ?zdwj1s%lLyjt2^AItf$r4>bM#upGKQl=dGfeyT>Y8r3HJ zIRJL?hOol)vJ> zBt=zaJP3cEW5rJ07->Znjx#EbxBam?g_BH@O{Y*zfJa;P}S8tly(Ybb(0CO$ioPW?Ja zpqFDqCz$me1{xxX>>G!z9zQ{jPTc2o-RP=X?gg8=Ke@U5b}ciRtv6HFw$^2(GT}_r z;W4BzK{Rg68Y8nf4o8lcBs)taH1UIV@89d_%971131^HL!69#oTm5j>-j^|1x0to6 zt!i_Ot0hYVFQsWNUVD=IGSg~Vs)-%0Pazy*V90rKBgWw+g%wz~e2*WdR>VuOcnUf8 zua-i0PgQ8TT0Zr?M{Q_Tmmd}q{mZyU$Jxi^3VLx`g5?F0Nd6L64<`JS`2%8l5M%@d zvTvpJ$LUqK`9?SD`6lCX|h)(dF zlcRel1Q5dFyG0<9Hph~A%365Bw;;ZLQP6#!LO_Uset6i!#2aDqS5BBgPc`^!qgKS4 zYggRP;jBwrCz|cy983@`|67fH@d-*_3Ug5t^EFZ;nfT5(e zBt@Ast*@`_WsqX5Fa8%D1mWO_Cz6u*~W!MG_82cG!Hos2)1P zk`7roIQ`DUXdr?5@mWh5Ep|C2&a>TKG+?GiR+%mb?4fbLD^Z)=T zF#{09mH-a<0b?m%N>wf8u3M$Mx#)rWAvjkg{TMgZ7o9p1QL z1$rZJ_072Zr-s5wC3LY~O47n2qR_=vWJu*wJynVlWLUjM0aX-l@4ud~SYW_&fa)1f zt_EiHdf$91O^n7>^*8mgbgO}S+##A}v39dFn)2A;ySW3w8}!}G!^(Wv04Ur@@{ijp zFLiQ#uI??NPAxG6%}~o+>I{^1A;U!^GO?cpQ6m#F%$`d~-%a-R@YHGHU&mzr*rkB@ zfrGKXYf@2mqhhezNFQt4~9H1FrLtXFZl zY$UPfGjdpf#RN3*vjmErnU#ZX+l{>c07+Ie=2=$Q9-#0thgXhq5T_Mj1Jf&puFm&| zD-=|&_OjARO{R`qw9~Oytt4KeScxmQp-#+*H!jRV0!SP6NQn?``$!=4#g;-rHn=%U zwO!`a)#&RiwyeczO*M#={4N?CgT-uAjJh%;wE4Y;nfK)6A3iz{9soQvjI-aSGzCHr zCER7??H-ckYOU)wV~oWTScD@&6J(4Pkw_^bq{>2 zV#_(9EYUDNs>B(5Bb?u)w#;5y!iM4eBQ+L0${>` zJv-*8J1mMhAs(nmbtm|18t1?2$s(wJtxFhe;kSlX86lzMd zaYH3@kl%XVv{gvv!iSaG&wj=l4UO9)apy>*UNvuU{Ob_2lv{b-R?tsTe@Ph1(|42>9K zEcM7l!|R6BHD2zk%+EqtYs+`x>CrLVmI&TRX&@C;K@f0Rf{=Z@jr!(zSXhi-&!%)r zsHANf^HgN?@LXn`&u6s#3->K}#8z%O+?p$gV6oR;LeDaxinhb+w@VD*+Q!5l{l8o; z3BN(xDj(ttHHg&t7_^2rCHY<=m!(rZr%n`Dn$Rw>!6nO-;g;MmSe$}(C7Frw?bQgA zMYxnZfV&430*M`15J7G|ju_L^`lm+eDygF~xCPW$>QP07!L~BYG!Lcgynd!f1*mQW(dW0Q#SS-E>eRDNEp4wY_UkuyDibM)$7Bq& zS=_V4`08Gf3b`ITZi+S@M*ce8ksZXqt_Mc%^FFzZLWB?!(S_)LrZaSIwfx^TaN%dq zT)ixou=y%B@&;SkUNM5NhodxvREvs&@=6r9l0KblCz*EzQV$2V6lC~iTDBf|?ejS5 z)IGk$>)b6JCcdthzmtY0%8Jp+cH&ipEOQ3PwBDUoSwD1YMcnb1R*uA6lUnM0WuMGA&&swcJY+CLPwK6=6Nx37)ZTdz0r9Z+>u9@^ z9AqdSzrJJ0jXGc&~)b|EIzl? zIzrWLS%SyG6`4g`6KTm?9@L_eP|-b}Bb|w)UH4y*078&DQ2RV`u!=%>=K1FaMc%P( zwSNBN(<^PS!|ttvQNe!37M`-wpAj<6gU8!7ZdbP`Bb}n2p?6k)oeTH?{rYE#V3?=b zAU(%y==dZ`gmJ;f_9s1|v}`S*wB`p#FCRZ#lvf7UT@~h3XP-E%4)5=k#9t8p_y|PJQVJb=p45y5w+NVeBeRU|u<+9%qh{io|`OMMA zX$qh6Y3Qs8EJCfp67e9YW6$gM>S-m4A1qnsdLtTTVk1#tfz4%(#MRWRUcF52CpV4wc{ibsn#4`P zW>QR-E`Fm-jN1-A;1BgopbPNGE9>?3{e*3>cX_+!9YGDcxN?}f^rg-P_4nxkkl%=DGhA&Tfq&yDH{u`hTb=A?pEvW`3nP}bUKXteQL`0e zt|jIdl<+)Db%U<^fE@dOZ=KitKjONA{{UpwMj&rMcL04mU>V?+WsNOQ7sgc{+5Z5< z?_54XC%KHqQ;K$o(ZyB9Lp5_7u-)uWWQ!5A@3!Z`-^X7Wsr~}^ezSXO-dB^m7B_#F z^v_sB4$>Es@0a7ZzwsHZk*{Xfs?z#??653`ABIJzBEqFv;xkVffJzs@`L<*A>*YQn z{{Txg&UXAi;&P!UqjEn^xg?q>fCtPk(=0}h{C<8MGq!P5vw3WWiOJjee^&o<4RV0-;76E-~@|hQQJ9!@6d{(zZtf!{0C!30hdeY=i5^Mc*s#cRLBcXw&` zBQcZ9RK?dO40esBBK#H?6wkB`G%-I3q_MDPlgRc1+kU@&_y@vt{{RU1Tz?OO6)wE9 z_ha8F&_f=LUtzu7N$-|#wf&*Q>8y<{NOb=I#r!N{FaE6Z!w7Zb%4)P=V3IQi^2`YF z*S8^+qX>q+L;K~7Bl8X9SjNtV?f(FFHIH&^RMXiE6naK$MnMB&+G`Rl>9mRJuNvuA z0DJ;D5!SU(OFfh;9{M2_}Tc9Kjl@2f#uJE)gs`FZvwZ^~J^XiP&e%eVL;gFLXUmq;zdj@WQBgYDo z5+z-a`t|(-1394}oUi|55nAmZ7 zT`i;7W2{Rp$e3Hm;~)s>QW&K!YkWfZXCu^5PTPC+@n0PNIE(mm#7#L#wd4>gsZXgn z=WCq*0Nqo$f$5i9OZFd3cDn^k`5b@oH`~5z@O0y3+E=jzk!MV3}8M~?V0@B9L*sp=NlbsLcl}Z^O(oKby+CQD+ zQa1DKI-(+ySZ5)9aT23MR^$HwjK!g~?OSwl)}^J7y^zV|UkOHfi0fLGE6}+jxh;&nYpPqtA7i6V({(HX={jlf7GEdrJR2P!}w<8Hk2W8TIGZKk{B(p3*2+y^;b zVuQJ9-bk;|)VX?EXB}QFZTxI7!nnHvX?cuoD$eS%y8=mMJE-~{{L6ANki)}P1bkLA5stHsjT|G%C8=H}lbJhsWyXC6L{WOLk-4gip(&tw(!{{VTt+#MsG)VfPGrL@+hsgu;-mijH9l4h*zX5J$H zoCow>B;4#j>_k+pl`RsD=OOhk;0s+_%TuY66VIEwsHo5Rz6xfZ z&>pHucOYbE6TvI5vD}}(&~;(>iisq2m+s2+Zk+TPR-M2im4VKd=w8k19XX%VIJ;Qu zSdB47Yf|-_Ci7)ro~>Yun8+Q{8zRe%{UUeVljL!s3MY`c;T}p+w(~bZDMVsc4JvplabuUpb$3mw!?9WT6rS^ zA2|ns+WL!Z$zQ`Imp#X*gh*_RWJ zuH04qFWM%wVc*kVbv^+*Z`7qxS)&?(_Ij(XN&f(xa}*4;)_dTe;wKKev$gtz9|ot& zoSsswS75;d0CAoIZxi;2R}?)wgvN*t)2ip6!QN=4XvWlg~vD==?<9c!t~M17Y@9ncL!1BGRFLQJx!64 zTwBi*2_wfdS5fIKPq5?Veuv-AN8`^V^J?@XPY@evM?U8=Q>jT*R^?yc>+9YdQGOnK z#osy$9J<1$sW*~DqxJ6lMl?582_kJMQjc5ULV6nijB4C>cC zINNeWktrK)exJ8sdY(D7V0hC;M2Lg}I&|Y4v3O)F4<}p@O&O%Sm#Vd%4>hADsgTo4 zN+<-_CB)USY8ceBi-ef&EUp0zK3^V3-&^fED0D6MpwYM|@oqFvr(>8ABvSG6N#h$6 z=}i7JOVPvOaTIK>KD>4+MG*^Pyol;rI375}WD~x??YE!l&_s0Z@47-P^Y5I&g9dxR zO+BIefuJ=eV_IdQtDjA4Ha?lJG_fptUbs#zG_l!tStmP_@*?}6r;(G%qtz@>M=6b= z1o8am^1@5m;WF4Ho5tiicShzi{{Z40ZKkSQ!ReKcAzv*d(#F!=fn*bvsICJ>K8?5f zdFuwQc;i?!)6}wXMRxh%?Nuz+LBJ`$6TPy#t&>mC#$TyUtiKPBu{;H__AT1tu)|!& zOFzEsM(eRB&c~{gL#tSo{H@&4=QcFn2;FVl8hWO*5dK@5uYI)hfMr=ji!>#60Fx{P zs<19TP)`2<*Puo$uAUa~e_TT?8t;*~JlayfQL&eCQDvRp)uSzOUTMsTc*r=z$tx9xA1(ThtacyQ z`P-&x;%Ov(K7i2cxc0;n6@ck@rtJsfKTdZm7o4pQlFMnE82asQo+e7-L3)%Wy*Vls zVzQYLH$MIb$J?WyM?4Q5%CaLG-O`V~F~ns{2eLYhYH4j>g4UW(A(f|Hs4+IN3}lLE zuhRLN4jzuc$0sAWAZ|Q#6TvJxg^9(1N7&{RA#68MfEb)so$VbfQ0KMHyp&e#Hcni= zqn!d$S(({u8J$!|8gtoIwmW+P^~wBQY=Ps_g&?eug-UxlQ0mduF_VRg6XBBs!NV9yb|>xs2mDFJ+?i zeNqVKOUdVpkFSq@pC*~~(fE?etz+j{y}^hJSZkcnF`T7vAeKy;Epn|KghnE5xdtEm zw%Gpw_V`pXec1i+D4UNuQF4=cl z&MzTW-D@6{s$&d_%fpwSC3o0)18;91PQN|)r^7~+w$OH7eGZ>c^R2I3?XTgV@tZ=Y zD?&TC_3F@jRo{Ql6Og6{92-ActL#ow{$pzle3e3z<=v zm~W7JjFM=Tu=P_&XV#>|PdNIbA$R1QRd z2Jgq>U${7hAvbtza;p?u+>zY}OIg!7I$kSAv!@Q4+ z$q3t*r(!teNau=0@O<(Lz>ht9J}f%TBSWYG^yJYU$N0rXEZS)S2d8ewJA?Ri{{V^R ziPch4!1q3+T1!ybFjriQSuFM)aj*uJ0tRvP<&u*+C$A`Atvo%<(Xj;j?&} zar~$85A&YNYqayO#~Wn&=yS8ZzSLTKR@SMLz-4jy8g`>eSA~k~0vcwxBP z-*0ZbX(L!a{NNODd-0J?8!4gG<-E~&+7f&z)ZH1 z-5>*$Cq8fD1H&wP<)72IaL_e@S~OXkW@4Z^qWDerb}mPgzQb=DcRpA;T>%u(QyC7OjrBu@mfv+*TCksS*keUp*ge*^2cNlgx* zu#lelqE%Z1o6nRgUZ(Y>n~xclqf!u%&YVjiKV~Dy_wmytPzgp;c;V(#SWA*yG2`T$ zc7`{B+^lS>b^~@Q3oHG6gYG=^dPu(gK=sARFNYf%$jD@^J}#7x=^HXeL@Ha63G)s2 z9DsixZ?Csc)Po$7C_VYj)5s)6Zs!Q_S6VRd@eRep0bNhXHUyF7hn>BFJ8kE0Jt1YF z6drFF=-klb8=7{UnGaXfAgifIU|C2$0ATwEC&$pKKI7Y}A(wOQClpnvah7itN71Vg zBX<$T2t0WavW6|>jmP!e_3vp?GQ68OG{oj?rZT;lCE|*c6e=VOyK&ooBkBVmCvCUs zTFpM-3XU^>4IbHFa@ZRY*>s*MTh$T>$EC7+u~E$Lw(I2k5!4!#5x`M-V}-wSdu4yr zx;n74ag7{fca zo_x52x4GZgdFo&OJ5vm3X#3@{$fd0G$coZhjir*sg^nS`;;pg$LZOc4H41=xpO|gF z{!iE1_Us>#V)9nUNO(mxyDSXS%B6llepuIW!LD#Q8+MR+c zFobsNk*|WQdwlpQji)vHzZ+?dXcUDq4of4IECGO$ilgQpf6KSGUPST98*N@(o|yDi zZg*1SEk7whh4K@ID4>IEvw)+)aDWlM-p7vT-*fHD4xviFfC2Ta2Qh`(Bqt^?`okki zY2Z+mYeDIXv&rU53eCZ+Y)7MVw z{t%k-=s*ou&VGG=8(;A!&FKnR{SDfy@M@gSL8hZeIgQ99kl^lHuwkmG+$NENGP7|E zzBVV15>M6qAK**zL8jL0%f}cSjBngme7TcN@WU)Y0g!agXnr5NG2TAu>m0^+xQTBw zb1OVDUCiIJJ*(3eZ&FAgW-JyU;CNCI6p#kzVQ0p5+Bg;%^lB({QNYO~nrXL4?Mid> z+4wsA7DK0KP}G_HEU%AB>LL9A(@QqoSJhVe%B!hU{$Fjk@_P9VQnsxd#glI~eTTMB zKA?Ds92}nc*4eYV1F$+uC@qRUy^60is~X0y6s(1#jImL&DwXm70J#131K~b1@pN6$ zX?bDBds+{N$st#i@^ka&`1AaInFfBHEUB8iMJ!4ZW@8e7$dN`BlYVSY>^wH!Ja5;B zqk>7^IVC=FdVKTg;?u_uCyE*QIs8X=-!G~17G;v%iKM$D`VoS~d^Y^bgR&?e$IyQr zexdw7@FkhVk|^4_=6q9Lu^?F6%yChne-4$qkZNVuBF}Q$`qn-g*o-e9nnHa|fGhRi zVf=gT`c!VZbODp@$F_WQrKECh$;*YKI~%2FOC}RLkgE3Tq-GqYnQP8s$Jqf{cqZJw z9ek7L{kkC_alH`Nr%&sNWhr2eajTZ>9+SU$o?KQU5vJVw2|A#Wavj2T8<5Ra!$zd7YtQbi}CP4*m(2g zbo-eWHrfgk*S=}kZn(uByzSNtPu9ocD^RD9zdR}obYhZgpBK#TUc`Kh#*4PVd-agV zG?F_gZMXSh5CRJV@lAWQdHOTZv2KN|RXn$=EeNHB)XN-S^<6nA+$($Ux3=9ls?&;@6sy}8S^ckoA# z&&?fN)OMkky>3k{S>aZ8tWr-=q+3r1BvI z^XrUV4Wf0|Zn4^tP2A3?(Yad{v3SfzCZ(zx$X}8*Slx0KtUn5{w1luHa7VYFHA^%a zp$^E_JyP;mn@aSo*v-E3-b&{tbf0r|1`<7MCv&fAO1PaV0L(x$zmTA>iH5}~=Yoil z<*i=i@-xdMvmqj88#j+7K?kI2VTAYtO&S>_28|lOQH|br_-bh@=;O<^{{V?j%3svD z-3_N79f-M~N$*LHTwm)+VWC7;xjZNl_ zxN>sZ)0MSW7q9)ozu6V+xD36s@<>&b639WZz4u|aP`TqFR z0AL??I7^tVhShjHbu5medF#NfCAW^uQ2ucZbYQhd%z0H=hb@Tmb_AZA_M;4~ByoJW z>Fk{?$D%e#r| znEq0v72nDC0<`ezJ-_z%5(RVl;7aTrRl9b`KG63^Sm@nRkF|r4XRPv>rLdyh=wk`=5L-H9jxI!f(k=r|iq5l9c%jmpb zQ%%U34Mg-S+|(bM*%zu-yL1y|M_$-&9YVydAiGF_6<)nX-7pb0D_4 z#a?wh=aL7F{R`|5%OU#vcs)OR{5E3xJ#dj-Xn;L`#&gJJSt4D*FR!jQusKtS(t5V8 zTBaVZoy5mtd~fA&Ei}1|8@tD1GI_~0SpHDpo&EeCwn>phGOID1o^P5y-q||B49bzO z1Z8Q|e~7&is&Gj%c(^=839r%xfOc|nRsrA zJq3vRF04em22Y#Ex4z?~NM06;!#B;2ILae0zR00pwpHprwQT;K%VKC|BA-Uhn@cq< zBrszy)lbn|UYuij8zs+kGn2tr{{VAz_T92y5zwoF)2R0Rv2wa?@X6$`tUb}a-_-iH zzIOg+Le|rlw7mAI;%h^gt(38-AqX18@XZ5=V`NZRZUUXg#B6#8)9K(uG3xgR>%kjw zYJU5}qpDy_yrnTH83uP`M3)%RRP=#~F;Q$~IHSj@$V0 z)Z##s>_AzF>N*jQTRtEQ!0UsZ#msjf@|g7}ZZ&QeIq5}KtJ2i8Xx5CP-*aFC+?l`5SHT(V)?znW2(dSXdw}5IsTl7^tM0I9UXL zh*KZ&iJsVg9@7bt)faWXQr;f&SgC4yI#R{BblI4W5!SCQ8Dq6(jLonSY$J<(xc!Os zku*u*F7SJ}8;9%P1c|&wssIeReXi5`J4yDZGo@OVa~(oEIXUc4c4wO-ExXMmuVx!F zGs`Q3B8YhwZGw)1Z9~XoaL8l|00XBTtNP)>BszzC>UlociPAmJ%h$@-({#0#s;#9k zam!Y{i(Qd-VV`auivk;0OjkOuze!Rlh)AKE6;$Gr9p{f27*l6Y~DShbUt zSG^yM?9ygxWANFluzpc(>D8%^p=GJ+Gcq##RoPMoM{f1`&`uoS#V*JG7c_=09R)TgP7Ahj zc5P#D(&V2ZajiP6^y2l{y_#{zu>-*IPPSS8BO&nvG1@sGP|guJW|_$d-O0jk)o85+ zh`*AlPfk9TY=!w}hR#7j#KS#6V_J|}kAyy@qTH08TLbUlZ1sIZzyy?$;>^CFqH|j^Nhr^kb zuBeWl{^Kf-Y?~B6UtB_9dr_vl*Nw?%^p2Lu_M1}Rue~YhyZ-=Up1ELQkDcL}NF?KiJvS=mZO11yTn?ei1;_E6YEs!q&0dk`}PI0e7*`uh4HI^#7h z3V9k=q`i7Lro!6B*3y{z)ntPsV{j?ja#fDj9^Jjb`Mx7X(N zTO`;KkZ;%W!Hp-2?hd7dV>L!MP+%a;MUuIDP}O`ICLaD0cm^loAjJIl#f2qVob%mJ zE|?(FMBC#kO3?$JZ?9gM0ED(hvAU>^)zsk*vhBW>&P6pWC99f`Cx=KPk4+o5be(Zx z{OJ^#cF5H9*36N?8@WbyE62y5aq*;91<)!n{9H8;O2S>iDUBMt>QA?}2I^ef=`B55 zvih3<`HUT?tztB;GY?v|%!^r?7L;c5dAy4T*+FzbRktH{JMKWr$*3(fFSk$!B=Dg} zU^-dF!wYE}?L^dUZLHZO_5;vjKNs4ooxbhHYHcf#lTPMkr)HKRvT|GthsfmYJQi&; z!k(SwwJ8hwXcPhu*TKm@j;My2O?0k6?Tm%PYK*QeL9#wWgOyiOVLu!CE*xZe4(H{v zI4v)ernALHI+D9kF-c&HmZwIZ%n(>&zLKavQ?|ecf$*tX&X5KotmerfaVLQgw&Zcw z4fUsXaayZPXzthQ&gNgh+lux&+#SWS0HbHtw(4xfV&qE`#AA>J5Xit7_AU14OiYuB zboybjMHC(IG}2EFpHR;ow4J>^S#NaKkiq_4iPSg_F#|7SRF%g9-S+=Ts>1yH63cVayKWA8#sBVFJ83fzdukVX_#|WRbBQQ`*nyE zw$_uUPk(G$63AMKVcXj)FLboWa`V=6cXY+c>0hE^$I_aVlEj*hj44t}64SR3WuWo2 zXP+)g-o*Q!fnFg+x)aDfvcTvPG~k`ReF^P^Sp7Ml)P1&mElKX-GdX-z*_$~{Np2jm z!rrDTuGQ^FGgrA{3o*2)gcSoWT>@;&<5Bhjf+P?TX{1JL>( z&oN07NV_bL!beIYkJG+n!FLC@8tSH2ojm@weBW>G+!-q|(!;m&+yRM zu4_Pe$cKuy+a6tYY9UcKf`T^{$Q}K#f=H4bGqCYkUJ+~V-+zfT7PR&CNXJsn;eIJ& zo_vl{I#t9eUZcHwlRVcU5+ZuMPV#bZeY#r`LZFJ|2e1Ok?T^yRR#?a!fnJ}V&nquz z{{RiOFb`h*xqPZgN?M0Ee+d<;x@O!G!(w&iUm?y(F=7doK}A7QmgVk zLCK%Qc^`9fdJg@6udX_~V7OG(nWgQHr=$7aoSywnL!8Uht(*0(OXQKhTSOZ z#zQa66r&GrmL0YkCW!b4pi@?TPp&gj8t+J_8>IjcKk*pX?lz;vXD~A4HMX3yk*%if zVkEdU{hJd@dP?&=@n43{pO9IFqHCoHT^RmX|(NL)aq-RPb=G9U8yluCvk<>Bv(vC8gS!i z&salVNyT{Ja12V(D0gzOi4g`Lc1N-Wz&8wM`#) zHHgPPg~jJ?R+@%e89epvV{g=ggnO~qs(CO&|@mmx@aN`T=HopiER2(Rt_Vdi=W<96X7vW8p|Q@ zgT@7dN#pX%E=@PXeChXr_WF~5((;_+bS5(|+of9Xh8N!lio$t*!)ir#$f;Dkt?Fy2`ftByb;Gf1fn z;rDLybUm*eI1MdhRpKGa>TOK(;HlQFHePgiF`4M^yDU}Xt}0C>7^%jrMTL`@EH?me z)}IMjRCL|F56}B%@0sLeg*?Xk^b7uS!%?qC6O>^56( zR40azFyG(K#FMMGoSwLZk9NgSOqcT~7Z!CLDRXhYKE-T?GS#~1nHrg6HE@EXa-HlJ z5SjiZSp-N=5}k^R%uJ>$ab3mQ{U zXLX*M#-;12g&C)Nmg0NSANfIMyGKVQVhCz4f_)VCAI(&ZyOmV8dc&CbVxu2)XrIgb zV^gsI0Emw5=*>r4M9)__sVd}nV{jMk>6WN5IXUV^Y1+BQ7h5pdh$2kNN0JY@>kf>~ z9_1TP&pf##)4+UEwh6YbNy{&&wNG}YyPbnuTGLoOj#jGGmbN2Ov~o?(X;RikG__f8 zQ;r9hl8}dG~SdIlw}vU zwO`l1OGU5KN@+>-uC2z!HmLZ_r1(rGUol$+E}}!d)c9MbS;NC%G&^o247-oxqLPWI zj_T`N*UV$I(T0{;*~;nIk1!m1af>WxdU4vGy*#F__J3Ix3Vk;>Vkl)j{|ag;S&M`e|db8Z;xutlgMWZ2ZtCG#PZ&!^2y8&Zngs}pSxWj z8I5$7jv}6ttonxCYmZ}%>iUsvM3m{wibE?R>=$(>z}$>s)j+c)_uzh5G62mPUPW0a zf_*4@WvIV})EK(>OS}M~1uFJ#%`|W=>59i)E5-U|IN~-cAPgCbsXK4?1^_V!t`41& zXhRRgPZ*!8+-#nqvzf#vZz|TrVXsFv6CHkUjm^(~8Ie-rz#^Iih6uTlD#$)|03UPF z_-V8^jZb~Q&N^VRNFrGY48CL7`+MYV%^TVWqjJ`)&?%DUv1GFr&L-Y!jXb59Wq9e< z#|tx9uO(wAs68d(TX0VP#JkiF4ZtI(WBTHX$sy(WH^tW&M|ZIp4Pl3|k;FEo)405* zPOZ>z*Q{y$jB(5ib%b;vXOakE0gTF}4$Zj(&so1~D1D{+^T@xR1Wv2OYP1%I0QAjW zL7*`h3|eU05#=(nYFLuGWe@)VQ=3oFaM8&=UR&;~36MNc@5J z7*H0|kF@UG0sJSaKj3|P(3;@fAR8IY`00}J=RL0NlyJJ{&76%6J(3iT>r^(nDp zCCA;FYf;Huvde074ARFW(l+EQV`%*N>z+`-QMqB>yJV^x#`{AGawv>%X0+}~y@j5( zpQn|fYMn>4&}4+w;%s89NZ$zIo-t{oFCwn{{?G{h2p6l{CNjrt3 z^!Ad$-O8K=>bjd<>MC|4ty(+zD=-MHM(p{ zMpS>4F;yG+>x;qRkuMH049M|`BaHZ)N4FSrt9xDC%>JB4xt7gKi`5G{S<_JBr>j+@ zwpG??Cdqt9pk|eMvb!jacN_EwBVeEbeQxlgox-!A3tdmB%F7?&qrUntU9CK3VmK>T zqcj*r$SIp2@RsX9^46&%8RlDd9Toxx;Xr=v7=om!-j2$fgmV8Qp_ z+is<4%w+BxpzrDqK@<416FB>(Bf~xY^Z(Kryp$!gVtjpG$MH(#PlpQn=+(TRS-cO zfbJC=&y&AE&cxD-$GnymOC8?6xm>&R-gs(Dj;z{OH-1=d*T_}Xc#Mr26(Pq;yF0@K zqt%vP3^^!J#E)_3rbiPH$HW!slE>zr_w7(By-qJ__jXNJs_1Flo(Cfi1JJ5*Rx(Kh zH8L}}feg86;t{pjqLoW1+$jEoqA_@2ux_~2Qv1&DKd1Q3j_6s)>Fl&8Ptm7mBXrj} z2=R2~w^mxQ6*0KGuv*cTos0To!zdnnb&DBrdBv=>Xp$6q;eToM6xyg0Z>y{{VF16-gr>A`b~jAeONz{|8~sV>r;%g~bgW43dSvYhlW9Ed z_pi$hyK&lX-r;nN(q%NGY6EV>pO)%Gk~_J0(pc3Qat@_yz_NyJUYIPKe@>kGx%#A> zcL%r28z8oXpDciL=zhMv*m)gEp*wL+u4|~Y{woEKtkB|SmJg1%R*Ye1mI)eIWqDZ< zKvvuWLH@uzc~~q~Po?6^#9Q%Hr1O$le(m;GUg^r2jRUWAy1pdVnB2%=>*jA%b}jJf zUbM<1t8B;5V5(SbKAZKZvLh6qOve4_etEJ%G;&7HJf!s<@q=SoQnjX`s}8NXm4%|M z@i`ZYmM*k1$e~P;00&eVsJ{Hf8W>p6V%<) zzoK|iqZX>wxf&GVn>Uoh$z5^KaUAx$Ge*R>A7xK%hUed-+qeT^Poe9Y8ZyL^0^ikP z4u?WexQ_g3Y@IqV=?vZ* zHj-Wt=5mr)XsgqXd3gHs?7Tf!J1VMj*}cD-6$)?h5Qp@v86zyiaHJ!To=#lU+KWw8 zy7qABz6~YRaV0vY5u!t4oxmG(*kwl_dbFOk*Ye3_StBKDgJ7Re zm##qLdlB5O-DND~A5htwDS3`&IV*Cf zweOg+nBzMaaRc?p+kMpUhM=CVknRREGuy-xS(h7;!+^79Qk2ds)RI{1Ew(b1OMD5-^9yS zzr|F>3pl+)9MUX-YD*i)>S2Ti;8dPl@3*%6(kx|u$sym~#gEG+5e^)J95)1X$6#IPS+C$&zUXZsndlCo;x;=KZ&}^TZ)261IOE~I%!vAlDHes73=;o zg63FWc@6eHzm_|q$zi*bp>hoLu3{GF##W%KM&%mREVDa)Wm+j0)S5V%xvOqB1ILdY z3bR8i_^1kwqVC2kQ41=^;K}EpMgIUplq0y`g^bQmErRYBbi3h~$l$Pfn($Mli=J4c ztB#H1SnScDoYo6OFX}r6ZcO=Q}6yWqLnUbojIVf zaaPUECI)PJEe41n<)dZSqX&;4HaPZ{@Rb zYQOOo13zy$r=^vN!L~w$$}_b^F|Df01IW?4l1bs<@BX0LjWmH!Qpyh|h`*k6J}fBf zI@szs>3;Y@p*yLq@_L?*2OEl`gQ*14TgW9CVwu)3#%XNiJ!wR-NWn*tHYI@iZPCdb zTUnYyS-M{zrWlz*ySLy`>4h?Dj@en%dA)a@)z@)JiLSNpW1@y^f9BR8vc)9F8lQ@is{4_!uh`6JVH2*BJo$9x_V;ER`*=yb3fuf)#I}^t#VfNbscyq z;thJvC9RGv} zGJ0DL=tQ!~CO$8YyISS3^G7g&tnq`(-p7t z*sP@v=IDGqtOhDr*G(;2UX_1BMdK^QQg(SF6_G*bzm^?OBugBhaj0q{&HClCeU+g` zTNB?uEU|PuV}!tDt>v*$xUno1;fh9K5vf8KR-Oo^+vgAe0O@(?&A0)N1Gm0Tl9aL9 z@bb2DhsCqmGP~4?MSY7mr3gHZ<$g&3W8@9bk8Y4-6hIstFzr`;a#rS`ip6EQaVrTY zGNmYNPQMjAF~+7j;;$QS5mark8}+L|l^q5xl!17S)|iYQsG!Y}p8DRc&+_-gTb7K~ z%&Y))nFi8v`l$!U^ytATNK^$+PD!kJp1DBpB{4%IcZcBx#+wy0FF(?wS?WX5R% zf+v}5P9<9&h&%1XZr^Wyu)2%1+heu>2XJZ|y>f_aU&9ahMk`Szcrp=7A!x0}s}V|! zHY*Flpf?X-JPy36prXwQuK8+C+ejpXh@3xaGO}8`r*Ko}WQI{Jmg(Fjq1bq6+RU49 zK;GLB!*BKZ?}~h04~FfZS+q6K^}m)fNm?{kk*s#W4NdrI?yPSes+x9N35=QSQ@4-5 zBLs_yD2rWN)Dmyyi5*R&{xJAN{{VJ%RL$9kf1V;eTCpS&t%gT&@|*1vv`u44#|=eZ02c&fR-T+AoPmAy^}tFGEZ}LzN`9K}mV8qb-#W z#_xQzwK_8B{`%%sAk9HezCSk&Y^r2&@j68$QdzeMvK~{pSM@)ypMRd$e*}LB>-=M> z_yl40{w1}e@*HNy$HqsJG-7(#%XLrwEt;zXEZEIe9y;7KMFB2OmNq=I+Lmw*PM%AMu9KDt-ZL_3ei?zv5M_yLCz{ z+Q&~WrNxO1a%A+isBcdMKsO^jOG!_CfcyLH?bm~={{W)mcVqCsic_EElY#jWi+{1b zEUL(Th33tl_O^%jr# z7x=H>nv8M~IhQcI@Xjx4jmsUOR5Ab@Q0r-LK)}y6f)hynf%+iu7 z7eaCt?n4_aH`)^)G&4#D#Oy#n=@j$J{5SkVp_Vjg+B4@{>`x=|9OAwwqHBV9hu*Is ze{at!=Vx?wqN96JY5e}2d|pO{nQO{tFfC~4!7k8SM?juB8wVKD)Y<(%_maGd6)R~!DA@3U2{{W=uP>x&p zJO2P)s`!q(OYr>+nu#Ra8jgEpqDErua_nf`8;{bud|Dy|$+{}ZI#-S&Bpg&l9B2tu zMId32KnawbnA(fW8=~*i2&yTw`xfw(>s>;am z$?7rk!FL;b_}{C)`28A#D4S$Jd5LNR8YeO`f(M8WewhCN2)~A`r21nCtNX`@2R(9) z399LP@-@h@?^y#x_7BTl=iKkG1A*{219SMN@n7+%@gL#81D9+nO0;+(rUNX}XQY;(z1nm|I? z7tRi9i?}@_hRExEb&#h*3~foTNcSdK=;7-iEL-&mUsr(t0AKg{{YTn$`k4M7@c5bC z_yBcp)3!NLLHEzh$Kzk|QLMie`nC-#+v?S+_9std47YPui@bWydeVjFk-~V*MH(^` zG2+KiDbn z^VqF1q%imb*t$7P-8BSk`0lmcV?nO^!)SCb@7nO zhM4xgxW>n7y>Y26U$2bASAvD5V+L-`@nR1~Sx8i?UKq=tRdyh;8*lD@rzz8;1``t3 z(!Z`gC6VI;ZBXa_am!ikVy$CXIqtPZr*j_+m+#kv*DqKvnT(> zQ7mX3Pm=+z_lH5(#bmQsM#yKPjl<)-t^D#8$DWYDJ2->MeiD@Ym$BD}Z+fdoDPKF?l1({{TOD?7;4k z4a@39U*(j%NJ7Z3*BL`c=uGp)C28ownr=^sOHDjT(aXQ;y@@_}-N%!&>_KlH-VJ1y zFu~N4{lCYiOCkgzfy57dyZskyYS5cZRBX)$zR=~YHMd%M)1!YM>$hHW;Zoqyizx78gm%v4e5o#LlZM;p5WUD<8%+So&qYdQo zA%?*3zT<6&Td32tCMT7Ng@q1!9{goRRKi*@z&zvTJJ`zl*2bmCWj+rrhsM2`=pAAhHf$?Kh2p^gC+qc^8Gh?$T(uS{L{gYjvmw6=@Ao5#f_b2S@F z5=N;ldZJX^#BNC{kf8DR+kZR%09NV#9X!$$VX`6m;K?c_5Nwl`&rJR!G5y%WN2mLz zfLvB8`U{rrO=d4n9vof-h9U&ht1y{jpn- z#SZx#tt!l{7s*`Z3%w=_Lt(W}vhJMO+%|faQ6j-hYRhF?G}Zi0^sB>RlC4>!hJ-K+rM z5&bcXF7)uq(Of>8@cV?!YiY7pCC21*hC>x*&SDMYA z8z$f1sb!m2sF@a4A&(t@u397uAE_Pj^;=Q4oSrCge*sGUtaHq`sTNO(c-$}sSd2{+ zW9Hj`1b74K(S4LiyWA3r)w{Li?=c~OtU}=Rrh8ZGy-$at1_w}MsibvhN=;&%D?65J z(AWdfbbdo|xFg9MYgP}`<-_)q%_tR942bL4&mf- zu~Nv}$VD-MX~?Z4*XYV!_wbq4%__)+XsNr%-qY%> zXI2eYZ!{&(SftWDiLBkPYTWRJJ4%otR*@s{LT-2Sx6pKnMwUr5>WmRc6~zyhP?D91 zw%%_Z8bZdQwM!>*uB^Q!yZGKTBFR&MC}XCP*`i3e9!w+SvERu6c;CS}2A#Yxbig2P zX!3ImkFkKQ_@~8o`@MNMZN8?~l3l+g%NDCe1$h4eE*_kvpbUqb9g|_W`u#n&u30`9 zhN9BaS5kSwSteiz9&A+iQXjjfB9zc&i z-DFYxC4hM~4y}B953jFY48h1`Co%S(mQNp?(z*Wj;jowuMTU{B90nSgoH{!ck0Ud( zpFu%woOv67cRd58$Ei<;$j<|RF+Zpn<=Pywa7eF~T%6{s(Ynl7z)5dUSgtI_)o4AS z(jT2x_)KK3cC% z_$S?72K9Q}o@?VA`a2Pi?e>t;Rj_(~0jX_bU~878sU@2VfCjS|v^l3J)a(G<@AN+X zOSV~_XO>^M4ZsGzTy?`M7-L-yGN@{L65_rxy*Xi9O)5(anDwsGNgJ$e>k_WSyRQ6( z$8WjmeiMheS&$9_la^gX9mXi8^eF>u_ixJ`-qza@cK0Up^p0Ji1JVoP2-juI;^tS$FiW{jk$9NZSRUW$suyxL=fz{5 zyplxW(gm6~U5QB2Fsxg1$CkvC)b5irgjmV`pW_^bNZiaau3yx8Pa^i_!{%Bhu2xWH zt|NIEkdHZr_LKXltK z9!iIE{{YzOr@$LRt8e$t1)G}1)!h+NudQlHq?E@YmJteozqz=8%i=&b^S6&5$4&8= z@C6JNPD#FVLXJ-63B>b-iUTh^;)f-MlCD1|X_1Gfu*xQ2$+IGbPmxIdn-8M>I`H)xMRiFBBhv`ZPa23twev#2g$(Ma{*C_s3X~e8Y_B z&v1KV*l)$=m6?`~H0LrE^$4~qvwMK}^WHNd$A2rNWQ%h`CiCyAFSqz?>Qz&B#lAvsM1P}=O{;m8y z{AHy0lwoyM9u<_ZqjBbuS{0^u1o|{MUXbzL&VO6j3sOLQ`CbhK3aZT&ej(&%~3cvAh z?Ixj%Piem7!5)XyaZVt(a}Fb=Wuz?AjDAVJQYV+lM`qZ8>7C>3{{Z3-x1Gw3TTJSFMAC^+SE)7X?zXFtyL>$A{+*8p ziQ8fb_8ol>!hee(RvJ%>Y1>Ube>Y3{=gNFT;QGBEE9Z~cW!I04m8<$8D@e+`*VK@s zF;m2^zWkVv6UJp)Lqu+HrX7;VYI@44Tik4(VsKZiIl?V4F^B^n7I=rgTXmdYsKaMFD4 zScX5b+ztJQ-|gdkMIJdzC>~?`XQ2kor*YzrEwNYN&0)1V&eF$c6epH7W5rf7+!T;p zlvBEsz-_mmJ$f&sNMA=HFAvA(o+#A3iKr)_ClalewOqv-%uFbZkn-fxNbS1tP@{5G zpJC_UZ?{XILS5vMl=6LhVCgk%6;xrK4$RS{Hd@0+2;=I*D-+14f!BjD z3n^Os^W75KDQmp8dOG~=kE3P`b(Mi$GV&l)^*7l=l~TuJ%YP@4UbjU7X<6280nIXb zcuq3PV(tqO?h%7=0fG64A->~p+qfY6b@h5>+d}yx5FDP_Hy~71Bo-&Z18tYbx$Dsi zE2d)+>4G`hZ943Lf>DRI;FJ7&`*`cgpGJKM z@^A+J04IR*cRs`K)tY!xSE(c8+ac9R@qo#dhf-tBO4~au*3vl|!BRl^Pc6dnM+~EX z8+|tZsnw|QYr^}h;~S-!8Fv%+mChh+^|eK zH&LbwVZa3Er>4{bKv&}x8EfLUN>`4a^%)AKrgQSi$I5`)?gMz(1>1k)W93AVM<@N- zqtn|gc^KFWXEbR;C6g80jf9#Y$An70nxHP;IJVqN4$^&`hvDsoeB~CK__jN`$e>)8GF9#xG>M1EzAxs&zGMI=)aN z!Q!#+4U1OikpPX7D7{8xQk!xCk$t>xw^HeU`JavIBah*lYS7o3LTmKTRzHNr5*c-l z6!sax&hGvpe-vMe?48U6SFC7`*$FqTV}-gI43%<`ff}<*8^;WY=V2ERN7RnKv*Fq= zfqV>|L$8hTHayu4M-?uw!rdN`NFKd0#rSdj3E9?mv8vcBc52nNPQyKzrm-eM)OFHxyJ zGASdz>FNAF(L#1)K*M>1uIkD_9!G^BkBa!`@i5dD(`iucJu5xWg!~y}`^iPWzJ74O z8Q+gPxnIm_Qp(LP{-Q6XF7F{SvVwSV;usI08;`KqpA$o)GPse~%ya6}7~)Y!&7Yi3 z{&&*;O4QaeS7yjtxXx?iqhcDwhnYaiIS@RLxBds;{0rb`P~@s@j3346o^HEZi5b7e z>FbqqL3Zc5ec;R9nw}jRDN&56G>UA|i6+h!UG5B-*H{*_j&B0p%C0lUfW2aKps3w56T_YytsV9?&WG+IDw;n+ae6M&bYB|R~kI{Fj>LH`Dc>LyCdU4BM9a~91`b5Q~%r;~dV}lDU zwk9>J?pViO5$UJU9{>~NdwG7BZmh6|4YWU)R!~_K5wr}k9k$c@uQNkVP{_lnu$3go zQ)vc5sM{mz@mSy2D4F&>?%dyF(-FO0NmIbf36bnRowZfxyQks5 zGcOA^Y&=UctkJwtw-k((;v65FWAy+Yr*>suES2euMM6abd0cV7hdmjgFJ*N$KTgM~ zE#Q{T=C6>k9f>6L;$}}q88%qr3_`CU3I4nEGHR!uHHD_wt;Yj3<6EL~sb=h3*E*ho z)_NA^n84sJ!#q^tp)*Gnd-DKcHaMu0lDOCd^9{D#9=#1e!&)%kXP8LO$6rhd85C_^ zGocz^@QJ3=AC1gt%u3?&u+56f+{r^ve~y4J#WiPELBZ8ufFODHBgWkzO3FyoJ;y`= z=zqQ}5W>Lg_4V~u4ZBWnv^e`Xs~Ed8QIaOj8t4o&uwf4t8!sT^+sPeGv?`Lc$`4F# z>Z4rXMknx(MqH`N<)*EBHyQ~BR>f%Ec;^!Of>;(p7C9VoRq(zCPVvGn$W(~EFbZy~ z=NT0H52>uTXO@5s-bk7q-C5bU2-^e4-+rfxD4$ZIX}lx})~sLW zlnuTcF}uMkc&zqEPFKhF{{T;5Y*xptvShT*s)gsfTHK5tcww4dkZ^Y(H_h$$_or-T zLUl7Zb5!y02+8A-P!d-X^fbnY$oCr)O8$h*=)CWv6q!r8Do&bw$hIan>_ zsBl`ZT$|Lh)Q(RPR>hb~V<)n$k*`7oPeB*bm6)*iAHmX_q+W4Lm$vH~!ERz4m10}}06s%N zL_nh39t{qy{{X1;#Kz85NAlP2if;Gz(?Dt}TFbat{2kl)?LmrJ*vEcV_?ytWSFUT; z#4+fSqMm1I`wU)R$qHuQZLoTU2m@b%n1IVK}s=$eUv!;E|| zKqy$@oxNTlhm%3N%#wr1F$a-d#@^)J7On&`L8yJwlYI0ao=ONINanD)YIn-!BT83U zrA$5^+*wQ6Nv+P-A(hdDlH_jA##tdK`!L&WhTcOH)qgmoCv1|Sug~Itr2G;wE{qVN2dK|rv(>XP+?a|lz(_G_q1}-Z$E!?y# z*sCOB#x)Ti(-po8)Q@2{(l63aA5R8^Mv54WPIiDlJS|Olwm9urqru^|k885{ERLOr zAenp7Tg2gI%G&stE!Ac)*sj!>c&MEu+!)mDvE2PSZ-g~lmOu=BPTmOo@e(qH+(!d1 zhh+Pwt1;MUan`$Wn}b{2GGl1RjhfS8EmwAE{x(Qta{`^C1QsE<{?V};we%#Asj6SI zbv8L4Bbu6s)m`59<*wJ2d)GdQ)3h|sj;D>yC6yL3KMfRBnclpXMAFR&=FYMJptm4* zKhDw}9+hUAS#@_29W3Kx)ke{hsCU@GPs4_=@79sOm!saiY&I|+sgoUh1zDFNExD#a zELSQ+84<%?B3WeJydC;{x?hLM6m6l9`1i;simsy;?(HC|+s);<)w=sgQ@>9a7GA!d z$yv!`^AB$@wd=$ANSY`u*Qn017qwzCefKM|@xI+f;q8st(|UkKFI(;TWk?*UZg!DC z`{i5j{+j$m>shTup|dy)hi|XWk3eHY)bjBd9cAZc#~_kNBaye295?WN`c{N|HFn7& zNSd|leLpOwSyf|E65WnY4rn|cx=3Tv-NV#5R;?u)Pnd!6vb`FyNo0u~GJr>1#qi(& zjLb+;^y=A`Cq|kWM_vu`e=LPsSlAz420F3&SFw?4`j~U7boIKq+tEpg$w^|qGR9h5 zMC)!We3zA?;~jaR-Bc6LZ|l-kwQA}{mG_|J4r=?>5Q;)w`vFJV@v&{* zO(1BW4PIAhol;1`z#yGUd`})eb~}3?Z)PjVjO7VZdj9~t6#z%%K2K~mY^I#;z8fKn zvn*6TCT>y|<1OhdNgCH!Ay~ndJ>*Ye?dRLyq#4VyspRJfukSC4#9nvs;h=S1t*x#v zvCXPufOy%K{Hby{IhTc4VHyt6; z$)}L&UA%B@c;Ni=r|{xPJR~Mw_m!u-J)iEEZaZnCve=x4cPpy!x!1*NTz-y)1>D{i zduArHYA#BW*@}k{;1COY{lyW>rkh&YaHGL>uv?xw8n0Zs>dIP%*&US3F|G37CG0kPK9H%{((jL zKo7-7kG!*Jb%oSHsY4TRC>y@w^CH@^GdVTZho(An8V6HiBg*CQ7|3;Ij@C7!&S9Zx zVEEZ=*@NP~0$Hqcp0XBxN+Z~Z2Vy`uf8+Iigrn(K3<30<&{6Z zI^Ve6tCCw9Mk-jNs%W*lnsYvE*!U}u#Hg_1@-8-(W*fH3b|p^7>`fF>0FrKEhw(2L z^BJ*`#Ed)F<%%xJ{vf-D-Q7p0w2q>eQRv*vFFsova`efP!D|b61pvxGHNW_Y>RiV# z4^p|4W=;eaAKY}$vqz;8PLZsU1>^ujE%(0X6RD7*(zlhE0(w>S%gL=UM^jMO>U z>85|>S5}%Rw_1erh#RwZLL-D433Q3 zk>vEh6H>*baNZFXc;dcz=hFy+EQ!hI86os{Z}EnFP1r4J5i-k=lP7AMQ8y1bg4>(iG~t+#4YS72`v+Id~ePAz+T3>mN5Z7-;DS9OMaNK7Ms%#xZBoZz6f-WM!!Dr5Rlw1)cNZlH z9@v^1FKQ|@Rb*&jn9KTWBJtP_%M-Ej*G6fKgaU8YuLo|?*n(>aBpCe@qa?GDOBQ%l zmnS|_jVlw|wG_UZ)vnm+`4+Jxz-|Cvmwoo=<&kD97!=((BCqFxrh&wy?&H%8`(a+b zYZlq8mQ6CZp+pnMk4J*WKD5lTLHU+7cWTns8;!g-A?Lt7B!o%|n@7KLJq{U>*~kk^ z+Vk$L$5L-n+*x?c!<$f7^u=3s>m-KUj}ws5PXr_PjlzAtoh{4kdXB|&?dgw+cQS+O zGmRayPk4tw3zO{mDvYeKSu_cQ$M}~$*EoTHdyi+FJV_fd7<3ZPXk zaVXNJMw8o<^9R~0Hfp?z>k`Cxyp|lWR|CrMJM}3=+VX+r99Mi`BX3{D(0Y9EM^IjZ zeB~UjMz(7gJ~tp$-yLP5#9prIOv!E)0LnrSX7RDueR{-Vqsmo*9mgXLkd$N&IsJ2* ze~n)KYTZAr@mQYS>FcuI$V*baJl;Z`w8&zhwDq`i!b9N?x&e3>y2oAzZ1XgdGsb3Ruw0%8LDG&l^+$KG zn4Jfass0#h`Kmb#R-Tr8U6^uSmS)oljjWDZ!jUaFJw}n({H#=g?gvr6mT9DqWS?~0 z(G|e-9=TqbLI!zxAq#f1=m5bikKvcJTKi7e%Vlyg>TIra7gEgnnuiIaj#|*H(!Dr= zG!fxV_X-tu*f!*OKekP#k&z=Rqp|D%02r8zv+QQ#%~z%Nz;DAItnF4iHIwZB0Bv=I zGiIt}vrA7MscF@asK-B}Je6XI#{`KZ4azAkxF>VJi(XAuq8R6%4@g`mt&YcX|a{t)8_^)RP2sfT~v7^ zaCrhFHtrOQ9-p2QkfXztTdBJ3UYN|%`bJus2HuOxY6x}4sLp&uw=L#lmmf8hGYQ?4 zGx~9wOo~(}9Gv@gvPc=CXrnQrdUJyVGD#%Q!kz&1WO@Q~`rX!)<;UZb;T8TgYP6VvMK}G^Q0=wU? zIjm{JfTtrv0>M_q@kX>FFrR3$^sxfu7 z0E-EY$YgP?LqC$!c5CJF*6}nFW{6XGfQXxn!byKjKavjn4!AK*$!uf0rr?9=@)(t{ zN{(bxK=hyup8~u&9f@Z z^bfE4&Vf~&qnn_AT&fxp%(~}acPAs6)Vls1Au0T-&XS(P*1rp+W-Do@>O&M##e``{ zb+C+8ebj-`(25O>3}#YnH>mBqGHD%k8ffAnO0Ookzw>~4w=qjc=*?4r(h#R@@=#{z zJUQH}$t0#&9!4_eXPh_2$#$?n!-MgR5_a3b0W6IJKb=A4SN8)S8b*`M#Y}~e(eLbj zS$g|rsWI7Y4M{ELmpPdj^qSsMC8J*(l#-+=7q5u;cv7vXr1aTcAHw~79*0m=IoTG- z@1g2GdFN?-LP?N~)_QjKKKO>#{{V_E(st7Jdc9m`qqAvbs|LB$I(B-^M@`$7G=doJ zwTWb<8boDDBv=rD2a)5Y6`pwfuAUw65Az@Io||d5IvJdJwPAbh{{VOqr#}%I$GEyv zS5na#D_zH}kCGT_YI?M)4O-c!8pH}MDEy1JK1_Zvn>oTXL?XRnaR1h(8U^BSO8h(|F_=#YedsZ$%UY*O<1W1S<%wUH3eDu$@Bx*+25x?^Te>xvu{GWeJp_#wrZd+kUI8Ww`IQ-T)QQv#TL@1%=U~KO>gvifFt$ zwrHsT0Fm#D9_;=JyZxvlk6Y+|53ZDtP@QnWdQ)K^(VI;*xu}K;fq<~tihG;o{Z9(e;Izp zUmKXIgw-}S!Q>%G=B8-en0oIOrC*SGoMJLbk>0vu``le<)i(XH$&pnQ!M*Jj{ zWwJ+5dYrm=`#J3srR``w-$9|Wn98b?O1E_sb+Y)Dy6q+Qv2GQfcX*mac5WdZeo^G~ zkkQHkotz$>ILc#+D4nGnyjS(_^2JwjzY@B4w|Mxp)~@ZowAT^jD@Br4(Rj#g>5P-S z63WXG#%WDzv^+V=Ty7*Aj~n&I8J&-TG9h35_&+?mO$V36`$Den2=DUwF>t-dINNin-Ni4`LZp^2PGN!}E+Z*_gMdbtQ>+7mwh7ooEW6$T6 z%ejAsES90x^gE@M*0m|v^cf9EarOoJxXf&*Wv25$-i(iS8Mff-#R8BA+o75$mD9r{ zpMEl#wJoXBtO%P`1rMLDE&l)zx(_{5C8z4>Oyt=-o#n2xPotv2jnElrDbB6RLM zRwh$Bn(huPX9kzA1x!|*j@1iz3?*6#9PG=Pvh&ziO6;oSzThvA4}sDchUbm#$>q9y z@wD>Er_;yehO7@#eQUhtHhaswH>W77B%SRH7wr*nbRGL_B zN|Hjn5QN}^a(oThwY2HFcW)1|UcaUz;vlP}2uai*D6XHK<-+aFO$IepoVJL*+K$FX zc_+wLirU?vAing-0gL&zAqDr$H`k2p0R+rkDjbm^%Q13aoiul4n#^UD>X zbtWRNmA#R`XXMJ_GT1n)X}NM)3s5w)?nq~erl%suYB?c@`eSwkh4MZ62ePcPMiy)4 zv(3`Dl31hz?$+!dUrdt5Q`g$UNZu>BxbV1z1h!HMX35QEYkGv6amlrcjRlS|h8&_Q zcHeIc9v3C=c2Oflr((uS6K9?)+tUU!`0wyd)YqDeQBay1RiVda4C|AgzCTTTHzJT! zRV0zDb=Yn?WNZj9s#$N=`(wN})hLcQz$wc7&s+Smxa;2b_Y+o61|#tQ0EMG= zd8HdMZnQ)f{{YSyt#uyQWa%MN9rsCG{PES> z-u2?}T3(ecQ+nEKY!)h<8iG86Sf>@tq_7!UEL_M^u35Oeu6+Q0RNrr}TOtx}6u7%r z_sF#H&d%$oBFhpz0RG>ec+~#@iSFFbi>GFuA1AD=QOUL(*2U9`<*HZg1)dLxnPgL5 z8xrs(fg_K(cVC30K8QB?5)laz0s2JJa0lSDV#UtG3a2YkA^6JKeK zV@FHrEQC6nADYZ#UflI8RJOQ*N)J|NS>~Fwb?qSy$dxCTFag`F*uhCqv=6U2=D{+- z0A_ACZ5_@F>)z7Q%j<0^o5Jg?{X6w!$gMp&@iEJ%@{r9DcBOCCEZE4MpaLgSNDH!b z^qXps(5d6Eah2*ezMI2wNEjO(f8H8pyC>SMbB(Q!)!2O>XHaQ~atmi0Ycg!xhSc!H z8qCv1(8z6$e4|$$2nTMn#*tJsWrFnf#l|L0%FK2#zn}WVt^WYR{Th#yz-fAU%__Mp zZYFCw)|P7YnOuEpwpwU}G1!rdQJORRQ9$4C)~v+sE>wVStFO;6yCW>Wjrjm}9{K;% zUT5eopPXdzX2LCugm#^mB9a&iND^BUz11;Sg-~wWdyq#i{Z~Sp%-9>D&0a zI-64Kc=39EtNxX&eS*?kzsaVv52sByPZ$S%w(AI-?UgkR=>V}Y4GFU|s9f|pNU55Ta=~8%r`QjkgKzYu1&ceAv|#V)Be9ZF=mzY3awKdv9R};{)rG1c zx!MU8`{gCna9y?Ci&`CU`K?8Vw=X2HC229CUS|fy={YLKV_1OWu-I+yxY~~mmLV#* z2lv3z?3yMn+e+fYx*8L-x*t0nmNgx$PD4A8j=Z%r-3jthSF;FIWl7`Y%OtMtza5aD zZ$84Wu6iOM!_=C>)9!ch!6v!OQ=#cDlI?w*zMY#nJp&B4YuCAnu`X0`EWW!^VA2GV zU_1fIfg2AatYm3ih5$d$jApJ^8zX8bpd%GDI|;A5$yVO2?pC7B(bH4dvM~B`2&abB z)XDV3*;TZjucstObwpJomdC0WQ5+w43J((bKjRTDo;27>12O7*f6i)Z55u+tvi-fu z>U}Gx@>jJ@;2#Jg%sVZGi;G1hnDUXwR3eRlV$Zkvy!p?yzM=L>DA+pjiquaq@SsEG z-Ob{g7ntsrqS5nc?MbE^BPMRsTb@dm?9#nTNSBjA#R-+95H`nc`F~B%S{YG{h}3=Y zl1Ce|F=OTZ^M6NI(w(1GnY4bUnjDOV%#SX5(nB4Hc6d@Oa>%UQrVJaF!Fc)D6V^y( z)f*Ea?06XCH{Ezw$i{zebgrZBrcT#(GnhQ>YiT)Rv;J9sBOQq;QhBRM z9c7yQIMz^7K14SA@5iE!Db$ubSPyP-aB1Fo7h{Sh#pV6&UX<;RVf$nJ3SFNOPh;CE zk~Z*__loQ>C$H&cH1@N{j^B46)O%6N@D&hRnrW;^N-XipT_T3U6TbU-^ZgkVk+f`Q z(`3>3w<^fCyjS<HFjw1ig4ytk~RwfIESaBXyvL!r7cv)$3mG6@G{VA5!kWmFgXU@&*_-t z*_0kTdyc$mwA1h2tZ&;rq@Pal4Zsgf0LpeQh8qETjdaFKJ-e~ZhqZ=P#@vR)%nWhJ z^|?s#q?-VwsU!OMrY%%~h2Mq;H<+kZqblBe<2pUqt#Ph9FQ#JCoyM)EH2l%v;>kmk zp>iRS$yZ3Wu9yBX<@B!05)Xd_@BQ9}HYj3tc-Z$HK3>?JPNEG){{RhX)u@kuY;57X zfgZcm7;R{oI!7Ig5m?I+b_>x(1E4X%GFG3_meV%J!j2@7_Sl_<){HNn@FGzOk(ox) z2p>Et$!05SoR()Zrdr-JD~pt4&ZW#j1UuK1l145mOHC6<)S)( zKfX+{6;MY;>zml@rjPCZBQ=iH*=+t^#zK=DI*R>KHRH_4#B7exFKQ(Rbq8)<{U>Z_Ts)5BvA^E3cJjKia-*pA_Qf7kKiyke+a06w_{}+{ zyLs@D!uiUXMYWR1SyCesSI5Wcx1%ZFksb&;4wz!n!whc}%_PUDt_S>P>De^~e-hSF z(0`mQzuUgrfw^*}Gi@rZ95&^ou z%Q3@}T}LW0QQkcma(%v+MdtMX0H;C=weh%h!rH%HoD?E)=^IJ9BS4`?smZrHbP7af zMv6||`q}i%mCTaEHIV)9In{&F^zb^)Of~}#nX>qM>lD%H>sdQL7ZY(NwO%fq5s4hg z8w2DWx)b6xv$EG-K>ED4IhsiP#G4rY&UVAQSt=<{A053KZ&~LK?$IudbYCINL(~9bPWa{M{*C2JrexB{_sKiHu%xZj<2Fbxp!FLgv#YKA{ zyGXv9)P>l`6s;KYKtBHfeuH-JB5oYmAkaTNE$)9 zM^56B-Kc5`bl@*ayT>O7j#5RLu1z6vyAj~^AV!^>MH?_3`{hEMq$~K(*BEo3?vA#p zgo`huscFoOIVOS_sF-Ae%GI&@p0k7t7&1oVVc>1!r^ObWhTS78ez`eTNme#aJ#u>q zt}>d2v~k+CO9PX~um1p7$NG`UTF90n-koqrU zeATs*k0n;R)sm0Jt*45!!6CH(kz8;i?2hJ}b|%8|GYw!n2Rpa{TH;g5R2MLSqKUFAf-CZDO?`*g6n zPUXtbum1pF&S1!!7fGge<0P|0{{W*bY`#EJHva%`kNzsov*CY?&frAq2Ur(%7 zj$mk>*YD|)i4{m$RDtR+8$H|J*Y_^8x^uYLX)rpPXeNfTX0dHfNbh=OV0xJrRf@v; zn+^HwRQr7owV~JiSK#s{r%NGiAUy4B1$)@X7)d@Zia^ip{l){}KjF!Yzksd&D9GE% z$zDS}6~lT_*Q*$i7#bP){NyIZxB88@^W)If{{YmzNuAf>@v6t%w^R9MPw@v@0SIx% zCv~U%F0u08zmvl1?A(^`muV|yrBHTH+KWAP=NfbO2XB9;Uao`wscHv@7Oz6P035D% zpISnY;1iYSQhpmh5K8iZ8>KgIf=&ni`kfhzoGTYm?duIFqq@x@-%{GJlb=EaC61Jj1A z?xUS>{$q#c*Z58^j7KJ-Bnz!k$Gr~tGAfl=-0|z_oj%rDdkLzv{JOgp zjjfn*O0>DU@ToWMVfR@O!qwdv%LDuJ2iy7UB0x7n0+YmpA-^P9?wH74C;&GYGrnk$~ zNO1T?j7N*b!7ycuDUp!wAvwY#7o=DT->ekKt&FThC_CiUG zUylCS!CbBrQTKDX*T9|8%Hf3}K(UT`eDdb@`>;6uOeD*pZOy}}=ipM#KsqmCU z&FWLd$FMFcqk;PK5(_aLwg-K;*#0N{U;JGzwI61iRedbQ)XHf zw$QY(EU&b5Dldziq0P>G)ra~Z$ChGOi&(HipzZbfT zyZMVfqV0f=_Lhd^)HMc9!a2rdZNNg$OvxMVAdH=vd=vYAtUCSY{+|B;1*gJv>+yex zC45201GVN)9Jp&+lm`vt}uRSt3nm8O57BOp~yVI^te;uVX*J`NYuvk6_x`Q6i zex6zg8`E1ZlS9h5knOVX#QE6o*RMap;YdXC>zU+!Xz)ezSxg$?AaS<6vf|MH0MuQ7 z!zmUsAC8)|;yIS-Xxd0e+9pe?Qd2_~C!KB@E=cku{btJEC(@O4O@jL%mx*qYs)!j5Kf}M0Okq@#o3*Zlh7BkVdh> z$*4o-zS%@-@W&)lrzCOCSX`!@r3RSHX&MlD(vGkYV%Jsr)3~ zlRJ8K&=Kj94=AJ9k>KywGwP=B#HQm0$4pahRCQP2;wu-da(Gix=Xr4#unHzx+T04lxc8~3C9Yv+C zSJv8Qf<<-ZvtpH`tXZdl3&#}Avb?YZ{{Y_m`wypHeA>^m>Mk8Yu9xkLcq5TO{$b8j zF5&jKw%TJ_V4}-@bv`Oe_pM&9rYP8wJTuE65Jd7ovokD6`vp*axAq6Cpwvw~FD98# zNE{C_s{_6aC{^7ZsX!e2<;T6)`iZ2}gCz49mQ^S7_8Cx9C@SsKp}@LS@_HA!cJTO|rUL#yEetZWZE2p;s_nY2!(p-ZJq)gs>EM}_)xT^#J#CUX7m?p5b>0)Sq6lH`ZLBS!Zv0tF*y%kw zv!wAddQdboxeS}^2w#-{06T0B3H6C`Xi$zQp1+P2o%a4S7HjV_WW5h1Uqd#Q^eH21C z^+S@v=#kfqperX5bz#>Wn(ISn^%j)59*&nOrn0laVsFZfjqx{%C0Z*dS@tbg}h51m_gWQ?`EIFVYI#M6%1-aLP)YQS+??7mdqhmB@H^T zW@J7#}y zzfw1JUVfIqfw#(bJ`Yi@l7%Z!aaR3R!EC@Yr|t>SJ=&KeJz5q zgOW{E`O3j7ZWXMsd{<%{RW_zKa zbJys`&{X-jEJyf&k=AU_5ZVhL8;hy%zw(Wuqwq>d>hjx%IhS zF4Cac%O&_o*1FRPUp-H`lSP)fg_e5oWJQ#ot5a4oFFN3#*MN>JcJ~|q06j;q@ETag zjF5~jj~~8PPUv?!Q}@eXL%6i_7bLR;lf{BDlQrdJhN_Xv)R*Et!5bc4$M5vpB-9{&J; z%mlO0ojz z#5TmPz=7az@9S!$iM%NET8SC}ws(5s?Me?R4ey^n61}+AI@=egu^22|84L?e1Kyh- zBOA1&V7p5-enDs0uOZ0z^Zg1m8qF*tP}0q^Zr9M_8BXe>S?{;Mg$~#0d{o(V)42(C zR8Yr~T<%P*+mT+3A5o*MRZ&p};416}+kwBHklz#3&dP>#@Ed}o)3-R)P@Z)ZeSUc2 z)7l3OV;N$5)n>S3k?dH=n1xWyF;bDVaTW@v-{s@DCvCj-jQeET2nM(xEW<*LbL*9F zyq}BC-1ePs=vtJr*}SALBui5lN?T7}P^-OVyd!0ac02CP{`+syd^1}!4MRF2A5&a< z));7Czf5KRANz@Y3_fu$D2l<*i>IdS+>3w-+X8*hIx8M&+>ij_25TAWtx# zNvV$(>4aZ$>OQsfQVP@~Tt9U(WIJ8rNcBh&%T-U!@+M}zF` zF7oQMyGi4BOc{17D|Q`nHomFQ(_pZW>Y1X$-M0i$L0dH>OOu=g1A`Y{Oj)QK6vq?ckAPa>$mXm zBwssNCnR8i?c10cFtubj$Rfwlwyd*okz=mbxSm7Hr~N-0dHeO-znO{K{WF4!@{Ck> zBLMn>d}5rMVT_U%jj=G)l1ZK>XD**mjM20f#qjb?BZpyZr*roe7S@8Erhf>n+9UJwp>!8?@Qd5&`DzF&u3 z0_};9C#&q@wML*;yK1Gk-Vr>F>PzZHALzu~pNQRmzeN_eSt3eTNxM#lff#-j@E^@x zGM@K0@X@O@)D^Ac`R8%Y(ZvVADMunuLNw$Jmy!GJ;QhKSJkiQnfw1?y0;hm+ouvD9 zZ%*haqRmAF7I^-pM_?yZkTW`o0~Y28+m7CT{x<4Yrk$NhIOPOBQzA7O`iEpI&y?Q9~486?-1Ds>tqH7-lr_=x%K7+*{{V*XY(lr@@rJKP=?=JVRd3G~KA5u69OvgBzn}2T?*9N_?qo7p97|>K zDAG?ZG*x7>h@_rAn#aVbVnXoW_)+Bb`wznYJ@9{ztZI`O^&W?z`Dcj6T|9+dZ8C&v zY)xd4V)YK6v8VFkg7LEuLh{A2WkbHjfgAYZ+)uY&>~ZU~C7LNqL+zLzH{^B6Z3EuU z^Y&vcUf*st=3atTkzPDK+YNgQDOcNwt2e0}D*iuUjfUsQ>5VRzT!lU(q*orb&+FG7 znweuZ2w~`X8QE{b{{Z}UJDc0d;>Gu>tK?~^juP}*dvI|D7n5V{yH6Z^SIm)5;2pSi z6rTi)G9Q8K-Usw1*A*t8;rhF2;RybtJI~n9_^)=ayJ=CYPfELA5elNg_$irA`FXGL zkL9{yucTMaR)&9!joBlO;*twiAV%ip5hU>br!SN)$K28X02O}>GHNu^%%@gYi#12( zh?C$t#DUmAOOF28aJ3e;(YQQ)Y>sm~Uk4qtAvg{2jKQG9+`;m4<)*rFjV_4W0}OIa;2a5Cj;Wa(s}o(5Rtttw0E%VAP<{iJNK z>TaN&wr-)+=w;SR;rJ|sb+K8`s5&+)IHQUj_A)56yuXyxcqYxrkd861^%aY58{L~= zOL_6~kA9g3nb%QLn^YMjuBHOfEpEUZeu=4#zXN0^Y1%EBA>VRlVZOzkVrSSdl19VM z!|Ep1NvN78NRpKGKG-@~7AI2X&Pdg&S0!nhk{DW5jY(C0F61d86croz+s7Th%fGjS zs?w0DP0eSs41lw49An29XClzk$NF>FMP-#^s(k_?B?7MDl?z69J^}fDquZ_cUxgF9 zU0-8`E56VG^4?hNb=9E-SY3o{&@_z15_VoZi@SIXyuYdI*jc{t6*MyyO0PIyUnG*p z#Y&Pq0^4~9&yD@g-Fjkm09oe)c)IVHXR`w_cOz)f>_*!b_CNONFEDnY(-!3!to9fa zkx259*p4ESJVCv_U>p(vVimk{BYy;SbR?-3D)M&P;kq2FeZkR?MMm}671GV9=9X0? z@Z>zWjY6n!U53m!jl6B=ZkMf*n4<7ePDqiWT%Nhi&0USVjnuPL#!Dl|w30~-ZvOz} zUHM29YzE|mxZCV{i(9MG9X0A$DZ0O&4vA&^M%e6(TvgR}vhn3H^V3SVtJ!#xX5{gy z4#9tGup}arzRS4V`+QgN0;Y}h?+mvK3-`~i_;t+EjkL?_gBJ5PXoW2-;Ln!d(gxZ1}kknp*vg^Q45?e2mW2_Rv$ zc+{sAEI|6N)OEiX52PARDh)oI9zyU){IW?Mo^KOS+uFY@?>FJ2{u{clSy`u-)pdPn zP{iRHv8_r4P9zxMI|&>SmWqi0u%?SJd=48x|^^P{#n~yAK4z&b{|f{ zat9kyN=T0OBv=)kqK(l(UC#Ue08bnHb>eFE`hSMBk0hI=uAOkA)9N*QLoFs!PsKO< zLNxxBp>G4FFW03FXyky;UPM_OgyJ{!ix8lFw*LTP56SAa+P{hJ>LK*$pGBhhWN?w? z=hr_q{{V@f$39C^Nq(Jtg!W!mm0CrVa6`G-_XMdV?e_lr^g17g@(AmHo_h)vRCXE1 zF5-7qOSvfiF6{R*SqTEi2$7k+M|J@4@Tv(1!Px%*_R^Om@ZT zUH$Xq^*V_qa!Bp<_4F^NV*daKI{UZSJDS@ma>g?xt5(&FED|%>xmv2B1L6uaXw!~c zdyki5K|A&7%Px?ZwDHBbf8=`~mU+tZZ@ZzF{{TaGQq+{G;$+5Uapp_1R!FDEwP=Y| z*%-8{5UkC&7ToXS-_J;G9FVIW%12wf#}-DvT(SBKvt85F8lx+h)Y+U%XuO?dd=*;q zE8M8uBUz%HfLn=e{f6Lv;CyUN{{Y6zr9%vD_P~6^jt(j1l~^h$37qWjf8k@l8ed=L zv6@3EtSf0vQ*GpnA%VD(LkukH(nTZ|6f!_0+>nKa$La1pI7Wt4j!8sDR2>*sIfir< zagzT4F8O0LziKl28%OB+6|giletRQTDCOkLMH^U+B9+=pAsrUG}Tgq_i3UqCEe zPp2Yy*bRa9-=T$DP~sgl>Ng&w*Xx=UR>_Wr2xm2Rex0b%O{6euv~v;1EB$Nd zlE^M@PZgJ=Ox()W#Xwgm*-wV!4E8a#kXMhCLL*rM@!W2uy^iPX4lO(ypStmO z9=Fr-!VEz+ILV9#ztm7msArc422&+var0uT;{9u~yw;P7CAh!~StDlohmxdyh#eS? z7w}Y1wK?2dj-H;l4D@#%1`y}9cDTScG8Cy(C7a3GjWamut)x}(HRUV=MgeYYs(rU4 zG4~$9UKW}{H z<1goyv8#5CsDY9jwvi04R=PyRf%WR`RLeU?%Id6o-)xvEX)K-y!|WDk zO>1?|W9!z!F0R2;WjJ#bHZst-*eJN%NrRL`F5B&}@wWX$+E>zu-NSvE&*JU*Wd%ix z9$dx$0H+aTGInvvHY%ngC5WqUFJ5?3)vFmOz=jZo7#OM|@&P;pu=^DUU&+BQ7+|Mjq-!XR8I%zsfx41G+o1B!WeE@x{{StD0Q!TSAZDPZxyrk*d)KQo zy~%?{X$&qaN$880TN)#W1zt?r$s!M4?2jaG`tK&^au2q{&s0aEVGBN{M}0^a_>R-< zjF3kJd!pp`ypYRDlF(XW&Wp=nvl`b8X3)$>k-KWfDe2E)i%77?2t{X%6YQ!6;1T3* zJEznXm1Pjh1yC1bIv>Pj56S8=``A4XM(tc>iv6~m2S+S|-1@#uqhGgbLm}oBB@ZYu zB7)nHHyibmiD;R1f!qH85VeSQ4Wv+tbXKaTYc;5$mm_*qw}Phz4m|qS zjbe&1W!4eSq|(Yk`*B|$7k;OKwHkzF(`io}F)gBnX$Aevc zkET}^onn(|0JUIeX7%+wc@^tb#!ni!D=|^XUCL0|GWnEM5<-z3iL2`&9KDXj@6pR2 zf~oilw<3>0{&6k_;~3?~T#WA*V{zT#)H-V?n!k+4X3)T4t zS&DMhve3m|9Gp-~#2H@ah2Mex`)+pgvk%#H^Q6%q71ZBTN7}H}nHU(9{+KJK{{RJj zwZ!QWP6`jJt5UxfLX?^7X78hBlzfvRKnViFx1R`hN7CY#A=tx2gVRf-$m9B{m%mmOfD&TOkk8_9O^k+QD*Kx5;j=$%7P zx)t#_tM8tag;oVkqpwV>ABU?Sifvn%!cx*5=+ybleoS4KERJr1HCjnRMQ=+eoK^n- zP=ciHt+D!Vw_dEDVMv-yU&B#C)qr_7>7GoQgS^KW^IcYUS502b(w>D3{J$HNo|>DI z)QCY)T(2B|6M2=ka+4H3ncN<{StW{{p%oSJewgta(D6^3B%!HtY@FE}E}0dQV6a!7 zWr6H>b->DZ+YZZiEUx$WSHXQi-gXhPduZ-(7f+-R z)cfYe7Ss`-q1zO?+a=n~L9VE2p62AV4sS!-#{6Cuu2&-%)Dv4u%4>&LR27s??Zj?a z`;qKAl^#fZS#;|v>eSZ*%l`72Bap!mK~{Xm{{W^A;3NDww|VrvI(mCbRn!$R*#V~K z$6t!H^g|$q+@6}sAd<2}?(O@SZVvr6Ikl%xsgrvYBh6zao&`waP;EB@^F6Wct7vH` z7K7tvk`Yeip^^tfikizRnIyE!$~mD%m@#jm8+iJnHeFp1!KO z8eJu+@Ro6Ded}hT_&XBbXz2z^P-EeTlpG|GqLQ1C0se-CSiz~HaBGfu=hr*MRr2_B z_4;5xbNeT!GBV4qJ9$g|C9KYwMxOObQ5=P<(T~@j3Kkei6HK9ps6J!9{{U@<9bE92 z)6PTbi*O0;?r@YzBykxVbAoyPnMbuhai+lKakVGV8mCxe1?o8qa@&ICOr}cped^5C zlqrF0`lQGKJhwmV=%iA~WoA?W5GsfR6H+R%dA{)2KACJg2i#qKYcrRtW(U*yM^Qm2 z)Ae&%GcAk=roz0-BFrNYMDl;r@^@Xmy}FKXvm`CzOTSW_lB1~q064ahjF6b)G&nXo zpIot+ZE*FhV=!3VQ)^UZXwU0q;-^}g{Aa|xh}7n{y2TU<>^OkjfCKs6anz&55p0N# z2|vC*brF-kgR$bfWcHP>CZ);d@d=r=idpPSB4YASAO8SMht=UKSFy;f$m~f`<(F~o z=cg6|G%lf!sPFk=-OOY-UTY28w0Mr+)XQeHj;ETIN=w!3>g*KvELm+uQy@|W_)na> zIPwu=Jb%91v}(kNkjV|FMI-r6aDrH;n^u?;y{R$fh;K7jT(r`4T` z?Pd+&&wqmSzxaiwmm5aRm{V$Iy*ZJjuN*;IFwelBZX<4z8&JP?lD5;y=dkz6cO6BU zSd|?0$m~{eY-;;DR+B?kd{&*SkeU%d)uRon&Fgx?;>3~f=hl1~MW%oT~- z-=SUXDSrt3uNqT=%s`=n-N4g*_JOf?bhLPU^;(xH$u<^vqf37e3`}ffAjlTnA?hK>w+0g1(MhDWA#?7(>V&7n;C4+jj26g@z$E6 zG!?DN^^jM1Y@u#T;XcFaH0j}i{^Dg|M<@GpfYLjoY2J(?zdrfBuCHl|S{jXBhgHPw9+o`D)D2v zL=s9TE+qc|cRZ4fJc};b0U!cE-B>dhj!iN~!-7rv{P9KHp3C-+vbvJDb82?$AqCt7 z*YXwhZVsbq20F|y7w7Z z`1~AZ)j@SRnnJg(Xw(7)I2lyv7sclVtX-2^H%|XNVy!}$IxteBL!uetP?<< zgWLM&5QSp^{q0fq_Q1~3ek(hlsx$IxjLq9JX&W<7M>nT&xRw^Nm0^e^Sqixr*W+I! z408UffX?WCU5MMKMv&6SLwV@L@qaFrlj@q7EMk~``O~_c3%Ysl5)mb+Mr=?@dwa1u@SV&4A%%FkXYGkTrDO<(MPIDTiiw!-L5ZDvHfMN~;4}FhLmrW!w z$2^Xn3pD}_{#iMdVVyLrZJ8_|TqV1Wsi^Up%ucInnH)||o84`%EqX5uUv0f&MgckJGQt> zc#BspS4O*7-}N9|UHGN+-xHIWir;l_@`70i^VDuuc4lC94?*ADVMQ3zD@;k;Nw4T{ z(<^qV(>nKB>YEc|EJ3EVW|N*QdSs)oH1e$~ETF|Z@vj|-9vMT-oeo<4XnALhLr!o&Jw~UYL33P{1u?MF|{*8<~MWGn8je_Di}t z&tBQm8izyYbiin=+0;7ADLtjYW$eK-n^v;z6BuN*wCeE)!!M9GBiIC*e+cKZ_RhggIbn9>10M$-XD2kz`a*Hjpg$9na)4+V_9C8J$tC z^d^+b=}m1Y%iFw}J2+g`>>Xo^8yZ*sCZT90qde=#i8#83A5F(wrqK{tU>@Dppiz zh@LH!F(;P(bJ00Yj7iabWI+Bvtd+zn@Wz$g>9rg#Q2!SGcLaicw`=Hif}f>o28U^;^Mq^C=TbQHnAQ9 z9JC}A+mrd?HE7zIw9Of!7}y;Eu0Kq++Pg~V?QaH0F_y<(t7dz(WrH4B>(wj9v|krk zRc}F9B9<-0w=jN#q$4~)Z6Nb^-~KYN#cDm?P_^^<psEtJDSUk|12$4#fnWv94>&P@^R>y1Q?22xlUsIfhP{{T0VeXs35Z!p;$eyE#B>ASk8BUZj=4W7l#HIwfVYpTgyJE`+;Ydvif1U*hW0 zk_pyG)$54_C746$gBc_#{s&TpjgW^RH*PxRx~~gTA~CTJI`NkMq}1Kg(DQs?lVU)re&EElnkZvO00%Tje`~dghEq%BP=vk_nLnybI~;$US|y z%DvxB3;4FfVz3!b-0BRSOkOs%I3&T=WzELI2aai{za~*qd1hzb6^rtHypFUT8JF)A z8~ndavKb+GB#*Ib>zW@iZ8{$cy8CCDD4$Lj$E1uf{eAKAVurQJYiI@&on0*!pP(t? z^YNsq6okk!Fjup6*V45JK#0xBTVuDkT)q~^G7D?!G1BY_08?*f$o;P)+H6#mGFZ$8 zn8?t|Vsa3+r^V#4tN9*hA7gqpY#T>~Y0SWulY^c^eg6P~@ZZSJ%Fv!TJd9&nu?+tJ zd{@dxsLH+EPr|mA$m@DJ+)w113ryrC_>D`R#n_o+s}hkcb!%fpqMR7}3|S;3j%pYk z{0^M6GKURpD}m~8CV3hqF|O@h*UQxW@uS=MFrS9ZPF(5@bB@g5vtJv34~)WBN+vaq z87$7p1SOhP5b<^5q<}s8ot(-x_zbcST*&l~B+EEqR21K@&oFkYx&6BD4y9h;Y5iHM zOqf52z}nLpd6p_)1z@Yik*|wZS*3zWSa5gQ*aNWl>8!Ft84nuMj=jcit=>i&FhZEf zAdWBd?~a$$8a~EH8eBCDi{dXZfEdtbgnYyRu@%QJFq4VKU8%UMbhB(nTYJJXu%mB$=|Ni@Ex ztqe9uC3oD9DmnnJNMu$D4j##2jaqf0N9pPR063A>UE%GoXRui6m!;E&<6?b0JT)Z9 zWsXlBJf4)Z$r8qa?I(U#xz3Q_9LlP9gt9wnsEVg6*#XDcOS<<71obc_4LTR zRua5>w)%GKhNml|^Z4xUJ4EAON#2t54FcjQRgT>}p)DHSHM~f{T0`rpP(ptlb2EYr zuVdWhAV(CeWKhR%H{a9q!HrAYe#3Tlo;O8zZb|alX&_9U{Z9BrzWB-SA%Uf)=^Wz} z@*@@S07VVt1Lde>l%KN-Ut@r}eM%|Svkk6zUt#TvntDUFIuk-`$uuUqu?BBl*^4=f z$38-e(X$To#Y+`hXv@u3-1V#`>^5l6A198Q? z%H5dkM|V5TV+o7Q$!WCBI}s(krcUjAgm{Y7#1UALEkaDTt|AgucO=LT`)$xGLB7GF zdf+y(VuncJUGksh>DSlLW!%u6oz;E1sa|~*+}ysTix~*77BX~)Escv4B5*J&WC^uO zca2Je>IGh2-Um+cV3DdwD0=tEk}bh}L{R-}-wXBs0BvY$CapN{Oz|~9mT4e9-XjNT@!BOKzHqvkoVsQr6#kF zuc)QVA9y)K+IT zCYIKiJf;gL6P%wfih7k~kvY|qoQ6AsGQOF0S8a~_jmPoQ(6a6%Va%4%G9MuI^~F4S z+*)fLH-eguW|j(zE!$P-V`H<94Crgu6SRpeQF_osRe<@pk?rTE?UQei`HAazacplH zoC4cuU-rlDo5AV9UVN4>P2#KJ^7lP!_}fbG`mw~)MHJJ*0`DfpNb#}oKAr%x-!6BK zF9EM;iJQw^vPU7LaJJ>Ghl3v;GYe}VnKAi&m}o|3ibi<31Sr$`&Gg)O=sEM*<+GzL z8wMQh9AcBYeaO#gyZMTkKH6k*5k-&VUr<_y;qcI~ja_6>%^p?~Y`y?t^!oJ3VUB@) zNTJ)lC&gJ00-JSY&XU6}YXO1RI)c@6sg5So+{EIZDzxNRLWn1hG0sVNfEW;4+kd}H zNdYAQ@`7mP6U4Ac>mMpWKk=Eg{jDFVvb8AO#_7s8s7@xv*7#VBnJiXrT>V+$^$*SE zhU5e6dNLVQg2!n&sFq8{Er9*8?PAqDe3jz2Gz&D$kp(Lh5g*fF3_&&wQ8qgb{-17x zuOkA#7ag%#cV6T%HS(huh`*_I1QS?}g&OZDs#0D`t1Qxi98pFUR2`If`jODILQlrw zQu_UUe`6#B0Y^2Je^yxUj6zlmo5<0NVzp}TXK(zq&f>RjHLO#Qo2&st1_3r|s)I`W+%2-4VP z3cD%!SbewLUPxx$;YR)*F@Ow;7og_5<_$}r>`9)fsUx{xBZa4A*viXNlwS-Wloy$! zifGy1R{$NG#>DUZ0{{>K!&u<@Vo-?QLn`?S@#}b|$@dFW>P+=5E!xbkZx@Wk-gvW9 zT*W~gSE7o3DO#0n;sGRG!PpR2e<$CkEKwpeNf2C_x zQ9!~+R7o8}=#NUE+_$d`g+y{7QN)qqfb-;atH%KOhI4=k5^~4u>*}*uqgpu9Ej>;e zG^Gi3X0HKuQSN5x2$(769{PvV~ zZR8ewY&iUUw`@gXNhWxshQyM3F)F-=cH!U;zf}oz#HeIDd-I4K)3PPUJMNa^$|Ue+k0)dQ#^3TF%V3_8;}U; zo{X&=(M33mk-_x5WM{LwKNXF~MXKb&X>uzp154s4BqDT<7T;l7E^|r2wr1i_kTW}w-= zKC4FIQbcIbljnX*ux_JZ9oiEqj$l1H9@(0e5V9n~qI1-GV~F-cN%v6Uv+-#ubgN>n zLv~FkjGkI2oK6E-vBkEMIG@Vwc(5dNvg{);yDsC@k=F(&pG_k;oVt<0^vw-J_)2`n zvbCt>)=|~?rAUmKI}%&SRI3PnHS0k)I;^S~B618tP<{Go)F*`+2#5f2Sh##eRty2N zf1YIj0Psc2xa*x5nJ%@p!jxUrGT{$jgGM5_s3+((}tJ@znk zfhuT=F&{7A4^J$p#z_a=e%F_eMB#CmZ9i`3aq<}bRg$d~RWo-N9BTnyIM-kUFQ%@i zb}R@!f1Z_3YLNn|*mcHBEF`Nc)&Brr@sBMVsqjsVt#eAxMqDfqN^4bVxy9)53;Mx% zBD!s`JNVnBsN{kOYr&aZ5@h^Ysj0H{wGJX|N5e&0I}oy;hP=@zXXP4)mJuA!&9?gZ z>8MO>tPdmG5?6H)dCHNh^he}*-8G-qQ7S=;f=XC5qXtF&AP=gN$z(|^(yOFkab?)C z@zar|k|PeCZEv2P^A*-P<&$+v!<^L`>gKtTpwJUl)4Jmqk~Cqlm`ABwB~^d{;gMsG zY0spjpKZ7Q06}d#X=E#{Rxnk9Iihly%Q#7rnle1YxW`7O!D|erkE@N<89Mgs&j?Js zdR-)Jm&E(cU^}pw!mitpfD`rcx#>}e!xI{tKlxxxQQT6{2aimz`lW96zIrohn$;_2 zvQ1GaU;L=v&DeoU6BbH6zvQBu*ti6Ocl&jtPLqPuUxYpWuLUG^l&BmL)3!EydpB`% zIP9)lR%z^BM<%vf&N}@ImL9^_e<2KZ6NOpTPt2?2F#iBhF~pK>ibfGvLNTmjD<1?o z>*^*+mI?n8WG1~;2-qpSV^>i-cjl4gGc}h zc)&cC8@ZaJQf2RBE?{t2-+*MMF2>fSoIn+&u+m2)Z4ed56ah&m>+iW#Dk4`5Tc;kl zD9ap73fQ|io|fLB)J=B-R+1bF-T=*%KE zC8QyU=8j<`sz?PI>)$LVYG@VHSC=(wA9*LUBqIF>aL_sZIV()_rp)l4kxH(^Z?99h z2`Sn;bU9>%JaCP))q}KjHjLAH<1d=YX4b_20GC*Fz`*w{Oenhi_9jrA9#T%gc>V{C z$(eN$cncI%H*k0usP@GKs>h4{F@c0lIjMA;en4lhMr(u!vY4r9$rFME4P6vNEU~c! za^G*~?k-v16Cp1lpHROtov*vk52R zEY?7X@^N1b816Rv9hEkjV~FY@m6QT4Td&L?O!gy(MJ}9>0EXWpgA|dSG3lqj&vw%wDFQjWG8+*dwsUwR6HRVL>=3adF6&ta$gr!+ZCOa)g7?I zTGX0%PS(9^6Mz6_wG{OymV1w~^RIi?P65%*#YsC4e}0#&)9RSU(hwzK_0o&@(xxthDP`i2czp>a5juW#}T@iwtp4DA@ias$lIi)5BZf>(_H0McQ{f2bXN zU&p_KJ{$4$@dUmH#76~{djA0VLb>_mF&NR`PpU#kVh1Dq<)7>q;*+sIi1QAbTlgRG zbYUaOX$?jy*UMCqK3N*8P64or!{vCG?moSK8}aYq&*Bf^R+3#rE;OL=BH30R{-2&3 zd@_48=*f7`{ykUbI_0Ic+09Xaw)VSetEGxN2(o{L^#S;tJMh@>rEPYas+I5;%AdE} z=Euc89jZn9evk+M0Qia5^BFrzM+zu%(|^Pg(uCansMW2Eg-vtC0L`?S~M=q!o4 zmRX}42#(wCKo6a-bAs@bo>uWf!R-a)&0kE?qnB0c=3Cb&;ui;^B{ z<9OLe5XDJf;C1$Y3I00x-iAd7SY?a~3g71rJw+9bWGcRy7p^-Um(bW6nN1MJ_7)ga z-)GmSg{(XaJbt-S>Z(r;Q{_GJ z$@pFF<_|3vQ%}Prhbu`WCXBNBQ#Ex`lEE!`4<#+-Nb~b``SZdj498=ZjPuVNVX!6vFmfr2q+&2fN3J8eq5 z?e}5(Gha&S%v8CXKOdM{iT?mIHB|E<9G!?GlFHkHclSPhw(Ieq;;-U&*2ylDN9EH4 z&pmP({G4Et2c$FjPMmY9sHf(qi*MULg#J1awyl?)$2AXNL(Iz1$$pftzS`VVY$+IaM;V~v4h)aNum9p8>farCmis_lkz7Y+F%db+1jd|HUH zHQ9JQC}v0EmgJB2jr{)NHrOB0zv=$~@H=WGgW~@H7SlHd<4Wu3#}=AIoU6LrL-+px zSwj0g+dM{B3y(PA23n?KNUiXDrR`guNlf!k6_;TlEh#MC<+naJ-+$bZ_B^d9*u&eV zdTgaa3gCKrXFz*v**vDH%+04{(%1CO{-6X(yrUn~4U z{7IttL_Q>Xm6ujW0CxH0a_gavHg4lBo}uhsn$ns|I^UMpN(lp1l(cGOnVfC72Y+6|Oe`RkfGt?N*a{5OfoU}%AefKr^M#*G%V^` zXxIs*<5Iofg{hRBM$t;ZMY)Y#ldOVzZtT_cL2FiW6KGT@vWsx;ohP1uz zt_aE*$}^S)l7Lb>R!!;+A*j2BrL{a$)?FKxy#%%K@F|eX$wMqwEJ}rBQzwJ+gSOsD z9W*q0eMC#R$r$Q!4z5%*XPd<@XS)sF-4T_?-qt$4&PNqgJiiV3jjMGG9Kx)P3;L3> zfcuV2!AJ4aW|u)Cx7pwVQhL=Kc%A61zlO5bIjl4FtqDNF#~=RyQS_i!n)I@JBfqAM zVP9h0y@teX(ilnL5I^qrzS%ekS+@=_ijHqcFuPg|qF*A%7Ozyr>ryT9Epm!CRz>l- z3PBt6whSn;ZR5Xu)j}xt%D4EV#nzWdWD~dA&o^6F%|cp~uz3675;vLlHe}!S%M&-g z=Y6){-+KNZs|HnFMwJen5_b{F_Q_^Rl112fBww~xKFao6yZUnpa>lmSl4{hcBoadm zu4lU>lO8^dml(_?iU!?A#O=54EIK_z+F9gQ)5Eg=06~wD!3s8cu=0G5dLzwa@pz3E zV5-v!@ZDPzDk=v6z4niaOcp)7Yzq1M5wixDN8!A$srMuNU?i+aP^5E=T}|4a=R(9$HV>w;RZ zvHHf{sdYbhsllpocxSBoc04>SX4=~la*eD*%r%!{pdKU6{{S!CGAWQK(|kT%n}OZ9 z(663lsBPs6$?Mw~*-Srcu=OzfW+jMUYM-yXL3zDe9~vFajVT{1}oj&&c*E04=D zQk3!L?Sh&7hK|*jEL%FZg_-eJUZKZ~wQBh3tA8YuGFz|!~ zDO1a|8rb)=K@{W3WX)%{jG4}Z7U ztIaU9a=i&5vMVriB~G~gP*{^WOC2is{Pk4cR;h{UB-I1F`stRf2uCj%eEO9af& zg6shs4ZQgy$6W|rU{fPIF+O9qh&}UTW?v&IEIog=5^72s{{Xr=M@`zp*~C5kiWsx> z>D{#@#i=|by4H~y97wzV=O5Rm>4(GNGrZfWc|t&|zWBXMNRm>IEq1{j0oy$%+nU*n zbYskB^LK;dvKXmv$!Fj=@{O6|X_?roN`K3_8*Q@tvPmS>NQ&%=i^w(C1iOS@Z3w`g z;AlNrXAg{_r)lbsTOpW*EWwYI$6g8(O|*$LL(x;lCHjC#K6fB7qe|%0%F?u81>l~y zhPzOulg=J@Yf5Fb$82!;eK~*pFQ3y%4a{Y!SWRx^?-wZ|9Dwgql)&#zu_lM_qQ!~TFbxsViBBFG@Gd|9#!nK2zGw`cEl&zp~6?Dc{ zY<;`ltx`P;wV9r>SC+i_8B&aKkPFV#)fI7p#kTIE zvuV~q`)zX0;wmz!@~6e*u~5kdS9PAU$?2~dOAX(TBfqfux7**Tboz)|PyWN$ zRv?at0%Re<+gP~9cFGM+a|>%yYi&cB$y1f2wIx}ERi|~3maIZ1@xp-uvh1U6!9IGh z>g12b5or}-KD}_(x`)Q@s>4;0YC(;Eo|?icKP73`fC~J%o-N@{{sG(DsgRJS$6mRc zn(!Mng0D42qm_>3lW>)c!U>upIR=;1E3z_`8*Sx}Tosg;O5-$@ZVv}4jzh40xy#$j zW3sqBzDp#Ny_&hqn>^%v@;q?EGbkV6@{x&{6i0L5c;|F`66rKlcFFxC>rW&^g zk;I&wvf}UGN)fuMd^~^~XO_&2%-hCD@!)I@`}B05gg6(SZFgK^rc7RDSfaU+!!;`N z!1BvvLl8vd>>4R|_x9NT0H_^HA|i&_C6ID}N$N2xsxkUY6sI$0X0hnpVGiY1HIabb zP$(OLzn#eX?m7_iy0mJerWjbj49(6Y^=^KSQ7(R06dR%fj{JUi_XM#U?g!i0^ie`k zg5>ic5mr!> znj^kjKHqmsJ*TV-RBp*;x@_TNnR$)2*|rV0@JJy406Y79oWYaG%eAl5Juw={zFN+i zc0ci-a~iNz$yk|{l@?Z#Qj?<{$#6mDRInr4bKrRQ9#r2CNsi*+FzM->H!TX}9PHoW zsu1KP_S)jMF4-46*e601A%Qcf%7tTTaD`wIT^5uRSJ-XOGUntg(3`lYzze2ixn{ z)cg*7BTB0WIg6?1>@JjwJZ8qm{c=jXrQ@U`zhYAjs0r>RSvrBl>sD_Mkz)-(i& zejsyKP`muDb_d(*x9Fb_{w4S)#X{5ga~{W~4(b3O!b06nl=m?MJ~shqbz>^;*pbhc7}? z%5&F);~Kc&F%TU{@0Z4({B!ahz|wT|Z+$y)cPSiGS9Hs1%$ygYR)$4yRAaKDE0v^H zMP)Es98b}@{S)|fd^g}4q}F@~<1GxJQAq`Z`Tqcso>rOS(&|3bv(J8)m+$b!{{R`U z!q%R#Um2;gnu{NZnd4bt)ENAWEpp^2RA}YNiCVudNXzLXF5vmwuSer6@qdlF>a=>j zDVUx@kT3n`hw)#AFU2*dQd|#igFBl8a zdfRUNs@<;)?B&2M>DYK&fDYs6K-=HkVAjNl{{U!-l`Hv_jDl@Eia;TO2N#)*XvO zD3IXAdazO3;wF5JH+U3tP6jBgO(LrewgqET#GUuws9WK&{5*%BP^?MgZVsJ<_) z2fj5^SVfqqp9`w7;MGuP65B|3WNm;kVMkdNt+`S#E9i2dWHQaM^!4j6;eI7KIeYhqnV1sD6D#{gO|P8 zx2UgS9b*S?|et6)4mJ8V7w0OvW`_=o=hijQJ6cZ3~FD-|M zh+(qwaq{s8&p{GPJ5LPII<@fC$Fbu*1^5)wDHBp0;~9(s(E9$M;)$n8 zbgp&^>;_nxm^6(37zXmW$@s4PWd0*Fb6V4xEmLys`4T7wGNrl@R1V0lQf1lLKd5#x zyPb=0E4KYi-w60li4`AB9B~e}M-+Y~FPW4JC$?Pf(f$Fy5Pjpx!IAMe1?&sl8{tViR zQ(E?47@BhpAV;2Df=H8E0fX*hAzEHMK3+Qk;A}SEuMbi2V=mPSWRQM?1j|K)c1Cv- zwV#Au#Qq;~k=xFuAiXd-TF97D4<27K#^kZ&6nlKYpMJcpMyd#piK(97&|(rjR-yKV zHG-Y!{C)PHwAiZ{%@yz#ELB%uRRnQVj4sLwl`5_MPX68j^Vf&0_}ud|L!?crd-u;@ zP4JL|bgFan)%cqK0Ev!oRNKi_Ow5-(N#zkiT4z{e9yX0fAfzBWo;&aK+iyNv=o(Yv zOysrmdF=&QzyJU;{Gj2yGXFCv2l01Mv(&)5hhzL95 zL+w+=XE^nTck&r))8jPjerJ?d<03@nb%TCHmt+m|@8@m(hhK5kqSd^mXq+w*n7IhSoI#Hp!f2Vhn=CYtg^^$NIA#B5*O0zufC zL;{do?{{_f#TQqg4JKU5>su>{O0eVXQj%jY8Ei&Ys!XZ6ub-dO+;Q{dFx%g)WMpG( z2>tU2Mfu|IIidA8aCCl3td+4?R;7@yPNt&8Jaw&DtdGW7l~FlH&bxv1*nQ83!}fhP zt~L@oTG>|U54Whm+y>wiEC!O#!P*@)OAwTDI)aoj)voug*phoKEUF{qWMe5RT%Ep~ z4;y$LW4YEyPW4GIpdE*{07J<*$hDV?Ig73Nx|kXwlh%T z+F5|JS*oPa9WuISyDO8_I@ab-3#xK-7SdH%s(eTk;40(PMP5X&sC;+;pKq}1lUE8r zf^9Of7tM2xkV&^{no*N>a5}F=;c}I-@Ycv#g7gx=T4rUEFsO)<%PN&_N~6g0xIR9C zE%te&jKWA#zrJuMVFceyso#j6(%J4lHyfR`oWyAup7F0%q`a#w!pi{T@eIHa5%$@4 z1h3cFyW#W4qnYCoNihSjTEi^w7S#YQ5a~YAPmt~HY$aVMrnLoXty9;^{6sb*X=`ok z2nzaalS-|>%fy0ygzhxzVj7a?Q6dr#maDEu_F_$tcY7Rkj^1coUNx-4q%`I`ClHP7 zMFeFbe`Vn%k4+cU^%u!IY)`*~wDL=+UJjy0Utjf&iWJ%`TV*rU`R!|?dxX?*dQUkG ze3Wy3UrlaFCJtl}w)PnkGGk^e4&(QIJe|6_7zU?CNz{TtuCDwZbC<6St6j0l$ueTBPhqz8ki1Jj{l{{IQ{#otybb?~Ki2ljb!b)$wZcLrvkNh`s_M zY$f0W80Cl14rKKKQ@1U~-`90S@uUVLrMaK^x>wH%MhwD@=50H!V9U!=yqY&VDt>0~ zi_A$8j-%vaZb#LPC4N;91x=U$%n9kmc81xkj`sPM`LFYXwGz#o0PlXZ*Lo`$+Mg$< zZt57V1#D3GiPtj@O)XK0yGNGgAzD5+Tn;D5B zhaULn&>H2l_^fT6DeKe7&pt8>cq zr0xTjBeqPE2MWlveKQ`G)l@Os*Hh8XV{w#k;}Uw3YTP{@CnUa;aFZi#wt*74cGwp3 z-rmP~=7pb06X~a83s>E->Hh%ajB{}7Yv##)2-;*`)K+S0$+H*p5y2Fh8rGvz0<4>S zEmYsck}DrO{?Jb6>izGw6m2*Pr=joj&Xt^<%zI%Ub2|~+p5Wy)t(K#x@%D7wFGOs>eaF=FdTn&tUm3pWtD59=_85?|7>aK^oW-kkeu~hVe-Wp( zJ?jzVGx-Ih5lYfpfC(MNdb7n=H+3x<65d!7RUpEu5Dt6kq^t$;>K{ZNa zuP_I$G{py>cT8((jWL?;Zj+<0GE-u**z~H;lf*6tN|RqugY>H;%CZU2Dc^1&eNThZ z0UL#AS<-IRjtKRCuHLq zH;uq5TVM~KT~Yr4#e7PAvc9AQ%vjL%ViEnxHoU&wC+n#{#^9% zSx5f>o~JWLsa~H68JP!@zQ^rJ8vvRYAc^ih{S2h zah=V*t#!V*qmrSRqU~2h>1qw|v&UnIh}+<=@e)H0#E^b(x49xEM$rv6pH9mtKaI~% zTEcS9(KIx%kJRDrysO#X)oAR-q|3bu7c+HiRl`SvthH=Z_}Ju@DC`(Fn#8C8`K!Y?NK=RW%zthI)cI;!@Q&SfuQVvhDpB_2w7 zXSG)ChUXm8Qj>W&v{G%ivXSI_b?G^dREZ~vL)ZekSAKFyWLBJ%{73p=Z+HIy8bxJ; z9{5dIaW&p7f@+LKYb%|Ce0;z2GgUFg#x$`e>SN`&Pp01I7M@t%(nQ_UX(MUBT%s-2 zTY+PrJ45(~z-m2A`lCg6N4Qh#jFnQ;VRa;u8ZBK)Gg*!cWXI|xYC!-NJclAS=;nu0 z6kZOa;n01T{{SWH`(mV>i=dKDRPZsstNYulJBf|Y>BFonWwJDD@tJE!Eg2%n23fra z^qEYEp2x@v+wZX4bs9w+ER#nNQFc4y{?y1oe<(P((0_{m0K~mK-j>jmtz>lNBsZw~ z_i0$Z*KEfd#RP29gf*&4n|#a;+k#uh=h6Efj&UrKsAiyeHU9uPJhR6HPRKVgIoM9u z=KIT-()KagNHJ7(K*zyu32nf`3vJ6L!I=-uGjsBr^6D*AdKg!7$i@yq0Qra4u1^M` zUDU}LvU8Z-&-_Mrw@UXnQEB|PiPL#(Y&I@b_$617rkE62rW?lQ6p`F<8*C7OM*eyf z_-=z&5){=qb5wt(dK!s*G6^3%a`xl8cJz)L6fycH4LNr+ipp5Ar!X+U(NM?%>qORU z$f)b;`lYyn6qO$+K1BMBDN!m(tTHN*Ox~V=4@^W7Lg&WX0p0rh;}OZcK6u$r6Pc%7-0)IK3?Gb@;PLc zj`g6|`DNR}ek1!+r0^J1QpSHN9$uY^47te@Bg(x8Z-<6yE$k_^rQe489ggJfzUi5@ zGfOV?jds;-G_=rFRe5a3-=WWI)XWRhOt7*vYc?a7p0el7|4o8KVSt~TBv4o%DZ{zDFQ6w&rC{V_{n~#@?3<>fG9Z{xl0g^eK z!ptmg=zlzn>L~a=Cn^URzQF0-Nv-vU7edz4=}R{qX2soMYTX>(KEl+Je~4?GQJ&)+ zgCJ#7x3S;F@dhG$bYRTo5VUK*5*E%cP-pqHiOZL+lr*$@R&Oad8LmeD? zS~+Vn;bnDUR_u~I(f zgZAnY(MBYOST{R#Jn{Xp>Aq-@W2GSV#FO`H3#)ND!q$V+xZO^)D9=rnyV6_O^jV~9 zvtEM4d%(>cdnxkEvG(@qa(q3bSf5cNMx^`E^aBc%YNL#slb$_JRs0WcdrjO-err}- z?$ymPnzcaVvpPzAy=#=I!4k;H7C8*bX1s^|#4|r3@9nc2;uGiqfqon$LU?h(zkb+0 z9P&#{b_G0tye<4ZXnjSbYh@BSaak=bg1M2&Y0Xr*iEP0Pd1%^bB+bTmX(Y!)oRk)A zj>q5HiM4Uf8py<~%%C#R=D+dzhM~%b(C9S#f_G zh|2mcYDGS!yoo-XMpJfD?8?NDssP)5p8r;tXTV)wXL z^vSlg=1mxi#Q-~iXa`&w#VP@ zOXHZ1qA3388ox|7(=Z`oaCO=FvUZ7WPzttn29GC@XB>%F%Qc;w;Kcdw*X1d=$fVlP6pb!FR=hh<{Qe^9R<3JKf|{>QDPHb0vb z$AMWHkhN#aDHdS5rE0mKv`7QN7%NclwflBL@S@2g?GE z;-m1K1IFaAn$n(WZD3@@!-vUBi$LoYE0<=i`foBsjALkLnNOw&1cmx}>#vB}WDFQx zdS<+08CoE0fG^XWkQgis6=8!JYI^xftyPj0NYd4ssW5qCE}tgcT#`?bzm5ECz)jZP z4gjEAaN@G6ekwaN-K}|y!{szatAiOWQ6+m=D1%2HXAx>z>|(f*EU|j9C}OMt`t{Kb zDog(W*@&_dKQD2XCZ@E~M53H>59QM<4|;zLnuT=U6B(efx^`MP>7%izVzUj3*$ITu zg~~@-c)vzCk%q{g#fIl^Bdk`2S)a#d5%LzjJ6=bo5=W+EBL4vP$o#J;CaH%}b}Kyw zCr3<(;=@+VTeUb9F~W6@Rfan|G!sf=nN{7F_bJ$s*6ddWN|3#=o&#-1lzrjmy5Zk% zJNKlpG~!K5m&)R7XByo>ovUknNXhTW9IL!h#$|Ov5bgk9Bi!|(IcO|M8imp8`C|Mz zH!~5y{c9|qvHVHPh|#^d&110nEXFefnz@ymF^APPc(AD|n4nKjXT9-G;JP>{pzrUn z=u3V5vjuInw69z!0u4T{4d&U0pf%)QJWwA7L3 zje+utb^&hF=+foLFA#3wLU(^QqswORELPd@uY2e23ykxS9_+ zi+w?#mmK-qIO@_-$rh`bn#MI+#X2@@$?-{YE-{m{kboV$oyjukLM(y>4sW+L>+;Bw zQ4Y2F zvD}T%M+`e%B}Pr4UtCATWFKdpcllXX284 zIM&>v7*-j$SaQspcuzk4DOM172Y(fhPS_Aer%xW56gz;)OWMn~+M6dnlE>r>*Ul(s zrc*-Ut!9PD(91nrF0rM6$U}N7CoR4FbZnCV(v+lASwe#xa5nM1_!a6gS*m8n*q=#0 zfxD$N?lTV|%e~ulmTOW(>tdbzQqu&jc56$zyMEKZjlF?nxl2yYS8Y)Jv5cd_k|suN zL2mw|`sRjl^rm>%hD(j8FUwj3KCIIB9$0ByFYwPg#Z{gthm*_45>%1xzgm*83{Y)f zMjz`GJVXO^4{Wb`lU05qG=8d*zK7R%Jzu5nm|p%rAxSG`G4)_89L5}7he36Mr#4{R zPQ>~8F=WuNBT)k*b|aDgv68R|9wY(B7;`7%PX{gsHBQCcH62HXRmE1)xn~q1miY-2 z*t+Vc;iHuEDe1GP50};?J-zZ@u|J6(&S)H!uGT??&q-R&MeX8yfp(O4 zujFn{ya<8_%ZGvmU=%P|*d6xiEheK==4Mr4{G$^tl06&v{{U#-gbq6{bgxSHBS>6l z$IBk~uzyU)TP=&fYNVK` zviXTit|HVqL0o}SYjepKLV4h093H!|EEoc)6n{N6TsZ>NUq2)1g(3u2CAxAezD9R5 zO=fiT64tGc()k@WwkrN(jfNYFYtxv@vqJ>2%#j;5Wt4otdygJ{)?PB!#O}T^umvf( zO9=?P3DNrI)r_WB4O1G}3z%xchBBORucKzHQT$v{&LkwIaX&qrey87VnxMVAHH<_6 zwm?b0i4+DkuOa6B&s?ni+wUjhzesA#b|3sLr|;-PB|DQ{sc9y)PvY*1&`)Z?c!VDg z(v^-NkFYDdb*-oPY>Y?Rm`l^2e@|ShR*F48jiyt)-Gl9e`EKZTl7>1wwxhs*hWojv zGcn|CRnwF)mU1?}B104rWh~Y4GB%%PF{j#=Q>|g) zFtATvJu*rE02taAP{~&TZr*bRsPj2E>@Fu&W0s|ABi2|}ug1d@B#_zU%%HFf%x}?+ zEb5`xYe(FJ`(cwDN?6fNv@5^9S&Rmv$m&Tj5aM3^DSIIG@>umsmTA2>YqCjTY`ek}oI+lZ#Dl*^Mi%VUC@9`78!5t~kkv ze0*55ZoPJZL2i0^IZ}D5w9w2UWB~er{{X28n{zX$EPCO^AxPCDt+(ITx9OFW3D_t* zVWzb%tEC;8AgFA?ki*Y@N|}6=CeOj+vX$*sf-53u;z1-PKa`Qa-sJStZt&wY0VAhl zn2?v%G2iAoO+lX)7 z@AcoTrW^WKwnptH=5|}$L7~P}9`AN@OzI75XHc#~F{d(`PbU*(wQioSKPSq|J&9c* z5LjCblf_6BKID_P^f+gd75pKT_CM5TqpROK_*M%t*d5e+;-|aaxWwuX=4eZQ;vBnR z;-?&Rq!WsOlXO56@00Fm{v5F(=y~lQu5ix3oG%c}nX>!1U3 zsoUw#zCOPWe}-*S+dXY#P(v1;$oy9It7-yfr!`C|v(EaxX!iAUc0z2R>=YpWy=amT z55wL;@9*{X?H;Bkc@c;wXY%{{pJ9!!#1Cq!VebujO8)?Jt<6TX`DtnBOZD-Styvm0 zVPaqvEwV;iWO7}A{+nzv1q~Px(c<5xdU1(0D5?r8-E_X0RBv3+mu}eA8e;CD?uJJ( z4lZogjn+*P-N7Qe$v{~uu9HnPs!^2v`pTV8hUlo5!!JYmV%=UvUmjA9wgB}WzS&s& zg{M=wGTq8xqR#1A>gB98?KehQaf?MEk%fnf4pFPKlvCk|`9{EP))$&G0U^-$$`W*q z1PrHe0*|gXKL^_Dy&4}_jRHG`TREcTvt{MM=O$Y>Dauj6iW_rrWKle^umpbKcHii> zZ9IxvNNQ2se~k0ByJ3+hi8iwk56c`q$JJfm#_LN~yLFey;_&wcxiu8h3$Kj6YP_^! zhF6wa;hL?Gpcr_oDiSyL>G8A%HCa?w@0ZNVBS%0QemZp++U%Ekb2@sBirSx1wsMrE z9&A=GCYCAJwKtjLk_*x_)$7RUOAvUeZHen75xDXtQSY8|_~vcyc9V`QUv4yyaWwor z$kF=hxq~ID6DemKEHYe!8irY5y^pOsl=RrFWm}IGC(qlVTR;|AiS#2XZ9$${<7C@1 zs2`_##SUjdThKa|#a%CzxsaPtt%#t_%U|<*m>Uhv4D!q?$gov4!Ss=wfKT79zaQ?L zQm^m+@TLkCH8KELakO;#fuH}?QR>Vs0qIU?eqAN&C*y6?2iCC~D2w47N3@63Q|b6S zfW-a!S0HiDQ5`dFyeN+iiH_705|nG!tprfS@}#dhV1w1M5#&}-{{S%G_K&vyHFtVm zDU=K6o6TK8tS#Xog6n(^Cro3QHdif^Rf;>Xv0#x@0Pc9OQao%(AAR~D08_TwPQwRs zE${2w6!@>j4{o(SMr?LA?76$tWaCIzuCcL{l|d4~${FI`ZI8Z z0yIEaj(OzaUX#^24z8Yp?v1@y){gCZQbjXN@;$C4WaSLa;Q&pScJMrZ9T(m)D>Bg? zdu0vc3R|=y@rha*OKz@e?mT6+C77Ggxdt^V)yG38%NoTTCywe#+>%?zzrNdkU4Z#9 zYiQJ_zrJndt#=B}q{dvYm%!E0*viV;3i&E6Z!_^o%CiV;Hpv`dA@&>bJN2vJh?oH0 zFVBqFhz%f_F8Ws(U8v`5t|DsiQV_0E%rFZyEyYH}kOg*g0oho*jHGS8{(OB8KnNU@ zV-~=IIqA+VD(Sr^b0cVKJw|l(_VsFGELp$m%~W?48S@^)8`?v&nrBS3cN+cN<>(@n>g01aA0_b!+(?|n{V3w%USem%(yjr7IJg#lXeG;6%Rp6#(DawEsL zfRJQ)2#zbwVi^zt<^u#fE!gcZCaGOPj?PlcVwPzd$fq&3V=6r{1g1#?EUnAtea6fV z<8V5A1{4S(uc6IN(Zu1D@+f7u8dFMk^ATlnnCxvv$v?*1haow&I~o2|c1Ln$oNc%p z`Ph%ASjD7$?PTJa6U$T(nBc zq@NA9ljmUt8;b<~<1p^(!o81tN#VZ|n0!8>$UdginW>p4h#ZY-q8jw9G@K)y$<6u??W7ILcowe22qhr^;W-1q8K8Etw2;JxQ32!14TSH{T8^BQE@r-s-bpnS`wy zF6BM53_a4<)9QRKHG6rUw+-5mwqD(@hK3AbQ|ZJYmlu&XaNyDrDkcay_! zpl-7~%XmcXzlN*yZKO}MYtR*BQqcn5+DYU!q{kmysSa&1mc!Wh#0&qyom>pH4a+wGy;qBI%#W*CE zBVJx|G;G&oSlpe79#7w-Gq5z^g*`7GQ_4<#$zIdg?9x-3oqKoe1!M_cIWH>A z%%M<7qkWsm@wVsfx$C^Z*>5N9f{L;$S6m*~n%hVA^9}IWmbH+~+>A&u?C~Iu@n+rz zSJ<&2{XU;xr&J_zOjNSc`r`cCijLTi!r`^fx3g<2dsWb>j-4a5J{uyi`grzVDk`&u zX&D>=zmNzYLC_b5CIiAYeKD1_Lv01G^~XMz^l>?8C!WAm1^ZbG8saJqLG zwyZ-HrpFtp4Vpfp84H@ep3+D;d!30tVbG#PqTWNu>sd1rF06ohi~)yOYK;}0pZr6l zGL0C=@M+!EJo3h5L!{yk5KcVYhC3Q`+h6~Mf!iklYkvfx_I-cIJ%VucV z!Q?X&V_H}e<}VrPW9w9kL}gJUvVyz|9mpH|`TF&tVAyhF7x7c89b&D<^*uqVpJhr^Hy}EEH|6x$*fGBr%d!b0C|Z<+kJQe0_T9UsTQF zO$#p_$5DoW>;lR3ILFKO*8vjRl_r|)yAd;F>%lXtSqP=0hG!w2BTdL8ef;!BTL>zT zY?0N4p4mdRV$F`mYMfRNxA1AmGIvVka&^q|Ryep>jMpR)qPtBbYDpUbzmQJ*^v?!H zon4tY{8Twh!q~!xn|_zLUe;!DbxC~i#e=d zFy$`Wi*mBAQmKweLJ~G8z>l|6O)6_6njKmrK->UmiuoMK=G1BBNnm~}<%>*D;{)+? z_*2QIJGfY3-R|5|y&f_tuQ**Vx{MWbSa`CItYnfx$>9)vvGVp&f(C0`yBmV#rpTgI73|I*@WnC4kExN^b zNozPG#o7}-$nko%f8{KY{s#wr{rn!kANbesNAXv{Pmccp4tcbo@g!bv&W9rxC&4^k zbW@~>>2!Zgws|hi_LI1bGq`Iq;jYaGD6*PAH1I~`uIkSPX-qPyJ0By@@%8cH{wLRI zLh0vKk}!E$SD%%dIXD{43Yd=IzJyrKd_QRWy``6qoYvGet}YY27|l&xYGl?QVG?9u z9AqGS7Dhi!`egqA7Wf9NZkI~>X-Mjaa^J0DWYnajiFCttbzkw4BT#ExC3cHf_PZ>p zU7ysoidgaxv`2F81YfGat9xza{{T(;L|O=S4qrv_n40*53}kQX$Pf_oMC)gCWq`g z*v}w^YVsoiJx&(crf1GA9Fi^umTR!2)es4{dRlM5qK;T0<0n150TrxFhw_T~woL#K@W=kpxpZ~R8T z;$L62)hF!7X0kML{l?7KnjE%9wBEgKH%*a|-baL$_>L!JPxBuq zuZ%{^q*k;;)z7cXJSiAT#X#~7r`P>w9={4R_eZ?C?ky{r)2XYY%H&@qeMN@#eEx6X^63g@bo2I{tYS9~X)* zwWN@iXIcl-IyD_kCXmOwScV#{urS7_XO)y}oD*VxX7GF;e!n_-rqsH#NL{;}@t}@r z*^xn_e@qnAG%o6VJLGdQirDBsUX2mI>J{CDlY*)@VYiQe9)82h)oKKdXXYcV)9t9pv*>4iq!+CC(e1a3gw`*r;{ z{{T+(TA06vblR;zA{OKh=ifaoGkB5iQ^?FZ*SC>s3@%RAK-oDpjs70ZD^CrSuuO`+ zfRxhlz>smt$MKK zuE_ZdSKT*~%t4HtAd`__Bo7B*Hyu>cA>6Ghn_D%~zs@E%W-0*l5r&_IEQYz&UB;)T zu4z10qSNPjwI(WVD79=O#v`+7rVNuhIvvyv$prlg>OE6K96m7B80YAx*869r0;8!} zR@4r@hdVKA1);Q>u69i^kECfdQzW&d^kOo3LmwEA&AB{x^RXXI`dm{_An@9I1b4}p z2<)x(!F%1n%j7j6$l$ci3YvDzB_~Xc?pNAqw<2mVuOTE~F8go4&>wy2WzqoU zu7i)v;K1&Ign;{hye3^)Zsj?zSd)Y%7O0er(N|!nkd{dc9l{`O!Po!*_V+3gs*nKY z?+M!O&lv-Z?k8_B7VP7)T9%ZowHkJU)qs@iGO$pKAOLQ!y7=63@$bJ!EIP@R9z8Qr zHDF;RVUW`dQ0lsvyEu&AYfDf%Lbg;-Dr$Ub=GUH7kgSN0Bb7b?1dc;*V0t^3dI_7x zEBvH%#jt4CX5tuj#Rp?BovGEet>afvUDZ0@3wCjve7)NPA!IbnIEIVTTI#?MyKqy# z-^uM%zYOo9F&B1Z7&P??1IY{MuVE zBL!j~FaZeV<&ND~589*Bs%e*OVXU8ALej}04d%!#E!}-3lI_(TJ_^nsNM6L{(n)Dp zf*Ep|D)Gvky?Epy!kyb~iDG>Fdrz^~S1;N(Nx678Kp$*l-ss#9FMPUsA6;n8XOG5Q zr>Uq%kj6x795rpI*_z~WjhaXiBW5g6l0t%RA zjyd$n-bX?JQbT^(&MxWphq~HA#-Yq=TeHsv;S*ZNVC&gY3&|SEChiDjl_cL{kGKQD z0QvM{ohJ+SbmR^R=O!{TlpN7HS(iOm0J7O^CPz7X+AMZxW$W9&$ht9&(q~yDibOug zbsL}PdPM&KYGOA^61#(6udX~BZca&Qobk@&Bb4c!#I{X{E77MkzM?h7l>!EWX&OXc zKmoSE5$p)xtbt~2!L;T#$d8EnlA!%LbufcZG_l7I-a+2_Vr7$Z{nJ|>xUKv)$K0$otIq12rfywK`8X`w z#$ql_II}FKXLp)dEXmJrQ0=zC0UqOF(|#f0YE>Xeyfg-jR~6}xhE1_-b-Mks^l80q znK^nm9PTv5Z!kV0-bSC8@xYMks~@I*ej%IWBmh0g9eMAjR7RF21TO#{_{3y=%jufk z)1lkkb63`x`xz{P;G|1a)yd5yHDy}Ff6N$*aP?76)O2grf~_+iHaVnqS64ooZ{+R^c=6!v(5J%niwJE= zq6s9E&N)B?sxTnsv&&`iUzX9-xY!Ha$;6e!^&x4YiKSKI?;3{yMtAwVct6vnL30xk zYE|Zm&Z3OM`8ZjMt79XKEoph!rw|i5MyeT^P^{jQ?Zc1oNCa)~?8C4y3&1#&+>V)A zwVsH}-_#YKQfgV~>H6NSi*ZqjJqe^EeXO)xjb zU+07NfTV!JhFSeH+$~Gq9^VXg8!e93*I{aM#a(AegBb*CFRbyY9%NIx?dRLv^pmDK zO+hlLI&g0>-*6rtQV#BZ4z={Q?$4;QHyA}NdlFj~C!RY9s5!+FF6-)T;QYQf0JnkF zQ0wCi3XV6~XE~IXq%>>QXNFMd>|+t~kw{hD z&n^6U+<-p)0!bXSk(+av(XbX*jHWsdzWIGq-29AQl;7c-3en@Mh|GhWEy7v%F{FVU z6<|)oj_1bx9;Z%=67By0x(_E9gUeNrABufTuCVkmT8Bmqg&H-dGUTRZ{{ZQ-L`YwU znNJ{~u><%U9r`^aFtSY?z%$n#xI4gdwkooNUhe+@a@slbI*%Pr);cDM?8QzNL`r|A zQ+6N;Bq7JYl_!xuaUTwW{^}6H{rz){#=z~H*xdaN?qPG%)Ux_HO2%2@ zjd|{l+j4FrefK+Y{yl}KU}hqQBXMtB0LN+TanKvu%exaE z+po9zzTZH9*RLDm9|+Ow6^oz`>N4#o#HQ0Q7isC1k3@H8PiOc=HIIS6vX2h2?C19r z#Daaj_Sk=YhroP8;TpXGwHu=K8T3(WA=H3W(|R1YdIP#y-7fLG83(gb2x{#d$8blG z!GR};J8VhYW8;4(uO0j*CwQj%>y)%~zFzszPSk!dGT64NE?Rj4lwVF+*=AKc6$U`0 z0;)jv`+r`iZ7gyERPA2>0P%?o5Dmh}&bD?Z@&5pp#ywi~btzamMrEZvwwN-OEZ$j} zLwWk|xcYeUWVRcW)^#IB{x17(+?W#^t#R1d7Q!rM&j{q*7>-O4 zxH%E1BaZ(5Ks|iy`W;4`hJ}rcZ-kO_-_r*5@8KWt=idQg@k@nSZJ=d_RDwdrMGLb> zBtV`=e>-dd_w&`-PvTFDd^{ycN{?KgO(ovobCKVPANUdJ?Nv3*u9e2BSY?(-=Ed<{ zwo}0TIy1&VK7L*!{W|>v;Xm~uX<^pI>F@jJnI?~Eusi);aUZ?E@O%71_Ug^KG{RWD z5~C_ZHF+VIih^1{Q((WecsuS-`t|nuKjI&QYt%WHZ_lPqV|6EK&Ufpt!oT7}w-T&3 zw3c?jiMN(Y)m~`hUCNWmIY-Ck`Vuzx`t|BVCX-NDq{+9pHF?aA6=>i_S2wM2a8$-- zbjC`By2W`~mXzoU4=gum%BdsVa@%kZQ^D}zT{wtu1YU*3VzJ&h(oI?HKu750X;lC6; z)zQq8;d`mvZ9D04R9tqe&(fYjv3VUWK;dH zWrnWX%5uwSU&fc>`zwvh<@DF$S6HgzDNQ`^WU}$zjpKNEuq%4Kh|effh;}@=e5=xa zBmV$W{u!p!Y2f&m@OG8nW&jZo>-l40_)yhHBY=b`?}u2A$FJj7hLZmP7ti0^tkv&G z(MeKOfIlf1#%AFRb(Pr&LQI{ z+k4Fu@*bH_j82?NlOGcL3?+HO`H0T#c2E8iJ)-Tkdeh~r z;c@U*j5L)oG^;_s5I6N~ltm#x_dEOf_Ubm1;u?i%b^48w_46O?o#4n@$NEcrE;2fq|?R(tL z^X2Vnodb-yUbL$s%aioq*JB_NFQ>Zk3;eO$?Y{kfm++6_JwA#!wL108@&hZwA0Qo1HLt-}tKk0KI z5Lh3n18tb$sy5VW6RaPqyWILMWKsLJG;#>R_F-tcpcZeH=ffIY1^>Z3y@0%APHp# zz{$GE0OSGkz#l&T-D5!7S)M5MJ|gz{WU&KQ39PRgcOfoEJE*Bu)c3FD-e`s@rZQGa zwG;lLH>u1Cod+MW-@yBIQSl6L$TZ3!{$hHZW4#k?LlvFX?=O5bcCHwy5}vlh%#~?; z6{^C$=!0<$DxIQ9T?(JxJnT0h`RhiD;c~^elLVs8gT^d50C{b5>^lDdN@^VlnI7rb z#GEo^UOM>fi9a7sLCpGb2^q^dk#+-e6aqm%NMsYoso9_mC)>##4pSYxZT|p>$0um@ zCvGtM8eE2v%L>>za#wBLQ!r$N%*=uql17aY%KX3|2YtQwA$ozWpH!=T2V_zrJHA0mp z#b90@9doNIQ?px6qpJc9(V>ADw-Cc+_9t`I zNMlF|QL)%?F;g?J3di*Aj$Cokb#-0&3>T*Os3eA^Z-!YRo=FcK;8@~2L&R)YcpQeu zk=v;@P9Tgf(MOY=wMSFs86B$oF^tr>8&L|aE=wVhj={#XRm_yBRoRVwgig?;jt=Kw zb|1$~6M?8zY6utcdY@dvDH)Y=ym#;LQJ`ee`c8!nQw4o$^IFI?YTGO|Vu@s$NTgs? z`nBU6LEn%dc>}6+zZld=Gw zoQjfVB>dDCh9hG1vB@Gv?HMD_5CPns`g6wfxtm=Y?PFuNm*s+lY4~niG-T4>iwz&0 z!^=}pXUPXQO@z+2;4&j~QQac)>e>^ADTJ0mQ zSPe<|$kvtY;_wu^HIdbc4Oo*a>cbkvEsAn7O)ODM8IXxyJ;5unZy=Q`)X{tvDGNy7 z5)qs7*K76128cox!N)IeJCBXjdMj9Jnz}^jOZ8O2AZC8y2R_w@@HkX0G9A#wf7kRS1z{={q6PDDN?0%oh%>K2^?mWaE>1I<2 zl~y+>!Z0=hnL8=%^1*FHi6cf;cMk*!o)Y^07 zZ(7G`+2w|=M$`nF<|rd?n~Dzya=$V5@C8HSlR~mUuz%dDFV$}*c-}%2bpl1>S4DTX zHL0#@1 z+^YT>IiZ+!K4(B?Cx%@0+d5BI;b8pJ2Ug-QJfntr_)S{MNF;H=5VLbo;PKmVdKGP4 zLgI)`r(;cD%km>MQ3Y6e4jy)YFI!Zc_H#XoOeSe;Lw)})ClQ)w*tSX82{ezxp(^S>V?bTL7w zm`GznXmUD{SZf$WEO-MFn!~ppx{b0~O+ll+I^DYwjDA*)C6-#UO<`Yn)f76N`7=2C z?gvysKBbIl7N9L%hBcVcM#RYem^-a|OZat0n;K#Kw zCFo+kMx4pcIH9K>D>h=1H``_mpb_L9x(Kz7+JcX#CCN4`f_wARucjO^?u__3(P`g;8k@gxV8hfh)Q8JAuByTLe07Ig{<1jH9sW z&ukXeZGgoJ?r&dHhq^=Xcd9#2TRme>Wk1DQ!&g$PUiaohYV;yS5kWHV7*|eHe87S7 z?gry-vRQQcw2lW;9+eo8T}~-fmsy;7lyC-BZuR~Nd%vbA<`)-sj;hGz443Ou5tTJ% zdD6wW=&@#vOww}Tp4>?B^eXYRbIB5fWI$+>{eRw78}MXxs|SwxyV}3Pe|I&`KMQFz zjuSv#(>JTZYbPubE?YGp4Xi1XiXuOb`ZN~-w07kslo8o4Ao}?{1$egxjBnBJ#9Y%F} zT1e!8ojL2<>+AEsY>sWz5;|e;c5xbWvX(TxyPB#jrnZL_B(mY{W1#qJ_gt#2r$mH2 zOY6G+-Y4pMo*nbF>88;UroI~a1JfP$MqMzIRLghU1^aE@@5H{K{QCB52yS69P)ll! zd{#B-C50>=q*(W9rE)${rQc!l{YK-fUqzuv&@8nxaBTkoTuU@e$grph>zP|^MS8b% zbNUYLcld~tEG<>$*y)u?S#3!v3XzGnX4~0L!~^fYWOy6wvFaA;*W7z%O5bQDcXBYl zQ1%m3_X0cld`7FSwXAYquyM;R5fy6{%2yH13a_bW(@l@iZ{u#U9vH&L@eo5%zHbz= zDupP#_WJt&00=(oeif5TX#F*pi&Ep^&cP5T6*Q?T59Vh(c5k0Fuv%Hgt759Ej zWQBoIy8sT}H|a}H;w(&e1MtojvI)ap1?;Dgle#MPVm75}`8IOr(sJOBOs>ymF zQ9y}L%B%F>$N9QzPb3~0VXN#1P*oX3p1Y5EI*FCs-XUtb-N ziYN60JV8W{WRv^Vl%E@KxFdXB43^uPkD;P7rqj^c6r0NxgOb%(2{y(t?kx{ z?+4(@o+lTgV#Mm~W>+g__Mo9!v{5QizYva>8xl?HPa^RJfJPv0f2~ic_;>6Rr;P6&i)vlIy+=v+Zy%9|IM=IDWU_N3jK2dVxnbn+ODh#B z3Hdzj?a;&G=%(NV)Y{WTY8?@U*11Y~tyzB^dd_~O zD9hBLJy;M$B=+Q1VkVsY-dA8epL5Yj+Buh4bdeR)s2fS|eQ08lBuFDO@#mmDu%Uaw zrS(3!zoJc)k5gjmS;*%oVkx||xU62RBE`l-8%sNJ1IrK(+sH(4$TY`Ng5tUapXrrK zhBB6GeOIn&OLG&Ek_^vrF{c?zNmRX;#H|xOnse8GQ6rModd=z2ZI!nuRf75Y0n;CN zR{JsB?f^G}ptE=(sv_K;oieiM55y;8t!mv>qaxCoJsph7!*yFy%Z^NW&U*1o*6htP z6_q0h+b=Mz+j#o*+Kmsy+ezZdI>^bu2-BcCCNNzJcP<(8vg%SjKYHdz=RP5cg~)1ylv-mKmqQ@}s2Jhz3X zdBXRuz58Pq6M?rjv4>I3p(#aTyVb|q)rkxNW0?%qq(q(=zl_Q(T;l|`_ zcKY-_BB2&&oF#T7s$JFzK~E&G;VjE#?$0E~c-lU2Ri;(8^hk?~JcsGXaqtgExDs}X z6_`Nt3eEfr>I))SGEj_y!+R$hTe|T?@xdg7L+SJ456U)DyAn6?w_0`$oY5mO&zY5f z4;j8-ha(NT#I%JX_v;*M;c%j;ZPc$hBm)I!A<)!%S<4ZQnrwyT9!CPQPj ze|#Ahg7ajb(-<-}%!O)I-yU9_rMFhX)nhu;di$>zu!nVNRQU7Y6a4Hf0R^`Xfb*GQ zOHuO-THLp$G1g8pycX@lT2QjqgiB!!$rQ*zoPs?e>HOS}$>-_Ngpt8&0AotBizk}J zRseB`#VQ=r8EvO*>UJ{Wp%Ohl?kP#+#DI>ilKjN=LgpN|^YeM)Y@rpbG9r+wM=; zoU+acSt!u@z;z3$)WzZExcwEGplN4>p^2xTgOWb726*OYcpJB610<7ShwGv%-aozuqh$Z$WnA>NWmtr z`ebP9r16?U&K-QKeDjl7&fE8=RO?Mu9=_N3T~VZeCd$uxv@7s8@zd9cBoA7caZZN(+QG@lV>y{T1WHdoRdT}K$upKk-Lic$)+z~4#)Vzn{`d1G5L5&CCB^lxmY z#@MoK)yZOn9*tO}iz#a+lVi;nX>2Wd8bzZ*V*FQS3>WM4>CVbP^C=hUM-~~tMGs=G z{rliYa`0WH?XHr_Th9Jl9x}`>&|tDN&nx6%+Eot)FeI@hi6*flDe`=c_8lf^q;>&g z+}v^pPT6LkPb~5m4an+xbCl1xUBS_~F4xz;*gYEhx*ai;r6;9cy@;#fvy;H`OL3#! zT+I|SY);Hr>{y>WZE9Xr6SAP>UmZJ)2%(6!r8N&yFtP`Jc;^eWKjRBXVS8yyE!-(& z!E1d-9myk#YD*MY_J+)HrE3>TDGfP|8KfTIw%$5Snn#Y4P6IDf&#$H@Nf(Petup=6 zngiB`GxSg5V!pG?#9b22r*f7vG%Q<+2lVAcuoYvp@sc-fmw%^3k(Lfr zu#j{FSA1i#q>(P0h9{DEAZ3`HbjDK)r-qodlhf^ypt9le7vOt}YOIO@yDVx&I+8@3 zQ8^Aud>^xFQ6q^|6IR2f3|mwd0_nSY`(g)3_Hw2c9c-GxC5Hj2vNtIu>X|ze)p`=7 z(=vy$#poL>%)%u*fZGqQ$(htg8moQi=D(-U9%r5Pf^;`Pen-Ag4L{rcX`nl$t@NIN z*BOVz$&aTlpN=b~F_@!hPVv;p#dTqOZikAhf?SP`* z#g6BFk3dG60FS3T!Mju2CP~Ul$r{`>!9KXW)jx!c27=P?ooRNKa=ogTtHo=}yKAQYS_U0V6j?G;WY3$v4Eq5jPz38RkD78^!XPPkTu(NDI`*p3S z-l4u9s3Lplcpm&`tc=k}vO?c*spjX39R^SeABXCH;@WhycDT!|^)7RNhj+1*z|le{ zs3xLdifF>N$a!ox`jC8bnLI+$!~q>oVtp?s)ySZb`-MiI!43SvAoC^i7S`}^ZQAq&JjNnKQi z0=n1bmIF1|{T1B>xqCa@tk}lt2_nBo1&qlGl`(bYiWi0$Hz{J&u)JF*Haj@qj{6># zvb+EW(;*r_+_}*~VmTMFq=K!!74o<~b%MGF9u$0s@T8+(G-ExJM`kWRuBUfyZBL zCW&;%!W@=w>HRUY+uz0pxzn0W^j?|LZ<{Gvooq&>!AmSQX0^aT{AqEXIGM>_L)(9` zAa&jvNa2~l_Q{bUfnjB=#02r+Y97Q}SD8J?_+Zl3dBz-(Wpj6!4bL~eCyL0&5?H+ehW3=VX zC#-P#ha$4z@Mb#X>HAMHSb%Lde?yK8LItS=bgyQGxwyGE?A2H%L4sHhpiP z#_qG!nisgbn%!L;u53Z9FwsYjeI1a9Cr35>-F*&~gC?38Co)H>%Lko9o=QtniC^FO0=@rqwsd+%;0LpTC{Gy zr3=?LxIGKkD@Hv>-plha8eYOvEbBY6iIWrQShA62-7_VP&^?iRtyZD2P2eSL7` zh#iuWF7GSez3o*wsaMHqy=$J(_w7#cTZv_}maQGhW#;lcA&g68iM%l&0p#>iPfQV^ z4x^`TnMs;S1C~%**QOKP&^m+sD}tqr?k$VLwnB<(tfpJjw=LXK!ef%XI?)x57{~;v zI}mp0T6koVpG*~bpg+z{rxQmM?8fJ>EpP`oo6YvP;5B@h{0D6mHl!vr)HSDo8!*?6 z3>GG)8D)WxN6V8P$1VJwx+Px_d9?rm{HOfpNg}E&ti{-I`J5N-Cu<rFkIe+gk_igiGX9I@Bl#P#_p=OOTX`5#=MNZLr}k9=%9T!2TP(>br1#OQ2w+nS|v zxx7|e*IBVSdK7QNL*k-hv71Xgiy@2RHXyQ)+|e!IzVJBgaVxoH)?mz zOPWs|TQ^;`m!&oP7V?&C8u472WMqP9;j9eO(un@h2k-OuJt>u0gDBfW6%sUUC@sON z_5-$JuzNbWOb)M-mbb@My^pU9nCvY%z5_3I8s^OLO#7^H#MWfpOYVGm>4_$-5tMCZ zJoDEyiDyEffK|CY$I#2?+0Vq!;p?^894~LH(J?l%$5fguK4hhgeQbpAs*tZ1=?v`B zo_vpzzj4+m)iS>7+B@XZX^Nuj+ExS-4R-_AAJf**HMK2Tn2li`oPBU1mgX5Q!r_?_ z*(_CpQ7n*$jd=XOBOUy2=dAIG0@HGi{+Q`Rl0>?uQ?PIkZ2#7X&p~P|Z!BPJv!Y36 zxSlayv&hZLx2GXH4UA*SU$x6 zkR{k|w82|-kzw{lSlfNh$9?>C#&uN@p}%^=kS`l<&I#(>BZlq_(c*KlTFL3iHkN4O zylFugjI&oYlzfsWBh2_=#QhHAq=}@9cZXY#7zQ9fX5qVHhYQ*58%tXgp|p;364?2R z+0>I5LrCioDH8gz{=IHob|CHv+uLK&nWo$K?g{i5afS%vaNAugHM@-ZX9Ibo)fBNA zyy=<|UjG23o}_RzvU)MHZltm~48wmPUk7fABO_kILf|BJcBdI7Rt+nrqN%QP)-cuZ z)ayem^lQ;-$sL4f*=F?740fhQO`m^1F+WbZnn$3DOZUTCjIvqWdSEW8{7GraE3PXM zPb={E?Yh;Gexy4^~J{CBJQhE z*ViF+l%2Z39VE8;p++;ScV$jIu8GV^9wH)1wpXQlwUu&L;HHEh{UYtB|)8b26C`Vsp5TGy`F|*aPk3p|xe)jmY-z zjNa1POI8Oay)i}I@5O$X(OG-g+y)6X##18PY*f7xOB5Rs$cGCgWIMUyHyls(@NwyN zGCt!r#2>x{KuNV7e51I_1=`NyS$!=>B$__9pNks@@W{*Gy<-UV`1Dm&sPMkrmRt+Y&TR)Z+AvZyZw-xkMXzP(17h z@z%4mC{S{7c!cQnSY?@_fwME4G^6A&|R+X7i?p>t37i?2>`%Y++-Q{+-47=mO0$twv{qg`RXsC-!D8`v{IwWm6r+lz zmzEgB69B;$D&(MEEw_+-`}HU;d1UhU8OL$lK=WW8qi*48s@P z9bP%Ib>*_w@-kYH3z%xx4a~-DKg+q_Z?8cfm`Llifd2rt5plV~{u9#~x))sKd%36Q zuWv+U<@m|1+nzkGDjKxXN~qGo8MwJ9WY>Kib+AWN*u~h8quzsHUzOJ3<_c#~uoaB$PVyWtcAD^52iS8+lW0 zAXJ5z_Z(qxO|a*_GxVnT+~um-Y`&MotO0G%#$a&fhp9>>9;e1iKm6sqoyWJ${W?QX z3X#U`eaXIY%8RhL9P~W?oM9#oY?a*n`D}K2jjSbz<$z)1tp#fe>fBn}%1TUDH3#L` z`6H#Bpr|NAj_1BV@FPaZH+uSE5XB?3Q)$+kOqGiTE=^hD5;Sij`i$&$B~&5v?u@tCYPVwR4Had|5$@>y&(fos!*N=!9ol0e00SloCUdwBjX5y3MD zoY=3HFYQj70)kfm0DN`!qNjbeCbYoK+zL3YF^|Vn9FogCxqHynK@O~$u#aN)$D6C!<5L=jk!oz{On{6 zzcQo~%C>X;jIw;H2Y&5o<9W1*w*O)l0>2Gm0KQ9e@9qbmiD z2Vi#_ZMMVedLgLO#HYe<5$~xTFpw~E>JI~^5b8e2_RmsbvYJZGtlW=0Fn(%e$=KQH z?fPgPWZ@WMyiX7ddHeX})lRG=R8eD&F>EA#j>pOykDtD3Xm7*+0BSpP99A@z6B`Ap z0n_(j7*IRleWptY<8~4;&Pc> zE>|0vNoBr}MUICbWHrVO!4|xuldVuT-J5N~lk7L@htkNZBm`F8x6}RRt9Xb2>&_?p z<==kd=zP^2Z5=MPv|~l+&u**|v#ipE9-6$#@bXN9?oZc$9SZ57WLFYg-k6AFELkLK zqsB73YuwC!a~ShsQfaUJ8XL1%w_YWYHYL{F5rhF$BMtWe{kPwsqO7}(H>ajO{{RCu zc`q9}aN{k}{PRX&ak$%+CbE~EC?qL*VE+K~4-=$l&gHk*?d}KI5;8oj%$kV{AD(K` zZRCi^!mT}r$=uFa)h(%`r3L(Wtp*y*${`jY9NJ|<71}}p1Rck>-=TjBM2!r5gUKIV zuvz>ibTRHE-S@9dAI)X4k^D|mRB48~tQ!?hrYew>%ozGjJgEs-*;~h*j^}=}!gL@( zr~ofE#{?=&z8F#q{@JD4-qhi=)%);i=&oY0*DZc*@mgXfOE!whBydKo6(UkdAbH=x z{k~TwsLK1?11ojPgmNTkh4?{38QQl@YHC=Ui>B|xEZG9m*?TrrvLX&8VAvHvqsbeM zy!&t!?s<`&v9KvSVFXuFB3uvgmR zB)Cf%Ij!JpqdIQJmP_KRBryU55QEt5x$ELTi2e!uAvAMK@z00C(Wt%D10T#${qxsP zh)xw&LLMLeh5rD&>P3$H{wez-+vKU;4Q+(g8i3MS?cc`X*BojjaPo9KC2iZm@&b7~ zoxCXiZ}^|UJ_WDV-@$Z`7MPk_(}p zLj2LbUQE53wroKRgmab|D_Dp#H~!P-$6s-z{{W&oIbe=?J~K3OGLJ6NK%Y##rqE5{ zw3>1l4r;T;Xa4}k5XMP7HT8et-Wv=yV97lTiNv2fJ(|$Blh>`K{{W&|i22ih6Uw0X zJBReVY$xG?fdsGR{svA{{{W2_VKwYBSAWBw!siTo#XW?lLK7n?5wcHSa?BCG``v*a z-Fngg0Mjqx4~Ogv{8Gj;eK&FW^u|plfz*vWt{*O!;S0RDF8yikMz2B~K2qPs)Uk~( z>W|B;ArYbnQR*a0S7WxvZT9dw_P4lU#Sf0y~s(Pp0fze(wOMTL5}%oZ{TSf~;Dal;5wB2mRz z-0pTCe!rjJ#?{Vh%(6B9XSvT^)Xym&%uZLmb==J>h>CvbcZXAB^v7;6#ii3&T&0w& zK2BBn#fhMmS}@e%m$i%wI03!vbSQfjNE=^1Jcbn($h3OvQ(24;DMPDHte|$llzH15G><)?1z0JmH+`d9cTTx}PQN$pYc4(xMDC{#& z5d}&4O9DwgeaBX+!kSjq>OLOQMn4EWK=sbi8Krqb*j~fdvfX#){{VGt=}dNu)0eE| zqp6Ntv*sd>OA=p}v}Q(WB#grs>NI>v*l+9(~dDEX@nNCFfD}qzipCrl33Z9ivj>AZ-22QwGFEpnD%RW zj)T|J7*;bH5&r;i9&-f@?u*oVdnbm?dXZu_5&{ClQ2j5!w;CZ z^*(x*O-s(`x}8lro-d%o+R-Uc2}6=`=d$tRR^?3{kw~mvoFppIiDfC}H&RNn$awK1 z#@}y#o>n5q{{Xm#fV>iV4X4*D4o@@OKIUr6baf_$xq#CcH=Pt+wOYk&to+ZT9ME%C zR@p-^X4sZp&(zYxPoq)cYXp+Na1E&W;3A_2kwM-L7v-|?Vz796T7ykAIcj!^r9&Pj zG{t0KBV>4n(a54ee{SHPm&o6#;*HBp&}u_OM&2Jr~&xC6ujKC6LlbTeDP_od~3=`A`56s+9R!K%4B_jr@VvoZ8J?u`bwU8cO7! z!%nJbSP#g4BWaIs04EAcAKrQ;y|6c7N|^20-zmw@^k_(vKf`Y)GCvp!T zeS)7#bcMH;GAZDL$LXCa$0HR{Yn9`@y@t`$Ak1c_%VRW@)>V=_k6I6fc#slffIV{Q zFCUcczw!VbF&;@uAk#FeJv!n71srv}M)t?E8W&4h!Ri{-Z0efU47cs(r;b1(;N`i( zhB(mf(laU8@44G^w?^{MQ$(Od_5dEgJZkW2L6-M7s4Ht-Ich9hQ^x!SAtJU_JwH|y z2tatJiXR+QkCX@Fu-mLy`~s263A6mTwiRrv##X5Ni!LJ}jI)Eo%cylcSD~wsvx7nK z^y;Ik$O|c0QUx1$XMb-#-CUYRA>)!@kX3-)&M`Lb8>|DDLf%(TS+k4Hwm&#Bk509= z^l`-2Ny5fGHh7|F$qYx0w&TAae!TRDQer7-viqKMNK|v??~7danz7%FMOQ@SY3Fg& zsWF;ca@Ce9mPClIiyY3W9G`MG@W*Y>f*u2WHWR2)j9aigjK@(e5Zy2%SN;k01`@1! z-qV~#yv`cO14k&TA(hwVb_k0bac!9HyZpqBy}B5+`e|J0{vgh%!t7vz@sL$_3}<2S zKZqS8r?mBrMJ6Um{w*uyF_Fh8#@DWRi6(++Jx@|t_W*D8*n91`#|OiueL_H6fok2) zvG&RvPz;J4DMq!Kap_;}M%=-oSC5V;%o&AE0La^^!S5D93J36zB8)y-VW*`nb;$}|RVs)NY=Yx_qnho5ujrMhYvQgw_7 zujEcp6MSTL8C#dO@^;ZzBZ;e**3nqYJ(+RFG=XAiB!3~K;C%%3HXCvQM*DajRmQ1` zyDUClzg_WlwU==OW7ZunPg}z@_}w+9G5U>Y2`oo1qSm8gh~^n~0##!6Hra_M{{U~l zQ=#ycQe8`!w{hu-kObVwoaGAqN%mJ(Xgmd-VFpUxCc%vhWAT=+t#4JFqR0|AEP1qn zh~3E^b{Ew%3DAUF_4^vr!M~i7A%71LDb(6k2i%Zh8m%os=r<~VUFu^>qd^>XD z(=)Hk!4v-ga}&5Ac{`k1O*xs?II3~joO{o}Lie2m>^I@=h7mE^lThW-OET7o<7+|$ zBZP~~^&@cGN%9T+?oYQ+OD^E?CY+9WCpa@uv(8x!P1}09s|}XZ*+WkL7Q|9|FiRY0 z6Jp$$Fi?5%B|!v@o5=d~wJ8(FDkV$MpIl2O?uVSK@OBqOVzAjNO^kwkWv%N^1=yoq zfZXq0!BS8Sz}vw3cs&gAO}!*mB1P$6-whNn+THT6SL_a-`23J~PI0^Y-?%Ov4rJ|eu5b@gBEngVmp5taV{yB(3#x!ESQqS_1{d8<5D zm8&U=#A(bcD$V98UNql-2V>+CLF<)Z+6JXdka)oajl#Ifp?k3UhY^X9EoWde&d##R ziy43;1M_m^HY`WK?cd*H?k-_3VlzVw799^5yw-Y2H1-y)X|g{Owjl&b4;PXzOJaE_ z@CM32J`Vej;6}FYAC`B|-Zzv0b0o?9KjrwGJ zn2;)lDppWA#nwhAzl~!~6ALIR@-PxepDz5iJ^=UI`1k0-Rfac!2m~6ynDqWeHjg2V zzbqD&`AFz~SpZ;2WGqKE-(pAc{0^4s8>x-s1%2|Aoq+@j7~0Yu;nmt*)*QrbC1^_V zm((v20B%`Po06X&(Dm~_5&j<1>J^?bwe!`}d`*?Mo=5b{d!qZ%r}Y}e>R(E>h*c_F zsX|qE8>!sww~rfr_usFL)chk^ptG=;{j=APQ55!9f;x<_T3fg|tR2FtQUa4dHH?%1?fTrd2kZM!`gP%I zehiZ-eWtH8PTU6^oa#4d{{Z4m9Fjn`b9F7ms;pyq5u;=!RJnxm*bV;x%djo)*N-p3 zUN16_%l+eRB;c-JZ8`X~>}PRctzTDRaPqvXw3a_(a-!XFh<@S!0KxwNuwBCw%Zsz6uSYKIro~z^vY#!nkx=d7)krVb(`mnoJ|(8x zvTfeHtK8Wh>R+{x5!!CVQAX4gsaG9CE25z}q=K0+4v}BofL99zLG_&;J0e zy4m*qrZy-uBYy$Bs4FWzum1q?ckX2Bd@|{~W~?Wej=hN7xmFFZ`4s%_Pk?sctMuQ+ zo(peS4*vj=!I9O$7@+?E`+KvPwU!)S4^vYGHkoTX@tPt30NkVzO#x+)k1E^je~%qd z{{Y5tyMsQRNe6;QPnQ@db}0zNU#4V-{sOwfN^4Ty2T@H#fTba;>Fj{<-I<+^`yW40 zPrq1yjC6s#NaJ1q03(7`&vTiofB3r(b)g^OjOwh636LN_6__2EuEY}FJnljI?b2KR zpzXSX$o9+{e&-%~OaB1H*T7eZMSD!&B=J`GyK0_zsXWYR#Gjb?-}>$Jif`lHYc-~j zZ64Tu3fSX{^~)!t{{Y|%+iY2la(ZtFBZzK3CH-&!;m_rEI}$yQx7>B+%lvQgcdrc! z{@8zJj>o249^Ze$7qGfQ1#F|~>J_SN1QqLJ;ow(t%j&WgA28qFW9~ZgC;lP$q~w>K zRgZFi-aQZ?+L7gl!TuV*2R)r?mNM|-uB*zto?k@5fO%JN8F(u)fxphg_yccfPsFt| zOgvp%kUE9$k1 z?TuE9!Umt=uJYekI0Hp5S83q^oWG9+8>yuq+Un_^LiN#H%;?2{&e`w*7 zA!&>uBr7YSjoKL1_8xW{o&CM)(j%a6VWwLYqp-!jXenZrgV2KVMH+lM!D| z>Lsx(^>KK~RwEwsZA@9@8?lc~At9Za@3(K2&YLPL5^L_)>}CWns{cLuR!9 z0LmEQKWH!%`(YM44T;O==~j~5=>_}q{6(8(8JbG5`i%0%;ll&rfp6z-hgc=mJdZ3f zu>e>CfcMT$q=z?-zs)pucFr>1X0~ETv3WOXEz1?E)@G71>N`M+>heMv8`u%Q(0lba zgQvECfjT2$yNC4%z>WPFpxDsdA0Be-#!N}%-5;v20S*vtbH@X)~Sjf+h)bZbW>rYlT ztpsYYJGFOc@)y`v1 zO?M$?EOmG#xnpE``B`HNKGL~WUr~m`+jSlbd{|^GG(?HO9%I1yVU}QakxQ5{c`PJx zY5fy{(-v_!l++C;2~@#0O@zm2?5SoEL`LP6-2onUK6k*ngn6|SYBxw0xahwuFE1qz z&mKCvx*DGgWYoW><;7C3Zy#3#kp`A2B2|QL3p7t6ltZ}OuMxMNqSM0*fXhDiAnv}n z-QF5)3&uJyebUp`Dq-#FrH-1|vovs2EP39zA@yS1dVn7w5DyR(?Y`u1Ec!i1oM{Oy zLeHSQd^5yT&M;F}_eE%EJp6x@nk2!Mnw^wIi-c<&jZ{e~XeE(l+%l3_@%G=w^mr0@ z(6Y&6i~jhvF#<{CUQ({!ekb*|rkfX!#NjADrNQNEt=h$vTwrLQ`H3S&QNmFaKpn{^ zbsOvf>(iG*ritC4vcF9$A8EAau?{MGE%VCsul%!Vr-wzUK?-clm6 zj9N&&E=PlgU6ikb-~xB+%xJzVr&v&FmC>4($8TJrV-6NF!AKd4w||HZ-1m0wQxl~y zvrCl3SIEgnA)Jmtxe+Q!%h8rb99N6J#BZ?MbM|((NvzYvvT9}mCL+~)U=bX1EM>P| zRod8m{)g^OTg#2cY54ND=DHRnQ&z=+JggKCONfYkg}zBw*&8gR=Io8g=s6%bK#CX<}NiLkXTkR2bRgg_Ms-n3w{7#0~lxQ&;@(ZPJt1 z498!OgNq*FXx$U1>1uq%tmaiNNm}Gm(t~(a=bk4J!vrB@NqrV#S76Qb*|+&)MCxe8FrNJ##oa~#inxhS^Jf2>144gYE(wFdA@Qv&5}!VmLDVdhds2);&j~FKO$~jk%ppK>osUGQ-Fw86;Ufm z8Ad-bQ@-2(07<^U`kxZ#0T=L|wlL8|G5C+v^ccqON8%QamC{eCG-haL^SN48Qr0~^ zH#l=6v5B~!Od~`bZ@6EW0q?mI#iTCc9ZVY`M&SPd<%bIfEbKolR@d)`YCEevTl(zr zwS~e~t!GrDEEizC3;NPU1Z>XmsF(xfg(uvfewc}^&=*}1rFSP`9#fjcIY3FgwjI2@ zi=mERLR83VDf07I7_6R7b=_&N4~KX1>jYsyW5^XCk3UeRm1Wf;YNSY%ejuZ%_RT~< z9l1W3{{XvFGpTVnxH6K8salzAt$cj{04=sag}{~8PDO{XAaUGz=yyd6yQw8f;`?VS zlArs z<+=hp=IskhJ9$azl_uuB{98U}E2b=9Fu3XEtvuAi*Rk->Ec}uQ4Ur&b5R@Z*gA$+X zSM1os=F;kLjH@sZr2H4W=tJ{{U(`jV7bRU+(5o{(AL`(q*N={%stXyWW!- zQaBKLP$3eNux?6yyc4jsb$U4CkmvvaEpDzxO)Rp`rpDB|#oyv15spsx=>1h^^Q=@^ zDKUd7942X~P>UF`!Cth8(n(qUD38u|VmDLrorhEWJ5eE7Al|GN>(t&lVE+JNR89aD zoqoe=jUii1W35`%SXvaO#ZrobOx3Ew0z#$0B**%W`vdgb-`{S$sb_H`D1nQH=dN~_ zO;ITAS-S?Yw=9w5A-`WEjh$cr0H{`$IVz$;!I3>h@JR%oAeJ9(y!26(a7nOz4+j|G z1pr2TkGPs|R%W2bQPetaYthj*C#7oCEiD-~F>xuy*h?dTNZ2s<+uVXMI-z#c$>Eb% zN1X0dRdI}Z^`ogBVP>man#_?&V$Bv&T}zOptZT<*jBUv6u_M46fCXYoJ{j7hvCKv$ z`wSALjM3F~y^TeWa@v}x_1xTKTn>`;E}%n0Niy-NaIdmdhn08_spBb zZGf6l(+4|)+aBNdD&)6vvBzgJcVCHwESBlU8T-VE3vamg9 z5?!r&AeUKShz<8r0s1i5^yp)GM*jebKZU3rMR0%K6w9W9whhhP4_qVeXKwRy;L}lM zvb3OF4lw*pXRxvbunC$)238HqFr*eF5#$rspEjx(NkU0xJY%%5&#h?SiXvE>${&^1 z*7dfZ8Z$pb8{OLg;A}S?PQg}h5(X;ed9(eq z^uL7v0MlJ=t|KJOv7-y;u2&6Sk@mk-;W6m8H0-&UC342UH^@IVjPsCjK{`U=_utBI zvFX4~JP#u#_}BK&6XV~)U;IHv54kR{-zyy1p6++UTUyarTxF{DF!t=hHdf6*uN_D% zJV?PkH&g3N7zzmGA=_^oo~VoA@Q6;N(Xc!5&P(w90GCxBkOJ=AJwAESuFZBEyxKbf zcGF}?y9Pa;j1t1J*jHGTtIm~bacPSv0Lt5h@JR8}d@T}<@u}qbh|kid{{W`ihS0@1 z+8mAtujSW0*w)?sqn5zjl`#5)DJw>|aWo^fHbxW7!Xtti9HU8I1uhivJb(wl>c}+z z01q-r7!IlGdS~Qc#2Q^!!{j902d%b#t0@VRMvYv!l}) zs4HT1Hcr~d=w>mK%jsU48*(w)Pe_(fiZ=dzz-c0ZwF)GZNfW6dM^Rlk%3P5I(S+SP ziv;@POSjpc%)7Z>egiSSQEb@%l7(oz|+Q( zCZkEX?((ln_w>AlnqneQ0iU@)%ksv)S6Jy>wxGY;eJgpO&%uav#N{nnh4Ir#W)n0J zNspNorXHgY+CUz_k2@f|+ZtIEcz4JHo;~sG5&;v-$ZV~8=TGQf-}d(`o#D=6X4Z9< zOF1Kf$4HXAKB~(dMBx;MvRMjuJhy$vpQ&(p=8+rWurY-9CyW00Q9$n_vxQVVkC(5{ z2D?F+9n-+3q3!Zy@rHzO#AdZx7RF-g*AC4Dk;uHHXNd2|W(s_QJoQYPIU(azfZuN9 z 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�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̝dXomU8Z>ykw2v5M)g| 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%0APlqgVy^VqVeI|Ju`^qy4Xu4tt+ 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ⅇp2)n;nO_0GhOHimUR-Hv&EsL#Z!w=J<0)2o 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 Suhty7S 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�~IN-C&)W=D$+15x2`{@l(#u!-?*5nc<3OS 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�{%TeZAm@myg`Y02fnvLiUQfq-D%c2lx9 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 Date: Sun, 27 Dec 2020 22:28:03 -0600 Subject: [PATCH 153/750] XMP feature added --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 9b6c3d570..63468df99 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1327,7 +1327,7 @@ class Image: if self._xmp is None: self._xmp = {} - + for segment, content in self.applist: if segment == "APP1": marker, xmp_tags = content.rsplit(b"\x00", 1) From 096854d1c8ab61f3cfae6189665dc84562bda1d3 Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 22:29:51 -0600 Subject: [PATCH 154/750] XMP feature added --- Tests/test_image_getxmp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index a2c400794..4d88fe620 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -6,4 +6,4 @@ def test_getxmp(): type_repr = repr(type(im.getxmp())) assert "dict" in type_repr - assert isinstance(im.getxmp()['Description'][0]['Version'], int) + assert isinstance(im.getxmp()['Description'][0]['Version'], str) From 3e9403af56e52562de0c265d1783cfd9a5f5f27b Mon Sep 17 00:00:00 2001 From: UrielMaD Date: Sun, 27 Dec 2020 22:32:42 -0600 Subject: [PATCH 155/750] XMP feature added --- Tests/test_image_getxmp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 4d88fe620..91c6634f1 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -6,4 +6,4 @@ def test_getxmp(): type_repr = repr(type(im.getxmp())) assert "dict" in type_repr - assert isinstance(im.getxmp()['Description'][0]['Version'], str) + assert isinstance(im.getxmp()["Description"][0]["Version"], str) From a39d7c4fcf2f114c643112506a412cf195da0535 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 27 Dec 2020 17:04:45 +0100 Subject: [PATCH 156/750] Fix OOB Read in tif_dirinfo.c ==3330== at 0xBD4110C: _TIFFSetupFields (tif_dirinfo.c:327) Passing in a stack allocated array is going to fail, as a reference is retained to the name and used later when flushing the Tiff to the file. --- src/libImaging/TiffDecode.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index bdb524bec..f33cbc6bd 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -573,7 +573,6 @@ int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length){ // Refer to libtiff docs (http://www.simplesystems.org/libtiff/addingtags.html) TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - char field_name[10]; uint32 n; int status = 0; @@ -586,7 +585,7 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ int passcount = 0; TIFFFieldInfo info[] = { - { key, readcount, writecount, field_type, FIELD_CUSTOM, 1, passcount, field_name } + { key, readcount, writecount, field_type, FIELD_CUSTOM, 1, passcount, "CustomField" } }; if (is_var_length) { From c68ddcf87d3efe0fe2dd98ae5c0f9f22ab613251 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Dec 2020 10:44:32 +1100 Subject: [PATCH 157/750] Updated openjpeg to 2.4.0 --- depends/install_openjpeg.sh | 2 +- docs/installation.rst | 2 +- winbuild/build_prepare.py | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/depends/install_openjpeg.sh b/depends/install_openjpeg.sh index a93498282..7321b80f0 100755 --- a/depends/install_openjpeg.sh +++ b/depends/install_openjpeg.sh @@ -1,7 +1,7 @@ #!/bin/bash # install openjpeg -archive=openjpeg-2.3.1 +archive=openjpeg-2.4.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 2f97d9f39..b358c18c4 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -171,7 +171,7 @@ Many of Pillow's features require external libraries: * **openjpeg** provides JPEG 2000 functionality. - * Pillow has been tested with openjpeg **2.0.0**, **2.1.0** and **2.3.1**. + * Pillow has been tested with openjpeg **2.0.0**, **2.1.0**, **2.3.1** and **2.4.0**. * Pillow does **not** support the earlier **1.5** series which ships with Debian Jessie. diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 324f91cd9..fb52cb4ce 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -242,15 +242,15 @@ deps = { "libs": [r"Lib\MS\*.lib"], }, "openjpeg": { - "url": "https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz", - "filename": "openjpeg-2.3.1.tar.gz", - "dir": "openjpeg-2.3.1", + "url": "https://github.com/uclouvain/openjpeg/archive/v2.4.0.tar.gz", + "filename": "openjpeg-2.4.0.tar.gz", + "dir": "openjpeg-2.4.0", "build": [ cmd_cmake(("-DBUILD_THIRDPARTY:BOOL=OFF", "-DBUILD_SHARED_LIBS:BOOL=OFF")), cmd_nmake(target="clean"), cmd_nmake(target="openjp2"), - cmd_mkdir(r"{inc_dir}\openjpeg-2.3.1"), - cmd_copy(r"src\lib\openjp2\*.h", r"{inc_dir}\openjpeg-2.3.1"), + cmd_mkdir(r"{inc_dir}\openjpeg-2.4.0"), + cmd_copy(r"src\lib\openjp2\*.h", r"{inc_dir}\openjpeg-2.4.0"), ], "libs": [r"bin\*.lib"], }, From 8f1111472b8ab40dfe1b7397e3295f7518b6faf8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Dec 2020 11:32:10 +1100 Subject: [PATCH 158/750] OpenJPEG has been updated in pillow-wheels [ci skip] --- docs/releasenotes/8.1.0.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 2284b22a5..f4eeabdeb 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -39,7 +39,8 @@ already exists for the ICNS format. Security ======== -TODO +OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, resolving +security problems present in the earlier version of that dependency. Other Changes ============= From 387ac3d7048c8acfa70db2f87a18b93b89b1bf12 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 29 Dec 2020 19:08:04 +1100 Subject: [PATCH 159/750] Simplified wording [ci skip] Co-authored-by: Hugo van Kemenade --- docs/releasenotes/8.1.0.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index f4eeabdeb..976fa482a 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -39,8 +39,7 @@ already exists for the ICNS format. Security ======== -OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, resolving -security problems present in the earlier version of that dependency. +OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, including security fixes. Other Changes ============= From 28fbc6bcd0623813f03970ebc13fd358ad51b361 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Dec 2020 20:03:45 +1100 Subject: [PATCH 160/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6b733cac4..00014753b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Fix OOB Read when writing TIFF with custom Metadata #5148 + [wiredfool] + - Added append_images support for ICO #4568 [ziplantil, radarhere] From 1892b2339f3d20cf4c8c92ec8fb1f1663e37cb3a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Dec 2020 21:20:26 +1100 Subject: [PATCH 161/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 00014753b..12e01ca35 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Allow putpalette to accept 1024 integers to include alpha values #5089 + [radarhere] + - Fix OOB Read when writing TIFF with custom Metadata #5148 [wiredfool] From 143a77d8e219274bece890be08f6ba104c15e47e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Dec 2020 21:29:22 +1100 Subject: [PATCH 162/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 12e01ca35..691a7a220 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Use previous disposal method in GIF load_end #5125 + [radarhere] + - Allow putpalette to accept 1024 integers to include alpha values #5089 [radarhere] From 8dd5913428d96cc454d152e9431fa150d1952960 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 11:34:46 +1100 Subject: [PATCH 163/750] Updated libtiff to 4.2.0 --- winbuild/build_prepare.py | 6 +++--- winbuild/tiff.opt | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index fb52cb4ce..2531d5504 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -141,9 +141,9 @@ deps = { "libs": [r"*.lib"], }, "libtiff": { - "url": "https://download.osgeo.org/libtiff/tiff-4.1.0.tar.gz", - "filename": "tiff-4.1.0.tar.gz", - "dir": "tiff-4.1.0", + "url": "https://download.osgeo.org/libtiff/tiff-4.2.0.tar.gz", + "filename": "tiff-4.2.0.tar.gz", + "dir": "tiff-4.2.0", "build": [ cmd_copy(r"{winbuild_dir}\tiff.opt", "nmake.opt"), cmd_nmake("makefile.vc", "clean"), diff --git a/winbuild/tiff.opt b/winbuild/tiff.opt index 16acabc26..d82c51678 100644 --- a/winbuild/tiff.opt +++ b/winbuild/tiff.opt @@ -66,6 +66,10 @@ ZIP_SUPPORT = 1 ZLIB_INCLUDE = -I$(INCLIB) ZLIB_LIB = $(INCLIB)/zlib.lib +# Indicate if the compiler provides strtoll/strtoull (default 1) +# Users of MSVC++ 14.0 ("Visual Studio 2015") and later should set this to 1 +HAVE_STRTOLL = 1 + # # Uncomment and edit following lines to enable ISO JBIG support # From 6b21a96578442cb0a4a806eb0b7f9de6682fcd04 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 11:57:05 +1100 Subject: [PATCH 164/750] Changed readcount so that _TIFFSetGetType can identify the type --- src/libImaging/TiffDecode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index f33cbc6bd..d86a42915 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -378,7 +378,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ TIFFClose(tiff); return -1; } - + state->bytes = row_byte_size * tile_length; if (TIFFTileSize(tiff) > state->bytes) { @@ -578,7 +578,7 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ // custom fields added with ImagingLibTiffMergeFieldInfo are only used for // decoding, ignore readcount; - int readcount = 0; + int readcount = 1; // we support writing a single value, or a variable number of values int writecount = 1; // whether the first value should encode the number of values. From 4056bf529e12744d50f9eeb19b48bb75e7789d2e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 12:43:13 +1100 Subject: [PATCH 165/750] Document #5148 [ci skip] --- docs/releasenotes/8.1.0.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 976fa482a..79ed507f4 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -39,7 +39,14 @@ already exists for the ICNS format. Security ======== -OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, including security fixes. +An out-of-bounds read when saving TIFFs with custom metadata through libtiff has been +fixed. + +Dependencies +^^^^^^^^^^^^ + +OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, including +security fixes. Other Changes ============= From 3757b8c7485f9d804f4a96772384543b4fe59121 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 8 May 2020 19:48:02 +0300 Subject: [PATCH 166/750] remove extra i8 calls where input is proved bytes[] or int --- src/PIL/BmpImagePlugin.py | 3 +-- src/PIL/CurImagePlugin.py | 3 +-- src/PIL/FliImagePlugin.py | 11 +++++------ src/PIL/FpxImagePlugin.py | 5 ++--- src/PIL/GdImageFile.py | 3 +-- src/PIL/GifImagePlugin.py | 29 ++++++++++++++--------------- src/PIL/GribStubImagePlugin.py | 3 +-- src/PIL/IcnsImagePlugin.py | 3 +-- src/PIL/IcoImagePlugin.py | 9 ++++----- src/PIL/ImImagePlugin.py | 7 +++---- src/PIL/Image.py | 4 ++-- src/PIL/IptcImagePlugin.py | 6 +++--- src/PIL/JpegImagePlugin.py | 19 +++++++++---------- src/PIL/MspImagePlugin.py | 3 +-- src/PIL/PcdImagePlugin.py | 3 +-- src/PIL/PcxImagePlugin.py | 11 +++++------ src/PIL/PngImagePlugin.py | 25 ++++++++++++------------- src/PIL/SgiImagePlugin.py | 5 ++--- src/PIL/TgaImagePlugin.py | 11 +++++------ src/PIL/TiffImagePlugin.py | 4 ++-- src/PIL/XVThumbImagePlugin.py | 4 ++-- src/PIL/XpmImagePlugin.py | 4 ++-- 22 files changed, 79 insertions(+), 96 deletions(-) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 1bcbe93b2..fa096b89b 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -25,7 +25,6 @@ from . import Image, ImageFile, ImagePalette -from ._binary import i8 from ._binary import i16le as i16 from ._binary import i32le as i32 from ._binary import o8 @@ -97,7 +96,7 @@ class BmpImageFile(ImageFile.ImageFile): # --------------------------------------------- Windows Bitmap v2 to v5 # v3, OS/2 v2, v4, v5 elif file_info["header_size"] in (40, 64, 108, 124): - file_info["y_flip"] = i8(header_data[7]) == 0xFF + file_info["y_flip"] = header_data[7] == 0xFF file_info["direction"] = 1 if file_info["y_flip"] else -1 file_info["width"] = i32(header_data[0:4]) file_info["height"] = ( diff --git a/src/PIL/CurImagePlugin.py b/src/PIL/CurImagePlugin.py index 35123f789..8451fe90f 100644 --- a/src/PIL/CurImagePlugin.py +++ b/src/PIL/CurImagePlugin.py @@ -16,7 +16,6 @@ # See the README file for information on usage and redistribution. # from . import BmpImagePlugin, Image -from ._binary import i8 from ._binary import i16le as i16 from ._binary import i32le as i32 @@ -52,7 +51,7 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): s = self.fp.read(16) if not m: m = s - elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): + elif s[0] > m[0] and s[1] > m[1]: m = s if not m: raise TypeError("No cursors were found") diff --git a/src/PIL/FliImagePlugin.py b/src/PIL/FliImagePlugin.py index 3c88d53af..5a3247024 100644 --- a/src/PIL/FliImagePlugin.py +++ b/src/PIL/FliImagePlugin.py @@ -17,7 +17,6 @@ from . import Image, ImageFile, ImagePalette -from ._binary import i8 from ._binary import i16le as i16 from ._binary import i32le as i32 from ._binary import o8 @@ -102,15 +101,15 @@ class FliImageFile(ImageFile.ImageFile): i = 0 for e in range(i16(self.fp.read(2))): s = self.fp.read(2) - i = i + i8(s[0]) - n = i8(s[1]) + i = i + s[0] + n = s[1] if n == 0: n = 256 s = self.fp.read(n * 3) for n in range(0, len(s), 3): - r = i8(s[n]) << shift - g = i8(s[n + 1]) << shift - b = i8(s[n + 2]) << shift + r = s[n] << shift + g = s[n + 1] << shift + b = s[n + 2] << shift palette[i] = (r, g, b) i += 1 diff --git a/src/PIL/FpxImagePlugin.py b/src/PIL/FpxImagePlugin.py index 14070eebf..5e385469f 100644 --- a/src/PIL/FpxImagePlugin.py +++ b/src/PIL/FpxImagePlugin.py @@ -17,7 +17,6 @@ import olefile from . import Image, ImageFile -from ._binary import i8 from ._binary import i32le as i32 # we map from colour field tuples to (mode, rawmode) descriptors @@ -181,8 +180,8 @@ class FpxImageFile(ImageFile.ImageFile): elif compression == 2: - internal_color_conversion = i8(s[14]) - jpeg_tables = i8(s[15]) + internal_color_conversion = s[14] + jpeg_tables = s[15] rawmode = self.rawmode if internal_color_conversion: diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 8561f7b74..986dd063e 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -28,7 +28,6 @@ from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i8 from ._binary import i16be as i16 from ._binary import i32be as i32 @@ -55,7 +54,7 @@ class GdImageFile(ImageFile.ImageFile): self.mode = "L" # FIXME: "P" self._size = i16(s[2:4]), i16(s[4:6]) - trueColor = i8(s[6]) + trueColor = s[6] trueColorOffset = 2 if trueColor else 0 # transparency index diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 95e300bd7..1873e441f 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -30,7 +30,6 @@ import os import subprocess from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i8 from ._binary import i16le as i16 from ._binary import o8 from ._binary import o16le as o16 @@ -58,8 +57,8 @@ class GifImageFile(ImageFile.ImageFile): def data(self): s = self.fp.read(1) - if s and i8(s): - return self.fp.read(i8(s)) + if s and s[0]: + return self.fp.read(s[0]) return None def _open(self): @@ -72,16 +71,16 @@ class GifImageFile(ImageFile.ImageFile): self.info["version"] = s[:6] self._size = i16(s[6:]), i16(s[8:]) self.tile = [] - flags = i8(s[10]) + flags = s[10] bits = (flags & 7) + 1 if flags & 128: # get global palette - self.info["background"] = i8(s[11]) + self.info["background"] = s[11] # check if palette contains colour indices p = self.fp.read(3 << bits) for i in range(0, len(p), 3): - if not (i // 3 == i8(p[i]) == i8(p[i + 1]) == i8(p[i + 2])): + if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): p = ImagePalette.raw("RGB", p) self.global_palette = self.palette = p break @@ -187,13 +186,13 @@ class GifImageFile(ImageFile.ImageFile): # s = self.fp.read(1) block = self.data() - if i8(s) == 249: + if s[0] == 249: # # graphic control extension # - flags = i8(block[0]) + flags = block[0] if flags & 1: - info["transparency"] = i8(block[3]) + info["transparency"] = block[3] info["duration"] = i16(block[1:3]) * 10 # disposal method - find the value of bits 4 - 6 @@ -205,7 +204,7 @@ class GifImageFile(ImageFile.ImageFile): # correct, but it seems to prevent the last # frame from looking odd for some animations self.disposal_method = dispose_bits - elif i8(s) == 254: + elif s[0] == 254: # # comment extension # @@ -216,14 +215,14 @@ class GifImageFile(ImageFile.ImageFile): info["comment"] = block block = self.data() continue - elif i8(s) == 255: + elif s[0] == 255: # # application extension # info["extension"] = block, self.fp.tell() if block[:11] == b"NETSCAPE2.0": block = self.data() - if len(block) >= 3 and i8(block[0]) == 1: + if len(block) >= 3 and block[0] == 1: info["loop"] = i16(block[1:3]) while self.data(): pass @@ -240,7 +239,7 @@ class GifImageFile(ImageFile.ImageFile): if x1 > self.size[0] or y1 > self.size[1]: self._size = max(x1, self.size[0]), max(y1, self.size[1]) self.dispose_extent = x0, y0, x1, y1 - flags = i8(s[8]) + flags = s[8] interlace = (flags & 64) != 0 @@ -249,7 +248,7 @@ class GifImageFile(ImageFile.ImageFile): self.palette = ImagePalette.raw("RGB", self.fp.read(3 << bits)) # image data - bits = i8(self.fp.read(1)) + bits = self.fp.read(1)[0] self.__offset = self.fp.tell() self.tile = [ ("gif", (x0, y0, x1, y1), self.__offset, (bits, interlace)) @@ -258,7 +257,7 @@ class GifImageFile(ImageFile.ImageFile): else: pass - # raise OSError, "illegal GIF tag `%x`" % i8(s) + # raise OSError, "illegal GIF tag `%x`" % s[0] try: if self.disposal_method < 2: diff --git a/src/PIL/GribStubImagePlugin.py b/src/PIL/GribStubImagePlugin.py index 515c272f7..b9bdd16e3 100644 --- a/src/PIL/GribStubImagePlugin.py +++ b/src/PIL/GribStubImagePlugin.py @@ -10,7 +10,6 @@ # from . import Image, ImageFile -from ._binary import i8 _handler = None @@ -30,7 +29,7 @@ def register_handler(handler): def _accept(prefix): - return prefix[0:4] == b"GRIB" and i8(prefix[7]) == 1 + return prefix[0:4] == b"GRIB" and prefix[7] == 1 class GribStubImageFile(ImageFile.StubImageFile): diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index b9b1ae007..2a63d75cb 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -24,7 +24,6 @@ import sys import tempfile from PIL import Image, ImageFile, PngImagePlugin, features -from PIL._binary import i8 enable_jpeg2k = features.check_codec("jpg_2000") if enable_jpeg2k: @@ -70,7 +69,7 @@ def read_32(fobj, start_length, size): byte = fobj.read(1) if not byte: break - byte = i8(byte) + byte = byte[0] if byte & 0x80: blocksize = byte - 125 byte = fobj.read(1) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 8b456d502..7dff008ed 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -28,7 +28,6 @@ from io import BytesIO from math import ceil, log from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i8 from ._binary import i16le as i16 from ._binary import i32le as i32 @@ -110,10 +109,10 @@ class IcoFile: s = buf.read(16) icon_header = { - "width": i8(s[0]), - "height": i8(s[1]), - "nb_color": i8(s[2]), # No. of colors in image (0 if >=8bpp) - "reserved": i8(s[3]), + "width": s[0], + "height": s[1], + "nb_color": s[2], # No. of colors in image (0 if >=8bpp) + "reserved": s[3], "planes": i16(s[4:]), "bpp": i16(s[6:]), "size": i32(s[8:]), diff --git a/src/PIL/ImImagePlugin.py b/src/PIL/ImImagePlugin.py index 8ef474171..1dfc808c4 100644 --- a/src/PIL/ImImagePlugin.py +++ b/src/PIL/ImImagePlugin.py @@ -30,7 +30,6 @@ import os import re from . import Image, ImageFile, ImagePalette -from ._binary import i8 # -------------------------------------------------------------------- # Standard tags @@ -223,14 +222,14 @@ class ImImageFile(ImageFile.ImageFile): linear = 1 # linear greyscale palette for i in range(256): if palette[i] == palette[i + 256] == palette[i + 512]: - if i8(palette[i]) != i: + if palette[i] != i: linear = 0 else: greyscale = 0 if self.mode in ["L", "LA", "P", "PA"]: if greyscale: if not linear: - self.lut = [i8(c) for c in palette[:256]] + self.lut = list(palette[:256]) else: if self.mode in ["L", "P"]: self.mode = self.rawmode = "P" @@ -240,7 +239,7 @@ class ImImageFile(ImageFile.ImageFile): self.palette = ImagePalette.raw("RGB;L", palette) elif self.mode == "RGB": if not greyscale or not linear: - self.lut = [i8(c) for c in palette] + self.lut = list(palette) self.frame = 0 diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1b4efdc4f..815c0f659 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -50,7 +50,7 @@ from . import ( _plugins, _raise_version_warning, ) -from ._binary import i8, i32le +from ._binary import i32le from ._util import deferred_error, isPath if sys.version_info >= (3, 7): @@ -1378,7 +1378,7 @@ class Image: self.load() x, y = self.im.getprojection() - return [i8(c) for c in x], [i8(c) for c in y] + return list(x), list(y) def histogram(self, mask=None, extrema=None): """ diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index f407b7e5f..932601adc 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -62,14 +62,14 @@ class IptcImageFile(ImageFile.ImageFile): if not len(s): return None, 0 - tag = i8(s[1]), i8(s[2]) + tag = s[1], s[2] # syntax - if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: + if s[0] != 0x1C or tag[0] < 1 or tag[0] > 9: raise SyntaxError("invalid IPTC/NAA file") # field size - size = i8(s[3]) + size = s[3] if size > 132: raise OSError("illegal field length in IPTC/NAA file") elif size == 128: diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 29bc61aa8..be917e01e 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -41,7 +41,6 @@ import tempfile import warnings from . import Image, ImageFile, TiffImagePlugin -from ._binary import i8 from ._binary import i16be as i16 from ._binary import i32be as i32 from ._binary import o8 @@ -75,7 +74,7 @@ def APP(self, marker): self.info["jfif_version"] = divmod(version, 256) # extract JFIF properties try: - jfif_unit = i8(s[7]) + jfif_unit = s[7] jfif_density = i16(s, 8), i16(s, 10) except Exception: pass @@ -115,7 +114,7 @@ def APP(self, marker): code = i16(s, offset) offset += 2 # resource name (usually empty) - name_len = i8(s[offset]) + name_len = s[offset] # name = s[offset+1:offset+1+name_len] offset += 1 + name_len offset += offset & 1 # align @@ -140,7 +139,7 @@ def APP(self, marker): self.info["adobe"] = i16(s, 5) # extract Adobe custom properties try: - adobe_transform = i8(s[1]) + adobe_transform = s[1] except Exception: pass else: @@ -197,11 +196,11 @@ def SOF(self, marker): s = ImageFile._safe_read(self.fp, n) self._size = i16(s[3:]), i16(s[1:]) - self.bits = i8(s[0]) + self.bits = s[0] if self.bits != 8: raise SyntaxError(f"cannot handle {self.bits}-bit layers") - self.layers = i8(s[5]) + self.layers = s[5] if self.layers == 1: self.mode = "L" elif self.layers == 3: @@ -217,7 +216,7 @@ def SOF(self, marker): if self.icclist: # fixup icc profile self.icclist.sort() # sort by sequence number - if i8(self.icclist[0][13]) == len(self.icclist): + if self.icclist[0][13] == len(self.icclist): profile = [] for p in self.icclist: profile.append(p[14:]) @@ -230,7 +229,7 @@ def SOF(self, marker): for i in range(6, len(s), 3): t = s[i : i + 3] # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], i8(t[1]) // 16, i8(t[1]) & 15, i8(t[2]))) + self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) def DQT(self, marker): @@ -244,7 +243,7 @@ def DQT(self, marker): n = i16(self.fp.read(2)) - 2 s = ImageFile._safe_read(self.fp, n) while len(s): - v = i8(s[0]) + v = s[0] precision = 1 if (v // 16 == 0) else 2 # in bytes qt_length = 1 + precision * 64 if len(s) < qt_length: @@ -362,7 +361,7 @@ class JpegImageFile(ImageFile.ImageFile): while True: - i = i8(s) + i = s[0] if i == 0xFF: s = s + self.fp.read(1) i = i16(s) diff --git a/src/PIL/MspImagePlugin.py b/src/PIL/MspImagePlugin.py index 9dd6e9f32..95190a944 100644 --- a/src/PIL/MspImagePlugin.py +++ b/src/PIL/MspImagePlugin.py @@ -27,7 +27,6 @@ import io import struct from . import Image, ImageFile -from ._binary import i8 from ._binary import i16le as i16 from ._binary import o16le as o16 @@ -133,7 +132,7 @@ class MspDecoder(ImageFile.PyDecoder): ) idx = 0 while idx < rowlen: - runtype = i8(row[idx]) + runtype = row[idx] idx += 1 if runtype == 0: (runcount, runval) = struct.unpack_from("Bc", row, idx) diff --git a/src/PIL/PcdImagePlugin.py b/src/PIL/PcdImagePlugin.py index 625f55646..38caf5c63 100644 --- a/src/PIL/PcdImagePlugin.py +++ b/src/PIL/PcdImagePlugin.py @@ -16,7 +16,6 @@ from . import Image, ImageFile -from ._binary import i8 ## # Image plugin for PhotoCD images. This plugin only reads the 768x512 @@ -38,7 +37,7 @@ class PcdImageFile(ImageFile.ImageFile): if s[:4] != b"PCD_": raise SyntaxError("not a PCD file") - orientation = i8(s[1538]) & 3 + orientation = s[1538] & 3 self.tile_post_rotate = None if orientation == 1: self.tile_post_rotate = 90 diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 767f9945a..b337b7dde 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -29,7 +29,6 @@ import io import logging from . import Image, ImageFile, ImagePalette -from ._binary import i8 from ._binary import i16le as i16 from ._binary import o8 from ._binary import o16le as o16 @@ -38,7 +37,7 @@ logger = logging.getLogger(__name__) def _accept(prefix): - return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] + return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] ## @@ -64,9 +63,9 @@ class PcxImageFile(ImageFile.ImageFile): logger.debug("BBox: %s %s %s %s", *bbox) # format - version = i8(s[1]) - bits = i8(s[3]) - planes = i8(s[65]) + version = s[1] + bits = s[3] + planes = s[65] stride = i16(s, 66) logger.debug( "PCX version %s, bits %s, planes %s, stride %s", @@ -91,7 +90,7 @@ class PcxImageFile(ImageFile.ImageFile): # FIXME: hey, this doesn't work with the incremental loader !!! self.fp.seek(-769, io.SEEK_END) s = self.fp.read(769) - if len(s) == 769 and i8(s[0]) == 12: + if len(s) == 769 and s[0] == 12: # check if the palette is linear greyscale for i in range(256): if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 6af41af6e..fd7ef712f 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -39,7 +39,6 @@ import warnings import zlib from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i8 from ._binary import i16be as i16 from ._binary import i32be as i32 from ._binary import o8 @@ -193,7 +192,7 @@ class ChunkStream: # Skip CRC checks for ancillary chunks if allowed to load truncated # images # 5th byte of first char is 1 [specs, section 5.4] - if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1): + if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): self.crc_skip(cid, data) return @@ -390,8 +389,8 @@ class PngStream(ChunkStream): # Compressed profile n bytes (zlib with deflate compression) i = s.find(b"\0") logger.debug("iCCP profile name %r", s[:i]) - logger.debug("Compression method %s", i8(s[i])) - comp_method = i8(s[i]) + logger.debug("Compression method %s", s[i]) + comp_method = s[i] if comp_method != 0: raise SyntaxError(f"Unknown compression method {comp_method} in iCCP chunk") try: @@ -412,12 +411,12 @@ class PngStream(ChunkStream): s = ImageFile._safe_read(self.fp, length) self.im_size = i32(s), i32(s[4:]) try: - self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))] + self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] except Exception: pass - if i8(s[12]): + if s[12]: self.im_info["interlace"] = 1 - if i8(s[11]): + if s[11]: raise SyntaxError("unknown filter category") return s @@ -491,7 +490,7 @@ class PngStream(ChunkStream): # 3 absolute colorimetric s = ImageFile._safe_read(self.fp, length) - self.im_info["srgb"] = i8(s) + self.im_info["srgb"] = s[0] return s def chunk_pHYs(self, pos, length): @@ -499,7 +498,7 @@ class PngStream(ChunkStream): # pixels per unit s = ImageFile._safe_read(self.fp, length) px, py = i32(s), i32(s[4:]) - unit = i8(s[8]) + unit = s[8] if unit == 1: # meter dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) self.im_info["dpi"] = dpi @@ -537,7 +536,7 @@ class PngStream(ChunkStream): k = s v = b"" if v: - comp_method = i8(v[0]) + comp_method = v[0] else: comp_method = 0 if comp_method != 0: @@ -571,7 +570,7 @@ class PngStream(ChunkStream): return s if len(r) < 2: return s - cf, cm, r = i8(r[0]), i8(r[1]), r[2:] + cf, cm, r = r[0], r[1], r[2:] try: lang, tk, v = r.split(b"\0", 2) except ValueError: @@ -641,8 +640,8 @@ class PngStream(ChunkStream): if delay_den == 0: delay_den = 100 self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = i8(s[24]) - self.im_info["blend"] = i8(s[25]) + self.im_info["disposal"] = s[24] + self.im_info["blend"] = s[25] return s def chunk_fdAT(self, pos, length): diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index f878fefa9..58a62fa5d 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -26,7 +26,6 @@ import os import struct from . import Image, ImageFile -from ._binary import i8 from ._binary import i16be as i16 from ._binary import o8 @@ -64,10 +63,10 @@ class SgiImageFile(ImageFile.ImageFile): raise ValueError("Not an SGI image file") # compression : verbatim or RLE - compression = i8(s[2]) + compression = s[2] # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = i8(s[3]) + bpc = s[3] # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) dimension = i16(s[4:]) diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 69b3e0678..2ebe5d349 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -20,7 +20,6 @@ import warnings from . import Image, ImageFile, ImagePalette -from ._binary import i8 from ._binary import i16le as i16 from ._binary import o8 from ._binary import o16le as o16 @@ -56,14 +55,14 @@ class TgaImageFile(ImageFile.ImageFile): # process header s = self.fp.read(18) - id_len = i8(s[0]) + id_len = s[0] - colormaptype = i8(s[1]) - imagetype = i8(s[2]) + colormaptype = s[1] + imagetype = s[2] - depth = i8(s[16]) + depth = s[16] - flags = i8(s[17]) + flags = s[17] self._size = i16(s[12:]), i16(s[14:]) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 5480fcd85..0b70ce382 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -49,7 +49,7 @@ from fractions import Fraction from numbers import Number, Rational from . import Image, ImageFile, ImagePalette, TiffTags -from ._binary import i8, o8 +from ._binary import o8 from .TiffTags import TYPES logger = logging.getLogger(__name__) @@ -1518,7 +1518,7 @@ def _save(im, fp, filename): if im.mode in ["P", "PA"]: lut = im.im.getpalette("RGB", "RGB;L") - ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut) + ifd[COLORMAP] = tuple(v * 256 for v in lut) # data orientation stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8) ifd[ROWSPERSTRIP] = im.size[1] diff --git a/src/PIL/XVThumbImagePlugin.py b/src/PIL/XVThumbImagePlugin.py index c0d8db09a..4efedb77e 100644 --- a/src/PIL/XVThumbImagePlugin.py +++ b/src/PIL/XVThumbImagePlugin.py @@ -18,7 +18,7 @@ # from . import Image, ImageFile, ImagePalette -from ._binary import i8, o8 +from ._binary import o8 _MAGIC = b"P7 332" @@ -59,7 +59,7 @@ class XVThumbImageFile(ImageFile.ImageFile): s = self.fp.readline() if not s: raise SyntaxError("Unexpected EOF reading XV thumbnail file") - if i8(s[0]) != 35: # ie. when not a comment: '#' + if s[0] != 35: # ie. when not a comment: '#' break # parse header line (already read) diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index d8bd00a1b..ebd65ba58 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -18,7 +18,7 @@ import re from . import Image, ImageFile, ImagePalette -from ._binary import i8, o8 +from ._binary import o8 # XPM header xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') @@ -72,7 +72,7 @@ class XpmImageFile(ImageFile.ImageFile): elif s[-1:] in b"\r\n": s = s[:-1] - c = i8(s[1]) + c = s[1] s = s[2:-2].split() for i in range(0, len(s), 2): From 1ff61bcaa6f67072a0397ea03b99ff91cb81b2e5 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 8 May 2020 21:11:58 +0300 Subject: [PATCH 167/750] use offset for all binary input functions instead of slicing --- src/PIL/BmpImagePlugin.py | 34 +++++++++++++++++----------------- src/PIL/CurImagePlugin.py | 4 ++-- src/PIL/EpsImagePlugin.py | 6 +++--- src/PIL/FliImagePlugin.py | 20 ++++++++++---------- src/PIL/GbrImagePlugin.py | 2 +- src/PIL/GdImageFile.py | 6 +++--- src/PIL/GifImagePlugin.py | 10 +++++----- src/PIL/IcoImagePlugin.py | 10 +++++----- src/PIL/Image.py | 2 +- src/PIL/IptcImagePlugin.py | 2 +- src/PIL/JpegImagePlugin.py | 10 +++++----- src/PIL/MspImagePlugin.py | 4 ++-- src/PIL/PixarImagePlugin.py | 4 ++-- src/PIL/PngImagePlugin.py | 14 +++++++------- src/PIL/PsdImagePlugin.py | 12 ++++++------ src/PIL/SgiImagePlugin.py | 8 ++++---- src/PIL/SunImagePlugin.py | 12 ++++++------ src/PIL/TgaImagePlugin.py | 4 ++-- 18 files changed, 82 insertions(+), 82 deletions(-) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index fa096b89b..98685be0b 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -51,7 +51,7 @@ def _accept(prefix): def _dib_accept(prefix): - return i32(prefix[:4]) in [12, 40, 64, 108, 124] + return i32(prefix) in [12, 40, 64, 108, 124] # ============================================================================= @@ -86,10 +86,10 @@ class BmpImageFile(ImageFile.ImageFile): # -------------------------------------------------- IBM OS/2 Bitmap v1 # ----- This format has different offsets because of width/height types if file_info["header_size"] == 12: - file_info["width"] = i16(header_data[0:2]) - file_info["height"] = i16(header_data[2:4]) - file_info["planes"] = i16(header_data[4:6]) - file_info["bits"] = i16(header_data[6:8]) + file_info["width"] = i16(header_data, 0) + file_info["height"] = i16(header_data, 2) + file_info["planes"] = i16(header_data, 4) + file_info["bits"] = i16(header_data, 6) file_info["compression"] = self.RAW file_info["palette_padding"] = 3 @@ -98,22 +98,22 @@ class BmpImageFile(ImageFile.ImageFile): elif file_info["header_size"] in (40, 64, 108, 124): file_info["y_flip"] = header_data[7] == 0xFF file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data[0:4]) + file_info["width"] = i32(header_data, 0) file_info["height"] = ( - i32(header_data[4:8]) + i32(header_data, 4) if not file_info["y_flip"] - else 2 ** 32 - i32(header_data[4:8]) + else 2 ** 32 - i32(header_data, 4) ) - file_info["planes"] = i16(header_data[8:10]) - file_info["bits"] = i16(header_data[10:12]) - file_info["compression"] = i32(header_data[12:16]) + file_info["planes"] = i16(header_data, 8) + file_info["bits"] = i16(header_data, 10) + file_info["compression"] = i32(header_data, 12) # byte size of pixel data - file_info["data_size"] = i32(header_data[16:20]) + file_info["data_size"] = i32(header_data, 16) file_info["pixels_per_meter"] = ( - i32(header_data[20:24]), - i32(header_data[24:28]), + i32(header_data, 20), + i32(header_data, 24), ) - file_info["colors"] = i32(header_data[28:32]) + file_info["colors"] = i32(header_data, 28) file_info["palette_padding"] = 4 self.info["dpi"] = tuple( int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"] @@ -123,7 +123,7 @@ class BmpImageFile(ImageFile.ImageFile): for idx, mask in enumerate( ["r_mask", "g_mask", "b_mask", "a_mask"] ): - file_info[mask] = i32(header_data[36 + idx * 4 : 40 + idx * 4]) + file_info[mask] = i32(header_data, 36 + idx * 4) else: # 40 byte headers only have the three components in the # bitfields masks, ref: @@ -266,7 +266,7 @@ class BmpImageFile(ImageFile.ImageFile): if not _accept(head_data): raise SyntaxError("Not a BMP file") # read the start position of the BMP image data (u32) - offset = i32(head_data[10:14]) + offset = i32(head_data, 10) # load bitmap information (offset=raster info) self._bitmap(offset=offset) diff --git a/src/PIL/CurImagePlugin.py b/src/PIL/CurImagePlugin.py index 8451fe90f..42af5cafc 100644 --- a/src/PIL/CurImagePlugin.py +++ b/src/PIL/CurImagePlugin.py @@ -47,7 +47,7 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): # pick the largest cursor in the file m = b"" - for i in range(i16(s[4:])): + for i in range(i16(s, 4)): s = self.fp.read(16) if not m: m = s @@ -57,7 +57,7 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): raise TypeError("No cursors were found") # load as bitmap - self._bitmap(i32(m[12:]) + offset) + self._bitmap(i32(m, 12) + offset) # patch up the bitmap height self._size = self.size[0], self.size[1] // 2 diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index ec2329c7e..dc61f48ed 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -312,14 +312,14 @@ class EpsImageFile(ImageFile.ImageFile): fp.seek(0, io.SEEK_END) length = fp.tell() offset = 0 - elif i32(s[0:4]) == 0xC6D3D0C5: + elif i32(s, 0) == 0xC6D3D0C5: # FIX for: Some EPS file not handled correctly / issue #302 # EPS can contain binary data # or start directly with latin coding # more info see: # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - offset = i32(s[4:8]) - length = i32(s[8:12]) + offset = i32(s, 4) + length = i32(s, 8) else: raise SyntaxError("not an EPS file") diff --git a/src/PIL/FliImagePlugin.py b/src/PIL/FliImagePlugin.py index 5a3247024..f2d4857f7 100644 --- a/src/PIL/FliImagePlugin.py +++ b/src/PIL/FliImagePlugin.py @@ -26,7 +26,7 @@ from ._binary import o8 def _accept(prefix): - return len(prefix) >= 6 and i16(prefix[4:6]) in [0xAF11, 0xAF12] + return len(prefix) >= 6 and i16(prefix, 4) in [0xAF11, 0xAF12] ## @@ -46,22 +46,22 @@ class FliImageFile(ImageFile.ImageFile): s = self.fp.read(128) if not ( _accept(s) - and i16(s[14:16]) in [0, 3] # flags + and i16(s, 14) in [0, 3] # flags and s[20:22] == b"\x00\x00" # reserved ): raise SyntaxError("not an FLI/FLC file") # frames - self.n_frames = i16(s[6:8]) + self.n_frames = i16(s, 6) self.is_animated = self.n_frames > 1 # image characteristics self.mode = "P" - self._size = i16(s[8:10]), i16(s[10:12]) + self._size = i16(s, 8), i16(s, 10) # animation speed - duration = i32(s[16:20]) - magic = i16(s[4:6]) + duration = i32(s, 16) + magic = i16(s, 4) if magic == 0xAF11: duration = (duration * 1000) // 70 self.info["duration"] = duration @@ -73,17 +73,17 @@ class FliImageFile(ImageFile.ImageFile): self.__offset = 128 - if i16(s[4:6]) == 0xF100: + if i16(s, 4) == 0xF100: # prefix chunk; ignore it self.__offset = self.__offset + i32(s) s = self.fp.read(16) - if i16(s[4:6]) == 0xF1FA: + if i16(s, 4) == 0xF1FA: # look for palette chunk s = self.fp.read(6) - if i16(s[4:6]) == 11: + if i16(s, 4) == 11: self._palette(palette, 2) - elif i16(s[4:6]) == 4: + elif i16(s, 4) == 4: self._palette(palette, 0) palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] diff --git a/src/PIL/GbrImagePlugin.py b/src/PIL/GbrImagePlugin.py index 5e447b411..0f230602d 100644 --- a/src/PIL/GbrImagePlugin.py +++ b/src/PIL/GbrImagePlugin.py @@ -29,7 +29,7 @@ from ._binary import i32be as i32 def _accept(prefix): - return len(prefix) >= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) + return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) ## diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 986dd063e..9c34adaa6 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -48,17 +48,17 @@ class GdImageFile(ImageFile.ImageFile): # Header s = self.fp.read(1037) - if not i16(s[:2]) in [65534, 65535]: + if not i16(s) in [65534, 65535]: raise SyntaxError("Not a valid GD 2.x .gd file") self.mode = "L" # FIXME: "P" - self._size = i16(s[2:4]), i16(s[4:6]) + self._size = i16(s, 2), i16(s, 4) trueColor = s[6] trueColorOffset = 2 if trueColor else 0 # transparency index - tindex = i32(s[7 + trueColorOffset : 7 + trueColorOffset + 4]) + tindex = i32(s, 7 + trueColorOffset) if tindex < 256: self.info["transparency"] = tindex diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 1873e441f..7c083bd8b 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -69,7 +69,7 @@ class GifImageFile(ImageFile.ImageFile): raise SyntaxError("not a GIF file") self.info["version"] = s[:6] - self._size = i16(s[6:]), i16(s[8:]) + self._size = i16(s, 6), i16(s, 8) self.tile = [] flags = s[10] bits = (flags & 7) + 1 @@ -193,7 +193,7 @@ class GifImageFile(ImageFile.ImageFile): flags = block[0] if flags & 1: info["transparency"] = block[3] - info["duration"] = i16(block[1:3]) * 10 + info["duration"] = i16(block, 1) * 10 # disposal method - find the value of bits 4 - 6 dispose_bits = 0b00011100 & flags @@ -223,7 +223,7 @@ class GifImageFile(ImageFile.ImageFile): if block[:11] == b"NETSCAPE2.0": block = self.data() if len(block) >= 3 and block[0] == 1: - info["loop"] = i16(block[1:3]) + info["loop"] = i16(block, 1) while self.data(): pass @@ -234,8 +234,8 @@ class GifImageFile(ImageFile.ImageFile): s = self.fp.read(9) # extent - x0, y0 = i16(s[0:]), i16(s[2:]) - x1, y1 = x0 + i16(s[4:]), y0 + i16(s[6:]) + x0, y0 = i16(s, 0), i16(s, 2) + x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) if x1 > self.size[0] or y1 > self.size[1]: self._size = max(x1, self.size[0]), max(y1, self.size[1]) self.dispose_extent = x0, y0, x1, y1 diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 7dff008ed..e1bfa7a59 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -102,7 +102,7 @@ class IcoFile: self.entry = [] # Number of items in file - self.nb_items = i16(s[4:]) + self.nb_items = i16(s, 4) # Get headers for each item for i in range(self.nb_items): @@ -113,10 +113,10 @@ class IcoFile: "height": s[1], "nb_color": s[2], # No. of colors in image (0 if >=8bpp) "reserved": s[3], - "planes": i16(s[4:]), - "bpp": i16(s[6:]), - "size": i32(s[8:]), - "offset": i32(s[12:]), + "planes": i16(s, 4), + "bpp": i16(s, 6), + "size": i32(s, 8), + "offset": i32(s, 12), } # See Wikipedia diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 815c0f659..e2540a2b2 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3374,7 +3374,7 @@ class Exif(MutableMapping): if self[0x927C][:8] == b"FUJIFILM": exif_data = self[0x927C] - ifd_offset = i32le(exif_data[8:12]) + ifd_offset = i32le(exif_data, 8) ifd_data = exif_data[ifd_offset:] makernote = {} diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 932601adc..0bbe50668 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -77,7 +77,7 @@ class IptcImageFile(ImageFile.ImageFile): elif size > 128: size = i(self.fp.read(size - 128)) else: - size = i16(s[3:]) + size = i16(s, 3) return tag, size diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index be917e01e..054495e6f 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -124,10 +124,10 @@ def APP(self, marker): data = s[offset : offset + size] if code == 0x03ED: # ResolutionInfo data = { - "XResolution": i32(data[:4]) / 65536, - "DisplayedUnitsX": i16(data[4:8]), - "YResolution": i32(data[8:12]) / 65536, - "DisplayedUnitsY": i16(data[12:]), + "XResolution": i32(data, 0) / 65536, + "DisplayedUnitsX": i16(data, 4), + "YResolution": i32(data, 8) / 65536, + "DisplayedUnitsY": i16(data, 12), } photoshop[code] = data offset += size @@ -194,7 +194,7 @@ def SOF(self, marker): n = i16(self.fp.read(2)) - 2 s = ImageFile._safe_read(self.fp, n) - self._size = i16(s[3:]), i16(s[1:]) + self._size = i16(s, 3), i16(s, 1) self.bits = s[0] if self.bits != 8: diff --git a/src/PIL/MspImagePlugin.py b/src/PIL/MspImagePlugin.py index 95190a944..e1fdc1fdf 100644 --- a/src/PIL/MspImagePlugin.py +++ b/src/PIL/MspImagePlugin.py @@ -58,12 +58,12 @@ class MspImageFile(ImageFile.ImageFile): # Header checksum checksum = 0 for i in range(0, 32, 2): - checksum = checksum ^ i16(s[i : i + 2]) + checksum = checksum ^ i16(s, i) if checksum != 0: raise SyntaxError("bad MSP checksum") self.mode = "1" - self._size = i16(s[4:]), i16(s[6:]) + self._size = i16(s, 4), i16(s, 6) if s[:4] == b"DanM": self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] diff --git a/src/PIL/PixarImagePlugin.py b/src/PIL/PixarImagePlugin.py index 91f0314b5..c4860b6c4 100644 --- a/src/PIL/PixarImagePlugin.py +++ b/src/PIL/PixarImagePlugin.py @@ -49,10 +49,10 @@ class PixarImageFile(ImageFile.ImageFile): # read rest of header s = s + self.fp.read(508) - self._size = i16(s[418:420]), i16(s[416:418]) + self._size = i16(s, 418), i16(s, 416) # get channel/depth descriptions - mode = i16(s[424:426]), i16(s[426:428]) + mode = i16(s, 424), i16(s, 426) if mode == (14, 2): self.mode = "RGB" diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index fd7ef712f..10e6010eb 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -409,7 +409,7 @@ class PngStream(ChunkStream): # image header s = ImageFile._safe_read(self.fp, length) - self.im_size = i32(s), i32(s[4:]) + self.im_size = i32(s, 0), i32(s, 4) try: self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] except Exception: @@ -464,7 +464,7 @@ class PngStream(ChunkStream): elif self.im_mode in ("1", "L", "I"): self.im_info["transparency"] = i16(s) elif self.im_mode == "RGB": - self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) + self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) return s def chunk_gAMA(self, pos, length): @@ -497,7 +497,7 @@ class PngStream(ChunkStream): # pixels per unit s = ImageFile._safe_read(self.fp, length) - px, py = i32(s), i32(s[4:]) + px, py = i32(s, 0), i32(s, 4) unit = s[8] if unit == 1: # meter dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) @@ -618,7 +618,7 @@ class PngStream(ChunkStream): warnings.warn("Invalid APNG, will use default PNG image if possible") return s self.im_n_frames = n_frames - self.im_info["loop"] = i32(s[4:]) + self.im_info["loop"] = i32(s, 4) self.im_custom_mimetype = "image/apng" return s @@ -630,13 +630,13 @@ class PngStream(ChunkStream): ): raise SyntaxError("APNG contains frame sequence errors") self._seq_num = seq - width, height = i32(s[4:]), i32(s[8:]) - px, py = i32(s[12:]), i32(s[16:]) + width, height = i32(s, 4), i32(s, 8) + px, py = i32(s, 12), i32(s, 16) im_w, im_h = self.im_size if px + width > im_w or py + height > im_h: raise SyntaxError("APNG contains invalid frames") self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s[20:]), i16(s[22:]) + delay_num, delay_den = i16(s, 20), i16(s, 22) if delay_den == 0: delay_den = 100 self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index 8d1dbf2b2..d3799edc3 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -63,12 +63,12 @@ class PsdImageFile(ImageFile.ImageFile): # header s = read(26) - if not _accept(s) or i16(s[4:]) != 1: + if not _accept(s) or i16(s, 4) != 1: raise SyntaxError("not a PSD file") - psd_bits = i16(s[22:]) - psd_channels = i16(s[12:]) - psd_mode = i16(s[24:]) + psd_bits = i16(s, 22) + psd_channels = i16(s, 12) + psd_mode = i16(s, 24) mode, channels = MODES[(psd_mode, psd_bits)] @@ -76,7 +76,7 @@ class PsdImageFile(ImageFile.ImageFile): raise OSError("not enough channels") self.mode = mode - self._size = i32(s[18:]), i32(s[14:]) + self._size = i32(s, 18), i32(s, 14) # # color mode data @@ -291,7 +291,7 @@ def _maketile(file, mode, bbox, channels): layer += ";I" tile.append(("packbits", bbox, offset, layer)) for y in range(ysize): - offset = offset + i16(bytecount[i : i + 2]) + offset = offset + i16(bytecount, i) i += 2 file.seek(offset) diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 58a62fa5d..d0f7c9993 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -69,16 +69,16 @@ class SgiImageFile(ImageFile.ImageFile): bpc = s[3] # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) - dimension = i16(s[4:]) + dimension = i16(s, 4) # xsize : width - xsize = i16(s[6:]) + xsize = i16(s, 6) # ysize : height - ysize = i16(s[8:]) + ysize = i16(s, 8) # zsize : channels count - zsize = i16(s[10:]) + zsize = i16(s, 10) # layout layout = bpc, dimension, zsize diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index d99884293..c03759a01 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -58,13 +58,13 @@ class SunImageFile(ImageFile.ImageFile): offset = 32 - self._size = i32(s[4:8]), i32(s[8:12]) + self._size = i32(s, 4), i32(s, 8) - depth = i32(s[12:16]) - # data_length = i32(s[16:20]) # unreliable, ignore. - file_type = i32(s[20:24]) - palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s[28:32]) + depth = i32(s, 12) + # data_length = i32(s, 16) # unreliable, ignore. + file_type = i32(s, 20) + palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s, 28) if depth == 1: self.mode, rawmode = "1", "1;I" diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 2ebe5d349..2b936d687 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -64,7 +64,7 @@ class TgaImageFile(ImageFile.ImageFile): flags = s[17] - self._size = i16(s[12:]), i16(s[14:]) + self._size = i16(s, 12), i16(s, 14) # validate header fields if ( @@ -110,7 +110,7 @@ class TgaImageFile(ImageFile.ImageFile): if colormaptype: # read palette - start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:]) + start, size, mapdepth = i16(s, 3), i16(s, 5), i16(s, 7) if mapdepth == 16: self.palette = ImagePalette.raw( "BGR;16", b"\0" * 2 * start + self.fp.read(2 * size) From 250e42f7f864401b87a378771e4b2fa0d6cccafe Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 30 Dec 2020 11:07:58 +0100 Subject: [PATCH 168/750] Bad Rebase --- src/libImaging/GifEncode.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index 9f22add24..a0fef9933 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -241,8 +241,6 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) break; } - this = state->buffer[state->x++]; - if (this == context->last) { context->count++; } else { From e126001e627345abc6515cc49d7ca6f801a2c759 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 30 Dec 2020 11:25:34 +0100 Subject: [PATCH 169/750] Help as default goal --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6430c9776..3febff602 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.DEFAULT_GOAL := release-test +.DEFAULT_GOAL := help .PHONY: clean clean: From dae30d86016dfd3ed69d344809346d63b3039591 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 30 Dec 2020 11:26:32 +0100 Subject: [PATCH 170/750] Removed co target -- Artifact of previous code review process --- Makefile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Makefile b/Makefile index 3febff602..031b1de0d 100644 --- a/Makefile +++ b/Makefile @@ -7,13 +7,6 @@ clean: rm -r build || true find . -name __pycache__ | xargs rm -r || true -BRANCHES=`git branch -a | grep -v HEAD | grep -v master | grep remote` -.PHONY: co -co: - -for i in $(BRANCHES) ; do \ - git checkout -t $$i ; \ - done - .PHONY: coverage coverage: pytest -qq From 85649e299d3faa7d45523d180b0939f960f6c4f7 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 30 Dec 2020 11:51:04 +0100 Subject: [PATCH 171/750] Makefile: Lint target --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 031b1de0d..ab64730a2 100644 --- a/Makefile +++ b/Makefile @@ -102,3 +102,9 @@ test: .PHONY: readme readme: python3 setup.py --long-description | markdown2 > .long-description.html && open .long-description.html + + +.PHONY: lint +lint: + tox --help > /dev/null || pip install tox + tox -e lint From 17c48db318a7e48d16909f08973df94b27dcc736 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 22:35:54 +1100 Subject: [PATCH 172/750] Use context manager --- Tests/test_image_getxmp.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 91c6634f1..2ca7f0fde 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -2,8 +2,8 @@ from PIL import Image def test_getxmp(): - im = Image.open("Tests/images/xmp_test.jpg") - type_repr = repr(type(im.getxmp())) + with Image.open("Tests/images/xmp_test.jpg") as im: + type_repr = repr(type(im.getxmp())) - assert "dict" in type_repr - assert isinstance(im.getxmp()["Description"][0]["Version"], str) + assert "dict" in type_repr + assert isinstance(im.getxmp()["Description"][0]["Version"], str) From 06b7b97a7aa771761d746e5a6fe424b543baa231 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 22:39:49 +1100 Subject: [PATCH 173/750] Use isinstance to check type --- Tests/test_image_getxmp.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 2ca7f0fde..33c531931 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -3,7 +3,8 @@ from PIL import Image def test_getxmp(): with Image.open("Tests/images/xmp_test.jpg") as im: - type_repr = repr(type(im.getxmp())) + xmp = im.getxmp() + + assert isinstance(xmp, dict) + assert isinstance(xmp["Description"][0]["Version"], str) - assert "dict" in type_repr - assert isinstance(im.getxmp()["Description"][0]["Version"], str) From 8c8b11003554255028ecc48939e61d3547618b9d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 22:40:39 +1100 Subject: [PATCH 174/750] Check string value --- Tests/test_image_getxmp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 33c531931..19df631d5 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -6,5 +6,4 @@ def test_getxmp(): xmp = im.getxmp() assert isinstance(xmp, dict) - assert isinstance(xmp["Description"][0]["Version"], str) - + assert xmp["Description"][0]["Version"] == "10.4" From ad9614be7a1b9fa5c9a43f99def78e56d3ca8ed7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 22:46:49 +1100 Subject: [PATCH 175/750] Renamed variable --- src/PIL/Image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 63468df99..4a94385c6 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1334,10 +1334,10 @@ class Image: if marker == b"http://ns.adobe.com/xap/1.0/": root = xml.etree.ElementTree.fromstring(xmp_tags) for element in root.findall(".//"): - xmp_atribs = [] + xmp_attribs = [] for child, value in element.attrib.items(): - xmp_atribs.append({child.split("}")[1]: value}) - self._xmp.update({element.tag.split("}")[1]: xmp_atribs}) + xmp_attribs.append({child.split("}")[1]: value}) + self._xmp.update({element.tag.split("}")[1]: xmp_attribs}) return self._xmp def getim(self): From 3c482b1b0b286aa5bc54c6a4547d92abe7b87e75 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 23:10:29 +1100 Subject: [PATCH 176/750] Changed list of single item dictionaries to dictionary --- Tests/test_image_getxmp.py | 2 +- src/PIL/Image.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py index 19df631d5..a684d6f0c 100644 --- a/Tests/test_image_getxmp.py +++ b/Tests/test_image_getxmp.py @@ -6,4 +6,4 @@ def test_getxmp(): xmp = im.getxmp() assert isinstance(xmp, dict) - assert xmp["Description"][0]["Version"] == "10.4" + assert xmp["Description"]["Version"] == "10.4" diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 4a94385c6..df78fb809 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1334,10 +1334,10 @@ class Image: if marker == b"http://ns.adobe.com/xap/1.0/": root = xml.etree.ElementTree.fromstring(xmp_tags) for element in root.findall(".//"): - xmp_attribs = [] - for child, value in element.attrib.items(): - xmp_attribs.append({child.split("}")[1]: value}) - self._xmp.update({element.tag.split("}")[1]: xmp_attribs}) + self._xmp[element.tag.split("}")[1]] = { + child.split("}")[1]: value + for child, value in element.attrib.items() + } return self._xmp def getim(self): From 737205c67f0c70ac4a83555afe0dfc16201f68cb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 Dec 2020 09:35:35 +1100 Subject: [PATCH 177/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 691a7a220..796ed156b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Added exception explaining that _repr_png_ saves to PNG #5139 + [radarhere] + - Use previous disposal method in GIF load_end #5125 [radarhere] From 77b16efba3aaf0758fd1a43aa6aea517509e88f3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 Dec 2020 16:25:46 +1100 Subject: [PATCH 178/750] Corrected argument --- Tests/test_decompression_bomb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 132269933..7671cdc09 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -11,7 +11,7 @@ ORIGINAL_LIMIT = Image.MAX_IMAGE_PIXELS class TestDecompressionBomb: @classmethod - def teardown_class(self): + def teardown_class(cls): Image.MAX_IMAGE_PIXELS = ORIGINAL_LIMIT def test_no_warning_small_file(self): From 1af26f3159739fca2a54338a60c3c2c07e23b619 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 Dec 2020 18:28:01 +1100 Subject: [PATCH 179/750] Revert "skip wheels on 3.10-dev due to wheel#354" This reverts commit bdcc48f0a2d5af58155c6e10a127536d4ac79374. --- .github/workflows/test-windows.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 562b2b7b4..db1675135 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -197,16 +197,14 @@ jobs: - name: Build wheel id: wheel - # Skip wheels on 3.10 due to https://github.com/pypa/wheel/issues/354 - if: "github.event_name == 'push' && !contains(matrix.python-version, '3.10')" + if: "github.event_name == 'push'" run: | for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ::set-output name=dist::dist-%%a winbuild\\build\\build_pillow.cmd --disable-imagequant bdist_wheel shell: cmd - uses: actions/upload-artifact@v2 - # Skip wheels on 3.10 due to https://github.com/pypa/wheel/issues/354 - if: "github.event_name == 'push' && !contains(matrix.python-version, '3.10')" + if: "github.event_name == 'push'" with: name: ${{ steps.wheel.outputs.dist }} path: dist\*.whl From 48eb46ece6e4ce088ac0e328d2ea264123eec832 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 00:05:47 +1100 Subject: [PATCH 180/750] Updated copyright year --- LICENSE | 2 +- docs/COPYING | 2 +- docs/conf.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index eb9c41f56..1197291bc 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2010-2020 by Alex Clark and contributors + Copyright © 2010-2021 by Alex Clark and contributors Like PIL, Pillow is licensed under the open source HPND License: diff --git a/docs/COPYING b/docs/COPYING index ec2a5d8cb..f2466d659 100644 --- a/docs/COPYING +++ b/docs/COPYING @@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is Pillow is the friendly PIL fork. It is - Copyright © 2010-2020 by Alex Clark and contributors + Copyright © 2010-2021 by Alex Clark and contributors Like PIL, Pillow is licensed under the open source PIL Software License: diff --git a/docs/conf.py b/docs/conf.py index 4e14a6fd0..4fb9d1f8f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -51,7 +51,7 @@ master_doc = "index" # General information about the project. project = "Pillow (PIL Fork)" -copyright = "1995-2011 Fredrik Lundh, 2010-2020 Alex Clark and Contributors" +copyright = "1995-2011 Fredrik Lundh, 2010-2021 Alex Clark and Contributors" author = "Fredrik Lundh, Alex Clark and Contributors" # The version info for the project you're documenting, acts as replacement for From 4ba769f99e4b7493d457b562096dfe8e896b5468 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 31 Dec 2020 16:38:41 +0100 Subject: [PATCH 181/750] documentation --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ab64730a2..8dd35ec5c 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,9 @@ help: @echo " install make and install" @echo " install-coverage make and install with C coverage" @echo " install-req install documentation and test dependencies" - @echo " install-venv install in virtualenv" + @echo " install-venv (deprecated) install in virtualenv" + @echo " lint run the lint checks" + @echo " lint-fix run black to (mostly) fix lint issues." @echo " release-test run code and package tests before release" @echo " test run tests on installed pillow" @echo " upload build and upload sdists to PyPI" From 35c396c1e6298ab1fdfdd31f502419916a4acebc Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 31 Dec 2020 16:38:57 +0100 Subject: [PATCH 182/750] the other pip invocation --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8dd35ec5c..322b5bc43 100644 --- a/Makefile +++ b/Makefile @@ -108,5 +108,5 @@ readme: .PHONY: lint lint: - tox --help > /dev/null || pip install tox + tox --help > /dev/null || python3 -m pip install tox tox -e lint From 31b6e80f6efb33a2aa541872a728b212d33ea2fc Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 31 Dec 2020 16:39:10 +0100 Subject: [PATCH 183/750] lint-fix target, currently including black --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 322b5bc43..0ed453705 100644 --- a/Makefile +++ b/Makefile @@ -110,3 +110,7 @@ readme: lint: tox --help > /dev/null || python3 -m pip install tox tox -e lint + +.PHONY: lint-fix +lint-fix: + black --target-version py36 . From d7350bd4039f6482b1bcce4b8a05fcf4b6a750cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 09:06:32 +1100 Subject: [PATCH 184/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 796ed156b..8cedc7415 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Use disposal settings from previous frame in APNG #5126 + [radarhere] + - Added exception explaining that _repr_png_ saves to PNG #5139 [radarhere] From 62693b7c54d0cae1bcd67affe2bf3e2829783a63 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 11:33:20 +1100 Subject: [PATCH 185/750] Moved QApplication into one test --- Tests/test_imageqt.py | 21 ---------- Tests/test_qt_image_fromqpixmap.py | 15 ------- Tests/test_qt_image_qapplication.py | 63 +++++++++++++++++++++++++++++ Tests/test_qt_image_toqimage.py | 33 --------------- Tests/test_qt_image_toqpixmap.py | 20 --------- 5 files changed, 63 insertions(+), 89 deletions(-) delete mode 100644 Tests/test_qt_image_fromqpixmap.py create mode 100644 Tests/test_qt_image_qapplication.py delete mode 100644 Tests/test_qt_image_toqpixmap.py diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index c39bb0a06..7a6e1354f 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -8,27 +8,6 @@ if ImageQt.qt_is_installed: from PIL.ImageQt import qRgba -@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") -class PillowQPixmapTestCase: - @classmethod - def setup_class(self): - try: - if ImageQt.qt_version == "5": - from PyQt5.QtGui import QGuiApplication - elif ImageQt.qt_version == "side2": - from PySide2.QtGui import QGuiApplication - except ImportError: - pytest.skip("QGuiApplication not installed") - return - - self.app = QGuiApplication([]) - - @classmethod - def teardown_class(self): - self.app.quit() - self.app = None - - @pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") def test_rgb(): # from https://doc.qt.io/archives/qt-4.8/qcolor.html diff --git a/Tests/test_qt_image_fromqpixmap.py b/Tests/test_qt_image_fromqpixmap.py deleted file mode 100644 index cb1b385ec..000000000 --- a/Tests/test_qt_image_fromqpixmap.py +++ /dev/null @@ -1,15 +0,0 @@ -from PIL import ImageQt - -from .helper import assert_image_equal, hopper -from .test_imageqt import PillowQPixmapTestCase - - -class TestFromQPixmap(PillowQPixmapTestCase): - def roundtrip(self, expected): - result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected)) - # Qt saves all pixmaps as rgb - assert_image_equal(result, expected.convert("RGB")) - - def test_sanity(self): - for mode in ("1", "RGB", "RGBA", "L", "P"): - self.roundtrip(hopper(mode)) diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py new file mode 100644 index 000000000..ef1ff5901 --- /dev/null +++ b/Tests/test_qt_image_qapplication.py @@ -0,0 +1,63 @@ +import pytest + +from PIL import ImageQt + +from .helper import assert_image_equal, hopper + +if ImageQt.qt_is_installed: + from PIL.ImageQt import QPixmap + + if ImageQt.qt_version == "5": + from PyQt5 import QtGui + from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget + elif ImageQt.qt_version == "side2": + from PySide2 import QtGui + from PySide2.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget + + class Example(QWidget): + def __init__(self): + super().__init__() + + img = hopper().resize((1000, 1000)) + + qimage = ImageQt.ImageQt(img) + + pixmap1 = QtGui.QPixmap.fromImage(qimage) + + QHBoxLayout(self) # hbox + + lbl = QLabel(self) + # Segfault in the problem + lbl.setPixmap(pixmap1.copy()) + + +def roundtrip(expected): + result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected)) + # Qt saves all pixmaps as rgb + assert_image_equal(result, expected.convert("RGB")) + + +@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") +def test_sanity(tmp_path): + # Segfault test + app = QApplication([]) + ex = Example() + assert app # Silence warning + assert ex # Silence warning + + for mode in ("1", "RGB", "RGBA", "L", "P"): + # to QPixmap + data = ImageQt.toqpixmap(hopper(mode)) + + assert isinstance(data, QPixmap) + assert not data.isNull() + + # Test saving the file + tempfile = str(tmp_path / f"temp_{mode}.png") + data.save(tempfile) + + # from QPixmap + roundtrip(hopper(mode)) + + app.quit() + app = None diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index 8d599f9bf..1a2bfd71e 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -11,13 +11,6 @@ pytestmark = pytest.mark.skipif( if ImageQt.qt_is_installed: from PIL.ImageQt import QImage - try: - from PyQt5 import QtGui - from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget - except (ImportError, RuntimeError): - from PySide2 import QtGui - from PySide2.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget - def test_sanity(tmp_path): for mode in ("RGB", "RGBA", "L", "P", "1"): @@ -49,29 +42,3 @@ def test_sanity(tmp_path): # Check that it actually worked. with Image.open(tempfile) as reloaded: assert_image_equal(reloaded, src) - - -def test_segfault(): - app = QApplication([]) - ex = Example() - assert app # Silence warning - assert ex # Silence warning - - -if ImageQt.qt_is_installed: - - class Example(QWidget): - def __init__(self): - super().__init__() - - img = hopper().resize((1000, 1000)) - - qimage = ImageQt.ImageQt(img) - - pixmap1 = QtGui.QPixmap.fromImage(qimage) - - QHBoxLayout(self) # hbox - - lbl = QLabel(self) - # Segfault in the problem - lbl.setPixmap(pixmap1.copy()) diff --git a/Tests/test_qt_image_toqpixmap.py b/Tests/test_qt_image_toqpixmap.py deleted file mode 100644 index f38cc7f13..000000000 --- a/Tests/test_qt_image_toqpixmap.py +++ /dev/null @@ -1,20 +0,0 @@ -from PIL import ImageQt - -from .helper import hopper -from .test_imageqt import PillowQPixmapTestCase - -if ImageQt.qt_is_installed: - from PIL.ImageQt import QPixmap - - -class TestToQPixmap(PillowQPixmapTestCase): - def test_sanity(self, tmp_path): - for mode in ("1", "RGB", "RGBA", "L", "P"): - data = ImageQt.toqpixmap(hopper(mode)) - - assert isinstance(data, QPixmap) - assert not data.isNull() - - # Test saving the file - tempfile = str(tmp_path / f"temp_{mode}.png") - data.save(tempfile) From 61753891869d75bff3ce9256b684d3da0762f01a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 12:45:02 +1100 Subject: [PATCH 186/750] Only read different sizes for "Large Thumbnail" frames --- Tests/images/ignore_frame_size.mpo | Bin 0 -> 4405 bytes Tests/test_file_mpo.py | 13 ++++++++++++- src/PIL/MpoImagePlugin.py | 8 +++++--- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Tests/images/ignore_frame_size.mpo diff --git a/Tests/images/ignore_frame_size.mpo b/Tests/images/ignore_frame_size.mpo new file mode 100644 index 0000000000000000000000000000000000000000..c4d60707a47f18ffe644a27443b974b3c3c613f2 GIT binary patch literal 4405 zcmeHJd010d7QZhG2|+oj-E}J#cPit(>@3e54Z$CncfS|i%Xo1@5d!c zH}HjY7K;lF?hGt~4a*PiW7+=L81%&q&gB>Y zpoP^EcJ^4TnI;D@5$y%Ho!74gj*f<~3<0*0%OpujP+@kE%LIu#R+>0Ct_6EKY#Xq9 zfYbUBn<6!M5B9-(L#*DQ!I>4)v#|vUmA_+RB}Ec76^_eP5+xX(|EyvD&ae$))&3`j zc7bF-A(6-=848(9mZMPQFOOb;wHiF0F2zVlq0AE2Q9xH2tB2j56%}z#{?Mu?$twKL^ ztbnYux}sKfL#se{rC&s%EM@+Jg^Sdd=`GhcFk~=SnVOkftohu2t;0G;C%288HoJRx zdiie)2n^aD9I|KczR0NPnAoJ`uMelB9!cXKKarFB&B;@z3(pr_xOnM1UUB7>t5wz4 zuHU$M=Wbp7y@tl0?zcT`fApCDq@%N^x3B;Ci-EzRmm_aS$Hw1H2;Wb_cV(ImyiPOv zfR7^NgCh{|1QNyv!9~G_S0oUZ(qxqE*d*WG%G&fpWR=y&3My)4byjW=sQN{;Qs(P2 zdX|k~lq8HkjZor$#b}n$EFZKJ%)uk@!0?KI1x8Nm172xq&<{5|%GH0Y!Av|_0Pu3&a%hLU(;MMNybNpij^`i&Z zHSKwjne%p0)sDNlPEPG_9u^P9?~FBzZo66iyj!KZn-Wr&@bj6PN!jvqMwe1pNi5ET z^zgdGv`PPDBWEjCv7=gJZpUVj^g|5kQtbT;+c&s>Tfsh>dj|z~OiL1eE*IO>^!bzs zZr<;0xErPD-B8ieMO{S7C>a_nCt1|B@sf8ReLOgP=MI|}xmQE)$bjG;PbKumuaE87 z=ZZ?B-9R(_o70GIJZ}LY$ zVpN+j!SmrY<(0_5 zcuMP%X!Jx@GhWQhwf4zs-g`hN{I(@OxM$tA6eoXe)oz1;r?g`SS8|qT1+yy#;TkK} zF3)qhkw*I_`qakQGwx?C7-5z6`ge;j*Q(}v@jpAZ>Drh5-~YQMheYZort9-;#SD5~X+3DrGfWx4M6?~+iUfdaMnl#>fL9zP!L z)|Rn3hpYUDXPE_(=*TOT{Mq3yTzm3Y#FoayQewwJ`4rkS)9RW7fgG6T))6<|BHUXPGH*LXXa1!%YhH|3zU5y>KCa3!Su_= z6o?ZXpHU!~ron7JY?!qCGzIdP{`gCOe4?WI6#Y>$X_FOG7Q*)MsPpkuST0;2<+mU4 zZ0D)1-;>+Kt~a;T$>)pJLo_tombI6egau^ku`8{+GF>dw`i;INrXQw%%OkY?P{k;5 zewcHTz2%~vJ&5WI{6;X?@zodcCEoD`g>H<1llpOU?%eYl35_ z+0(ML2%&C->+*tOj`Hcp4c9v>ubMn8@BP_LLCthxOGn0tZC|ZhmS>@6X>>-ch$SAJ z;`C?k2pX}mv)@0UwW-Nk@11xRw^Nh0@!8oQw~F-&_vyG;wLJ+jc4@3Y0r^EK3T$eG zP)B6!4@%7EcGXVqSZT~(m+E__?}bgysQGy8zFi~hqxfS%2b7f3f4R?5d>#0`ApLUJ z#rJbsv+1PO@u7{Zp2d$62KZ1Da7IdgqN(tDyaUH?P07};-oV>yzo+o!{9TOEu2&hc z)z4zjL^4<3PCM(-?tb(^-wE%%zFQLD7r9@ZH5DmNyiw6z8_+6jnS2w+LV=c%>x9B6 zbL4%NfX^FZ3sbE&!NJWaC_5q=K2qF-f}~N^@YK4IZMPT~(i55-9r_Vgk9R=)PQ)v# zd9)<|OZfTQk6EcP{}#b>m%V@Pyl&nwNBv~gtF}>VLzbdK z>g(s%TZ=rhZy6bd`M4l2u5Y03incjiViMdI+H7PJ{aoa4(h^Fx#+y%(#+c3gj;)Wr zbC`S?lXGB|DqqMF+dV`9pEGr0qkm0egF~O?QI4{=m)#O}XIC#%?iN8gb3pxNxbRDp zgn>>4(SA{Af55@yvrkVA7PqWOnpPs$P|#3wulS{!Xfor9-HNMnT={X*uG(?N&@*3I z1HCcQrm9eluwGtV%hqzyXofpHK(G4pD|e09Sp_d#dwsV=B`;c=XXByp>x9`Wqa{%S z&yBZr_BXq}DW4kCA65Qs7zObZ!H(b5qZDYY+cgsp&c{krihZ8%(`Wlm#ZCDQHMmj_ h33pE!X2e@Fx7){P#9i~X->y}7kfIL?53 Date: Fri, 1 Jan 2021 13:00:01 +1100 Subject: [PATCH 187/750] Changed MP Type to match #1631 image --- Tests/images/sugarshack_frame_size.mpo | Bin 120198 -> 120198 bytes Tests/test_file_mpo.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/images/sugarshack_frame_size.mpo b/Tests/images/sugarshack_frame_size.mpo index 81d58e64b8268eac4210f1506b4dbded0b92ffda..009280a79a648be15d6064c96f931e71ce9fde8e 100644 GIT binary patch delta 22 ecmZo$&EB?}eZx_4W=00a<`d%EPlz+_+Y10*> Date: Fri, 1 Jan 2021 15:54:53 +1100 Subject: [PATCH 188/750] Added isort to lint-fix --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 0ed453705..36338b2e1 100644 --- a/Makefile +++ b/Makefile @@ -114,3 +114,4 @@ lint: .PHONY: lint-fix lint-fix: black --target-version py36 . + isort . From 4f28ed3956a8104a7e36e7f0fe2b74d034d4a4aa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jan 2021 23:32:46 +1100 Subject: [PATCH 189/750] Changed tabs to spaces for consistency --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 36338b2e1..af1c12039 100644 --- a/Makefile +++ b/Makefile @@ -41,8 +41,8 @@ help: @echo " install-coverage make and install with C coverage" @echo " install-req install documentation and test dependencies" @echo " install-venv (deprecated) install in virtualenv" - @echo " lint run the lint checks" - @echo " lint-fix run black to (mostly) fix lint issues." + @echo " lint run the lint checks" + @echo " lint-fix run black to (mostly) fix lint issues." @echo " release-test run code and package tests before release" @echo " test run tests on installed pillow" @echo " upload build and upload sdists to PyPI" From 4e3dc9a06b4459b444af44a234ff37434ed1253f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 28 Dec 2020 12:58:08 +0200 Subject: [PATCH 190/750] Add support for PySide6 --- Tests/test_imageqt.py | 4 +++- Tests/test_qt_image_qapplication.py | 5 ++++- src/PIL/ImageQt.py | 11 +++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index 7a6e1354f..cf4aba982 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -14,7 +14,9 @@ def test_rgb(): # typedef QRgb # An ARGB quadruplet on the format #AARRGGBB, # equivalent to an unsigned int. - if ImageQt.qt_version == "5": + if ImageQt.qt_version == "side6": + from PySide6.QtGui import qRgb + elif ImageQt.qt_version == "5": from PyQt5.QtGui import qRgb elif ImageQt.qt_version == "side2": from PySide2.QtGui import qRgb diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index ef1ff5901..8d76eca3c 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -7,7 +7,10 @@ from .helper import assert_image_equal, hopper if ImageQt.qt_is_installed: from PIL.ImageQt import QPixmap - if ImageQt.qt_version == "5": + if ImageQt.qt_version == "side6": + from PySide6 import QtGui + from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget + elif ImageQt.qt_version == "5": from PyQt5 import QtGui from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side2": diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 91be53488..64f07be11 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -22,13 +22,20 @@ from io import BytesIO from . import Image from ._util import isPath -qt_versions = [["5", "PyQt5"], ["side2", "PySide2"]] +qt_versions = [ + ["side6", "PySide6"], + ["5", "PyQt5"], + ["side2", "PySide2"], +] # If a version has already been imported, attempt it first qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) for qt_version, qt_module in qt_versions: try: - if qt_module == "PyQt5": + if qt_module == "PySide6": + from PySide6.QtCore import QBuffer, QIODevice + from PySide6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PyQt5": from PyQt5.QtCore import QBuffer, QIODevice from PyQt5.QtGui import QImage, QPixmap, qRgba elif qt_module == "PySide2": From effa65cb386638aa064ad92b17c9e91449fd461a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 28 Dec 2020 13:04:25 +0200 Subject: [PATCH 191/750] Refactor --- Tests/test_qt_image_qapplication.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index 8d76eca3c..06bd27c00 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -8,13 +8,10 @@ if ImageQt.qt_is_installed: from PIL.ImageQt import QPixmap if ImageQt.qt_version == "side6": - from PySide6 import QtGui from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "5": - from PyQt5 import QtGui from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side2": - from PySide2 import QtGui from PySide2.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget class Example(QWidget): @@ -25,7 +22,7 @@ if ImageQt.qt_is_installed: qimage = ImageQt.ImageQt(img) - pixmap1 = QtGui.QPixmap.fromImage(qimage) + pixmap1 = ImageQt.QPixmap.fromImage(qimage) QHBoxLayout(self) # hbox From 8e948d066a36f53f31b34bbaf4199443dbfa489b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 09:34:31 +1100 Subject: [PATCH 192/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 8cedc7415..3573d934f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Add support for PySide6 #5161 + [hugovk] + - Use disposal settings from previous frame in APNG #5126 [radarhere] From 3808aee4e6d019def83132d9ab3e1514738273a4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 09:39:04 +1100 Subject: [PATCH 193/750] Document #5161 [ci skip] --- docs/releasenotes/8.1.0.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 79ed507f4..b52d9f883 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -55,3 +55,9 @@ PyPy wheels ^^^^^^^^^^^ Wheels have been added for PyPy 3.7. + +PySide6 +^^^^^^^ + +Support has been added for PySide6. If it is installed, it will be used instead of +PyQt5 or PySide2, since it is based on a newer Qt. From 6f3670df4d27f54f2bd66f9b1f2a98e59b46bf1d Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 2 Jan 2021 09:46:03 +1100 Subject: [PATCH 194/750] Updated description --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index af1c12039..dae26bbee 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ help: @echo " install-req install documentation and test dependencies" @echo " install-venv (deprecated) install in virtualenv" @echo " lint run the lint checks" - @echo " lint-fix run black to (mostly) fix lint issues." + @echo " lint-fix run black and isort to (mostly) fix lint issues." @echo " release-test run code and package tests before release" @echo " test run tests on installed pillow" @echo " upload build and upload sdists to PyPI" From 852503a4a3a7d47266c6a8b69e741136b47d76e8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 11:00:33 +1100 Subject: [PATCH 195/750] Document #5159 [ci skip] --- docs/releasenotes/8.1.0.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index b52d9f883..f89693677 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -15,6 +15,11 @@ vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). .. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ +Makefile +^^^^^^^^ + +The 'install-venv' target has been deprecated. + API Changes =========== @@ -51,6 +56,11 @@ security fixes. Other Changes ============= +Makefile +^^^^^^^^ + +The 'co' target has been removed. + PyPy wheels ^^^^^^^^^^^ From 01cad6bcad622cb853a58642b12facfe6dc86362 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 11:24:20 +1100 Subject: [PATCH 196/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3573d934f..346cfd2a9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Makefile updates #5159 + [wiredfool, radarhere] + - Add support for PySide6 #5161 [hugovk] From 527409053fb9d4732166e50b1624d9385230e859 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 19:39:42 +1100 Subject: [PATCH 197/750] Added deprecation message for install-venv --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index dae26bbee..53eaa0566 100644 --- a/Makefile +++ b/Makefile @@ -76,6 +76,7 @@ install-req: .PHONY: install-venv install-venv: + echo "'install-venv' is deprecated and will be removed in a future Pillow release" virtualenv . bin/pip install -r requirements.txt From e6ef8a6c0916807bd10d6a089ca95b70e03d538c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 19:58:03 +1100 Subject: [PATCH 198/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 346cfd2a9..7a21cf440 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Fix OOB Read when saving GIF of xsize=1 #5149 + [wiredfool] + - Makefile updates #5159 [wiredfool, radarhere] From 6ffa37b85bc46133ac3c176253e36bff9c6c7272 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 19:59:29 +1100 Subject: [PATCH 199/750] Document #5149 [ci skip] --- docs/releasenotes/8.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index b52d9f883..37571d731 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -40,7 +40,7 @@ Security ======== An out-of-bounds read when saving TIFFs with custom metadata through libtiff has been -fixed. +fixed, as well as when saving a GIF of 1px width. Dependencies ^^^^^^^^^^^^ From 7e95c63fa7f503f185d3d9eb16b9cee1e54d1e46 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 29 Oct 2020 23:07:15 +0000 Subject: [PATCH 200/750] Fix for SGI Decode buffer overrun CVE-2020-35655 * Independently found by a contributor and sent to Tidelift, and by Google's OSS Fuzz. --- ...7f2244da6d0ae297ee0754a424213444e92778.sgi | Bin 0 -> 6973 bytes Tests/images/ossfuzz-5730089102868480.sgi | Bin 0 -> 530 bytes Tests/test_sgi_crash.py | 8 +++++- src/libImaging/SgiRleDecode.c | 23 ++++++++++++------ 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi create mode 100644 Tests/images/ossfuzz-5730089102868480.sgi diff --git a/Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi b/Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi new file mode 100644 index 0000000000000000000000000000000000000000..74396935b9a5df427fdcc80c5d884e0196f6caf0 GIT binary patch literal 6973 zcmeI0e^6G}na4l(_qq4I_bwXKxW*WUl9XCw(NaS-H4Y`w7*cIY3`;30MPn!-#IVG; zl%@0?N{u>7S*ylaLJ854#9RI~)^6DQ~flo{5&u)T66OghU?uv&MEwCyZzUo8n za`^focvK$W=3Mw@6MQEIc5H<2b;0+iLVXTAcNmVyd`kti&w^i$z^k3`t9}@o10%=a zUCA?%iRNrXi|It0k%bl?gLca$v}8FNDNE4OYSHdbKwI05mS2PR*nYI~HneT;q3y{= ztLsNQT!GfI60IW{t!FXXzy`FDI<%|9=vET?lxp-F#?fbQKwoeX{R=thD|*ng63{mk zq8A-PFB?SP=A-YKh5pQJ^#6`WKRy+`V-&ro7k!`^eWV`!>Rt?UD@IHi#>~wa2?ZEQ z8!(pSV5DVXWQcNCVHAo=M3pkGmbDtOIh2RdT#V6Pj&W)`#u;CpOR#P^iuJi1tUJoE?oGm49gmg266^8pSQUL()ibf4UW3(8 zfb~KNR>wxH(^*)93$ZTySbvy`ZI@$DX~CX(68jU4*z?P%@LjVUHwZzngzdfPHH#KJqvK|E5`Y%*shD>Jd}=8^d3%0InK9+ah{li zQYgHsW4?7Wbwf;(j^-H@O%$B^~$fG2Hu- zakH~c4s#@k+ix9f{|`^B$b;XOBqcSQV-@4|br z5bx#Xc&Fp>UN`ZE&f<+Un~g& zl4cS~k0p|oLL@hjNPZQOqGLo#28l%9A+k*o`L9_-o=PI}%t|89l@dA9NaXkkk&|B6_)Nmt7YXMT5Z*dMxHy|I^(Df)XA^#@ zobdi$!t7aux#@&?n+OYc5EhF{qJ-t^2`d*6ZW|^1ZVlm{g@pTC2V5M!sB}hPb3qbJVf}?6~eBogx!+AcNO7lhY8Qr5uTG+Z=@0qO5VX!gl|gTH}gfu z2#1tNY=^{d=pDjeFA;4Qogo~Sy$;LXhUMPQPZQ;cBLsT!4dl^X)?GT+Me0z>)Gt5hXTkB!*Tu5z$yEEWR??A>rSX~V3 zWv(C={=EcBdLSzHPYC>}8iu_K;puWXa0(9J49^Q#`bh{Uo1tqf^h*4*HE`aB%XM(I z08Pt5^LC(JGmdt{ZnRGbD4Mq%ZBahj9Y@ht#-n9QzfQ)5GXEdxXceVsJ5QoLH6QIj zD_T<#TH7)-ITu=A8ro0^+LdEy|0m?pO-H|0piW#Y`dk4-iv;#8twjIw74$Vr(DS3{ zn_AJMGTtd`PsO1h6kv2j0MSnsdZ&P-zE1R^M)WJS=;OOER3*l=QjA!EJah6flGkIT zuEAI-5GX4XV}k&pB2ife#@1|%-MJWb0)^xp8!ZBpIw~-FsxSujVF#;74uRi=I@KJ%xbKEX~de*gLU&%ta*E}KA(?uR}0pvDAw01u?ml2ePbN!iBzoJ zGJZzJjU8A&>B8!4!+NbAYgjOAjDqsL+rZ+F5Op& zy;^|NgCp3Fj$wb}3ih|Vv3KsnesU#t-C690h1k#U#cmtLeo6dam9;Yi*uw&zF5iiL zwGc;% z0fA}1p1}D{G0v5KoH2?22Z3Vbp{!*ndB3Vq;MLSp)O7;1uJ1v`3hcT`K-MS4=9VaG zp6IjHsLu_c7B`?$7o+YHkhP*4bzd{;D>bOKvi^YRp*qx~ZK%gbP-OzwD#}n>1*Cm< zA!?7<)|8;0mG}+ff3zOeD!wO&P_N{o`UI4{F&%ZW2{rl->irsAPe9nT5!@T&a1(lP z=cnKBfR{tMUEK4u| literal 0 HcmV?d00001 diff --git a/Tests/images/ossfuzz-5730089102868480.sgi b/Tests/images/ossfuzz-5730089102868480.sgi new file mode 100644 index 0000000000000000000000000000000000000000..a92c1ed019bf1505edc5cc7444f72bd89f7105b7 GIT binary patch literal 530 zcmbV}JxT;Y5QX0x1_l2X!3#{Vk%1bUmuz`gUnXQAvCj}~ z7>4_*w5lQ8R_)W3#s6Qn?)|gR$6YB~%3<#QnCan5OLprB9k|!1GG*%B<)Kn9rCeY5 lRXC<*?69+uJ>aQ&fSW~xI==&kzK^d-^5=gx6Y-&T?Hdo^jb8u& literal 0 HcmV?d00001 diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index 2b671244a..6626f55f7 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -6,7 +6,13 @@ from PIL import Image @pytest.mark.parametrize( "test_file", - ["Tests/images/sgi_overrun_expandrowF04.bin", "Tests/images/sgi_crash.bin"], + [ + "Tests/images/sgi_overrun_expandrowF04.bin", + "Tests/images/sgi_crash.bin", + "Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi", + "Tests/images/ossfuzz-5730089102868480.sgi", + + ], ) def test_crashes(test_file): with open(test_file, "rb") as f: diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index a03ecd456..46a917923 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -112,11 +112,27 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, int err = 0; int status; + /* size check */ + if (im->xsize > INT_MAX / im->bands || + im->ysize > INT_MAX / im->bands) { + return IMAGING_CODEC_MEMORY; + } + /* Get all data from File descriptor */ c = (SGISTATE*)state->context; _imaging_seek_pyFd(state->fd, 0L, SEEK_END); c->bufsize = _imaging_tell_pyFd(state->fd); c->bufsize -= SGI_HEADER_SIZE; + + c->tablen = im->bands * im->ysize; + /* below, we populate the starttab and lentab into the bufsize, + each with 4 bytes per element of tablen + Check here before we allocate any memory + */ + if (c->bufsize < 8*c->tablen) { + return IMAGING_CODEC_MEMORY; + } + ptr = malloc(sizeof(UINT8) * c->bufsize); if (!ptr) { return IMAGING_CODEC_MEMORY; @@ -134,18 +150,11 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, state->ystep = 1; } - if (im->xsize > INT_MAX / im->bands || - im->ysize > INT_MAX / im->bands) { - err = IMAGING_CODEC_MEMORY; - goto sgi_finish_decode; - } - /* Allocate memory for RLE tables and rows */ free(state->buffer); state->buffer = NULL; /* malloc overflow check above */ state->buffer = calloc(im->xsize * im->bands, sizeof(UINT8) * 2); - c->tablen = im->bands * im->ysize; c->starttab = calloc(c->tablen, sizeof(UINT32)); c->lengthtab = calloc(c->tablen, sizeof(UINT32)); if (!state->buffer || From 9a2c9f722f78773e608d44710873437baf3f17d1 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 30 Oct 2020 09:57:23 +0000 Subject: [PATCH 201/750] Make the SGI code return -1 as an error flag, error in state --- src/libImaging/SgiRleDecode.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index 46a917923..9a8814b50 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -115,7 +115,8 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, /* size check */ if (im->xsize > INT_MAX / im->bands || im->ysize > INT_MAX / im->bands) { - return IMAGING_CODEC_MEMORY; + state->errcode = IMAGING_CODEC_MEMORY; + return -1; } /* Get all data from File descriptor */ @@ -130,12 +131,14 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, Check here before we allocate any memory */ if (c->bufsize < 8*c->tablen) { - return IMAGING_CODEC_MEMORY; + state->errcode = IMAGING_CODEC_OVERRUN; + return -1; } ptr = malloc(sizeof(UINT8) * c->bufsize); if (!ptr) { - return IMAGING_CODEC_MEMORY; + state->errcode = IMAGING_CODEC_MEMORY; + return -1; } _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); _imaging_read_pyFd(state->fd, (char*)ptr, c->bufsize); @@ -185,7 +188,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, if (c->rleoffset + c->rlelength > c->bufsize) { state->errcode = IMAGING_CODEC_OVERRUN; - return -1; + goto sgi_finish_decode; } /* row decompression */ @@ -197,7 +200,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, } if (status == -1) { state->errcode = IMAGING_CODEC_OVERRUN; - return -1; + goto sgi_finish_decode; } else if (status == 1) { goto sgi_finish_decode; } @@ -218,7 +221,8 @@ sgi_finish_decode: ; free(c->lengthtab); free(ptr); if (err != 0){ - return err; + state->errcode=err; + return -1; } return state->count - c->bufsize; } From 1cbb12fb6e44da0d6d6d58254d0d96930d04af5e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 20:19:26 +1100 Subject: [PATCH 202/750] Lint fix --- Tests/test_sgi_crash.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index 6626f55f7..ac304aab4 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -11,7 +11,6 @@ from PIL import Image "Tests/images/sgi_crash.bin", "Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi", "Tests/images/ossfuzz-5730089102868480.sgi", - ], ) def test_crashes(test_file): From eb8c1206d6b170d4e798a00db7432e023853da5c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Nov 2020 14:16:38 +0000 Subject: [PATCH 203/750] Fix CVE-2020-35654 - OOB Write in TiffDecode.c * In some circumstances with some versions of libtiff (4.1.0+), there could be a 4 byte out of bound write when decoding a YCbCr tiff. * The Pillow code dates to 6.0.0 * Found and reported through Tidelift --- Tests/images/crash-2020-10-test.tif | Bin 0 -> 4883 bytes Tests/test_tiff_crashes.py | 7 +- src/libImaging/TiffDecode.c | 286 +++++++++++++++++----------- 3 files changed, 185 insertions(+), 108 deletions(-) create mode 100644 Tests/images/crash-2020-10-test.tif diff --git a/Tests/images/crash-2020-10-test.tif b/Tests/images/crash-2020-10-test.tif new file mode 100644 index 0000000000000000000000000000000000000000..958cdde22098ae65a82e671407f170ef75e34a1f GIT binary patch literal 4883 zcmeHKU2GIp6h3!$x-M;jwk&O|O9s$m#tJfoVVWf+wliKAaz3DL z^_15Db50FKdLu|=+eD)S*U4kH2@kKzBiEbDVY2P(T}rDm(pq^aZUOgY%L$s%t+xf8m2zOyS;uA{V(FvKrE?EgNalcZzcY)9bytoJ zL*L#Gu^aX&n|bvbVAJ2XF92MJ>z>CLE9sI_DXqA}q23?$_(NyK8zIyWTY+qZJuC5kSJzke zq;3B(d7BF(h}hV1>BoZ~*!eOV6PDv2?V#yCQg|fgvFqrT!{v4zlL@OdQbSWD8jr^x zT$^ZXwKiF?&=rcyRG5{HgQD8B>jTG=#}6G% z9c-)b*n4D8f1u~F#{->5hWZ07p_b-nBN5A}^q7>cigc`4^~Ccf^?k2h@NeGp(M|g* zdFC58)Pu6Q8GIZmZZ4Q(m<=HVrUL$LHDVJhG$_AH1%C~{U{Wcj30$*EYHY5tAZC?g zKCT{}c1wv|Whu5`U1mE?tDo5lrMLEUZ8Hk(#7|JoTtZjC(GE7ZX5CsMo-MnB;$DNq z1?J+O#LUg%-BAw(Fqh)p3#dogkHq#0<2>jb4_5sWOw#dSe%*ON z4$*Sqm0Qqz$t#<0c@Wm)Id2;QnpsXXW;f$J4M z0UT8LQ{dGS8&uUqv^G;B9kdI0ox(%Fjo@KNy#l-*bjE4mCWTJ{hZKGbI1C-iz;g~b z0ynLeZn>67Vm;+!Q|n z{#D^GfPV+(L)tj--ORMJ@)_f95cD5G_h%iaRN$l*1lBop59jOudb@ySy4SdOYd+}c z+}<$)L%BJ~j|mPSccm&)r$KHMJ)MIC-Kn7gaN(TzWZy7a?!wNJ{5E*`Dr_f`Hgm}v zyrjdnO_<<5Kzu^63Lz-RLr2u?QMdPgz%W4W(k*F1pYz#+Rnxn1B$cALRC7?$A zBc*{&Lwlb~c5m4hIDTjlUs1SgtKXkW9ZiPA!^6X&;i#n>G#AK>@55rL?JRg9QmxRD Yp?%?KB9RD3tgvM@W8LOsFC^Oj1mik+wEzGB literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 9c293e014..d0de4b305 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -19,7 +19,12 @@ from .helper import on_ci @pytest.mark.parametrize( - "test_file", ["Tests/images/crash_1.tif", "Tests/images/crash_2.tif"] + "test_file", + [ + "Tests/images/crash_1.tif", + "Tests/images/crash_2.tif", + "Tests/images/crash-2020-10-test.tif", + ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") @pytest.mark.filterwarnings("ignore:Metadata warning") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index d86a42915..2684b9e28 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -238,54 +238,181 @@ int ReadTile(TIFF* tiff, UINT32 col, UINT32 row, UINT32* buffer) { return 0; } -int ReadStrip(TIFF* tiff, UINT32 row, UINT32* buffer) { - uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR - TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); - +int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { // To avoid dealing with YCbCr subsampling, let libtiff handle it - if (photometric == PHOTOMETRIC_YCBCR) { - TIFFRGBAImage img; - char emsg[1024] = ""; - UINT32 rows_per_strip, rows_to_read; - int ok; + // Use a TIFFRGBAImage wrapping the tiff image, and let libtiff handle + // all of the conversion. Metadata read from the TIFFRGBAImage could + // be different from the metadata that the base tiff returns. + INT32 strip_row; + UINT8 *new_data; + UINT32 rows_per_strip, row_byte_size, rows_to_read; + int ret; + TIFFRGBAImage img; + char emsg[1024] = ""; + int ok; - TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); - if ((row % rows_per_strip) != 0) { - TRACE(("Row passed to ReadStrip() must be first in a strip.")); - return -1; - } - - if (TIFFRGBAImageOK(tiff, emsg) && TIFFRGBAImageBegin(&img, tiff, 0, emsg)) { - TRACE(("Initialized RGBAImage\n")); - - img.req_orientation = ORIENTATION_TOPLEFT; - img.row_offset = row; - img.col_offset = 0; - - rows_to_read = min(rows_per_strip, img.height - row); - - TRACE(("rows to read: %d\n", rows_to_read)); - ok = TIFFRGBAImageGet(&img, buffer, img.width, rows_to_read); - - TIFFRGBAImageEnd(&img); - } else { - ok = 0; - } - - if (ok == 0) { - TRACE(("Decode Error, row %d; msg: %s\n", row, emsg)); - return -1; - } - - return 0; + ret = TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); + if (ret != 1) { + rows_per_strip = state->ysize; } + TRACE(("RowsPerStrip: %u \n", rows_per_strip)); - if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, row, 0), (tdata_t)buffer, -1) == -1) { - TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, row, 0))); + if (!(TIFFRGBAImageOK(tiff, emsg) && TIFFRGBAImageBegin(&img, tiff, 0, emsg))) { + TRACE(("Decode error, msg: %s", emsg)); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFClose(tiff); return -1; } + img.req_orientation = ORIENTATION_TOPLEFT; + img.col_offset = 0; + + if (state->xsize != img.width || state->ysize != img.height) { + TRACE(("Inconsistent Image Error: %d =? %d, %d =? %d", + state->xsize, img.width, state->ysize, img.height)); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFRGBAImageEnd(&img); + TIFFClose(tiff); + return -1; + } + + /* overflow check for row byte size */ + if (INT_MAX / 4 < img.width) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFRGBAImageEnd(&img); + TIFFClose(tiff); + return -1; + } + + // TiffRGBAImages are 32bits/pixel. + row_byte_size = img.width * 4; + + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < rows_per_strip) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFRGBAImageEnd(&img); + TIFFClose(tiff); + return -1; + } + + state->bytes = rows_per_strip * row_byte_size; + + TRACE(("StripSize: %d \n", state->bytes)); + + /* realloc to fit whole strip */ + /* malloc check above */ + new_data = realloc (state->buffer, state->bytes); + if (!new_data) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFRGBAImageEnd(&img); + TIFFClose(tiff); + return -1; + } + + state->buffer = new_data; + + for (; state->y < state->ysize; state->y += rows_per_strip) { + img.row_offset = state->y; + rows_to_read = min(rows_per_strip, img.height - state->y); + + if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == -1) { + TRACE(("Decode Error, y: %d\n", state->y )); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFRGBAImageEnd(&img); + TIFFClose(tiff); + return -1; + } + + TRACE(("Decoded strip for row %d \n", state->y)); + + // iterate over each row in the strip and stuff data into image + for (strip_row = 0; strip_row < min((INT32) rows_per_strip, state->ysize - state->y); strip_row++) { + TRACE(("Writing data into line %d ; \n", state->y + strip_row)); + + // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); + // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + + state->shuffle((UINT8*) im->image[state->y + state->yoff + strip_row] + + state->xoff * im->pixelsize, + state->buffer + strip_row * row_byte_size, + state->xsize); + } + } + TIFFRGBAImageEnd(&img); + return 0; +} + +int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { + INT32 strip_row; + UINT8 *new_data; + UINT32 rows_per_strip, row_byte_size; + int ret; + + ret = TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); + if (ret != 1) { + rows_per_strip = state->ysize; + } + TRACE(("RowsPerStrip: %u \n", rows_per_strip)); + + // We could use TIFFStripSize, but for YCbCr data it returns subsampled data size + row_byte_size = (state->xsize * state->bits + 7) / 8; + + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < rows_per_strip) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } + + state->bytes = rows_per_strip * row_byte_size; + + TRACE(("StripSize: %d \n", state->bytes)); + + if (TIFFStripSize(tiff) > state->bytes) { + // If the strip size as expected by LibTiff isn't what we're expecting, abort. + // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a + // call to TIFFReadEncodedStrip ... + + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } + + /* realloc to fit whole strip */ + /* malloc check above */ + new_data = realloc (state->buffer, state->bytes); + if (!new_data) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } + + state->buffer = new_data; + + for (; state->y < state->ysize; state->y += rows_per_strip) { + if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, 0), (tdata_t)state->buffer, -1) == -1) { + TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFClose(tiff); + return -1; + } + + TRACE(("Decoded strip for row %d \n", state->y)); + + // iterate over each row in the strip and stuff data into image + for (strip_row = 0; strip_row < min((INT32) rows_per_strip, state->ysize - state->y); strip_row++) { + TRACE(("Writing data into line %d ; \n", state->y + strip_row)); + + // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); + // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + + state->shuffle((UINT8*) im->image[state->y + state->yoff + strip_row] + + state->xoff * im->pixelsize, + state->buffer + strip_row * row_byte_size, + state->xsize); + } + } return 0; } @@ -294,6 +421,9 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ char *filename = "tempfile.tif"; char *mode = "r"; TIFF *tiff; + uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR + int isYCbCr = 0; + int ret; /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ @@ -354,6 +484,10 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ } } + + TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); + isYCbCr = photometric == PHOTOMETRIC_YCBCR; + if (TIFFIsTiled(tiff)) { INT32 x, y, tile_y; UINT32 tile_width, tile_length, current_tile_width, row_byte_size; @@ -429,75 +563,13 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ } } } else { - INT32 strip_row; - UINT8 *new_data; - UINT32 rows_per_strip, row_byte_size; - int ret; - - ret = TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); - if (ret != 1) { - rows_per_strip = state->ysize; + if (!isYCbCr) { + ret = _decodeStrip(im, state, tiff); } - TRACE(("RowsPerStrip: %u \n", rows_per_strip)); - - // We could use TIFFStripSize, but for YCbCr data it returns subsampled data size - row_byte_size = (state->xsize * state->bits + 7) / 8; - - /* overflow check for realloc */ - if (INT_MAX / row_byte_size < rows_per_strip) { - state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; - } - - state->bytes = rows_per_strip * row_byte_size; - - TRACE(("StripSize: %d \n", state->bytes)); - - if (TIFFStripSize(tiff) > state->bytes) { - // If the strip size as expected by LibTiff isn't what we're expecting, abort. - // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a - // call to TIFFReadEncodedStrip ... - - state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; - } - - /* realloc to fit whole strip */ - /* malloc check above */ - new_data = realloc (state->buffer, state->bytes); - if (!new_data) { - state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; - } - - state->buffer = new_data; - - for (; state->y < state->ysize; state->y += rows_per_strip) { - if (ReadStrip(tiff, state->y, (UINT32 *)state->buffer) == -1) { - TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); - state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); - return -1; - } - - TRACE(("Decoded strip for row %d \n", state->y)); - - // iterate over each row in the strip and stuff data into image - for (strip_row = 0; strip_row < min((INT32) rows_per_strip, state->ysize - state->y); strip_row++) { - TRACE(("Writing data into line %d ; \n", state->y + strip_row)); - - // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); - // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - - state->shuffle((UINT8*) im->image[state->y + state->yoff + strip_row] + - state->xoff * im->pixelsize, - state->buffer + strip_row * row_byte_size, - state->xsize); - } + else { + ret = _decodeStripYCbCr(im, state, tiff); } + if (ret == -1) { return ret; } } TIFFClose(tiff); From 45a62e91b1f72e79989a7919af97b062dc8dfaf4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 1 Nov 2020 16:25:31 +0000 Subject: [PATCH 204/750] Rework ReadTile * Don't malloc for the swap line, just shuffle backwards * Ensure that im->pixelsize is sanity checked * Ensure that we're using the right size for the buffer from TiffReadRGBATile --- src/libImaging/TiffDecode.c | 164 ++++++++++++++---------------------- 1 file changed, 61 insertions(+), 103 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 2684b9e28..5cbbe7380 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -181,63 +181,6 @@ int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { } -int ReadTile(TIFF* tiff, UINT32 col, UINT32 row, UINT32* buffer) { - uint16 photometric = 0; - - TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); - - // To avoid dealing with YCbCr subsampling, let libtiff handle it - if (photometric == PHOTOMETRIC_YCBCR) { - UINT32 tile_width, tile_height, swap_line_size, i_row; - UINT32* swap_line; - - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); - TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_height); - - swap_line_size = tile_width * sizeof(UINT32); - if (tile_width != swap_line_size / sizeof(UINT32)) { - return -1; - } - - /* Read the tile into an RGBA array */ - if (!TIFFReadRGBATile(tiff, col, row, buffer)) { - return -1; - } - - swap_line = (UINT32*)malloc(swap_line_size); - if (swap_line == NULL) { - return -1; - } - /* - * For some reason the TIFFReadRGBATile() function chooses the - * lower left corner as the origin. Vertically mirror scanlines. - */ - for(i_row = 0; i_row < tile_height / 2; i_row++) { - UINT32 *top_line, *bottom_line; - - top_line = buffer + tile_width * i_row; - bottom_line = buffer + tile_width * (tile_height - i_row - 1); - - memcpy(swap_line, top_line, 4*tile_width); - memcpy(top_line, bottom_line, 4*tile_width); - memcpy(bottom_line, swap_line, 4*tile_width); - } - - free(swap_line); - - return 0; - } - - if (TIFFReadTile(tiff, (tdata_t)buffer, col, row, 0, 0) == -1) { - TRACE(("Decode Error, Tile at %dx%d\n", col, row)); - return -1; - } - - TRACE(("Successfully read tile at %dx%d; \n\n", col, row)); - - return 0; -} - int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { // To avoid dealing with YCbCr subsampling, let libtiff handle it // Use a TIFFRGBAImage wrapping the tiff image, and let libtiff handle @@ -250,7 +193,6 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { int ret; TIFFRGBAImage img; char emsg[1024] = ""; - int ok; ret = TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); if (ret != 1) { @@ -261,7 +203,7 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { if (!(TIFFRGBAImageOK(tiff, emsg) && TIFFRGBAImageBegin(&img, tiff, 0, emsg))) { TRACE(("Decode error, msg: %s", emsg)); state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); + // nothing to clean up, just return return -1; } @@ -272,17 +214,13 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { TRACE(("Inconsistent Image Error: %d =? %d, %d =? %d", state->xsize, img.width, state->ysize, img.height)); state->errcode = IMAGING_CODEC_BROKEN; - TIFFRGBAImageEnd(&img); - TIFFClose(tiff); - return -1; + goto decodeycbcr_err; } /* overflow check for row byte size */ if (INT_MAX / 4 < img.width) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFRGBAImageEnd(&img); - TIFFClose(tiff); - return -1; + goto decodeycbcr_err; } // TiffRGBAImages are 32bits/pixel. @@ -291,9 +229,7 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { /* overflow check for realloc */ if (INT_MAX / row_byte_size < rows_per_strip) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFRGBAImageEnd(&img); - TIFFClose(tiff); - return -1; + goto decodeycbcr_err; } state->bytes = rows_per_strip * row_byte_size; @@ -305,9 +241,7 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { new_data = realloc (state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFRGBAImageEnd(&img); - TIFFClose(tiff); - return -1; + goto decodeycbcr_err; } state->buffer = new_data; @@ -319,9 +253,7 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == -1) { TRACE(("Decode Error, y: %d\n", state->y )); state->errcode = IMAGING_CODEC_BROKEN; - TIFFRGBAImageEnd(&img); - TIFFClose(tiff); - return -1; + goto decodeycbcr_err; } TRACE(("Decoded strip for row %d \n", state->y)); @@ -339,7 +271,12 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { state->xsize); } } - TIFFRGBAImageEnd(&img); + + decodeycbcr_err: + TIFFRGBAImageEnd(&img); + if (state->errcode != 0) { + return -1; + } return 0; } @@ -361,7 +298,6 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { /* overflow check for realloc */ if (INT_MAX / row_byte_size < rows_per_strip) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); return -1; } @@ -375,7 +311,6 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { // call to TIFFReadEncodedStrip ... state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); return -1; } @@ -384,7 +319,6 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { new_data = realloc (state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); return -1; } @@ -394,7 +328,6 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, 0), (tdata_t)state->buffer, -1) == -1) { TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); return -1; } @@ -423,7 +356,6 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ TIFF *tiff; uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR int isYCbCr = 0; - int ret; /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ @@ -480,7 +412,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ rv = TIFFSetSubDirectory(tiff, ifdoffset); if (!rv){ TRACE(("error in TIFFSetSubDirectory")); - return -1; + goto decode_err; } } @@ -490,7 +422,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ if (TIFFIsTiled(tiff)) { INT32 x, y, tile_y; - UINT32 tile_width, tile_length, current_tile_width, row_byte_size; + UINT32 tile_width, tile_length, current_tile_length, current_line, current_tile_width, row_byte_size; UINT8 *new_data; TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); @@ -499,18 +431,26 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ /* overflow check for row_byte_size calculation */ if ((UINT32) INT_MAX / state->bits < tile_width) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; + goto decode_err; } - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size - row_byte_size = (tile_width * state->bits + 7) / 8; + + if (isYCbCr) { + row_byte_size = tile_width * 4; + /* sanity check, we use this value in shuffle below */ + if (im->pixelsize != 4) { + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } + } else { + // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size + row_byte_size = (tile_width * state->bits + 7) / 8; + } /* overflow check for realloc */ if (INT_MAX / row_byte_size < tile_length) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; + goto decode_err; } state->bytes = row_byte_size * tile_length; @@ -518,8 +458,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ if (TIFFTileSize(tiff) > state->bytes) { // If the strip size as expected by LibTiff isn't what we're expecting, abort. state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; + goto decode_err; } /* realloc to fit whole tile */ @@ -527,8 +466,7 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ new_data = realloc (state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - return -1; + goto decode_err; } state->buffer = new_data; @@ -537,26 +475,46 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ for (y = state->yoff; y < state->ysize; y += tile_length) { for (x = state->xoff; x < state->xsize; x += tile_width) { - if (ReadTile(tiff, x, y, (UINT32*) state->buffer) == -1) { - TRACE(("Decode Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); - return -1; + if (isYCbCr) { + /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ + if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { + TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } + } else { + if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, 0) == -1) { + TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } } TRACE(("Read tile at %dx%d; \n\n", x, y)); current_tile_width = min((INT32) tile_width, state->xsize - x); - + current_tile_length = min((INT32) tile_length, state->ysize - y); // iterate over each line in the tile and stuff data into image - for (tile_y = 0; tile_y < min((INT32) tile_length, state->ysize - y); tile_y++) { + for (tile_y = 0; tile_y < current_tile_length; tile_y++) { TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); // UINT8 * bbb = state->buffer + tile_y * row_byte_size; // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + /* + * For some reason the TIFFReadRGBATile() function + * chooses the lower left corner as the origin. + * Vertically mirror by shuffling the scanlines + * backwards + */ + if (isYCbCr) { + current_line = tile_length - tile_y - 1; + } else { + current_line = tile_y; + } + state->shuffle((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + tile_y * row_byte_size, + state->buffer + current_line * row_byte_size, current_tile_width ); } @@ -564,14 +522,14 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ } } else { if (!isYCbCr) { - ret = _decodeStrip(im, state, tiff); + _decodeStrip(im, state, tiff); } else { - ret = _decodeStripYCbCr(im, state, tiff); + _decodeStripYCbCr(im, state, tiff); } - if (ret == -1) { return ret; } } + decode_err: TIFFClose(tiff); TRACE(("Done Decoding, Returning \n")); // Returning -1 here to force ImageFile.load to break, rather than From 2f409261eb1228e166868f8f0b5da5cda52e55bf Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 17 Dec 2020 00:17:53 +0100 Subject: [PATCH 205/750] Fix for CVE CVE-2020-35655 - Read Overflow in PCX Decoding. * Don't trust the image to specify a buffer size --- Tests/images/ossfuzz-4836216264589312.pcx | Bin 0 -> 129 bytes Tests/test_image.py | 27 ++++++++++++---------- src/PIL/PcxImagePlugin.py | 9 ++++++-- 3 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 Tests/images/ossfuzz-4836216264589312.pcx diff --git a/Tests/images/ossfuzz-4836216264589312.pcx b/Tests/images/ossfuzz-4836216264589312.pcx new file mode 100644 index 0000000000000000000000000000000000000000..fdde9716a0cbd84900f9499c2f8c6d13067d456a GIT binary patch literal 129 wcmd;LP+(+WP*4Ej|6rg11t1QLjY`90z%&y`Cj@}_2tCMbm "7.0.0" - def test_overrun(self): - """For overrun completeness, test as: - valgrind pytest -qq Tests/test_image.py::TestImage::test_overrun | grep decode.c - """ - for file in [ + @pytest.mark.parametrize("path", [ "fli_overrun.bin", "sgi_overrun.bin", "sgi_overrun_expandrow.bin", "sgi_overrun_expandrow2.bin", "pcx_overrun.bin", "pcx_overrun2.bin", + "ossfuzz-4836216264589312.pcx", "01r_00.pcx", - ]: - with Image.open(os.path.join("Tests/images", file)) as im: - try: - im.load() - assert False - except OSError as e: - assert str(e) == "buffer overrun when reading image file" + ]) + def test_overrun(self, path): + """For overrun completeness, test as: + valgrind pytest -qq Tests/test_image.py::TestImage::test_overrun | grep decode.c + """ + with Image.open(os.path.join("Tests/images", path)) as im: + try: + im.load() + assert False + except OSError as e: + assert (str(e) == "buffer overrun when reading image file" or + "image file is truncated" in str(e)) + def test_fli_overrun2(self): with Image.open("Tests/images/fli_overrun2.bin") as im: try: im.seek(1) diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index b337b7dde..a24d44b42 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -66,13 +66,13 @@ class PcxImageFile(ImageFile.ImageFile): version = s[1] bits = s[3] planes = s[65] - stride = i16(s, 66) + ignored_stride = i16(s, 66) logger.debug( "PCX version %s, bits %s, planes %s, stride %s", version, bits, planes, - stride, + ignored_stride, ) self.info["dpi"] = i16(s, 12), i16(s, 14) @@ -110,6 +110,11 @@ class PcxImageFile(ImageFile.ImageFile): self.mode = mode self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] + # don't trust the passed in stride. Calculate for ourselves. + # CVE-2020-35655 + stride = (self._size[0] * bits + 7) // 8 + stride += stride % 2 + bbox = (0, 0) + self.size logger.debug("size: %sx%s", *self.size) From 903c67353da1dc3a59d5367338e76101a9cfb4b1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 20:41:17 +1100 Subject: [PATCH 206/750] Lint fix --- Tests/test_image.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index d91f1c263..f2a1917e8 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -775,7 +775,9 @@ class TestImage: with pytest.warns(DeprecationWarning): assert test_module.PILLOW_VERSION > "7.0.0" - @pytest.mark.parametrize("path", [ + @pytest.mark.parametrize( + "path", + [ "fli_overrun.bin", "sgi_overrun.bin", "sgi_overrun_expandrow.bin", @@ -784,7 +786,8 @@ class TestImage: "pcx_overrun2.bin", "ossfuzz-4836216264589312.pcx", "01r_00.pcx", - ]) + ], + ) def test_overrun(self, path): """For overrun completeness, test as: valgrind pytest -qq Tests/test_image.py::TestImage::test_overrun | grep decode.c @@ -794,8 +797,10 @@ class TestImage: im.load() assert False except OSError as e: - assert (str(e) == "buffer overrun when reading image file" or - "image file is truncated" in str(e)) + buffer_overrun = str(e) == "buffer overrun when reading image file" + truncated = "image file is truncated" in str(e) + + assert buffer_overrun or truncated def test_fli_overrun2(self): with Image.open("Tests/images/fli_overrun2.bin") as im: From 95f99d52c404dc467388bee351c41de15895cf55 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 21:27:50 +1100 Subject: [PATCH 207/750] Document CVE fixes [ci skip] --- CHANGES.rst | 9 +++++++++ docs/releasenotes/8.1.0.rst | 33 +++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7a21cf440..668aaa7c5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 8.1.0 (unreleased) ------------------ +- Fix TIFF OOB Write error. CVE-2020-35654 #5175 + [wiredfool] + +- Fix for Read Overflow in PCX Decoding. CVE-2020-35653 #5174 + [wiredfool, radarhere] + +- Fix for SGI Decode buffer overrun. CVE-2020-35655 #5173 + [wiredfool, radarhere] + - Fix OOB Read when saving GIF of xsize=1 #5149 [wiredfool] diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index da5f95405..84ec8ae76 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -20,14 +20,6 @@ Makefile The 'install-venv' target has been deprecated. -API Changes -=========== - -TODO -^^^^ - -TODO - API Additions ============= @@ -44,8 +36,29 @@ already exists for the ICNS format. Security ======== -An out-of-bounds read when saving TIFFs with custom metadata through libtiff has been -fixed, as well as when saving a GIF of 1px width. +This release includes security fixes. + +* An out-of-bounds read when saving TIFFs with custom metadata through libtiff +* An out-of-bounds read when saving a GIF of 1px width +* :cve:`CVE-2020-35653` Buffer Read Overrun in PCX Decoding. + +The PCX Image decoder used the reported image stride to calculate the row buffer, +rather than calculating it from the image size. This issue dates back to the PIL fork. +Thanks to Google's OSS-Fuzz project for finding this. + +* :cve:`CVE-2020-35654` Fix TIFF OOB Write error + +OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTiff versions +(4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases libtiff's +interpretation of the file is different when reading in RGBA mode, leading to an Out of +bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0.0 to +8.0.1, depending on the version of LibTiff. This was reported through Tidelift. + +* :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun + +4 Byte Read Overflow in SGIRleDecode.c, where the code was not correctly checking the +offsets and length tables. Independently reported through Tidelift and Google's OSS-Fuzz. +This vulnerability covers Pillow versions 4.3.0->8.0.1. Dependencies ^^^^^^^^^^^^ From c5c0cd89145f77ee33da927d397c12bc49bf4c8e Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 2 Jan 2021 11:54:56 +0100 Subject: [PATCH 208/750] document pillow-wheels PR180 --- docs/releasenotes/8.1.0.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index da5f95405..05196e154 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -53,6 +53,9 @@ Dependencies OpenJPEG in the macOS and Linux wheels has been updated from 2.3.1 to 2.4.0, including security fixes. +LibTIFF in the macOS and Linux wheels has been updated from 4.1.0 to 4.2.0, including +security fixes discovered by fuzzers. + Other Changes ============= From d88fdcda0699c647ba7a0befca97f08134fe6627 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 2 Jan 2021 22:00:35 +1100 Subject: [PATCH 209/750] Updated capitalisation [ci skip] Co-authored-by: Hugo van Kemenade --- docs/releasenotes/8.1.0.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 84ec8ae76..78c3e914a 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -38,25 +38,25 @@ Security This release includes security fixes. -* An out-of-bounds read when saving TIFFs with custom metadata through libtiff +* An out-of-bounds read when saving TIFFs with custom metadata through LibTIFF * An out-of-bounds read when saving a GIF of 1px width -* :cve:`CVE-2020-35653` Buffer Read Overrun in PCX Decoding. +* :cve:`CVE-2020-35653` Buffer read overrun in PCX decoding -The PCX Image decoder used the reported image stride to calculate the row buffer, +The PCX image decoder used the reported image stride to calculate the row buffer, rather than calculating it from the image size. This issue dates back to the PIL fork. Thanks to Google's OSS-Fuzz project for finding this. * :cve:`CVE-2020-35654` Fix TIFF OOB Write error -OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTiff versions -(4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases libtiff's +OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTIFF versions +(4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to an Out of bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0.0 to -8.0.1, depending on the version of LibTiff. This was reported through Tidelift. +8.0.1, depending on the version of LibTIFF. This was reported through Tidelift. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun -4 Byte Read Overflow in SGIRleDecode.c, where the code was not correctly checking the +4 byte read overflow in SGIRleDecode.c, where the code was not correctly checking the offsets and length tables. Independently reported through Tidelift and Google's OSS-Fuzz. This vulnerability covers Pillow versions 4.3.0->8.0.1. From 2711549503be2f665888c405eabaa9e8786d5ece Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 22:07:03 +1100 Subject: [PATCH 210/750] Link to TideLift [ci skip] --- docs/releasenotes/8.1.0.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 78c3e914a..e5228ac8c 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -52,13 +52,15 @@ OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTIFF versi (4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to an Out of bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0.0 to -8.0.1, depending on the version of LibTIFF. This was reported through Tidelift. +8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun 4 byte read overflow in SGIRleDecode.c, where the code was not correctly checking the -offsets and length tables. Independently reported through Tidelift and Google's OSS-Fuzz. -This vulnerability covers Pillow versions 4.3.0->8.0.1. +offsets and length tables. Independently reported through `Tidelift`_ and Google's +OSS-Fuzz. This vulnerability covers Pillow versions 4.3.0->8.0.1. + +.. _Tidelift: https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pillow&utm_medium=referral&utm_campaign=docs Dependencies ^^^^^^^^^^^^ From cd316feead0bba5f2e949a9cd4991ca7fe1d0615 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 22:09:07 +1100 Subject: [PATCH 211/750] Link to OSS-Fuzz [ci skip] --- docs/releasenotes/8.1.0.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index e5228ac8c..90847af81 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -44,7 +44,7 @@ This release includes security fixes. The PCX image decoder used the reported image stride to calculate the row buffer, rather than calculating it from the image size. This issue dates back to the PIL fork. -Thanks to Google's OSS-Fuzz project for finding this. +Thanks to Google's `OSS-Fuzz`_ project for finding this. * :cve:`CVE-2020-35654` Fix TIFF OOB Write error @@ -58,9 +58,10 @@ bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0. 4 byte read overflow in SGIRleDecode.c, where the code was not correctly checking the offsets and length tables. Independently reported through `Tidelift`_ and Google's -OSS-Fuzz. This vulnerability covers Pillow versions 4.3.0->8.0.1. +`OSS-Fuzz`_. This vulnerability covers Pillow versions 4.3.0->8.0.1. .. _Tidelift: https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pillow&utm_medium=referral&utm_campaign=docs +.. _OSS-Fuzz: https://github.com/google/oss-fuzz Dependencies ^^^^^^^^^^^^ From a99128052c472ed94f60b2b13548c0ee6dbf3c7d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 22:38:16 +1100 Subject: [PATCH 212/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 668aaa7c5..6296c09c7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,7 +2,7 @@ Changelog (Pillow) ================== -8.1.0 (unreleased) +8.1.0 (2020-01-02) ------------------ - Fix TIFF OOB Write error. CVE-2020-35654 #5175 From fcc42e0d344146ee9d265d1f43c094ce5a0ec4cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 2 Jan 2021 22:39:02 +1100 Subject: [PATCH 213/750] 8.1.0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 4fcb50190..8877e09d2 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = "8.1.0.dev0" +__version__ = "8.1.0" From 6b6c0b3692a94f4bc1cafb23232917c2026eb051 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 2 Jan 2021 13:06:49 +0100 Subject: [PATCH 214/750] Added docs for C-Extension debugging with valgrind [ci-skip] --- docs/reference/c_extension_debugging.rst | 469 +++++++++++++++++++++++ docs/reference/internal_design.rst | 1 + 2 files changed, 470 insertions(+) create mode 100644 docs/reference/c_extension_debugging.rst diff --git a/docs/reference/c_extension_debugging.rst b/docs/reference/c_extension_debugging.rst new file mode 100644 index 000000000..893acc699 --- /dev/null +++ b/docs/reference/c_extension_debugging.rst @@ -0,0 +1,469 @@ +C Extension debugging on Linux, with gbd/valgrind. +================================================== + +Install the tools +----------------- + +You need some basics in addition to the basic tools to build +pillow. These are what's required on Ubuntu, YMMV for other +distributions. + +- ``python3-dbg`` package for the gdb extensions and python symbols +- ``gdb`` and ``valgrind`` +- Potentially debug symbols for libraries. On ubuntu they're shipped + in package-dbgsym packages, from a different repo. + +:: + + deb http://ddebs.ubuntu.com focal main restricted universe multiverse + deb http://ddebs.ubuntu.com focal-updates main restricted universe multiverse + deb http://ddebs.ubuntu.com focal-proposed main restricted universe multiverse + +Then ``sudo apt-get update && sudo apt-get install libtiff5-dbgsym`` + +- There's a bug with the dbg package for at least python 3.8 on ubuntu + 20.04, and you need to add a new link or two to make it autoload when + running python: + +:: + + cd /usr/share/gdb/auto-load/usr/bin + ln -s python3.8m-gdb.py python3.8d-gdb.py + +- In Ubuntu 18.04, it's actually including the path to the virtualenv + in the search for the ``python3.*-gdb.py`` file, but you can + helpfully put in the same directory as the binary. + +- I also find that history is really useful for gdb, so I added this to + my ``~/.gdbinit`` file: + +:: + + set history filename ~/.gdb_history + set history save on + +- If the python stack isn't working in gdb, then + ``set debug auto-load`` can also be helpful in ``.gdbinit``. + +- Make a virtualenv with the debug python and activate it, then install + whatever dependencies are required and build. You want to build with + the debug python so you get symbols for your extension. + +:: + + virtualenv -p python3.8-dbg ~/vpy38-dbg + source ~/vpy38-dbg/bin/activate + cd ~/Pillow && pip install -r requirements.txt && make install + +Test Case +--------- + +Take your test image, and make a really simple harness. + +:: + + from PIL import Image + im = Image.open(path) + im.load() + +- Run this through valgrind, but note that python triggers some issues + on its own, so you're looking for items within the Pillow hierarchy + that don't look like they're solely in the python call chain. In this + example, the ones we're interested are after the warnings, and have + ``decode.c`` and ``TiffDecode.c`` in the call stack: + +:: + + (vpy38-dbg) ubuntu@primary:~/Home/tests$ valgrind python test_tiff.py + ==51890== Memcheck, a memory error detector + ==51890== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. + ==51890== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info + ==51890== Command: python test_tiff.py + ==51890== + ==51890== Invalid read of size 4 + ==51890== at 0x472E3D: address_in_range (obmalloc.c:1401) + ==51890== by 0x472EEA: pymalloc_free (obmalloc.c:1677) + ==51890== by 0x474960: _PyObject_Free (obmalloc.c:1896) + ==51890== by 0x473BAC: _PyMem_DebugRawFree (obmalloc.c:2187) + ==51890== by 0x473BD4: _PyMem_DebugFree (obmalloc.c:2318) + ==51890== by 0x474C08: PyObject_Free (obmalloc.c:709) + ==51890== by 0x45DD60: dictresize (dictobject.c:1259) + ==51890== by 0x45DD76: insertion_resize (dictobject.c:1019) + ==51890== by 0x464F30: PyDict_SetDefault (dictobject.c:2924) + ==51890== by 0x4D03BE: PyUnicode_InternInPlace (unicodeobject.c:15289) + ==51890== by 0x4D0700: PyUnicode_InternFromString (unicodeobject.c:15322) + ==51890== by 0x64D2FC: descr_new (descrobject.c:857) + ==51890== Address 0x4c1b020 is 384 bytes inside a block of size 1,160 free'd + ==51890== at 0x483CA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) + ==51890== by 0x4735D3: _PyMem_RawFree (obmalloc.c:127) + ==51890== by 0x473BAC: _PyMem_DebugRawFree (obmalloc.c:2187) + ==51890== by 0x474941: PyMem_RawFree (obmalloc.c:595) + ==51890== by 0x47496E: _PyObject_Free (obmalloc.c:1898) + ==51890== by 0x473BAC: _PyMem_DebugRawFree (obmalloc.c:2187) + ==51890== by 0x473BD4: _PyMem_DebugFree (obmalloc.c:2318) + ==51890== by 0x474C08: PyObject_Free (obmalloc.c:709) + ==51890== by 0x45DD60: dictresize (dictobject.c:1259) + ==51890== by 0x45DD76: insertion_resize (dictobject.c:1019) + ==51890== by 0x464F30: PyDict_SetDefault (dictobject.c:2924) + ==51890== by 0x4D03BE: PyUnicode_InternInPlace (unicodeobject.c:15289) + ==51890== Block was alloc'd at + ==51890== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) + ==51890== by 0x473646: _PyMem_RawMalloc (obmalloc.c:99) + ==51890== by 0x473529: _PyMem_DebugRawAlloc (obmalloc.c:2120) + ==51890== by 0x473565: _PyMem_DebugRawMalloc (obmalloc.c:2153) + ==51890== by 0x4748B1: PyMem_RawMalloc (obmalloc.c:572) + ==51890== by 0x475909: _PyObject_Malloc (obmalloc.c:1628) + ==51890== by 0x473529: _PyMem_DebugRawAlloc (obmalloc.c:2120) + ==51890== by 0x473565: _PyMem_DebugRawMalloc (obmalloc.c:2153) + ==51890== by 0x4736B0: _PyMem_DebugMalloc (obmalloc.c:2303) + ==51890== by 0x474B78: PyObject_Malloc (obmalloc.c:685) + ==51890== by 0x45C435: new_keys_object (dictobject.c:558) + ==51890== by 0x45DA95: dictresize (dictobject.c:1202) + ==51890== + ==51890== Invalid read of size 4 + ==51890== at 0x472E3D: address_in_range (obmalloc.c:1401) + ==51890== by 0x47594A: pymalloc_realloc (obmalloc.c:1929) + ==51890== by 0x475A02: _PyObject_Realloc (obmalloc.c:1982) + ==51890== by 0x473DCA: _PyMem_DebugRawRealloc (obmalloc.c:2240) + ==51890== by 0x473FF8: _PyMem_DebugRealloc (obmalloc.c:2326) + ==51890== by 0x4749FB: PyMem_Realloc (obmalloc.c:623) + ==51890== by 0x44A6FC: list_resize (listobject.c:70) + ==51890== by 0x44A872: app1 (listobject.c:340) + ==51890== by 0x44FD65: PyList_Append (listobject.c:352) + ==51890== by 0x514315: r_ref (marshal.c:945) + ==51890== by 0x516034: r_object (marshal.c:1139) + ==51890== by 0x516C70: r_object (marshal.c:1389) + ==51890== Address 0x4c41020 is 32 bytes before a block of size 1,600 in arena "client" + ==51890== + ==51890== Conditional jump or move depends on uninitialised value(s) + ==51890== at 0x472E46: address_in_range (obmalloc.c:1403) + ==51890== by 0x47594A: pymalloc_realloc (obmalloc.c:1929) + ==51890== by 0x475A02: _PyObject_Realloc (obmalloc.c:1982) + ==51890== by 0x473DCA: _PyMem_DebugRawRealloc (obmalloc.c:2240) + ==51890== by 0x473FF8: _PyMem_DebugRealloc (obmalloc.c:2326) + ==51890== by 0x4749FB: PyMem_Realloc (obmalloc.c:623) + ==51890== by 0x44A6FC: list_resize (listobject.c:70) + ==51890== by 0x44A872: app1 (listobject.c:340) + ==51890== by 0x44FD65: PyList_Append (listobject.c:352) + ==51890== by 0x5E3321: _posix_listdir (posixmodule.c:3823) + ==51890== by 0x5E33A8: os_listdir_impl (posixmodule.c:3879) + ==51890== by 0x5E4D77: os_listdir (posixmodule.c.h:1197) + ==51890== + ==51890== Use of uninitialised value of size 8 + ==51890== at 0x472E59: address_in_range (obmalloc.c:1403) + ==51890== by 0x47594A: pymalloc_realloc (obmalloc.c:1929) + ==51890== by 0x475A02: _PyObject_Realloc (obmalloc.c:1982) + ==51890== by 0x473DCA: _PyMem_DebugRawRealloc (obmalloc.c:2240) + ==51890== by 0x473FF8: _PyMem_DebugRealloc (obmalloc.c:2326) + ==51890== by 0x4749FB: PyMem_Realloc (obmalloc.c:623) + ==51890== by 0x44A6FC: list_resize (listobject.c:70) + ==51890== by 0x44A872: app1 (listobject.c:340) + ==51890== by 0x44FD65: PyList_Append (listobject.c:352) + ==51890== by 0x5E3321: _posix_listdir (posixmodule.c:3823) + ==51890== by 0x5E33A8: os_listdir_impl (posixmodule.c:3879) + ==51890== by 0x5E4D77: os_listdir (posixmodule.c.h:1197) + ==51890== + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 16908288 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67895296 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 1572864 bytes but only got 0. Skipping tag 42 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 116647 bytes but only got 4867. Skipping tag 42738 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 3468830728 bytes but only got 4851. Skipping tag 279 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 2198732800 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67239937 bytes but only got 4125. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33947764 bytes but only got 0. Skipping tag 139 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 17170432 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 80478208 bytes but only got 0. Skipping tag 1 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 787460 bytes but only got 4882. Skipping tag 20 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 1075 bytes but only got 0. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 120586240 bytes but only got 0. Skipping tag 194 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 65536 bytes but only got 0. Skipping tag 3 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 198656 bytes but only got 0. Skipping tag 279 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 206848 bytes but only got 0. Skipping tag 64512 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 130968 bytes but only got 4882. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 77848 bytes but only got 4689. Skipping tag 64270 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 262156 bytes but only got 0. Skipping tag 257 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33624064 bytes but only got 0. Skipping tag 49152 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67178752 bytes but only got 4627. Skipping tag 50688 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33632768 bytes but only got 0. Skipping tag 56320 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 134386688 bytes but only got 4115. Skipping tag 2048 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33912832 bytes but only got 0. Skipping tag 7168 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 151966208 bytes but only got 4627. Skipping tag 10240 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 119032832 bytes but only got 3859. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 46535680 bytes but only got 0. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 35651584 bytes but only got 0. Skipping tag 42 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 524288 bytes but only got 0. Skipping tag 0 + warnings.warn( + _TIFFVSetField: tempfile.tif: Null count for "Tag 769" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 42754" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 769" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 42754" (type 1, writecount -3, passcount 1). + ZIPDecode: Decoding error at scanline 0, incorrect header check. + ==51890== Invalid write of size 4 + ==51890== at 0x61C39E6: putcontig8bitYCbCr22tile (tif_getimage.c:2146) + ==51890== by 0x61C5865: gtStripContig (tif_getimage.c:977) + ==51890== by 0x6094317: ReadStrip (TiffDecode.c:269) + ==51890== by 0x6094749: ImagingLibTiffDecode (TiffDecode.c:479) + ==51890== by 0x60615D1: _decode (decode.c:136) + ==51890== by 0x64BF47: method_vectorcall_VARARGS (descrobject.c:300) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x43627B: function_code_fastcall (call.c:283) + ==51890== by 0x436D21: _PyFunction_Vectorcall (call.c:410) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== Address 0x6f456d4 is 0 bytes after a block of size 68 alloc'd + ==51890== at 0x483DFAF: realloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) + ==51890== by 0x60946D0: ImagingLibTiffDecode (TiffDecode.c:469) + ==51890== by 0x60615D1: _decode (decode.c:136) + ==51890== by 0x64BF47: method_vectorcall_VARARGS (descrobject.c:300) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x43627B: function_code_fastcall (call.c:283) + ==51890== by 0x436D21: _PyFunction_Vectorcall (call.c:410) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x4DFDFB: _PyEval_EvalCodeWithName (ceval.c:4298) + ==51890== by 0x436C40: _PyFunction_Vectorcall (call.c:435) + ==51890== + ==51890== Invalid write of size 4 + ==51890== at 0x61C39B5: putcontig8bitYCbCr22tile (tif_getimage.c:2145) + ==51890== by 0x61C5865: gtStripContig (tif_getimage.c:977) + ==51890== by 0x6094317: ReadStrip (TiffDecode.c:269) + ==51890== by 0x6094749: ImagingLibTiffDecode (TiffDecode.c:479) + ==51890== by 0x60615D1: _decode (decode.c:136) + ==51890== by 0x64BF47: method_vectorcall_VARARGS (descrobject.c:300) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x43627B: function_code_fastcall (call.c:283) + ==51890== by 0x436D21: _PyFunction_Vectorcall (call.c:410) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== Address 0x6f456d8 is 4 bytes after a block of size 68 alloc'd + ==51890== at 0x483DFAF: realloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) + ==51890== by 0x60946D0: ImagingLibTiffDecode (TiffDecode.c:469) + ==51890== by 0x60615D1: _decode (decode.c:136) + ==51890== by 0x64BF47: method_vectorcall_VARARGS (descrobject.c:300) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x43627B: function_code_fastcall (call.c:283) + ==51890== by 0x436D21: _PyFunction_Vectorcall (call.c:410) + ==51890== by 0x4EB73C: _PyObject_Vectorcall (abstract.h:127) + ==51890== by 0x4EB73C: call_function (ceval.c:4963) + ==51890== by 0x4EB73C: _PyEval_EvalFrameDefault (ceval.c:3486) + ==51890== by 0x4DF2EE: PyEval_EvalFrameEx (ceval.c:741) + ==51890== by 0x4DFDFB: _PyEval_EvalCodeWithName (ceval.c:4298) + ==51890== by 0x436C40: _PyFunction_Vectorcall (call.c:435) + ==51890== + TIFFFillStrip: Invalid strip byte count 0, strip 1. + Traceback (most recent call last): + File "test_tiff.py", line 8, in + im.load() + File "/home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py", line 1087, in load + return self._load_libtiff() + File "/home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py", line 1191, in _load_libtiff + raise OSError(err) + OSError: -2 + sys:1: ResourceWarning: unclosed file <_io.BufferedReader name='crash-2020-10-test.tiff'> + ==51890== + ==51890== HEAP SUMMARY: + ==51890== in use at exit: 748,734 bytes in 444 blocks + ==51890== total heap usage: 6,320 allocs, 5,876 frees, 69,142,969 bytes allocated + ==51890== + ==51890== LEAK SUMMARY: + ==51890== definitely lost: 0 bytes in 0 blocks + ==51890== indirectly lost: 0 bytes in 0 blocks + ==51890== possibly lost: 721,538 bytes in 372 blocks + ==51890== still reachable: 27,196 bytes in 72 blocks + ==51890== suppressed: 0 bytes in 0 blocks + ==51890== Rerun with --leak-check=full to see details of leaked memory + ==51890== + ==51890== Use --track-origins=yes to see where uninitialised values come from + ==51890== For lists of detected and suppressed errors, rerun with: -s + ==51890== ERROR SUMMARY: 2556 errors from 6 contexts (suppressed: 0 from 0) + (vpy38-dbg) ubuntu@primary:~/Home/tests$ + +- Now that we've confirmed that there's something odd/bad going on, + it's time to gdb. +- Start with ``gdb python`` +- Set a break point starting with the valgrind stack trace. + ``b TiffDecode.c:269`` +- Run the script with ``r test_tiff.py`` +- When the break point is hit, explore the state with ``info locals``, + ``bt``, ``py-bt``, or ``p [variable]``. For pointers, + ``p *[variable]`` is useful. + +:: + + (vpy38-dbg) ubuntu@primary:~/Home/tests$ gdb python + GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2 + Copyright (C) 2020 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + This is free software: you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + Type "show copying" and "show warranty" for details. + This GDB was configured as "x86_64-linux-gnu". + Type "show configuration" for configuration details. + For bug reporting instructions, please see: + . + Find the GDB manual and other documentation resources online at: + . + + For help, type "help". + Type "apropos word" to search for commands related to "word"... + Reading symbols from python... + (gdb) b TiffDecode.c:269 + No source file named TiffDecode.c. + Make breakpoint pending on future shared library load? (y or [n]) y + Breakpoint 1 (TiffDecode.c:269) pending. + (gdb) r test_tiff.py + Starting program: /home/ubuntu/vpy38-dbg/bin/python test_tiff.py + [Thread debugging using libthread_db enabled] + Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 16908288 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67895296 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 1572864 bytes but only got 0. Skipping tag 42 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 116647 bytes but only got 4867. Skipping tag 42738 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 3468830728 bytes but only got 4851. Skipping tag 279 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 2198732800 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67239937 bytes but only got 4125. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33947764 bytes but only got 0. Skipping tag 139 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 17170432 bytes but only got 0. Skipping tag 0 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 80478208 bytes but only got 0. Skipping tag 1 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 787460 bytes but only got 4882. Skipping tag 20 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 1075 bytes but only got 0. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 120586240 bytes but only got 0. Skipping tag 194 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 65536 bytes but only got 0. Skipping tag 3 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 198656 bytes but only got 0. Skipping tag 279 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 206848 bytes but only got 0. Skipping tag 64512 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 130968 bytes but only got 4882. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 77848 bytes but only got 4689. Skipping tag 64270 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 262156 bytes but only got 0. Skipping tag 257 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33624064 bytes but only got 0. Skipping tag 49152 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 67178752 bytes but only got 4627. Skipping tag 50688 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33632768 bytes but only got 0. Skipping tag 56320 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 134386688 bytes but only got 4115. Skipping tag 2048 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 33912832 bytes but only got 0. Skipping tag 7168 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 151966208 bytes but only got 4627. Skipping tag 10240 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 119032832 bytes but only got 3859. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 46535680 bytes but only got 0. Skipping tag 256 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 35651584 bytes but only got 0. Skipping tag 42 + warnings.warn( + /home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py:770: UserWarning: Possibly corrupt EXIF data. Expecting to read 524288 bytes but only got 0. Skipping tag 0 + warnings.warn( + _TIFFVSetField: tempfile.tif: Null count for "Tag 769" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 42754" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 769" (type 1, writecount -3, passcount 1). + _TIFFVSetField: tempfile.tif: Null count for "Tag 42754" (type 1, writecount -3, passcount 1). + + Breakpoint 1, ReadStrip (tiff=tiff@entry=0xae9b90, row=0, buffer=0xac2eb0) at src/libImaging/TiffDecode.c:269 + 269 ok = TIFFRGBAImageGet(&img, buffer, img.width, rows_to_read); + (gdb) p img + $1 = {tif = 0xae9b90, stoponerr = 0, isContig = 1, alpha = 0, width = 20, height = 1536, bitspersample = 8, samplesperpixel = 3, + orientation = 1, req_orientation = 1, photometric = 6, redcmap = 0x0, greencmap = 0x0, bluecmap = 0x0, get = + 0x7ffff71d0710 , put = {any = 0x7ffff71ce550 , + contig = 0x7ffff71ce550 , separate = 0x7ffff71ce550 }, Map = 0x0, + BWmap = 0x0, PALmap = 0x0, ycbcr = 0xaf24b0, cielab = 0x0, UaToAa = 0x0, Bitdepth16To8 = 0x0, row_offset = 0, col_offset = 0} + (gdb) up + #1 0x00007ffff736174a in ImagingLibTiffDecode (im=0xac1f90, state=0x7ffff76767e0, buffer=, bytes=) + at src/libImaging/TiffDecode.c:479 + 479 if (ReadStrip(tiff, state->y, (UINT32 *)state->buffer) == -1) { + (gdb) p *state + $2 = {count = 0, state = 0, errcode = 0, x = 0, y = 0, ystep = 0, xsize = 17, ysize = 108, xoff = 0, yoff = 0, + shuffle = 0x7ffff735f411 , bits = 32, bytes = 68, buffer = 0xac2eb0 "P\354\336\367\377\177", context = 0xa75440, fd = 0x0} + (gdb) py-bt + Traceback (most recent call first): + File "/home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py", line 1428, in _load_libtiff + + File "/home/ubuntu/vpy38-dbg/lib/python3.8/site-packages/Pillow-8.0.1-py3.8-linux-x86_64.egg/PIL/TiffImagePlugin.py", line 1087, in load + return self._load_libtiff() + File "test_tiff.py", line 8, in + im.load() + +- Poke around till you understand what's going on. In this case, + state->xsize and img.width are different, which led to an out of + bounds write, as the receiving buffer was sized for the smaller of + the two. + +Caveats +------- + +- If your program is running/hung in a docker container and your host + has the appropriate tools, you can run gdb as the superuser in the + host and you may be able to get a trace of where the process is hung. + You probably won't have the capability to do that from within the + docker container, as the trace capacity isn't allowed by default. + +- Variations of this are possible on the mac/windows, but the details + are going to be different. + +- IIRC, Fedora has the gdb bits working by default. Ubuntu has always + been a bit of a battle to make it work. diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst index 5f911db51..2e2d3322f 100644 --- a/docs/reference/internal_design.rst +++ b/docs/reference/internal_design.rst @@ -8,3 +8,4 @@ Internal Reference Docs limits block_allocator internal_modules + c_extension_debugging From 56e7d1fd9bd5754f3a0c8e3909fd217cd16c3058 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 3 Jan 2021 07:14:59 +1100 Subject: [PATCH 215/750] 8.2.0.dev0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 8877e09d2..20e8754a4 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = "8.1.0" +__version__ = "8.2.0.dev0" From 5d968accf5db5d45fceeb68b9cbc4af44be0f6b4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 9 Jul 2020 15:32:14 +0300 Subject: [PATCH 216/750] Add clang-format style that approximates Python's PEP 7 from pganssle/zoneinfo --- .clang-format | 18 ++++++++++++++++++ MANIFEST.in | 1 + 2 files changed, 19 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..e7fc90e37 --- /dev/null +++ b/.clang-format @@ -0,0 +1,18 @@ +# A clang-format style that approximates Python's PEP 7 +# Useful for IDE integration +BasedOnStyle: Google +AlwaysBreakAfterReturnType: All +AllowShortIfStatementsOnASingleLine: false +AlignAfterOpenBracket: Align +BreakBeforeBraces: Stroustrup +ColumnLimit: 79 +DerivePointerAlignment: false +IndentWidth: 4 +Language: Cpp +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +TabWidth: 4 +UseTab: Never diff --git a/MANIFEST.in b/MANIFEST.in index f5d367fdd..e9aaa8318 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -18,6 +18,7 @@ graft docs # build/src control detritus exclude .appveyor.yml +exclude .clang-format exclude .coveragerc exclude .editorconfig exclude .readthedocs.yml From e2d00f8cf88e2f0d6c8597cff24433876eb29471 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 9 Jul 2020 15:59:18 +0300 Subject: [PATCH 217/750] Adjust clang-format style --- .clang-format | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.clang-format b/.clang-format index e7fc90e37..be32e6d1a 100644 --- a/.clang-format +++ b/.clang-format @@ -3,9 +3,11 @@ BasedOnStyle: Google AlwaysBreakAfterReturnType: All AllowShortIfStatementsOnASingleLine: false -AlignAfterOpenBracket: Align -BreakBeforeBraces: Stroustrup -ColumnLimit: 79 +AlignAfterOpenBracket: AlwaysBreak +BinPackArguments: false +BinPackParameters: false +BreakBeforeBraces: Attach +ColumnLimit: 88 DerivePointerAlignment: false IndentWidth: 4 Language: Cpp From 46b7e86bab79450ec0a2866c6c0c679afb659d17 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 3 Jan 2021 14:17:51 +1100 Subject: [PATCH 218/750] Format with ClangFormat --- src/Tk/_tkmini.h | 54 +- src/Tk/tkImaging.c | 194 +- src/_imaging.c | 2949 +++++++++++++++---------------- src/_imagingcms.c | 1065 +++++------ src/_imagingft.c | 985 ++++++----- src/_imagingmath.c | 149 +- src/_imagingmorph.c | 157 +- src/_imagingtk.c | 33 +- src/_webp.c | 645 ++++--- src/decode.c | 465 +++-- src/display.c | 564 +++--- src/encode.c | 645 +++---- src/libImaging/Access.c | 136 +- src/libImaging/AlphaComposite.c | 47 +- src/libImaging/Bands.c | 130 +- src/libImaging/BcnDecode.c | 438 +++-- src/libImaging/Bit.h | 3 +- src/libImaging/BitDecode.c | 42 +- src/libImaging/Blend.c | 37 +- src/libImaging/BoxBlur.c | 169 +- src/libImaging/Chops.c | 161 +- src/libImaging/ColorLUT.c | 135 +- src/libImaging/Convert.c | 993 +++++------ src/libImaging/ConvertYCbCr.c | 620 ++++--- src/libImaging/Copy.c | 13 +- src/libImaging/Crop.c | 9 +- src/libImaging/Dib.c | 134 +- src/libImaging/Draw.c | 1342 +++++++------- src/libImaging/Effects.c | 82 +- src/libImaging/EpsEncode.c | 24 +- src/libImaging/Except.c | 26 +- src/libImaging/File.c | 23 +- src/libImaging/Fill.c | 21 +- src/libImaging/Filter.c | 332 ++-- src/libImaging/FliDecode.c | 75 +- src/libImaging/Geometry.c | 935 +++++----- src/libImaging/GetBBox.c | 278 ++- src/libImaging/Gif.h | 21 +- src/libImaging/GifDecode.c | 106 +- src/libImaging/GifEncode.c | 189 +- src/libImaging/HexDecode.c | 25 +- src/libImaging/Histo.c | 47 +- src/libImaging/ImDib.h | 23 +- src/libImaging/ImPlatform.h | 11 +- src/libImaging/Imaging.h | 803 +++++---- src/libImaging/ImagingUtils.h | 47 +- src/libImaging/Jpeg.h | 22 +- src/libImaging/Jpeg2K.h | 33 +- src/libImaging/Jpeg2KDecode.c | 474 ++--- src/libImaging/Jpeg2KEncode.c | 182 +- src/libImaging/JpegDecode.c | 283 ++- src/libImaging/JpegEncode.c | 126 +- src/libImaging/Matrix.c | 33 +- src/libImaging/ModeFilter.c | 14 +- src/libImaging/Negative.c | 8 +- src/libImaging/Offset.c | 21 +- src/libImaging/Pack.c | 473 +++-- src/libImaging/PackDecode.c | 33 +- src/libImaging/Palette.c | 139 +- src/libImaging/Paste.c | 346 ++-- src/libImaging/PcdDecode.c | 27 +- src/libImaging/PcxDecode.c | 34 +- src/libImaging/PcxEncode.c | 216 ++- src/libImaging/Point.c | 205 +-- src/libImaging/Quant.c | 2527 +++++++++++++------------- src/libImaging/QuantHash.c | 515 +++--- src/libImaging/QuantHash.h | 51 +- src/libImaging/QuantHeap.c | 224 +-- src/libImaging/QuantHeap.h | 16 +- src/libImaging/QuantOctree.c | 760 ++++---- src/libImaging/QuantOctree.h | 9 +- src/libImaging/QuantPngQuant.c | 47 +- src/libImaging/QuantPngQuant.h | 4 +- src/libImaging/QuantTypes.h | 14 +- src/libImaging/RankFilter.c | 132 +- src/libImaging/Raw.h | 1 - src/libImaging/RawDecode.c | 24 +- src/libImaging/RawEncode.c | 19 +- src/libImaging/Reduce.c | 1405 ++++++++------- src/libImaging/Resample.c | 452 +++-- src/libImaging/Sgi.h | 1 - src/libImaging/SgiRleDecode.c | 93 +- src/libImaging/Storage.c | 163 +- src/libImaging/SunRleDecode.c | 28 +- src/libImaging/TgaRleDecode.c | 29 +- src/libImaging/TgaRleEncode.c | 21 +- src/libImaging/TiffDecode.c | 470 +++-- src/libImaging/TiffDecode.h | 32 +- src/libImaging/Unpack.c | 1248 +++++++------ src/libImaging/UnpackYCC.c | 223 +-- src/libImaging/UnsharpMask.c | 39 +- src/libImaging/XbmDecode.c | 25 +- src/libImaging/XbmEncode.c | 51 +- src/libImaging/ZipCodecs.h | 28 +- src/libImaging/ZipDecode.c | 207 ++- src/libImaging/ZipEncode.c | 412 +++-- src/libImaging/codec_fd.c | 19 +- src/libImaging/raqm.h | 58 +- src/map.c | 182 +- src/outline.c | 112 +- src/path.c | 294 ++- 101 files changed, 14097 insertions(+), 13889 deletions(-) diff --git a/src/Tk/_tkmini.h b/src/Tk/_tkmini.h index adc470532..b6945eb1a 100644 --- a/src/Tk/_tkmini.h +++ b/src/Tk/_tkmini.h @@ -79,18 +79,20 @@ typedef struct Tcl_Interp Tcl_Interp; typedef struct Tcl_Command_ *Tcl_Command; typedef void *ClientData; -typedef int (Tcl_CmdProc) (ClientData clientData, Tcl_Interp - *interp, int argc, const char *argv[]); -typedef void (Tcl_CmdDeleteProc) (ClientData clientData); +typedef int(Tcl_CmdProc)( + ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); +typedef void(Tcl_CmdDeleteProc)(ClientData clientData); /* Typedefs derived from function signatures in Tcl header */ /* Tcl_CreateCommand */ -typedef Tcl_Command (*Tcl_CreateCommand_t)(Tcl_Interp *interp, - const char *cmdName, Tcl_CmdProc *proc, - ClientData clientData, - Tcl_CmdDeleteProc *deleteProc); +typedef Tcl_Command (*Tcl_CreateCommand_t)( + Tcl_Interp *interp, + const char *cmdName, + Tcl_CmdProc *proc, + ClientData clientData, + Tcl_CmdDeleteProc *deleteProc); /* Tcl_AppendResult */ -typedef void (*Tcl_AppendResult_t) (Tcl_Interp *interp, ...); +typedef void (*Tcl_AppendResult_t)(Tcl_Interp *interp, ...); /* Tk header excerpts */ @@ -107,8 +109,7 @@ typedef struct Tk_Window_ *Tk_Window; typedef void *Tk_PhotoHandle; -typedef struct Tk_PhotoImageBlock -{ +typedef struct Tk_PhotoImageBlock { unsigned char *pixelPtr; int width; int height; @@ -119,23 +120,30 @@ typedef struct Tk_PhotoImageBlock /* Typedefs derived from function signatures in Tk header */ /* Tk_PhotoPutBlock for Tk <= 8.4 */ -typedef void (*Tk_PhotoPutBlock_84_t) (Tk_PhotoHandle handle, - Tk_PhotoImageBlock *blockPtr, int x, int y, - int width, int height, int compRule); +typedef void (*Tk_PhotoPutBlock_84_t)( + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, + int x, + int y, + int width, + int height, + int compRule); /* Tk_PhotoPutBlock for Tk >= 8.5 */ -typedef int (*Tk_PhotoPutBlock_85_t) (Tcl_Interp * interp, - Tk_PhotoHandle handle, - Tk_PhotoImageBlock * blockPtr, int x, int y, - int width, int height, int compRule); +typedef int (*Tk_PhotoPutBlock_85_t)( + Tcl_Interp *interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, + int x, + int y, + int width, + int height, + int compRule); /* Tk_PhotoSetSize for Tk <= 8.4 */ -typedef void (*Tk_PhotoSetSize_84_t) (Tk_PhotoHandle handle, - int width, int height); +typedef void (*Tk_PhotoSetSize_84_t)(Tk_PhotoHandle handle, int width, int height); /* Tk_FindPhoto */ -typedef Tk_PhotoHandle (*Tk_FindPhoto_t) (Tcl_Interp *interp, - const char *imageName); +typedef Tk_PhotoHandle (*Tk_FindPhoto_t)(Tcl_Interp *interp, const char *imageName); /* Tk_PhotoGetImage */ -typedef int (*Tk_PhotoGetImage_t) (Tk_PhotoHandle handle, - Tk_PhotoImageBlock * blockPtr); +typedef int (*Tk_PhotoGetImage_t)(Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr); /* * end block for C++ diff --git a/src/Tk/tkImaging.c b/src/Tk/tkImaging.c index 5df3abb72..1c6c5f34a 100644 --- a/src/Tk/tkImaging.c +++ b/src/Tk/tkImaging.c @@ -58,8 +58,7 @@ static Tk_PhotoSetSize_84_t TK_PHOTO_SET_SIZE_84; static Tk_PhotoPutBlock_85_t TK_PHOTO_PUT_BLOCK_85; static Imaging -ImagingFind(const char* name) -{ +ImagingFind(const char *name) { Py_ssize_t id; /* FIXME: use CObject instead? */ @@ -72,41 +71,37 @@ ImagingFind(const char* name) return NULL; } - return (Imaging) id; + return (Imaging)id; } - static int -PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, - int argc, const char **argv) -{ +PyImagingPhotoPut( + ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv) { Imaging im; Tk_PhotoHandle photo; Tk_PhotoImageBlock block; if (argc != 3) { - TCL_APPEND_RESULT(interp, "usage: ", argv[0], - " destPhoto srcImage", (char *) NULL); + TCL_APPEND_RESULT( + interp, "usage: ", argv[0], " destPhoto srcImage", (char *)NULL); return TCL_ERROR; } /* get Tcl PhotoImage handle */ photo = TK_FIND_PHOTO(interp, argv[1]); if (photo == NULL) { - TCL_APPEND_RESULT( - interp, "destination photo must exist", (char *) NULL - ); + TCL_APPEND_RESULT(interp, "destination photo must exist", (char *)NULL); return TCL_ERROR; } /* get PIL Image handle */ im = ImagingFind(argv[2]); if (!im) { - TCL_APPEND_RESULT(interp, "bad name", (char*) NULL); + TCL_APPEND_RESULT(interp, "bad name", (char *)NULL); return TCL_ERROR; } if (!im->block) { - TCL_APPEND_RESULT(interp, "bad display memory", (char*) NULL); + TCL_APPEND_RESULT(interp, "bad display memory", (char *)NULL); return TCL_ERROR; } @@ -126,18 +121,18 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, block.offset[3] = 0; /* no alpha */ } } else { - TCL_APPEND_RESULT(interp, "Bad mode", (char*) NULL); + TCL_APPEND_RESULT(interp, "Bad mode", (char *)NULL); return TCL_ERROR; } block.width = im->xsize; block.height = im->ysize; block.pitch = im->linesize; - block.pixelPtr = (unsigned char*) im->block; + block.pixelPtr = (unsigned char *)im->block; if (TK_LT_85) { /* Tk 8.4 */ - TK_PHOTO_PUT_BLOCK_84(photo, &block, 0, 0, block.width, block.height, - TK_PHOTO_COMPOSITE_SET); + TK_PHOTO_PUT_BLOCK_84( + photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET); if (strcmp(im->mode, "RGBA") == 0) { /* Tk workaround: we need apply ToggleComplexAlphaIfNeeded */ /* (fixed in Tk 8.5a3) */ @@ -145,50 +140,54 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, } } else { /* Tk >=8.5 */ - TK_PHOTO_PUT_BLOCK_85(interp, photo, &block, 0, 0, block.width, - block.height, TK_PHOTO_COMPOSITE_SET); + TK_PHOTO_PUT_BLOCK_85( + interp, + photo, + &block, + 0, + 0, + block.width, + block.height, + TK_PHOTO_COMPOSITE_SET); } return TCL_OK; } static int -PyImagingPhotoGet(ClientData clientdata, Tcl_Interp* interp, - int argc, const char **argv) -{ +PyImagingPhotoGet( + ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv) { Imaging im; Tk_PhotoHandle photo; Tk_PhotoImageBlock block; int x, y, z; if (argc != 3) { - TCL_APPEND_RESULT(interp, "usage: ", argv[0], - " srcPhoto destImage", (char *) NULL); + TCL_APPEND_RESULT( + interp, "usage: ", argv[0], " srcPhoto destImage", (char *)NULL); return TCL_ERROR; } /* get Tcl PhotoImage handle */ photo = TK_FIND_PHOTO(interp, argv[1]); if (photo == NULL) { - TCL_APPEND_RESULT( - interp, "source photo must exist", (char *) NULL - ); + TCL_APPEND_RESULT(interp, "source photo must exist", (char *)NULL); return TCL_ERROR; } /* get PIL Image handle */ im = ImagingFind(argv[2]); if (!im) { - TCL_APPEND_RESULT(interp, "bad name", (char*) NULL); + TCL_APPEND_RESULT(interp, "bad name", (char *)NULL); return TCL_ERROR; } TK_PHOTO_GET_IMAGE(photo, &block); for (y = 0; y < block.height; y++) { - UINT8* out = (UINT8*)im->image32[y]; + UINT8 *out = (UINT8 *)im->image32[y]; for (x = 0; x < block.pitch; x += block.pixelSize) { - for (z=0; z < block.pixelSize; z++) { + for (z = 0; z < block.pixelSize; z++) { int offset = block.offset[z]; out[x + offset] = block.pixelPtr[y * block.pitch + x + offset]; } @@ -198,14 +197,20 @@ PyImagingPhotoGet(ClientData clientdata, Tcl_Interp* interp, return TCL_OK; } - void -TkImaging_Init(Tcl_Interp* interp) -{ - TCL_CREATE_COMMAND(interp, "PyImagingPhoto", PyImagingPhotoPut, - (ClientData) 0, (Tcl_CmdDeleteProc*) NULL); - TCL_CREATE_COMMAND(interp, "PyImagingPhotoGet", PyImagingPhotoGet, - (ClientData) 0, (Tcl_CmdDeleteProc*) NULL); +TkImaging_Init(Tcl_Interp *interp) { + TCL_CREATE_COMMAND( + interp, + "PyImagingPhoto", + PyImagingPhotoPut, + (ClientData)0, + (Tcl_CmdDeleteProc *)NULL); + TCL_CREATE_COMMAND( + interp, + "PyImagingPhotoGet", + PyImagingPhotoGet, + (ClientData)0, + (Tcl_CmdDeleteProc *)NULL); } /* @@ -230,13 +235,13 @@ TkImaging_Init(Tcl_Interp* interp) #define TKINTER_PKG "tkinter" -FARPROC _dfunc(HMODULE lib_handle, const char *func_name) -{ +FARPROC +_dfunc(HMODULE lib_handle, const char *func_name) { /* * Load function `func_name` from `lib_handle`. * Set Python exception if we can't find `func_name` in `lib_handle`. * Returns function pointer or NULL if not present. - */ + */ char message[100]; @@ -248,24 +253,26 @@ FARPROC _dfunc(HMODULE lib_handle, const char *func_name) return func; } -int get_tcl(HMODULE hMod) -{ +int +get_tcl(HMODULE hMod) { /* * Try to fill Tcl global vars with function pointers. Return 0 for no * functions found, 1 for all functions found, -1 for some but not all * functions found. */ - if ((TCL_CREATE_COMMAND = (Tcl_CreateCommand_t) - GetProcAddress(hMod, "Tcl_CreateCommand")) == NULL) { + if ((TCL_CREATE_COMMAND = + (Tcl_CreateCommand_t)GetProcAddress(hMod, "Tcl_CreateCommand")) == NULL) { return 0; /* Maybe not Tcl module */ } - return ((TCL_APPEND_RESULT = (Tcl_AppendResult_t) _dfunc(hMod, - "Tcl_AppendResult")) == NULL) ? -1 : 1; + return ((TCL_APPEND_RESULT = + (Tcl_AppendResult_t)_dfunc(hMod, "Tcl_AppendResult")) == NULL) + ? -1 + : 1; } -int get_tk(HMODULE hMod) -{ +int +get_tk(HMODULE hMod) { /* * Try to fill Tk global vars with function pointers. Return 0 for no * functions found, 1 for all functions found, -1 for some but not all @@ -273,26 +280,31 @@ int get_tk(HMODULE hMod) */ FARPROC func = GetProcAddress(hMod, "Tk_PhotoPutBlock"); - if (func == NULL) { /* Maybe not Tk module */ + if (func == NULL) { /* Maybe not Tk module */ return 0; } - if ((TK_PHOTO_GET_IMAGE = (Tk_PhotoGetImage_t) - _dfunc(hMod, "Tk_PhotoGetImage")) == NULL) { return -1; }; - if ((TK_FIND_PHOTO = (Tk_FindPhoto_t) - _dfunc(hMod, "Tk_FindPhoto")) == NULL) { return -1; }; + if ((TK_PHOTO_GET_IMAGE = (Tk_PhotoGetImage_t)_dfunc(hMod, "Tk_PhotoGetImage")) == + NULL) { + return -1; + }; + if ((TK_FIND_PHOTO = (Tk_FindPhoto_t)_dfunc(hMod, "Tk_FindPhoto")) == NULL) { + return -1; + }; TK_LT_85 = GetProcAddress(hMod, "Tk_PhotoPutBlock_Panic") == NULL; /* Tk_PhotoPutBlock_Panic defined as of 8.5.0 */ if (TK_LT_85) { - TK_PHOTO_PUT_BLOCK_84 = (Tk_PhotoPutBlock_84_t) func; - return ((TK_PHOTO_SET_SIZE_84 = (Tk_PhotoSetSize_84_t) - _dfunc(hMod, "Tk_PhotoSetSize")) == NULL) ? -1 : 1; + TK_PHOTO_PUT_BLOCK_84 = (Tk_PhotoPutBlock_84_t)func; + return ((TK_PHOTO_SET_SIZE_84 = + (Tk_PhotoSetSize_84_t)_dfunc(hMod, "Tk_PhotoSetSize")) == NULL) + ? -1 + : 1; } - TK_PHOTO_PUT_BLOCK_85 = (Tk_PhotoPutBlock_85_t) func; + TK_PHOTO_PUT_BLOCK_85 = (Tk_PhotoPutBlock_85_t)func; return 1; } -int load_tkinter_funcs(void) -{ +int +load_tkinter_funcs(void) { /* * Load Tcl and Tk functions by searching all modules in current process. * Return 0 for success, non-zero for failure. @@ -344,7 +356,7 @@ int load_tkinter_funcs(void) return 1; } -#else /* not Windows */ +#else /* not Windows */ /* * On Unix, we can get the Tcl and Tk symbols from the tkinter module, because @@ -353,9 +365,9 @@ int load_tkinter_funcs(void) */ /* From module __file__ attribute to char *string for dlopen. */ -char *fname2char(PyObject *fname) -{ - PyObject* bytes; +char * +fname2char(PyObject *fname) { + PyObject *bytes; bytes = PyUnicode_EncodeFSDefault(fname); if (bytes == NULL) { return NULL; @@ -365,15 +377,15 @@ char *fname2char(PyObject *fname) #include -void *_dfunc(void *lib_handle, const char *func_name) -{ +void * +_dfunc(void *lib_handle, const char *func_name) { /* * Load function `func_name` from `lib_handle`. * Set Python exception if we can't find `func_name` in `lib_handle`. * Returns function pointer or NULL if not present. */ - void* func; + void *func; /* Reset errors. */ dlerror(); func = dlsym(lib_handle, func_name); @@ -384,35 +396,44 @@ void *_dfunc(void *lib_handle, const char *func_name) return func; } -int _func_loader(void *lib) -{ +int +_func_loader(void *lib) { /* * Fill global function pointers from dynamic lib. * Return 1 if any pointer is NULL, 0 otherwise. */ - if ((TCL_CREATE_COMMAND = (Tcl_CreateCommand_t) - _dfunc(lib, "Tcl_CreateCommand")) == NULL) { return 1; } - if ((TCL_APPEND_RESULT = (Tcl_AppendResult_t) _dfunc(lib, - "Tcl_AppendResult")) == NULL) { return 1; } - if ((TK_PHOTO_GET_IMAGE = (Tk_PhotoGetImage_t) - _dfunc(lib, "Tk_PhotoGetImage")) == NULL) { return 1; } - if ((TK_FIND_PHOTO = (Tk_FindPhoto_t) - _dfunc(lib, "Tk_FindPhoto")) == NULL) { return 1; } + if ((TCL_CREATE_COMMAND = (Tcl_CreateCommand_t)_dfunc(lib, "Tcl_CreateCommand")) == + NULL) { + return 1; + } + if ((TCL_APPEND_RESULT = (Tcl_AppendResult_t)_dfunc(lib, "Tcl_AppendResult")) == + NULL) { + return 1; + } + if ((TK_PHOTO_GET_IMAGE = (Tk_PhotoGetImage_t)_dfunc(lib, "Tk_PhotoGetImage")) == + NULL) { + return 1; + } + if ((TK_FIND_PHOTO = (Tk_FindPhoto_t)_dfunc(lib, "Tk_FindPhoto")) == NULL) { + return 1; + } /* Tk_PhotoPutBlock_Panic defined as of 8.5.0 */ TK_LT_85 = (dlsym(lib, "Tk_PhotoPutBlock_Panic") == NULL); if (TK_LT_85) { - return (((TK_PHOTO_PUT_BLOCK_84 = (Tk_PhotoPutBlock_84_t) - _dfunc(lib, "Tk_PhotoPutBlock")) == NULL) || - ((TK_PHOTO_SET_SIZE_84 = (Tk_PhotoSetSize_84_t) - _dfunc(lib, "Tk_PhotoSetSize")) == NULL)); + return ( + ((TK_PHOTO_PUT_BLOCK_84 = + (Tk_PhotoPutBlock_84_t)_dfunc(lib, "Tk_PhotoPutBlock")) == NULL) || + ((TK_PHOTO_SET_SIZE_84 = + (Tk_PhotoSetSize_84_t)_dfunc(lib, "Tk_PhotoSetSize")) == NULL)); } - return ((TK_PHOTO_PUT_BLOCK_85 = (Tk_PhotoPutBlock_85_t) - _dfunc(lib, "Tk_PhotoPutBlock")) == NULL); + return ( + (TK_PHOTO_PUT_BLOCK_85 = + (Tk_PhotoPutBlock_85_t)_dfunc(lib, "Tk_PhotoPutBlock")) == NULL); } -int load_tkinter_funcs(void) -{ +int +load_tkinter_funcs(void) { /* * Load tkinter global funcs from tkinter compiled module. * Return 0 for success, non-zero for failure. @@ -447,8 +468,7 @@ int load_tkinter_funcs(void) } tkinter_lib = dlopen(tkinter_libname, RTLD_LAZY); if (tkinter_lib == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "Cannot dlopen tkinter module file"); + PyErr_SetString(PyExc_RuntimeError, "Cannot dlopen tkinter module file"); goto exit; } ret = _func_loader(tkinter_lib); diff --git a/src/_imaging.c b/src/_imaging.c index 0f8c9d61f..a8741f6ad 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -94,31 +94,30 @@ #include /* Configuration stuff. Feel free to undef things you don't need. */ -#define WITH_IMAGECHOPS /* ImageChops support */ -#define WITH_IMAGEDRAW /* ImageDraw support */ -#define WITH_MAPPING /* use memory mapping to read some file formats */ -#define WITH_IMAGEPATH /* ImagePath stuff */ -#define WITH_ARROW /* arrow graphics stuff (experimental) */ -#define WITH_EFFECTS /* special effects */ -#define WITH_QUANTIZE /* quantization support */ -#define WITH_RANKFILTER /* rank filter */ -#define WITH_MODEFILTER /* mode filter */ -#define WITH_THREADING /* "friendly" threading support */ +#define WITH_IMAGECHOPS /* ImageChops support */ +#define WITH_IMAGEDRAW /* ImageDraw support */ +#define WITH_MAPPING /* use memory mapping to read some file formats */ +#define WITH_IMAGEPATH /* ImagePath stuff */ +#define WITH_ARROW /* arrow graphics stuff (experimental) */ +#define WITH_EFFECTS /* special effects */ +#define WITH_QUANTIZE /* quantization support */ +#define WITH_RANKFILTER /* rank filter */ +#define WITH_MODEFILTER /* mode filter */ +#define WITH_THREADING /* "friendly" threading support */ #define WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask module */ -#undef VERBOSE +#undef VERBOSE -#define B16(p, i) ((((int)p[(i)]) << 8) + p[(i)+1]) -#define L16(p, i) ((((int)p[(i)+1]) << 8) + p[(i)]) -#define S16(v) ((v) < 32768 ? (v) : ((v) - 65536)) +#define B16(p, i) ((((int)p[(i)]) << 8) + p[(i) + 1]) +#define L16(p, i) ((((int)p[(i) + 1]) << 8) + p[(i)]) +#define S16(v) ((v) < 32768 ? (v) : ((v)-65536)) /* -------------------------------------------------------------------- */ /* OBJECT ADMINISTRATION */ /* -------------------------------------------------------------------- */ typedef struct { - PyObject_HEAD - Imaging image; + PyObject_HEAD Imaging image; ImagingAccess access; } ImagingObject; @@ -126,8 +125,7 @@ static PyTypeObject Imaging_Type; #ifdef WITH_IMAGEDRAW -typedef struct -{ +typedef struct { /* to write a character, cut out sxy from glyph data, place at current position plus dxy, and advance by (dx, dy) */ int dx, dy; @@ -136,8 +134,7 @@ typedef struct } Glyph; typedef struct { - PyObject_HEAD - ImagingObject* ref; + PyObject_HEAD ImagingObject *ref; Imaging bitmap; int ysize; int baseline; @@ -147,8 +144,7 @@ typedef struct { static PyTypeObject ImagingFont_Type; typedef struct { - PyObject_HEAD - ImagingObject* image; + PyObject_HEAD ImagingObject *image; UINT8 ink[4]; int blend; } ImagingDrawObject; @@ -158,17 +154,15 @@ static PyTypeObject ImagingDraw_Type; #endif typedef struct { - PyObject_HEAD - ImagingObject* image; + PyObject_HEAD ImagingObject *image; int readonly; } PixelAccessObject; static PyTypeObject PixelAccess_Type; -PyObject* -PyImagingNew(Imaging imOut) -{ - ImagingObject* imagep; +PyObject * +PyImagingNew(Imaging imOut) { + ImagingObject *imagep; if (!imOut) { return NULL; @@ -187,13 +181,11 @@ PyImagingNew(Imaging imOut) imagep->image = imOut; imagep->access = ImagingAccessNew(imOut); - return (PyObject*) imagep; + return (PyObject *)imagep; } static void -_dealloc(ImagingObject* imagep) -{ - +_dealloc(ImagingObject *imagep) { #ifdef VERBOSE printf("imaging %p deleted\n", imagep); #endif @@ -207,8 +199,8 @@ _dealloc(ImagingObject* imagep) #define PyImaging_Check(op) (Py_TYPE(op) == &Imaging_Type) -Imaging PyImaging_AsImaging(PyObject *op) -{ +Imaging +PyImaging_AsImaging(PyObject *op) { if (!PyImaging_Check(op)) { PyErr_BadInternalCall(); return NULL; @@ -217,22 +209,21 @@ Imaging PyImaging_AsImaging(PyObject *op) return ((ImagingObject *)op)->image; } - /* -------------------------------------------------------------------- */ /* THREAD HANDLING */ /* -------------------------------------------------------------------- */ -void ImagingSectionEnter(ImagingSectionCookie* cookie) -{ +void +ImagingSectionEnter(ImagingSectionCookie *cookie) { #ifdef WITH_THREADING - *cookie = (PyThreadState *) PyEval_SaveThread(); + *cookie = (PyThreadState *)PyEval_SaveThread(); #endif } -void ImagingSectionLeave(ImagingSectionCookie* cookie) -{ +void +ImagingSectionLeave(ImagingSectionCookie *cookie) { #ifdef WITH_THREADING - PyEval_RestoreThread((PyThreadState*) *cookie); + PyEval_RestoreThread((PyThreadState *)*cookie); #endif } @@ -241,13 +232,13 @@ void ImagingSectionLeave(ImagingSectionCookie* cookie) /* -------------------------------------------------------------------- */ /* Python compatibility API */ -int PyImaging_CheckBuffer(PyObject* buffer) -{ +int +PyImaging_CheckBuffer(PyObject *buffer) { return PyObject_CheckBuffer(buffer); } -int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view) -{ +int +PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view) { /* must call check_buffer first! */ return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); } @@ -257,58 +248,50 @@ int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view) /* -------------------------------------------------------------------- */ /* error messages */ -static const char* must_be_sequence = "argument must be a sequence"; -static const char* must_be_two_coordinates = - "coordinate list must contain exactly 2 coordinates"; -static const char* wrong_mode = "unrecognized image mode"; -static const char* wrong_raw_mode = "unrecognized raw mode"; -static const char* outside_image = "image index out of range"; -static const char* outside_palette = "palette index out of range"; -static const char* wrong_palette_size = "invalid palette size"; -static const char* no_palette = "image has no palette"; -static const char* readonly = "image is readonly"; +static const char *must_be_sequence = "argument must be a sequence"; +static const char *must_be_two_coordinates = + "coordinate list must contain exactly 2 coordinates"; +static const char *wrong_mode = "unrecognized image mode"; +static const char *wrong_raw_mode = "unrecognized raw mode"; +static const char *outside_image = "image index out of range"; +static const char *outside_palette = "palette index out of range"; +static const char *wrong_palette_size = "invalid palette size"; +static const char *no_palette = "image has no palette"; +static const char *readonly = "image is readonly"; /* static const char* no_content = "image has no content"; */ void * -ImagingError_OSError(void) -{ +ImagingError_OSError(void) { PyErr_SetString(PyExc_OSError, "error when accessing file"); return NULL; } void * -ImagingError_MemoryError(void) -{ +ImagingError_MemoryError(void) { return PyErr_NoMemory(); } void * -ImagingError_Mismatch(void) -{ +ImagingError_Mismatch(void) { PyErr_SetString(PyExc_ValueError, "images do not match"); return NULL; } void * -ImagingError_ModeError(void) -{ +ImagingError_ModeError(void) { PyErr_SetString(PyExc_ValueError, "image has wrong mode"); return NULL; } void * -ImagingError_ValueError(const char *message) -{ +ImagingError_ValueError(const char *message) { PyErr_SetString( - PyExc_ValueError, - (message) ? (char*) message : "unrecognized argument value" - ); + PyExc_ValueError, (message) ? (char *)message : "unrecognized argument value"); return NULL; } void -ImagingError_Clear(void) -{ +ImagingError_Clear(void) { PyErr_Clear(); } @@ -317,8 +300,7 @@ ImagingError_Clear(void) /* -------------------------------------------------------------------- */ static int -getbands(const char* mode) -{ +getbands(const char *mode) { Imaging im; int bands; @@ -335,15 +317,14 @@ getbands(const char* mode) return bands; } -#define TYPE_UINT8 (0x100|sizeof(UINT8)) -#define TYPE_INT32 (0x200|sizeof(INT32)) -#define TYPE_FLOAT16 (0x500|sizeof(FLOAT16)) -#define TYPE_FLOAT32 (0x300|sizeof(FLOAT32)) -#define TYPE_DOUBLE (0x400|sizeof(double)) +#define TYPE_UINT8 (0x100 | sizeof(UINT8)) +#define TYPE_INT32 (0x200 | sizeof(INT32)) +#define TYPE_FLOAT16 (0x500 | sizeof(FLOAT16)) +#define TYPE_FLOAT32 (0x300 | sizeof(FLOAT32)) +#define TYPE_DOUBLE (0x400 | sizeof(double)) -static void* -getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) -{ +static void * +getlist(PyObject *arg, Py_ssize_t *length, const char *wrong_length, int type) { /* - allocates and returns a c array of the items in the python sequence arg. - the size of the returned array is in length @@ -358,11 +339,11 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) int itemp; double dtemp; FLOAT32 ftemp; - UINT8* list; - PyObject* seq; - PyObject* op; + UINT8 *list; + PyObject *seq; + PyObject *op; - if ( ! PySequence_Check(arg)) { + if (!PySequence_Check(arg)) { PyErr_SetString(PyExc_TypeError, must_be_sequence); return NULL; } @@ -376,12 +357,12 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) /* malloc check ok, type & ff is just a sizeof(something) calloc checks for overflow */ list = calloc(n, type & 0xff); - if ( ! list) { + if (!list) { return ImagingError_MemoryError(); } seq = PySequence_Fast(arg, must_be_sequence); - if ( ! seq) { + if (!seq) { free(list); return NULL; } @@ -391,22 +372,22 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) // DRY, branch prediction is going to work _really_ well // on this switch. And 3 fewer loops to copy/paste. switch (type) { - case TYPE_UINT8: - itemp = PyLong_AsLong(op); - list[i] = CLIP8(itemp); - break; - case TYPE_INT32: - itemp = PyLong_AsLong(op); - memcpy(list + i * sizeof(INT32), &itemp, sizeof(itemp)); - break; - case TYPE_FLOAT32: - ftemp = (FLOAT32)PyFloat_AsDouble(op); - memcpy(list + i * sizeof(ftemp), &ftemp, sizeof(ftemp)); - break; - case TYPE_DOUBLE: - dtemp = PyFloat_AsDouble(op); - memcpy(list + i * sizeof(dtemp), &dtemp, sizeof(dtemp)); - break; + case TYPE_UINT8: + itemp = PyLong_AsLong(op); + list[i] = CLIP8(itemp); + break; + case TYPE_INT32: + itemp = PyLong_AsLong(op); + memcpy(list + i * sizeof(INT32), &itemp, sizeof(itemp)); + break; + case TYPE_FLOAT32: + ftemp = (FLOAT32)PyFloat_AsDouble(op); + memcpy(list + i * sizeof(ftemp), &ftemp, sizeof(ftemp)); + break; + case TYPE_DOUBLE: + dtemp = PyFloat_AsDouble(op); + memcpy(list + i * sizeof(dtemp), &dtemp, sizeof(dtemp)); + break; } } @@ -431,31 +412,30 @@ float16tofloat32(const FLOAT16 in) { UINT32 t3; FLOAT32 out[1] = {0}; - t1 = in & 0x7fff; // Non-sign bits - t2 = in & 0x8000; // Sign bit - t3 = in & 0x7c00; // Exponent + t1 = in & 0x7fff; // Non-sign bits + t2 = in & 0x8000; // Sign bit + t3 = in & 0x7c00; // Exponent - t1 <<= 13; // Align mantissa on MSB - t2 <<= 16; // Shift sign bit into position + t1 <<= 13; // Align mantissa on MSB + t2 <<= 16; // Shift sign bit into position - t1 += 0x38000000; // Adjust bias + t1 += 0x38000000; // Adjust bias - t1 = (t3 == 0 ? 0 : t1); // Denormals-as-zero + t1 = (t3 == 0 ? 0 : t1); // Denormals-as-zero - t1 |= t2; // Re-insert sign bit + t1 |= t2; // Re-insert sign bit memcpy(out, &t1, 4); return out[0]; } -static inline PyObject* -getpixel(Imaging im, ImagingAccess access, int x, int y) -{ +static inline PyObject * +getpixel(Imaging im, ImagingAccess access, int x, int y) { union { - UINT8 b[4]; - UINT16 h; - INT32 i; - FLOAT32 f; + UINT8 b[4]; + UINT16 h; + INT32 i; + FLOAT32 f; } pixel; if (x < 0) { @@ -473,27 +453,28 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) access->get_pixel(im, x, y, &pixel); switch (im->type) { - case IMAGING_TYPE_UINT8: - switch (im->bands) { - case 1: - return PyLong_FromLong(pixel.b[0]); - case 2: - return Py_BuildValue("BB", pixel.b[0], pixel.b[1]); - case 3: - return Py_BuildValue("BBB", pixel.b[0], pixel.b[1], pixel.b[2]); - case 4: - return Py_BuildValue("BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]); - } - break; - case IMAGING_TYPE_INT32: - return PyLong_FromLong(pixel.i); - case IMAGING_TYPE_FLOAT32: - return PyFloat_FromDouble(pixel.f); - case IMAGING_TYPE_SPECIAL: - if (strncmp(im->mode, "I;16", 4) == 0) { - return PyLong_FromLong(pixel.h); - } - break; + case IMAGING_TYPE_UINT8: + switch (im->bands) { + case 1: + return PyLong_FromLong(pixel.b[0]); + case 2: + return Py_BuildValue("BB", pixel.b[0], pixel.b[1]); + case 3: + return Py_BuildValue("BBB", pixel.b[0], pixel.b[1], pixel.b[2]); + case 4: + return Py_BuildValue( + "BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]); + } + break; + case IMAGING_TYPE_INT32: + return PyLong_FromLong(pixel.i); + case IMAGING_TYPE_FLOAT32: + return PyFloat_FromDouble(pixel.f); + case IMAGING_TYPE_SPECIAL: + if (strncmp(im->mode, "I;16", 4) == 0) { + return PyLong_FromLong(pixel.h); + } + break; } /* unknown type */ @@ -501,11 +482,10 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) return Py_None; } -static char* -getink(PyObject* color, Imaging im, char* ink) -{ - int g=0, b=0, a=0; - double f=0; +static char * +getink(PyObject *color, Imaging im, char *ink) { + int g = 0, b = 0, a = 0; + double f = 0; /* Windows 64 bit longs are 32 bits, and 0xFFFFFFFF (white) is a python long (not int) that raises an overflow error when trying to return it into a 32 bit C long @@ -521,8 +501,7 @@ getink(PyObject* color, Imaging im, char* ink) if (PyTuple_Check(color) && PyTuple_Size(color) == 1) { color = PyTuple_GetItem(color, 0); } - if (im->type == IMAGING_TYPE_UINT8 || - im->type == IMAGING_TYPE_INT32 || + if (im->type == IMAGING_TYPE_UINT8 || im->type == IMAGING_TYPE_INT32 || im->type == IMAGING_TYPE_SPECIAL) { if (PyLong_Check(color)) { r = PyLong_AsLongLong(color); @@ -536,70 +515,71 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } else { - PyErr_SetString(PyExc_TypeError, "color must be int or single-element tuple"); + PyErr_SetString( + PyExc_TypeError, "color must be int or single-element tuple"); return NULL; } } switch (im->type) { - case IMAGING_TYPE_UINT8: - /* unsigned integer */ - if (im->bands == 1) { - /* unsigned integer, single layer */ - if (rIsInt != 1) { - if (!PyArg_ParseTuple(color, "L", &r)) { - return NULL; + case IMAGING_TYPE_UINT8: + /* unsigned integer */ + if (im->bands == 1) { + /* unsigned integer, single layer */ + if (rIsInt != 1) { + if (!PyArg_ParseTuple(color, "L", &r)) { + return NULL; + } } - } - ink[0] = (char) CLIP8(r); - ink[1] = ink[2] = ink[3] = 0; - } else { - a = 255; - if (rIsInt) { - /* compatibility: ABGR */ - a = (UINT8) (r >> 24); - b = (UINT8) (r >> 16); - g = (UINT8) (r >> 8); - r = (UINT8) r; + ink[0] = (char)CLIP8(r); + ink[1] = ink[2] = ink[3] = 0; } else { - if (im->bands == 2) { - if (!PyArg_ParseTuple(color, "L|i", &r, &a)) { - return NULL; - } - g = b = r; + a = 255; + if (rIsInt) { + /* compatibility: ABGR */ + a = (UINT8)(r >> 24); + b = (UINT8)(r >> 16); + g = (UINT8)(r >> 8); + r = (UINT8)r; } else { - if (!PyArg_ParseTuple(color, "Lii|i", &r, &g, &b, &a)) { - return NULL; + if (im->bands == 2) { + if (!PyArg_ParseTuple(color, "L|i", &r, &a)) { + return NULL; + } + g = b = r; + } else { + if (!PyArg_ParseTuple(color, "Lii|i", &r, &g, &b, &a)) { + return NULL; + } } } + ink[0] = (char)CLIP8(r); + ink[1] = (char)CLIP8(g); + ink[2] = (char)CLIP8(b); + ink[3] = (char)CLIP8(a); } - ink[0] = (char) CLIP8(r); - ink[1] = (char) CLIP8(g); - ink[2] = (char) CLIP8(b); - ink[3] = (char) CLIP8(a); - } - return ink; - case IMAGING_TYPE_INT32: - /* signed integer */ - itmp = r; - memcpy(ink, &itmp, sizeof(itmp)); - return ink; - case IMAGING_TYPE_FLOAT32: - /* floating point */ - f = PyFloat_AsDouble(color); - if (f == -1.0 && PyErr_Occurred()) { - return NULL; - } - ftmp = f; - memcpy(ink, &ftmp, sizeof(ftmp)); - return ink; - case IMAGING_TYPE_SPECIAL: - if (strncmp(im->mode, "I;16", 4) == 0) { - ink[0] = (UINT8) r; - ink[1] = (UINT8) (r >> 8); - ink[2] = ink[3] = 0; return ink; - } + case IMAGING_TYPE_INT32: + /* signed integer */ + itmp = r; + memcpy(ink, &itmp, sizeof(itmp)); + return ink; + case IMAGING_TYPE_FLOAT32: + /* floating point */ + f = PyFloat_AsDouble(color); + if (f == -1.0 && PyErr_Occurred()) { + return NULL; + } + ftmp = f; + memcpy(ink, &ftmp, sizeof(ftmp)); + return ink; + case IMAGING_TYPE_SPECIAL: + if (strncmp(im->mode, "I;16", 4) == 0) { + ink[0] = (UINT8)r; + ink[1] = (UINT8)(r >> 8); + ink[2] = ink[3] = 0; + return ink; + } } PyErr_SetString(PyExc_ValueError, wrong_mode); @@ -610,12 +590,11 @@ getink(PyObject* color, Imaging im, char* ink) /* FACTORIES */ /* -------------------------------------------------------------------- */ -static PyObject* -_fill(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_fill(PyObject *self, PyObject *args) { + char *mode; int xsize, ysize; - PyObject* color; + PyObject *color; char buffer[4]; Imaging im; @@ -639,16 +618,14 @@ _fill(PyObject* self, PyObject* args) } } - - (void) ImagingFill(im, buffer); + (void)ImagingFill(im, buffer); return PyImagingNew(im); } -static PyObject* -_new(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_new(PyObject *self, PyObject *args) { + char *mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { @@ -658,10 +635,9 @@ _new(PyObject* self, PyObject* args) return PyImagingNew(ImagingNew(mode, xsize, ysize)); } -static PyObject* -_new_block(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_new_block(PyObject *self, PyObject *args) { + char *mode; int xsize, ysize; if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { @@ -671,10 +647,9 @@ _new_block(PyObject* self, PyObject* args) return PyImagingNew(ImagingNewBlock(mode, xsize, ysize)); } -static PyObject* -_linear_gradient(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_linear_gradient(PyObject *self, PyObject *args) { + char *mode; if (!PyArg_ParseTuple(args, "s", &mode)) { return NULL; @@ -683,10 +658,9 @@ _linear_gradient(PyObject* self, PyObject* args) return PyImagingNew(ImagingFillLinearGradient(mode)); } -static PyObject* -_radial_gradient(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_radial_gradient(PyObject *self, PyObject *args) { + char *mode; if (!PyArg_ParseTuple(args, "s", &mode)) { return NULL; @@ -695,64 +669,57 @@ _radial_gradient(PyObject* self, PyObject* args) return PyImagingNew(ImagingFillRadialGradient(mode)); } -static PyObject* -_alpha_composite(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep1; - ImagingObject* imagep2; +static PyObject * +_alpha_composite(ImagingObject *self, PyObject *args) { + ImagingObject *imagep1; + ImagingObject *imagep2; - if (!PyArg_ParseTuple(args, "O!O!", - &Imaging_Type, &imagep1, - &Imaging_Type, &imagep2)) { + if (!PyArg_ParseTuple( + args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) { return NULL; } return PyImagingNew(ImagingAlphaComposite(imagep1->image, imagep2->image)); } -static PyObject* -_blend(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep1; - ImagingObject* imagep2; +static PyObject * +_blend(ImagingObject *self, PyObject *args) { + ImagingObject *imagep1; + ImagingObject *imagep2; double alpha; alpha = 0.5; - if (!PyArg_ParseTuple(args, "O!O!|d", - &Imaging_Type, &imagep1, - &Imaging_Type, &imagep2, - &alpha)) { + if (!PyArg_ParseTuple( + args, "O!O!|d", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2, &alpha)) { return NULL; } - return PyImagingNew(ImagingBlend(imagep1->image, imagep2->image, - (float) alpha)); + return PyImagingNew(ImagingBlend(imagep1->image, imagep2->image, (float)alpha)); } /* -------------------------------------------------------------------- */ /* METHODS */ /* -------------------------------------------------------------------- */ -static INT16* -_prepare_lut_table(PyObject* table, Py_ssize_t table_size) -{ +static INT16 * +_prepare_lut_table(PyObject *table, Py_ssize_t table_size) { int i; Py_buffer buffer_info; INT32 data_type = TYPE_FLOAT32; float item = 0; - void* table_data = NULL; - int free_table_data = 0; - INT16* prepared; + void *table_data = NULL; + int free_table_data = 0; + INT16 *prepared; - /* NOTE: This value should be the same as in ColorLUT.c */ - #define PRECISION_BITS (16 - 8 - 2) +/* NOTE: This value should be the same as in ColorLUT.c */ +#define PRECISION_BITS (16 - 8 - 2) - const char* wrong_size = ("The table should have table_channels * " - "size1D * size2D * size3D float items."); + const char *wrong_size = + ("The table should have table_channels * " + "size1D * size2D * size3D float items."); if (PyObject_CheckBuffer(table)) { - if ( ! PyObject_GetBuffer(table, &buffer_info, - PyBUF_CONTIG_RO | PyBUF_FORMAT)) { + if (!PyObject_GetBuffer(table, &buffer_info, PyBUF_CONTIG_RO | PyBUF_FORMAT)) { if (buffer_info.ndim == 1 && buffer_info.shape[0] == table_size) { if (strlen(buffer_info.format) == 1) { switch (buffer_info.format[0]) { @@ -775,21 +742,21 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } } - if ( ! table_data) { + if (!table_data) { free_table_data = 1; table_data = getlist(table, &table_size, wrong_size, TYPE_FLOAT32); - if ( ! table_data) { + if (!table_data) { return NULL; } } /* malloc check ok, max is 2 * 4 * 65**3 = 2197000 */ - prepared = (INT16*) malloc(sizeof(INT16) * table_size); - if ( ! prepared) { + prepared = (INT16 *)malloc(sizeof(INT16) * table_size); + if (!prepared) { if (free_table_data) { free(table_data); } - return (INT16*) ImagingError_MemoryError(); + return (INT16 *)ImagingError_MemoryError(); } for (i = 0; i < table_size; i++) { @@ -797,15 +764,16 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) double dtmp; switch (data_type) { case TYPE_FLOAT16: - memcpy(&htmp, ((char*) table_data) + i * sizeof(htmp), sizeof(htmp)); + memcpy(&htmp, ((char *)table_data) + i * sizeof(htmp), sizeof(htmp)); item = float16tofloat32(htmp); break; case TYPE_FLOAT32: - memcpy(&item, ((char*) table_data) + i * sizeof(FLOAT32), sizeof(FLOAT32)); + memcpy( + &item, ((char *)table_data) + i * sizeof(FLOAT32), sizeof(FLOAT32)); break; case TYPE_DOUBLE: - memcpy(&dtmp, ((char*) table_data) + i * sizeof(dtmp), sizeof(dtmp)); - item = (FLOAT32) dtmp; + memcpy(&dtmp, ((char *)table_data) + i * sizeof(dtmp), sizeof(dtmp)); + item = (FLOAT32)dtmp; break; } /* Max value for INT16 */ @@ -825,69 +793,75 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } } - #undef PRECISION_BITS +#undef PRECISION_BITS if (free_table_data) { free(table_data); } return prepared; } - -static PyObject* -_color_lut_3d(ImagingObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_color_lut_3d(ImagingObject *self, PyObject *args) { + char *mode; int filter; int table_channels; int size1D, size2D, size3D; - PyObject* table; + PyObject *table; - INT16* prepared_table; + INT16 *prepared_table; Imaging imOut; - if ( ! PyArg_ParseTuple(args, "siiiiiO:color_lut_3d", &mode, &filter, - &table_channels, &size1D, &size2D, &size3D, - &table)) { + if (!PyArg_ParseTuple( + args, + "siiiiiO:color_lut_3d", + &mode, + &filter, + &table_channels, + &size1D, + &size2D, + &size3D, + &table)) { return NULL; } /* actually, it is trilinear */ if (filter != IMAGING_TRANSFORM_BILINEAR) { - PyErr_SetString(PyExc_ValueError, - "Only LINEAR filter is supported."); + PyErr_SetString(PyExc_ValueError, "Only LINEAR filter is supported."); return NULL; } if (1 > table_channels || table_channels > 4) { - PyErr_SetString(PyExc_ValueError, - "table_channels should be from 1 to 4"); + PyErr_SetString(PyExc_ValueError, "table_channels should be from 1 to 4"); return NULL; } - if (2 > size1D || size1D > 65 || - 2 > size2D || size2D > 65 || - 2 > size3D || size3D > 65 - ) { - PyErr_SetString(PyExc_ValueError, - "Table size in any dimension should be from 2 to 65"); + if (2 > size1D || size1D > 65 || 2 > size2D || size2D > 65 || 2 > size3D || + size3D > 65) { + PyErr_SetString( + PyExc_ValueError, "Table size in any dimension should be from 2 to 65"); return NULL; } - prepared_table = _prepare_lut_table( - table, table_channels * size1D * size2D * size3D); - if ( ! prepared_table) { + prepared_table = + _prepare_lut_table(table, table_channels * size1D * size2D * size3D); + if (!prepared_table) { return NULL; } imOut = ImagingNewDirty(mode, self->image->xsize, self->image->ysize); - if ( ! imOut) { + if (!imOut) { free(prepared_table); return NULL; } - if ( ! ImagingColorLUT3D_linear(imOut, self->image, - table_channels, size1D, size2D, size3D, - prepared_table)) { + if (!ImagingColorLUT3D_linear( + imOut, + self->image, + table_channels, + size1D, + size2D, + size3D, + prepared_table)) { free(prepared_table); ImagingDelete(imOut); return NULL; @@ -898,10 +872,9 @@ _color_lut_3d(ImagingObject* self, PyObject* args) return PyImagingNew(imOut); } -static PyObject* -_convert(ImagingObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_convert(ImagingObject *self, PyObject *args) { + char *mode; int dither = 0; ImagingObject *paletteimage = NULL; @@ -911,7 +884,8 @@ _convert(ImagingObject* self, PyObject* args) if (paletteimage != NULL) { if (!PyImaging_Check(paletteimage)) { PyObject_Print((PyObject *)paletteimage, stderr, 0); - PyErr_SetString(PyExc_ValueError, "palette argument must be image with mode 'P'"); + PyErr_SetString( + PyExc_ValueError, "palette argument must be image with mode 'P'"); return NULL; } if (paletteimage->image->palette == NULL) { @@ -920,17 +894,16 @@ _convert(ImagingObject* self, PyObject* args) } } - return PyImagingNew(ImagingConvert(self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither)); + return PyImagingNew(ImagingConvert( + self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither)); } -static PyObject* -_convert2(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep1; - ImagingObject* imagep2; - if (!PyArg_ParseTuple(args, "O!O!", - &Imaging_Type, &imagep1, - &Imaging_Type, &imagep2)) { +static PyObject * +_convert2(ImagingObject *self, PyObject *args) { + ImagingObject *imagep1; + ImagingObject *imagep2; + if (!PyArg_ParseTuple( + args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) { return NULL; } @@ -942,17 +915,28 @@ _convert2(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_convert_matrix(ImagingObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_convert_matrix(ImagingObject *self, PyObject *args) { + char *mode; float m[12]; - if (!PyArg_ParseTuple(args, "s(ffff)", &mode, m+0, m+1, m+2, m+3)) { + if (!PyArg_ParseTuple(args, "s(ffff)", &mode, m + 0, m + 1, m + 2, m + 3)) { PyErr_Clear(); - if (!PyArg_ParseTuple(args, "s(ffffffffffff)", &mode, - m+0, m+1, m+2, m+3, - m+4, m+5, m+6, m+7, - m+8, m+9, m+10, m+11)){ + if (!PyArg_ParseTuple( + args, + "s(ffffffffffff)", + &mode, + m + 0, + m + 1, + m + 2, + m + 3, + m + 4, + m + 5, + m + 6, + m + 7, + m + 8, + m + 9, + m + 10, + m + 11)) { return NULL; } } @@ -960,11 +944,10 @@ _convert_matrix(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingConvertMatrix(self->image, mode, m)); } -static PyObject* -_convert_transparent(ImagingObject* self, PyObject* args) -{ - char* mode; - int r,g,b; +static PyObject * +_convert_transparent(ImagingObject *self, PyObject *args) { + char *mode; + int r, g, b; if (PyArg_ParseTuple(args, "s(iii)", &mode, &r, &g, &b)) { return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, g, b)); } @@ -975,9 +958,8 @@ _convert_transparent(ImagingObject* self, PyObject* args) return NULL; } -static PyObject* -_copy(ImagingObject* self, PyObject* args) -{ +static PyObject * +_copy(ImagingObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) { return NULL; } @@ -985,9 +967,8 @@ _copy(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingCopy(self->image)); } -static PyObject* -_crop(ImagingObject* self, PyObject* args) -{ +static PyObject * +_crop(ImagingObject *self, PyObject *args) { int x0, y0, x1, y1; if (!PyArg_ParseTuple(args, "(iiii)", &x0, &y0, &x1, &y1)) { return NULL; @@ -996,9 +977,8 @@ _crop(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingCrop(self->image, x0, y0, x1, y1)); } -static PyObject* -_expand_image(ImagingObject* self, PyObject* args) -{ +static PyObject * +_expand_image(ImagingObject *self, PyObject *args) { int x, y; int mode = 0; if (!PyArg_ParseTuple(args, "ii|i", &x, &y, &mode)) { @@ -1008,18 +988,17 @@ _expand_image(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingExpand(self->image, x, y, mode)); } -static PyObject* -_filter(ImagingObject* self, PyObject* args) -{ - PyObject* imOut; +static PyObject * +_filter(ImagingObject *self, PyObject *args) { + PyObject *imOut; Py_ssize_t kernelsize; - FLOAT32* kerneldata; + FLOAT32 *kerneldata; int xsize, ysize, i; float divisor, offset; - PyObject* kernel = NULL; - if (!PyArg_ParseTuple(args, "(ii)ffO", &xsize, &ysize, - &divisor, &offset, &kernel)) { + PyObject *kernel = NULL; + if (!PyArg_ParseTuple( + args, "(ii)ffO", &xsize, &ysize, &divisor, &offset, &kernel)) { return NULL; } @@ -1028,7 +1007,7 @@ _filter(ImagingObject* self, PyObject* args) if (!kerneldata) { return NULL; } - if (kernelsize != (Py_ssize_t) xsize * (Py_ssize_t) ysize) { + if (kernelsize != (Py_ssize_t)xsize * (Py_ssize_t)ysize) { free(kerneldata); return ImagingError_ValueError("bad kernel size"); } @@ -1037,9 +1016,7 @@ _filter(ImagingObject* self, PyObject* args) kerneldata[i] /= divisor; } - imOut = PyImagingNew( - ImagingFilter(self->image, xsize, ysize, kerneldata, offset) - ); + imOut = PyImagingNew(ImagingFilter(self->image, xsize, ysize, kerneldata, offset)); free(kerneldata); @@ -1047,9 +1024,8 @@ _filter(ImagingObject* self, PyObject* args) } #ifdef WITH_UNSHARPMASK -static PyObject* -_gaussian_blur(ImagingObject* self, PyObject* args) -{ +static PyObject * +_gaussian_blur(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -1074,16 +1050,15 @@ _gaussian_blur(ImagingObject* self, PyObject* args) } #endif -static PyObject* -_getpalette(ImagingObject* self, PyObject* args) -{ - PyObject* palette; +static PyObject * +_getpalette(ImagingObject *self, PyObject *args) { + PyObject *palette; int palettesize = 256; int bits; ImagingShuffler pack; - char* mode = "RGB"; - char* rawmode = "RGB"; + char *mode = "RGB"; + char *rawmode = "RGB"; if (!PyArg_ParseTuple(args, "|ss", &mode, &rawmode)) { return NULL; } @@ -1104,27 +1079,25 @@ _getpalette(ImagingObject* self, PyObject* args) return NULL; } - pack((UINT8*) PyBytes_AsString(palette), - self->image->palette->palette, palettesize); + pack( + (UINT8 *)PyBytes_AsString(palette), self->image->palette->palette, palettesize); return palette; } -static PyObject* -_getpalettemode(ImagingObject* self, PyObject* args) -{ +static PyObject * +_getpalettemode(ImagingObject *self, PyObject *args) { if (!self->image->palette) { - PyErr_SetString(PyExc_ValueError, no_palette); - return NULL; + PyErr_SetString(PyExc_ValueError, no_palette); + return NULL; } return PyUnicode_FromString(self->image->palette->mode); } static inline int -_getxy(PyObject* xy, int* x, int *y) -{ - PyObject* value; +_getxy(PyObject *xy, int *x, int *y) { + PyObject *value; if (!PyTuple_Check(xy) || PyTuple_GET_SIZE(xy) != 2) { goto badarg; @@ -1134,7 +1107,7 @@ _getxy(PyObject* xy, int* x, int *y) if (PyLong_Check(value)) { *x = PyLong_AS_LONG(value); } else if (PyFloat_Check(value)) { - *x = (int) PyFloat_AS_DOUBLE(value); + *x = (int)PyFloat_AS_DOUBLE(value); } else { goto badval; } @@ -1143,39 +1116,29 @@ _getxy(PyObject* xy, int* x, int *y) if (PyLong_Check(value)) { *y = PyLong_AS_LONG(value); } else if (PyFloat_Check(value)) { - *y = (int) PyFloat_AS_DOUBLE(value); + *y = (int)PyFloat_AS_DOUBLE(value); } else { goto badval; } return 0; - badarg: - PyErr_SetString( - PyExc_TypeError, - "argument must be sequence of length 2" - ); +badarg: + PyErr_SetString(PyExc_TypeError, "argument must be sequence of length 2"); return -1; - badval: - PyErr_SetString( - PyExc_TypeError, - "an integer is required" - ); +badval: + PyErr_SetString(PyExc_TypeError, "an integer is required"); return -1; } -static PyObject* -_getpixel(ImagingObject* self, PyObject* args) -{ - PyObject* xy; +static PyObject * +_getpixel(ImagingObject *self, PyObject *args) { + PyObject *xy; int x, y; if (PyTuple_GET_SIZE(args) != 1) { - PyErr_SetString( - PyExc_TypeError, - "argument 1 must be sequence of length 2" - ); + PyErr_SetString(PyExc_TypeError, "argument 1 must be sequence of length 2"); return NULL; } @@ -1199,38 +1162,37 @@ union hist_extrema { FLOAT32 f[2]; }; -static union hist_extrema* -parse_histogram_extremap(ImagingObject* self, PyObject* extremap, - union hist_extrema* ep) -{ +static union hist_extrema * +parse_histogram_extremap( + ImagingObject *self, PyObject *extremap, union hist_extrema *ep) { int i0, i1; double f0, f1; if (extremap) { switch (self->image->type) { - case IMAGING_TYPE_UINT8: - if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { + case IMAGING_TYPE_UINT8: + if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { + return NULL; + } + ep->u[0] = CLIP8(i0); + ep->u[1] = CLIP8(i1); + break; + case IMAGING_TYPE_INT32: + if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { + return NULL; + } + ep->i[0] = i0; + ep->i[1] = i1; + break; + case IMAGING_TYPE_FLOAT32: + if (!PyArg_ParseTuple(extremap, "dd", &f0, &f1)) { + return NULL; + } + ep->f[0] = (FLOAT32)f0; + ep->f[1] = (FLOAT32)f1; + break; + default: return NULL; - } - ep->u[0] = CLIP8(i0); - ep->u[1] = CLIP8(i1); - break; - case IMAGING_TYPE_INT32: - if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { - return NULL; - } - ep->i[0] = i0; - ep->i[1] = i1; - break; - case IMAGING_TYPE_FLOAT32: - if (!PyArg_ParseTuple(extremap, "dd", &f0, &f1)) { - return NULL; - } - ep->f[0] = (FLOAT32) f0; - ep->f[1] = (FLOAT32) f1; - break; - default: - return NULL; } } else { return NULL; @@ -1238,17 +1200,16 @@ parse_histogram_extremap(ImagingObject* self, PyObject* extremap, return ep; } -static PyObject* -_histogram(ImagingObject* self, PyObject* args) -{ +static PyObject * +_histogram(ImagingObject *self, PyObject *args) { ImagingHistogram h; - PyObject* list; + PyObject *list; int i; union hist_extrema extrema; - union hist_extrema* ep; + union hist_extrema *ep; - PyObject* extremap = NULL; - ImagingObject* maskp = NULL; + PyObject *extremap = NULL; + ImagingObject *maskp = NULL; if (!PyArg_ParseTuple(args, "|OO!", &extremap, &Imaging_Type, &maskp)) { return NULL; } @@ -1264,7 +1225,7 @@ _histogram(ImagingObject* self, PyObject* args) /* Build an integer list containing the histogram */ list = PyList_New(h->bands * 256); for (i = 0; i < h->bands * 256; i++) { - PyObject* item; + PyObject *item; item = PyLong_FromLong(h->histogram[i]); if (item == NULL) { Py_DECREF(list); @@ -1280,18 +1241,17 @@ _histogram(ImagingObject* self, PyObject* args) return list; } -static PyObject* -_entropy(ImagingObject* self, PyObject* args) -{ +static PyObject * +_entropy(ImagingObject *self, PyObject *args) { ImagingHistogram h; int idx, length; long sum; double entropy, fsum, p; union hist_extrema extrema; - union hist_extrema* ep; + union hist_extrema *ep; - PyObject* extremap = NULL; - ImagingObject* maskp = NULL; + PyObject *extremap = NULL; + ImagingObject *maskp = NULL; if (!PyArg_ParseTuple(args, "|OO!", &extremap, &Imaging_Type, &maskp)) { return NULL; } @@ -1330,9 +1290,8 @@ _entropy(ImagingObject* self, PyObject* args) } #ifdef WITH_MODEFILTER -static PyObject* -_modefilter(ImagingObject* self, PyObject* args) -{ +static PyObject * +_modefilter(ImagingObject *self, PyObject *args) { int size; if (!PyArg_ParseTuple(args, "i", &size)) { return NULL; @@ -1342,9 +1301,8 @@ _modefilter(ImagingObject* self, PyObject* args) } #endif -static PyObject* -_offset(ImagingObject* self, PyObject* args) -{ +static PyObject * +_offset(ImagingObject *self, PyObject *args) { int xoffset, yoffset; if (!PyArg_ParseTuple(args, "ii", &xoffset, &yoffset)) { return NULL; @@ -1353,38 +1311,35 @@ _offset(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingOffset(self->image, xoffset, yoffset)); } -static PyObject* -_paste(ImagingObject* self, PyObject* args) -{ +static PyObject * +_paste(ImagingObject *self, PyObject *args) { int status; char ink[4]; - PyObject* source; + PyObject *source; int x0, y0, x1, y1; - ImagingObject* maskp = NULL; - if (!PyArg_ParseTuple(args, "O(iiii)|O!", - &source, - &x0, &y0, &x1, &y1, - &Imaging_Type, &maskp)) { + ImagingObject *maskp = NULL; + if (!PyArg_ParseTuple( + args, "O(iiii)|O!", &source, &x0, &y0, &x1, &y1, &Imaging_Type, &maskp)) { return NULL; } if (PyImaging_Check(source)) { status = ImagingPaste( - self->image, PyImaging_AsImaging(source), + self->image, + PyImaging_AsImaging(source), (maskp) ? maskp->image : NULL, - x0, y0, x1, y1 - ); + x0, + y0, + x1, + y1); } else { if (!getink(source, self->image, ink)) { return NULL; } status = ImagingFill2( - self->image, ink, - (maskp) ? maskp->image : NULL, - x0, y0, x1, y1 - ); + self->image, ink, (maskp) ? maskp->image : NULL, x0, y0, x1, y1); } if (status < 0) { @@ -1395,23 +1350,22 @@ _paste(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_point(ImagingObject* self, PyObject* args) -{ - static const char* wrong_number = "wrong number of lut entries"; +static PyObject * +_point(ImagingObject *self, PyObject *args) { + static const char *wrong_number = "wrong number of lut entries"; Py_ssize_t n; int i, bands; Imaging im; - PyObject* list; - char* mode; + PyObject *list; + char *mode; if (!PyArg_ParseTuple(args, "Oz", &list, &mode)) { return NULL; } if (mode && !strcmp(mode, "F")) { - FLOAT32* data; + FLOAT32 *data; /* map from 8-bit data to floating point */ n = 256; @@ -1419,11 +1373,11 @@ _point(ImagingObject* self, PyObject* args) if (!data) { return NULL; } - im = ImagingPoint(self->image, mode, (void*) data); + im = ImagingPoint(self->image, mode, (void *)data); free(data); } else if (!strcmp(self->image->mode, "I") && mode && !strcmp(mode, "L")) { - UINT8* data; + UINT8 *data; /* map from 16-bit subset of 32-bit data to 8-bit */ /* FIXME: support arbitrary number of entries (requires API change) */ @@ -1432,11 +1386,11 @@ _point(ImagingObject* self, PyObject* args) if (!data) { return NULL; } - im = ImagingPoint(self->image, mode, (void*) data); + im = ImagingPoint(self->image, mode, (void *)data); free(data); } else { - INT32* data; + INT32 *data; UINT8 lut[1024]; if (mode) { @@ -1456,23 +1410,23 @@ _point(ImagingObject* self, PyObject* args) } if (mode && !strcmp(mode, "I")) { - im = ImagingPoint(self->image, mode, (void*) data); + im = ImagingPoint(self->image, mode, (void *)data); } else if (mode && bands > 1) { for (i = 0; i < 256; i++) { - lut[i*4] = CLIP8(data[i]); - lut[i*4+1] = CLIP8(data[i+256]); - lut[i*4+2] = CLIP8(data[i+512]); + lut[i * 4] = CLIP8(data[i]); + lut[i * 4 + 1] = CLIP8(data[i + 256]); + lut[i * 4 + 2] = CLIP8(data[i + 512]); if (n > 768) { - lut[i*4+3] = CLIP8(data[i+768]); + lut[i * 4 + 3] = CLIP8(data[i + 768]); } } - im = ImagingPoint(self->image, mode, (void*) lut); + im = ImagingPoint(self->image, mode, (void *)lut); } else { /* map individual bands */ for (i = 0; i < n; i++) { lut[i] = CLIP8(data[i]); } - im = ImagingPoint(self->image, mode, (void*) lut); + im = ImagingPoint(self->image, mode, (void *)lut); } free(data); } @@ -1480,9 +1434,8 @@ _point(ImagingObject* self, PyObject* args) return PyImagingNew(im); } -static PyObject* -_point_transform(ImagingObject* self, PyObject* args) -{ +static PyObject * +_point_transform(ImagingObject *self, PyObject *args) { double scale = 1.0; double offset = 0.0; if (!PyArg_ParseTuple(args, "|dd", &scale, &offset)) { @@ -1492,16 +1445,15 @@ _point_transform(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingPointTransform(self->image, scale, offset)); } -static PyObject* -_putdata(ImagingObject* self, PyObject* args) -{ +static PyObject * +_putdata(ImagingObject *self, PyObject *args) { Imaging image; // i & n are # pixels, require py_ssize_t. x can be as large as n. y, just because. Py_ssize_t n, i, x, y; - PyObject* data; - PyObject* seq = NULL; - PyObject* op; + PyObject *data; + PyObject *seq = NULL; + PyObject *op; double scale = 1.0; double offset = 0.0; @@ -1524,54 +1476,54 @@ _putdata(ImagingObject* self, PyObject* args) if (image->image8) { if (PyBytes_Check(data)) { - unsigned char* p; - p = (unsigned char*) PyBytes_AS_STRING(data); + unsigned char *p; + p = (unsigned char *)PyBytes_AS_STRING(data); if (scale == 1.0 && offset == 0.0) { /* Plain string data */ for (i = y = 0; i < n; i += image->xsize, y++) { x = n - i; - if (x > (int) image->xsize) { + if (x > (int)image->xsize) { x = image->xsize; } - memcpy(image->image8[y], p+i, x); + memcpy(image->image8[y], p + i, x); } } else { /* Scaled and clipped string data */ for (i = x = y = 0; i < n; i++) { - image->image8[y][x] = CLIP8((int) (p[i] * scale + offset)); - if (++x >= (int) image->xsize) { + image->image8[y][x] = CLIP8((int)(p[i] * scale + offset)); + if (++x >= (int)image->xsize) { x = 0, y++; } } } } else { - seq = PySequence_Fast(data, must_be_sequence); - if (!seq) { - PyErr_SetString(PyExc_TypeError, must_be_sequence); - return NULL; - } - if (scale == 1.0 && offset == 0.0) { - /* Clipped data */ - for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(seq, i); - image->image8[y][x] = (UINT8) CLIP8(PyLong_AsLong(op)); - if (++x >= (int) image->xsize){ - x = 0, y++; - } - } + seq = PySequence_Fast(data, must_be_sequence); + if (!seq) { + PyErr_SetString(PyExc_TypeError, must_be_sequence); + return NULL; + } + if (scale == 1.0 && offset == 0.0) { + /* Clipped data */ + for (i = x = y = 0; i < n; i++) { + op = PySequence_Fast_GET_ITEM(seq, i); + image->image8[y][x] = (UINT8)CLIP8(PyLong_AsLong(op)); + if (++x >= (int)image->xsize) { + x = 0, y++; + } + } } else { - /* Scaled and clipped data */ - for (i = x = y = 0; i < n; i++) { - PyObject *op = PySequence_Fast_GET_ITEM(seq, i); - image->image8[y][x] = CLIP8( - (int) (PyFloat_AsDouble(op) * scale + offset)); - if (++x >= (int) image->xsize){ - x = 0, y++; - } - } - } - PyErr_Clear(); /* Avoid weird exceptions */ + /* Scaled and clipped data */ + for (i = x = y = 0; i < n; i++) { + PyObject *op = PySequence_Fast_GET_ITEM(seq, i); + image->image8[y][x] = + CLIP8((int)(PyFloat_AsDouble(op) * scale + offset)); + if (++x >= (int)image->xsize) { + x = 0, y++; + } + } + } + PyErr_Clear(); /* Avoid weird exceptions */ } } else { /* 32-bit images */ @@ -1581,50 +1533,50 @@ _putdata(ImagingObject* self, PyObject* args) return NULL; } switch (image->type) { - case IMAGING_TYPE_INT32: - for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(seq, i); - IMAGING_PIXEL_INT32(image, x, y) = - (INT32) (PyFloat_AsDouble(op) * scale + offset); - if (++x >= (int) image->xsize){ - x = 0, y++; + case IMAGING_TYPE_INT32: + for (i = x = y = 0; i < n; i++) { + op = PySequence_Fast_GET_ITEM(seq, i); + IMAGING_PIXEL_INT32(image, x, y) = + (INT32)(PyFloat_AsDouble(op) * scale + offset); + if (++x >= (int)image->xsize) { + x = 0, y++; + } } - } - PyErr_Clear(); /* Avoid weird exceptions */ - break; - case IMAGING_TYPE_FLOAT32: - for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(seq, i); - IMAGING_PIXEL_FLOAT32(image, x, y) = - (FLOAT32) (PyFloat_AsDouble(op) * scale + offset); - if (++x >= (int) image->xsize){ - x = 0, y++; + PyErr_Clear(); /* Avoid weird exceptions */ + break; + case IMAGING_TYPE_FLOAT32: + for (i = x = y = 0; i < n; i++) { + op = PySequence_Fast_GET_ITEM(seq, i); + IMAGING_PIXEL_FLOAT32(image, x, y) = + (FLOAT32)(PyFloat_AsDouble(op) * scale + offset); + if (++x >= (int)image->xsize) { + x = 0, y++; + } } - } - PyErr_Clear(); /* Avoid weird exceptions */ - break; - default: - for (i = x = y = 0; i < n; i++) { - union { - char ink[4]; - INT32 inkint; - } u; + PyErr_Clear(); /* Avoid weird exceptions */ + break; + default: + for (i = x = y = 0; i < n; i++) { + union { + char ink[4]; + INT32 inkint; + } u; - u.inkint = 0; + u.inkint = 0; - op = PySequence_Fast_GET_ITEM(seq, i); - if (!op || !getink(op, image, u.ink)) { - Py_DECREF(seq); - return NULL; + op = PySequence_Fast_GET_ITEM(seq, i); + if (!op || !getink(op, image, u.ink)) { + Py_DECREF(seq); + return NULL; + } + /* FIXME: what about scale and offset? */ + image->image32[y][x] = u.inkint; + if (++x >= (int)image->xsize) { + x = 0, y++; + } } - /* FIXME: what about scale and offset? */ - image->image32[y][x] = u.inkint; - if (++x >= (int) image->xsize){ - x = 0, y++; - } - } - PyErr_Clear(); /* Avoid weird exceptions */ - break; + PyErr_Clear(); /* Avoid weird exceptions */ + break; } } @@ -1636,9 +1588,8 @@ _putdata(ImagingObject* self, PyObject* args) #ifdef WITH_QUANTIZE -static PyObject* -_quantize(ImagingObject* self, PyObject* args) -{ +static PyObject * +_quantize(ImagingObject *self, PyObject *args) { int colours = 256; int method = 0; int kmeans = 0; @@ -1648,23 +1599,20 @@ _quantize(ImagingObject* self, PyObject* args) if (!self->image->xsize || !self->image->ysize) { /* no content; return an empty image */ - return PyImagingNew( - ImagingNew("P", self->image->xsize, self->image->ysize) - ); + return PyImagingNew(ImagingNew("P", self->image->xsize, self->image->ysize)); } return PyImagingNew(ImagingQuantize(self->image, colours, method, kmeans)); } #endif -static PyObject* -_putpalette(ImagingObject* self, PyObject* args) -{ +static PyObject * +_putpalette(ImagingObject *self, PyObject *args) { ImagingShuffler unpack; int bits; - char* rawmode; - UINT8* palette; + char *rawmode; + UINT8 *palette; Py_ssize_t palettesize; if (!PyArg_ParseTuple(args, "sy#", &rawmode, &palette, &palettesize)) { return NULL; @@ -1682,7 +1630,7 @@ _putpalette(ImagingObject* self, PyObject* args) return NULL; } - if ( palettesize * 8 / bits > 256) { + if (palettesize * 8 / bits > 256) { PyErr_SetString(PyExc_ValueError, wrong_palette_size); return NULL; } @@ -1699,9 +1647,8 @@ _putpalette(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_putpalettealpha(ImagingObject* self, PyObject* args) -{ +static PyObject * +_putpalettealpha(ImagingObject *self, PyObject *args) { int index; int alpha = 0; if (!PyArg_ParseTuple(args, "i|i", &index, &alpha)) { @@ -1719,15 +1666,14 @@ _putpalettealpha(ImagingObject* self, PyObject* args) } strcpy(self->image->palette->mode, "RGBA"); - self->image->palette->palette[index*4+3] = (UINT8) alpha; + self->image->palette->palette[index * 4 + 3] = (UINT8)alpha; Py_INCREF(Py_None); return Py_None; } -static PyObject* -_putpalettealphas(ImagingObject* self, PyObject* args) -{ +static PyObject * +_putpalettealphas(ImagingObject *self, PyObject *args) { int i; UINT8 *values; Py_ssize_t length; @@ -1740,28 +1686,27 @@ _putpalettealphas(ImagingObject* self, PyObject* args) return NULL; } - if (length > 256) { + if (length > 256) { PyErr_SetString(PyExc_ValueError, outside_palette); return NULL; } strcpy(self->image->palette->mode, "RGBA"); - for (i=0; iimage->palette->palette[i*4+3] = (UINT8) values[i]; + for (i = 0; i < length; i++) { + self->image->palette->palette[i * 4 + 3] = (UINT8)values[i]; } Py_INCREF(Py_None); return Py_None; } -static PyObject* -_putpixel(ImagingObject* self, PyObject* args) -{ +static PyObject * +_putpixel(ImagingObject *self, PyObject *args) { Imaging im; char ink[4]; int x, y; - PyObject* color; + PyObject *color; if (!PyArg_ParseTuple(args, "(ii)O", &x, &y, &color)) { return NULL; } @@ -1793,9 +1738,8 @@ _putpixel(ImagingObject* self, PyObject* args) } #ifdef WITH_RANKFILTER -static PyObject* -_rankfilter(ImagingObject* self, PyObject* args) -{ +static PyObject * +_rankfilter(ImagingObject *self, PyObject *args) { int size, rank; if (!PyArg_ParseTuple(args, "ii", &size, &rank)) { return NULL; @@ -1805,9 +1749,8 @@ _rankfilter(ImagingObject* self, PyObject* args) } #endif -static PyObject* -_resize(ImagingObject* self, PyObject* args) -{ +static PyObject * +_resize(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -1819,8 +1762,16 @@ _resize(ImagingObject* self, PyObject* args) box[2] = imIn->xsize; box[3] = imIn->ysize; - if (!PyArg_ParseTuple(args, "(ii)|i(ffff)", &xsize, &ysize, &filter, - &box[0], &box[1], &box[2], &box[3])) { + if (!PyArg_ParseTuple( + args, + "(ii)|i(ffff)", + &xsize, + &ysize, + &filter, + &box[0], + &box[1], + &box[2], + &box[3])) { return NULL; } @@ -1841,36 +1792,31 @@ _resize(ImagingObject* self, PyObject* args) } // If box's coordinates are int and box size matches requested size - if (box[0] - (int) box[0] == 0 && box[2] - box[0] == xsize - && box[1] - (int) box[1] == 0 && box[3] - box[1] == ysize) { + if (box[0] - (int)box[0] == 0 && box[2] - box[0] == xsize && + box[1] - (int)box[1] == 0 && box[3] - box[1] == ysize) { imOut = ImagingCrop(imIn, box[0], box[1], box[2], box[3]); - } - else if (filter == IMAGING_TRANSFORM_NEAREST) { + } else if (filter == IMAGING_TRANSFORM_NEAREST) { double a[6]; memset(a, 0, sizeof a); - a[0] = (double) (box[2] - box[0]) / xsize; - a[4] = (double) (box[3] - box[1]) / ysize; + a[0] = (double)(box[2] - box[0]) / xsize; + a[4] = (double)(box[3] - box[1]) / ysize; a[2] = box[0]; a[5] = box[1]; imOut = ImagingNewDirty(imIn->mode, xsize, ysize); imOut = ImagingTransform( - imOut, imIn, IMAGING_TRANSFORM_AFFINE, - 0, 0, xsize, ysize, - a, filter, 1); - } - else { + imOut, imIn, IMAGING_TRANSFORM_AFFINE, 0, 0, xsize, ysize, a, filter, 1); + } else { imOut = ImagingResample(imIn, xsize, ysize, filter, box); } return PyImagingNew(imOut); } -static PyObject* -_reduce(ImagingObject* self, PyObject* args) -{ +static PyObject * +_reduce(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -1881,8 +1827,15 @@ _reduce(ImagingObject* self, PyObject* args) box[2] = imIn->xsize; box[3] = imIn->ysize; - if (!PyArg_ParseTuple(args, "(ii)|(iiii)", &xscale, &yscale, - &box[0], &box[1], &box[2], &box[3])) { + if (!PyArg_ParseTuple( + args, + "(ii)|(iiii)", + &xscale, + &yscale, + &box[0], + &box[1], + &box[2], + &box[3])) { return NULL; } @@ -1914,18 +1867,16 @@ _reduce(ImagingObject* self, PyObject* args) return PyImagingNew(imOut); } - -#define IS_RGB(mode)\ +#define IS_RGB(mode) \ (!strcmp(mode, "RGB") || !strcmp(mode, "RGBA") || !strcmp(mode, "RGBX")) -static PyObject* -im_setmode(ImagingObject* self, PyObject* args) -{ +static PyObject * +im_setmode(ImagingObject *self, PyObject *args) { /* attempt to modify the mode of an image in place */ Imaging im; - char* mode; + char *mode; Py_ssize_t modelen; if (!PyArg_ParseTuple(args, "s#:setmode", &mode, &modelen)) { return NULL; @@ -1942,7 +1893,7 @@ im_setmode(ImagingObject* self, PyObject* args) strcpy(im->mode, mode); im->bands = modelen; if (!strcmp(mode, "RGBA")) { - (void) ImagingFillBand(im, 3, 255); + (void)ImagingFillBand(im, 3, 255); } } else { /* trying doing an in-place conversion */ @@ -1960,42 +1911,48 @@ im_setmode(ImagingObject* self, PyObject* args) return Py_None; } - -static PyObject* -_transform2(ImagingObject* self, PyObject* args) -{ - static const char* wrong_number = "wrong number of matrix entries"; +static PyObject * +_transform2(ImagingObject *self, PyObject *args) { + static const char *wrong_number = "wrong number of matrix entries"; Imaging imOut; Py_ssize_t n; double *a; - ImagingObject* imagep; + ImagingObject *imagep; int x0, y0, x1, y1; int method; - PyObject* data; + PyObject *data; int filter = IMAGING_TRANSFORM_NEAREST; int fill = 1; - if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii", - &x0, &y0, &x1, &y1, - &Imaging_Type, &imagep, - &method, &data, - &filter, &fill)) { + if (!PyArg_ParseTuple( + args, + "(iiii)O!iO|ii", + &x0, + &y0, + &x1, + &y1, + &Imaging_Type, + &imagep, + &method, + &data, + &filter, + &fill)) { return NULL; } switch (method) { - case IMAGING_TRANSFORM_AFFINE: - n = 6; - break; - case IMAGING_TRANSFORM_PERSPECTIVE: - n = 8; - break; - case IMAGING_TRANSFORM_QUAD: - n = 8; - break; - default: - n = -1; /* force error */ + case IMAGING_TRANSFORM_AFFINE: + n = 6; + break; + case IMAGING_TRANSFORM_PERSPECTIVE: + n = 8; + break; + case IMAGING_TRANSFORM_QUAD: + n = 8; + break; + default: + n = -1; /* force error */ } a = getlist(data, &n, wrong_number, TYPE_DOUBLE); @@ -2004,8 +1961,7 @@ _transform2(ImagingObject* self, PyObject* args) } imOut = ImagingTransform( - self->image, imagep->image, method, - x0, y0, x1, y1, a, filter, fill); + self->image, imagep->image, method, x0, y0, x1, y1, a, filter, fill); free(a); @@ -2017,9 +1973,8 @@ _transform2(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_transpose(ImagingObject* self, PyObject* args) -{ +static PyObject * +_transpose(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -2031,45 +1986,45 @@ _transpose(ImagingObject* self, PyObject* args) imIn = self->image; switch (op) { - case 0: /* flip left right */ - case 1: /* flip top bottom */ - case 3: /* rotate 180 */ - imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); - break; - case 2: /* rotate 90 */ - case 4: /* rotate 270 */ - case 5: /* transpose */ - case 6: /* transverse */ - imOut = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); - break; - default: - PyErr_SetString(PyExc_ValueError, "No such transpose operation"); - return NULL; + case 0: /* flip left right */ + case 1: /* flip top bottom */ + case 3: /* rotate 180 */ + imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); + break; + case 2: /* rotate 90 */ + case 4: /* rotate 270 */ + case 5: /* transpose */ + case 6: /* transverse */ + imOut = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); + break; + default: + PyErr_SetString(PyExc_ValueError, "No such transpose operation"); + return NULL; } if (imOut) { switch (op) { - case 0: - (void) ImagingFlipLeftRight(imOut, imIn); - break; - case 1: - (void) ImagingFlipTopBottom(imOut, imIn); - break; - case 2: - (void) ImagingRotate90(imOut, imIn); - break; - case 3: - (void) ImagingRotate180(imOut, imIn); - break; - case 4: - (void) ImagingRotate270(imOut, imIn); - break; - case 5: - (void) ImagingTranspose(imOut, imIn); - break; - case 6: - (void) ImagingTransverse(imOut, imIn); - break; + case 0: + (void)ImagingFlipLeftRight(imOut, imIn); + break; + case 1: + (void)ImagingFlipTopBottom(imOut, imIn); + break; + case 2: + (void)ImagingRotate90(imOut, imIn); + break; + case 3: + (void)ImagingRotate180(imOut, imIn); + break; + case 4: + (void)ImagingRotate270(imOut, imIn); + break; + case 5: + (void)ImagingTranspose(imOut, imIn); + break; + case 6: + (void)ImagingTransverse(imOut, imIn); + break; } } @@ -2077,9 +2032,8 @@ _transpose(ImagingObject* self, PyObject* args) } #ifdef WITH_UNSHARPMASK -static PyObject* -_unsharp_mask(ImagingObject* self, PyObject* args) -{ +static PyObject * +_unsharp_mask(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -2103,9 +2057,8 @@ _unsharp_mask(ImagingObject* self, PyObject* args) } #endif -static PyObject* -_box_blur(ImagingObject* self, PyObject* args) -{ +static PyObject * +_box_blur(ImagingObject *self, PyObject *args) { Imaging imIn; Imaging imOut; @@ -2131,15 +2084,13 @@ _box_blur(ImagingObject* self, PyObject* args) /* -------------------------------------------------------------------- */ -static PyObject* -_isblock(ImagingObject* self, PyObject* args) -{ +static PyObject * +_isblock(ImagingObject *self, PyObject *args) { return PyBool_FromLong(self->image->block != NULL); } -static PyObject* -_getbbox(ImagingObject* self, PyObject* args) -{ +static PyObject * +_getbbox(ImagingObject *self, PyObject *args) { int bbox[4]; if (!ImagingGetBBox(self->image, bbox)) { Py_INCREF(Py_None); @@ -2149,12 +2100,11 @@ _getbbox(ImagingObject* self, PyObject* args) return Py_BuildValue("iiii", bbox[0], bbox[1], bbox[2], bbox[3]); } -static PyObject* -_getcolors(ImagingObject* self, PyObject* args) -{ - ImagingColorItem* items; +static PyObject * +_getcolors(ImagingObject *self, PyObject *args) { + ImagingColorItem *items; int i, colors; - PyObject* out; + PyObject *out; int maxcolors = 256; if (!PyArg_ParseTuple(args, "i:getcolors", &maxcolors)) { @@ -2172,10 +2122,9 @@ _getcolors(ImagingObject* self, PyObject* args) } else { out = PyList_New(colors); for (i = 0; i < colors; i++) { - ImagingColorItem* v = &items[i]; - PyObject* item = Py_BuildValue( - "iN", v->count, getpixel(self->image, self->access, v->x, v->y) - ); + ImagingColorItem *v = &items[i]; + PyObject *item = Py_BuildValue( + "iN", v->count, getpixel(self->image, self->access, v->x, v->y)); PyList_SetItem(out, i, item); } } @@ -2185,9 +2134,8 @@ _getcolors(ImagingObject* self, PyObject* args) return out; } -static PyObject* -_getextrema(ImagingObject* self, PyObject* args) -{ +static PyObject * +_getextrema(ImagingObject *self, PyObject *args) { union { UINT8 u[2]; INT32 i[2]; @@ -2203,16 +2151,16 @@ _getextrema(ImagingObject* self, PyObject* args) if (status) { switch (self->image->type) { - case IMAGING_TYPE_UINT8: - return Py_BuildValue("BB", extrema.u[0], extrema.u[1]); - case IMAGING_TYPE_INT32: - return Py_BuildValue("ii", extrema.i[0], extrema.i[1]); - case IMAGING_TYPE_FLOAT32: - return Py_BuildValue("dd", extrema.f[0], extrema.f[1]); - case IMAGING_TYPE_SPECIAL: - if (strcmp(self->image->mode, "I;16") == 0) { - return Py_BuildValue("HH", extrema.s[0], extrema.s[1]); - } + case IMAGING_TYPE_UINT8: + return Py_BuildValue("BB", extrema.u[0], extrema.u[1]); + case IMAGING_TYPE_INT32: + return Py_BuildValue("ii", extrema.i[0], extrema.i[1]); + case IMAGING_TYPE_FLOAT32: + return Py_BuildValue("dd", extrema.f[0], extrema.f[1]); + case IMAGING_TYPE_SPECIAL: + if (strcmp(self->image->mode, "I;16") == 0) { + return Py_BuildValue("HH", extrema.s[0], extrema.s[1]); + } } } @@ -2220,12 +2168,11 @@ _getextrema(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_getprojection(ImagingObject* self, PyObject* args) -{ - unsigned char* xprofile; - unsigned char* yprofile; - PyObject* result; +static PyObject * +_getprojection(ImagingObject *self, PyObject *args) { + unsigned char *xprofile; + unsigned char *yprofile; + PyObject *result; /* malloc check ok */ xprofile = malloc(self->image->xsize); @@ -2237,11 +2184,15 @@ _getprojection(ImagingObject* self, PyObject* args) return ImagingError_MemoryError(); } - ImagingGetProjection(self->image, (unsigned char *)xprofile, (unsigned char *)yprofile); + ImagingGetProjection( + self->image, (unsigned char *)xprofile, (unsigned char *)yprofile); - result = Py_BuildValue("y#y#", - xprofile, (Py_ssize_t)self->image->xsize, - yprofile, (Py_ssize_t)self->image->ysize); + result = Py_BuildValue( + "y#y#", + xprofile, + (Py_ssize_t)self->image->xsize, + yprofile, + (Py_ssize_t)self->image->ysize); free(xprofile); free(yprofile); @@ -2251,9 +2202,8 @@ _getprojection(ImagingObject* self, PyObject* args) /* -------------------------------------------------------------------- */ -static PyObject* -_getband(ImagingObject* self, PyObject* args) -{ +static PyObject * +_getband(ImagingObject *self, PyObject *args) { int band; if (!PyArg_ParseTuple(args, "i", &band)) { @@ -2263,9 +2213,8 @@ _getband(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingGetBand(self->image, band)); } -static PyObject* -_fillband(ImagingObject* self, PyObject* args) -{ +static PyObject * +_fillband(ImagingObject *self, PyObject *args) { int band; int color; @@ -2281,14 +2230,11 @@ _fillband(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_putband(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_putband(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; int band; - if (!PyArg_ParseTuple(args, "O!i", - &Imaging_Type, &imagep, - &band)) { + if (!PyArg_ParseTuple(args, "O!i", &Imaging_Type, &imagep, &band)) { return NULL; } @@ -2300,19 +2246,27 @@ _putband(ImagingObject* self, PyObject* args) return Py_None; } -static PyObject* -_merge(PyObject* self, PyObject* args) -{ - char* mode; +static PyObject * +_merge(PyObject *self, PyObject *args) { + char *mode; ImagingObject *band0 = NULL; ImagingObject *band1 = NULL; ImagingObject *band2 = NULL; ImagingObject *band3 = NULL; Imaging bands[4] = {NULL, NULL, NULL, NULL}; - if (!PyArg_ParseTuple(args, "sO!|O!O!O!", &mode, - &Imaging_Type, &band0, &Imaging_Type, &band1, - &Imaging_Type, &band2, &Imaging_Type, &band3)) { + if (!PyArg_ParseTuple( + args, + "sO!|O!O!O!", + &mode, + &Imaging_Type, + &band0, + &Imaging_Type, + &band1, + &Imaging_Type, + &band2, + &Imaging_Type, + &band3)) { return NULL; } @@ -2332,23 +2286,22 @@ _merge(PyObject* self, PyObject* args) return PyImagingNew(ImagingMerge(mode, bands)); } -static PyObject* -_split(ImagingObject* self, PyObject* args) -{ +static PyObject * +_split(ImagingObject *self, PyObject *args) { int fails = 0; Py_ssize_t i; - PyObject* list; - PyObject* imaging_object; + PyObject *list; + PyObject *imaging_object; Imaging bands[4] = {NULL, NULL, NULL, NULL}; - if ( ! ImagingSplit(self->image, bands)) { + if (!ImagingSplit(self->image, bands)) { return NULL; } list = PyTuple_New(self->image->bands); for (i = 0; i < self->image->bands; i++) { imaging_object = PyImagingNew(bands[i]); - if ( ! imaging_object) { + if (!imaging_object) { fails += 1; } PyTuple_SET_ITEM(list, i, imaging_object); @@ -2364,16 +2317,14 @@ _split(ImagingObject* self, PyObject* args) #ifdef WITH_IMAGECHOPS -static PyObject* -_chop_invert(ImagingObject* self, PyObject* args) -{ +static PyObject * +_chop_invert(ImagingObject *self, PyObject *args) { return PyImagingNew(ImagingNegative(self->image)); } -static PyObject* -_chop_lighter(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_lighter(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2382,10 +2333,9 @@ _chop_lighter(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopLighter(self->image, imagep->image)); } -static PyObject* -_chop_darker(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_darker(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2394,10 +2344,9 @@ _chop_darker(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopDarker(self->image, imagep->image)); } -static PyObject* -_chop_difference(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_difference(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2406,10 +2355,9 @@ _chop_difference(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopDifference(self->image, imagep->image)); } -static PyObject* -_chop_multiply(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_multiply(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2418,10 +2366,9 @@ _chop_multiply(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopMultiply(self->image, imagep->image)); } -static PyObject* -_chop_screen(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_screen(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2430,48 +2377,41 @@ _chop_screen(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopScreen(self->image, imagep->image)); } -static PyObject* -_chop_add(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_add(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; float scale; int offset; scale = 1.0; offset = 0; - if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, - &scale, &offset)) { + if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, &scale, &offset)) { return NULL; } - return PyImagingNew(ImagingChopAdd(self->image, imagep->image, - scale, offset)); + return PyImagingNew(ImagingChopAdd(self->image, imagep->image, scale, offset)); } -static PyObject* -_chop_subtract(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_subtract(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; float scale; int offset; scale = 1.0; offset = 0; - if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, - &scale, &offset)) { + if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, &scale, &offset)) { return NULL; } - return PyImagingNew(ImagingChopSubtract(self->image, imagep->image, - scale, offset)); + return PyImagingNew(ImagingChopSubtract(self->image, imagep->image, scale, offset)); } -static PyObject* -_chop_and(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_and(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2480,10 +2420,9 @@ _chop_and(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopAnd(self->image, imagep->image)); } -static PyObject* -_chop_or(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_or(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2492,10 +2431,9 @@ _chop_or(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopOr(self->image, imagep->image)); } -static PyObject* -_chop_xor(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_xor(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2504,10 +2442,9 @@ _chop_xor(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopXor(self->image, imagep->image)); } -static PyObject* -_chop_add_modulo(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_add_modulo(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2516,10 +2453,9 @@ _chop_add_modulo(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopAddModulo(self->image, imagep->image)); } -static PyObject* -_chop_subtract_modulo(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_subtract_modulo(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2528,10 +2464,9 @@ _chop_subtract_modulo(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopSubtractModulo(self->image, imagep->image)); } -static PyObject* -_chop_soft_light(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_soft_light(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2540,10 +2475,9 @@ _chop_soft_light(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopSoftLight(self->image, imagep->image)); } -static PyObject* -_chop_hard_light(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_hard_light(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2552,10 +2486,9 @@ _chop_hard_light(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingChopHardLight(self->image, imagep->image)); } -static PyObject* -_chop_overlay(ImagingObject* self, PyObject* args) -{ - ImagingObject* imagep; +static PyObject * +_chop_overlay(ImagingObject *self, PyObject *args) { + ImagingObject *imagep; if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { return NULL; @@ -2565,24 +2498,21 @@ _chop_overlay(ImagingObject* self, PyObject* args) } #endif - /* -------------------------------------------------------------------- */ #ifdef WITH_IMAGEDRAW -static PyObject* -_font_new(PyObject* self_, PyObject* args) -{ +static PyObject * +_font_new(PyObject *self_, PyObject *args) { ImagingFontObject *self; int i, y0, y1; - static const char* wrong_length = "descriptor table has wrong size"; + static const char *wrong_length = "descriptor table has wrong size"; - ImagingObject* imagep; - unsigned char* glyphdata; + ImagingObject *imagep; + unsigned char *glyphdata; Py_ssize_t glyphdata_length; - if (!PyArg_ParseTuple(args, "O!y#", - &Imaging_Type, &imagep, - &glyphdata, &glyphdata_length)) { + if (!PyArg_ParseTuple( + args, "O!y#", &Imaging_Type, &imagep, &glyphdata, &glyphdata_length)) { return NULL; } @@ -2629,19 +2559,17 @@ _font_new(PyObject* self_, PyObject* args) Py_INCREF(imagep); self->ref = imagep; - return (PyObject*) self; + return (PyObject *)self; } static void -_font_dealloc(ImagingFontObject* self) -{ +_font_dealloc(ImagingFontObject *self) { Py_XDECREF(self->ref); PyObject_Del(self); } static inline int -textwidth(ImagingFontObject* self, const unsigned char* text) -{ +textwidth(ImagingFontObject *self, const unsigned char *text) { int xsize; for (xsize = 0; *text; text++) { @@ -2651,16 +2579,17 @@ textwidth(ImagingFontObject* self, const unsigned char* text) return xsize; } -void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){ +void +_font_text_asBytes(PyObject *encoded_string, unsigned char **text) { /* Allocates *text, returns a 'new reference'. Caller is required to free */ - PyObject* bytes = NULL; + PyObject *bytes = NULL; Py_ssize_t len = 0; char *buffer; *text = NULL; - if (PyUnicode_CheckExact(encoded_string)){ + if (PyUnicode_CheckExact(encoded_string)) { bytes = PyUnicode_AsLatin1String(encoded_string); if (!bytes) { return; @@ -2670,7 +2599,7 @@ void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){ PyBytes_AsStringAndSize(encoded_string, &buffer, &len); } - *text = calloc(len+1,1); + *text = calloc(len + 1, 1); if (*text) { memcpy(*text, buffer, len); } else { @@ -2683,23 +2612,21 @@ void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){ return; } - -static PyObject* -_font_getmask(ImagingFontObject* self, PyObject* args) -{ +static PyObject * +_font_getmask(ImagingFontObject *self, PyObject *args) { Imaging im; Imaging bitmap; int x, b; - int i=0; + int i = 0; int status; - Glyph* glyph; + Glyph *glyph; - PyObject* encoded_string; + PyObject *encoded_string; - unsigned char* text; - char* mode = ""; + unsigned char *text; + char *mode = ""; - if (!PyArg_ParseTuple(args, "O|s:getmask", &encoded_string, &mode)){ + if (!PyArg_ParseTuple(args, "O|s:getmask", &encoded_string, &mode)) { return NULL; } @@ -2715,22 +2642,24 @@ _font_getmask(ImagingFontObject* self, PyObject* args) } b = 0; - (void) ImagingFill(im, &b); + (void)ImagingFill(im, &b); b = self->baseline; for (x = 0; text[i]; i++) { glyph = &self->glyphs[text[i]]; - bitmap = ImagingCrop( - self->bitmap, - glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1 - ); + bitmap = + ImagingCrop(self->bitmap, glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1); if (!bitmap) { goto failed; } status = ImagingPaste( - im, bitmap, NULL, - glyph->dx0+x, glyph->dy0+b, glyph->dx1+x, glyph->dy1+b - ); + im, + bitmap, + NULL, + glyph->dx0 + x, + glyph->dy0 + b, + glyph->dx1 + x, + glyph->dy1 + b); ImagingDelete(bitmap); if (status < 0) { goto failed; @@ -2741,18 +2670,17 @@ _font_getmask(ImagingFontObject* self, PyObject* args) free(text); return PyImagingNew(im); - failed: +failed: free(text); ImagingDelete(im); Py_RETURN_NONE; } -static PyObject* -_font_getsize(ImagingFontObject* self, PyObject* args) -{ - unsigned char* text; - PyObject* encoded_string; - PyObject* val; +static PyObject * +_font_getsize(ImagingFontObject *self, PyObject *args) { + unsigned char *text; + PyObject *encoded_string; + PyObject *val; if (!PyArg_ParseTuple(args, "O:getsize", &encoded_string)) { return NULL; @@ -2776,12 +2704,11 @@ static struct PyMethodDef _font_methods[] = { /* -------------------------------------------------------------------- */ -static PyObject* -_draw_new(PyObject* self_, PyObject* args) -{ +static PyObject * +_draw_new(PyObject *self_, PyObject *args) { ImagingDrawObject *self; - ImagingObject* imagep; + ImagingObject *imagep; int blend = 0; if (!PyArg_ParseTuple(args, "O!|i", &Imaging_Type, &imagep, &blend)) { return NULL; @@ -2800,41 +2727,39 @@ _draw_new(PyObject* self_, PyObject* args) self->blend = blend; - return (PyObject*) self; + return (PyObject *)self; } static void -_draw_dealloc(ImagingDrawObject* self) -{ +_draw_dealloc(ImagingDrawObject *self) { Py_XDECREF(self->image); PyObject_Del(self); } -extern Py_ssize_t PyPath_Flatten(PyObject* data, double **xy); +extern Py_ssize_t +PyPath_Flatten(PyObject *data, double **xy); -static PyObject* -_draw_ink(ImagingDrawObject* self, PyObject* args) -{ +static PyObject * +_draw_ink(ImagingDrawObject *self, PyObject *args) { INT32 ink = 0; - PyObject* color; + PyObject *color; if (!PyArg_ParseTuple(args, "O", &color)) { return NULL; } - if (!getink(color, self->image->image, (char*) &ink)) { + if (!getink(color, self->image->image, (char *)&ink)) { return NULL; } - return PyLong_FromLong((int) ink); + return PyLong_FromLong((int)ink); } -static PyObject* -_draw_arc(ImagingDrawObject* self, PyObject* args) -{ - double* xy; +static PyObject * +_draw_arc(ImagingDrawObject *self, PyObject *args) { + double *xy; Py_ssize_t n; - PyObject* data; + PyObject *data; int ink; int width = 0; float start, end; @@ -2852,11 +2777,17 @@ _draw_arc(ImagingDrawObject* self, PyObject* args) return NULL; } - n = ImagingDrawArc(self->image->image, - (int) xy[0], (int) xy[1], - (int) xy[2], (int) xy[3], - start, end, &ink, width, self->blend - ); + n = ImagingDrawArc( + self->image->image, + (int)xy[0], + (int)xy[1], + (int)xy[2], + (int)xy[3], + start, + end, + &ink, + width, + self->blend); free(xy); @@ -2868,14 +2799,13 @@ _draw_arc(ImagingDrawObject* self, PyObject* args) return Py_None; } -static PyObject* -_draw_bitmap(ImagingDrawObject* self, PyObject* args) -{ +static PyObject * +_draw_bitmap(ImagingDrawObject *self, PyObject *args) { double *xy; Py_ssize_t n; PyObject *data; - ImagingObject* bitmap; + ImagingObject *bitmap; int ink; if (!PyArg_ParseTuple(args, "OO!i", &data, &Imaging_Type, &bitmap, &ink)) { return NULL; @@ -2886,17 +2816,14 @@ _draw_bitmap(ImagingDrawObject* self, PyObject* args) return NULL; } if (n != 1) { - PyErr_SetString(PyExc_TypeError, - "coordinate list must contain exactly 1 coordinate" - ); + PyErr_SetString( + PyExc_TypeError, "coordinate list must contain exactly 1 coordinate"); free(xy); return NULL; } n = ImagingDrawBitmap( - self->image->image, (int) xy[0], (int) xy[1], bitmap->image, - &ink, self->blend - ); + self->image->image, (int)xy[0], (int)xy[1], bitmap->image, &ink, self->blend); free(xy); @@ -2908,216 +2835,12 @@ _draw_bitmap(ImagingDrawObject* self, PyObject* args) return Py_None; } -static PyObject* -_draw_chord(ImagingDrawObject* self, PyObject* args) -{ - double* xy; - Py_ssize_t n; - - PyObject* data; - int ink, fill; - int width = 0; - float start, end; - if (!PyArg_ParseTuple(args, "Offii|i", - &data, &start, &end, &ink, &fill, &width)) { - return NULL; - } - - n = PyPath_Flatten(data, &xy); - if (n < 0) { - return NULL; - } - if (n != 2) { - PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); - free(xy); - return NULL; - } - - n = ImagingDrawChord(self->image->image, - (int) xy[0], (int) xy[1], - (int) xy[2], (int) xy[3], - start, end, &ink, fill, width, self->blend - ); - - free(xy); - - if (n < 0) { - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -_draw_ellipse(ImagingDrawObject* self, PyObject* args) -{ - double* xy; - Py_ssize_t n; - - PyObject* data; - int ink; - int fill = 0; - int width = 0; - if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) { - return NULL; - } - - n = PyPath_Flatten(data, &xy); - if (n < 0) { - return NULL; - } - if (n != 2) { - PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); - free(xy); - return NULL; - } - - n = ImagingDrawEllipse(self->image->image, - (int) xy[0], (int) xy[1], - (int) xy[2], (int) xy[3], - &ink, fill, width, self->blend - ); - - free(xy); - - if (n < 0) { - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -_draw_lines(ImagingDrawObject* self, PyObject* args) -{ +static PyObject * +_draw_chord(ImagingDrawObject *self, PyObject *args) { double *xy; - Py_ssize_t i, n; + Py_ssize_t n; PyObject *data; - int ink; - int width = 0; - if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &width)) { - return NULL; - } - - n = PyPath_Flatten(data, &xy); - if (n < 0) { - return NULL; - } - - if (width <= 1) { - double *p = NULL; - for (i = 0; i < n-1; i++) { - p = &xy[i+i]; - if (ImagingDrawLine( - self->image->image, - (int) p[0], (int) p[1], (int) p[2], (int) p[3], - &ink, self->blend) < 0) { - free(xy); - return NULL; - } - } - if (p) {/* draw last point */ - ImagingDrawPoint( - self->image->image, - (int) p[2], (int) p[3], - &ink, self->blend - ); - } - } else { - for (i = 0; i < n-1; i++) { - double *p = &xy[i+i]; - if (ImagingDrawWideLine( - self->image->image, - (int) p[0], (int) p[1], (int) p[2], (int) p[3], - &ink, width, self->blend) < 0) { - free(xy); - return NULL; - } - } - } - - free(xy); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -_draw_points(ImagingDrawObject* self, PyObject* args) -{ - double *xy; - Py_ssize_t i, n; - - PyObject *data; - int ink; - if (!PyArg_ParseTuple(args, "Oi", &data, &ink)) { - return NULL; - } - - n = PyPath_Flatten(data, &xy); - if (n < 0) { - return NULL; - } - - for (i = 0; i < n; i++) { - double *p = &xy[i+i]; - if (ImagingDrawPoint(self->image->image, (int) p[0], (int) p[1], - &ink, self->blend) < 0) { - free(xy); - return NULL; - } - } - - free(xy); - - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef WITH_ARROW - -/* from outline.c */ -extern ImagingOutline PyOutline_AsOutline(PyObject* outline); - -static PyObject* -_draw_outline(ImagingDrawObject* self, PyObject* args) -{ - ImagingOutline outline; - - PyObject* outline_; - int ink; - int fill = 0; - if (!PyArg_ParseTuple(args, "Oi|i", &outline_, &ink, &fill)) { - return NULL; - } - - outline = PyOutline_AsOutline(outline_); - if (!outline) { - PyErr_SetString(PyExc_TypeError, "expected outline object"); - return NULL; - } - - if (ImagingDrawOutline(self->image->image, outline, - &ink, fill, self->blend) < 0) { - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -#endif - -static PyObject* -_draw_pieslice(ImagingDrawObject* self, PyObject* args) -{ - double* xy; - Py_ssize_t n; - - PyObject* data; int ink, fill; int width = 0; float start, end; @@ -3135,11 +2858,18 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args) return NULL; } - n = ImagingDrawPieslice(self->image->image, - (int) xy[0], (int) xy[1], - (int) xy[2], (int) xy[3], - start, end, &ink, fill, width, self->blend - ); + n = ImagingDrawChord( + self->image->image, + (int)xy[0], + (int)xy[1], + (int)xy[2], + (int)xy[3], + start, + end, + &ink, + fill, + width, + self->blend); free(xy); @@ -3151,65 +2881,12 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args) return Py_None; } -static PyObject* -_draw_polygon(ImagingDrawObject* self, PyObject* args) -{ +static PyObject * +_draw_ellipse(ImagingDrawObject *self, PyObject *args) { double *xy; - int *ixy; - Py_ssize_t n, i; - - PyObject* data; - int ink; - int fill = 0; - if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) { - return NULL; - } - - n = PyPath_Flatten(data, &xy); - if (n < 0) { - return NULL; - } - if (n < 2) { - PyErr_SetString(PyExc_TypeError, - "coordinate list must contain at least 2 coordinates" - ); - free(xy); - return NULL; - } - - /* Copy list of vertices to array */ - ixy = (int*) calloc(n, 2 * sizeof(int)); - if (ixy == NULL) { - free(xy); - return ImagingError_MemoryError(); - } - - for (i = 0; i < n; i++) { - ixy[i+i] = (int) xy[i+i]; - ixy[i+i+1] = (int) xy[i+i+1]; - } - - free(xy); - - if (ImagingDrawPolygon(self->image->image, n, ixy, - &ink, fill, self->blend) < 0) { - free(ixy); - return NULL; - } - - free(ixy); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* -_draw_rectangle(ImagingDrawObject* self, PyObject* args) -{ - double* xy; Py_ssize_t n; - PyObject* data; + PyObject *data; int ink; int fill = 0; int width = 0; @@ -3227,11 +2904,280 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args) return NULL; } - n = ImagingDrawRectangle(self->image->image, - (int) xy[0], (int) xy[1], - (int) xy[2], (int) xy[3], - &ink, fill, width, self->blend - ); + n = ImagingDrawEllipse( + self->image->image, + (int)xy[0], + (int)xy[1], + (int)xy[2], + (int)xy[3], + &ink, + fill, + width, + self->blend); + + free(xy); + + if (n < 0) { + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +_draw_lines(ImagingDrawObject *self, PyObject *args) { + double *xy; + Py_ssize_t i, n; + + PyObject *data; + int ink; + int width = 0; + if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &width)) { + return NULL; + } + + n = PyPath_Flatten(data, &xy); + if (n < 0) { + return NULL; + } + + if (width <= 1) { + double *p = NULL; + for (i = 0; i < n - 1; i++) { + p = &xy[i + i]; + if (ImagingDrawLine( + self->image->image, + (int)p[0], + (int)p[1], + (int)p[2], + (int)p[3], + &ink, + self->blend) < 0) { + free(xy); + return NULL; + } + } + if (p) { /* draw last point */ + ImagingDrawPoint( + self->image->image, (int)p[2], (int)p[3], &ink, self->blend); + } + } else { + for (i = 0; i < n - 1; i++) { + double *p = &xy[i + i]; + if (ImagingDrawWideLine( + self->image->image, + (int)p[0], + (int)p[1], + (int)p[2], + (int)p[3], + &ink, + width, + self->blend) < 0) { + free(xy); + return NULL; + } + } + } + + free(xy); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +_draw_points(ImagingDrawObject *self, PyObject *args) { + double *xy; + Py_ssize_t i, n; + + PyObject *data; + int ink; + if (!PyArg_ParseTuple(args, "Oi", &data, &ink)) { + return NULL; + } + + n = PyPath_Flatten(data, &xy); + if (n < 0) { + return NULL; + } + + for (i = 0; i < n; i++) { + double *p = &xy[i + i]; + if (ImagingDrawPoint( + self->image->image, (int)p[0], (int)p[1], &ink, self->blend) < 0) { + free(xy); + return NULL; + } + } + + free(xy); + + Py_INCREF(Py_None); + return Py_None; +} + +#ifdef WITH_ARROW + +/* from outline.c */ +extern ImagingOutline +PyOutline_AsOutline(PyObject *outline); + +static PyObject * +_draw_outline(ImagingDrawObject *self, PyObject *args) { + ImagingOutline outline; + + PyObject *outline_; + int ink; + int fill = 0; + if (!PyArg_ParseTuple(args, "Oi|i", &outline_, &ink, &fill)) { + return NULL; + } + + outline = PyOutline_AsOutline(outline_); + if (!outline) { + PyErr_SetString(PyExc_TypeError, "expected outline object"); + return NULL; + } + + if (ImagingDrawOutline(self->image->image, outline, &ink, fill, self->blend) < 0) { + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +#endif + +static PyObject * +_draw_pieslice(ImagingDrawObject *self, PyObject *args) { + double *xy; + Py_ssize_t n; + + PyObject *data; + int ink, fill; + int width = 0; + float start, end; + if (!PyArg_ParseTuple(args, "Offii|i", &data, &start, &end, &ink, &fill, &width)) { + return NULL; + } + + n = PyPath_Flatten(data, &xy); + if (n < 0) { + return NULL; + } + if (n != 2) { + PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); + return NULL; + } + + n = ImagingDrawPieslice( + self->image->image, + (int)xy[0], + (int)xy[1], + (int)xy[2], + (int)xy[3], + start, + end, + &ink, + fill, + width, + self->blend); + + free(xy); + + if (n < 0) { + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +_draw_polygon(ImagingDrawObject *self, PyObject *args) { + double *xy; + int *ixy; + Py_ssize_t n, i; + + PyObject *data; + int ink; + int fill = 0; + if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) { + return NULL; + } + + n = PyPath_Flatten(data, &xy); + if (n < 0) { + return NULL; + } + if (n < 2) { + PyErr_SetString( + PyExc_TypeError, "coordinate list must contain at least 2 coordinates"); + free(xy); + return NULL; + } + + /* Copy list of vertices to array */ + ixy = (int *)calloc(n, 2 * sizeof(int)); + if (ixy == NULL) { + free(xy); + return ImagingError_MemoryError(); + } + + for (i = 0; i < n; i++) { + ixy[i + i] = (int)xy[i + i]; + ixy[i + i + 1] = (int)xy[i + i + 1]; + } + + free(xy); + + if (ImagingDrawPolygon(self->image->image, n, ixy, &ink, fill, self->blend) < 0) { + free(ixy); + return NULL; + } + + free(ixy); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +_draw_rectangle(ImagingDrawObject *self, PyObject *args) { + double *xy; + Py_ssize_t n; + + PyObject *data; + int ink; + int fill = 0; + int width = 0; + if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) { + return NULL; + } + + n = PyPath_Flatten(data, &xy); + if (n < 0) { + return NULL; + } + if (n != 2) { + PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); + return NULL; + } + + n = ImagingDrawRectangle( + self->image->image, + (int)xy[0], + (int)xy[1], + (int)xy[2], + (int)xy[3], + &ink, + fill, + width, + self->blend); free(xy); @@ -3265,10 +3211,8 @@ static struct PyMethodDef _draw_methods[] = { #endif - -static PyObject* -pixel_access_new(ImagingObject* imagep, PyObject* args) -{ +static PyObject * +pixel_access_new(ImagingObject *imagep, PyObject *args) { PixelAccessObject *self; int readonly = 0; @@ -3287,19 +3231,17 @@ pixel_access_new(ImagingObject* imagep, PyObject* args) self->readonly = readonly; - return (PyObject*) self; + return (PyObject *)self; } static void -pixel_access_dealloc(PixelAccessObject* self) -{ +pixel_access_dealloc(PixelAccessObject *self) { Py_XDECREF(self->image); PyObject_Del(self); } static PyObject * -pixel_access_getitem(PixelAccessObject *self, PyObject *xy) -{ +pixel_access_getitem(PixelAccessObject *self, PyObject *xy) { int x, y; if (_getxy(xy, &x, &y)) { return NULL; @@ -3309,14 +3251,13 @@ pixel_access_getitem(PixelAccessObject *self, PyObject *xy) } static int -pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) -{ +pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) { Imaging im = self->image->image; char ink[4]; int x, y; if (self->readonly) { - (void) ImagingError_ValueError(readonly); + (void)ImagingError_ValueError(readonly); return -1; } @@ -3336,7 +3277,7 @@ pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) return -1; } - if (!color) {/* FIXME: raise exception? */ + if (!color) { /* FIXME: raise exception? */ return 0; } @@ -3355,29 +3296,36 @@ pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) #ifdef WITH_EFFECTS -static PyObject* -_effect_mandelbrot(ImagingObject* self, PyObject* args) -{ +static PyObject * +_effect_mandelbrot(ImagingObject *self, PyObject *args) { int xsize = 512; int ysize = 512; double extent[4]; int quality = 100; - extent[0] = -3; extent[1] = -2.5; - extent[2] = 2; extent[3] = 2.5; + extent[0] = -3; + extent[1] = -2.5; + extent[2] = 2; + extent[3] = 2.5; - if (!PyArg_ParseTuple(args, "|(ii)(dddd)i", &xsize, &ysize, - &extent[0], &extent[1], &extent[2], &extent[3], - &quality)) { + if (!PyArg_ParseTuple( + args, + "|(ii)(dddd)i", + &xsize, + &ysize, + &extent[0], + &extent[1], + &extent[2], + &extent[3], + &quality)) { return NULL; } return PyImagingNew(ImagingEffectMandelbrot(xsize, ysize, extent, quality)); } -static PyObject* -_effect_noise(ImagingObject* self, PyObject* args) -{ +static PyObject * +_effect_noise(ImagingObject *self, PyObject *args) { int xsize, ysize; float sigma = 128; if (!PyArg_ParseTuple(args, "(ii)|f", &xsize, &ysize, &sigma)) { @@ -3387,9 +3335,8 @@ _effect_noise(ImagingObject* self, PyObject* args) return PyImagingNew(ImagingEffectNoise(xsize, ysize, sigma)); } -static PyObject* -_effect_spread(ImagingObject* self, PyObject* args) -{ +static PyObject * +_effect_spread(ImagingObject *self, PyObject *args) { int dist; if (!PyArg_ParseTuple(args, "i", &dist)) { @@ -3405,30 +3352,33 @@ _effect_spread(ImagingObject* self, PyObject* args) /* UTILITIES */ /* -------------------------------------------------------------------- */ - -static PyObject* -_getcodecstatus(PyObject* self, PyObject* args) -{ +static PyObject * +_getcodecstatus(PyObject *self, PyObject *args) { int status; - char* msg; + char *msg; if (!PyArg_ParseTuple(args, "i", &status)) { return NULL; } switch (status) { - case IMAGING_CODEC_OVERRUN: - msg = "buffer overrun"; break; - case IMAGING_CODEC_BROKEN: - msg = "broken data stream"; break; - case IMAGING_CODEC_UNKNOWN: - msg = "unrecognized data stream contents"; break; - case IMAGING_CODEC_CONFIG: - msg = "codec configuration error"; break; - case IMAGING_CODEC_MEMORY: - msg = "out of memory"; break; - default: - Py_RETURN_NONE; + case IMAGING_CODEC_OVERRUN: + msg = "buffer overrun"; + break; + case IMAGING_CODEC_BROKEN: + msg = "broken data stream"; + break; + case IMAGING_CODEC_UNKNOWN: + msg = "unrecognized data stream contents"; + break; + case IMAGING_CODEC_CONFIG: + msg = "codec configuration error"; + break; + case IMAGING_CODEC_MEMORY: + msg = "out of memory"; + break; + default: + Py_RETURN_NONE; } return PyUnicode_FromString(msg); @@ -3438,11 +3388,9 @@ _getcodecstatus(PyObject* self, PyObject* args) /* DEBUGGING HELPERS */ /* -------------------------------------------------------------------- */ - -static PyObject* -_save_ppm(ImagingObject* self, PyObject* args) -{ - char* filename; +static PyObject * +_save_ppm(ImagingObject *self, PyObject *args) { + char *filename; if (!PyArg_ParseTuple(args, "s", &filename)) { return NULL; @@ -3456,7 +3404,6 @@ _save_ppm(ImagingObject* self, PyObject* args) return Py_None; } - /* -------------------------------------------------------------------- */ /* methods */ @@ -3562,73 +3509,65 @@ static struct PyMethodDef methods[] = { {NULL, NULL} /* sentinel */ }; - /* attributes */ -static PyObject* -_getattr_mode(ImagingObject* self, void* closure) -{ +static PyObject * +_getattr_mode(ImagingObject *self, void *closure) { return PyUnicode_FromString(self->image->mode); } -static PyObject* -_getattr_size(ImagingObject* self, void* closure) -{ +static PyObject * +_getattr_size(ImagingObject *self, void *closure) { return Py_BuildValue("ii", self->image->xsize, self->image->ysize); } -static PyObject* -_getattr_bands(ImagingObject* self, void* closure) -{ +static PyObject * +_getattr_bands(ImagingObject *self, void *closure) { return PyLong_FromLong(self->image->bands); } -static PyObject* -_getattr_id(ImagingObject* self, void* closure) -{ - return PyLong_FromSsize_t((Py_ssize_t) self->image); +static PyObject * +_getattr_id(ImagingObject *self, void *closure) { + return PyLong_FromSsize_t((Py_ssize_t)self->image); } -static PyObject* -_getattr_ptr(ImagingObject* self, void* closure) -{ +static PyObject * +_getattr_ptr(ImagingObject *self, void *closure) { return PyCapsule_New(self->image, IMAGING_MAGIC, NULL); } -static PyObject* -_getattr_unsafe_ptrs(ImagingObject* self, void* closure) -{ - return Py_BuildValue("(sn)(sn)(sn)", - "image8", self->image->image8, - "image32", self->image->image32, - "image", self->image->image - ); +static PyObject * +_getattr_unsafe_ptrs(ImagingObject *self, void *closure) { + return Py_BuildValue( + "(sn)(sn)(sn)", + "image8", + self->image->image8, + "image32", + self->image->image32, + "image", + self->image->image); }; - static struct PyGetSetDef getsetters[] = { - { "mode", (getter) _getattr_mode }, - { "size", (getter) _getattr_size }, - { "bands", (getter) _getattr_bands }, - { "id", (getter) _getattr_id }, - { "ptr", (getter) _getattr_ptr }, - { "unsafe_ptrs", (getter) _getattr_unsafe_ptrs }, - { NULL } -}; + {"mode", (getter)_getattr_mode}, + {"size", (getter)_getattr_size}, + {"bands", (getter)_getattr_bands}, + {"id", (getter)_getattr_id}, + {"ptr", (getter)_getattr_ptr}, + {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, + {NULL}}; /* basic sequence semantics */ static Py_ssize_t -image_length(ImagingObject *self) -{ +image_length(ImagingObject *self) { Imaging im = self->image; - return (Py_ssize_t) im->xsize * im->ysize; + return (Py_ssize_t)im->xsize * im->ysize; } static PyObject * -image_item(ImagingObject *self, Py_ssize_t i) -{ +image_item(ImagingObject *self, Py_ssize_t i) { int x, y; Imaging im = self->image; @@ -3643,154 +3582,150 @@ image_item(ImagingObject *self, Py_ssize_t i) } static PySequenceMethods image_as_sequence = { - (lenfunc) image_length, /*sq_length*/ - (binaryfunc) NULL, /*sq_concat*/ - (ssizeargfunc) NULL, /*sq_repeat*/ - (ssizeargfunc) image_item, /*sq_item*/ - (ssizessizeargfunc) NULL, /*sq_slice*/ - (ssizeobjargproc) NULL, /*sq_ass_item*/ - (ssizessizeobjargproc) NULL, /*sq_ass_slice*/ + (lenfunc)image_length, /*sq_length*/ + (binaryfunc)NULL, /*sq_concat*/ + (ssizeargfunc)NULL, /*sq_repeat*/ + (ssizeargfunc)image_item, /*sq_item*/ + (ssizessizeargfunc)NULL, /*sq_slice*/ + (ssizeobjargproc)NULL, /*sq_ass_item*/ + (ssizessizeobjargproc)NULL, /*sq_ass_slice*/ }; - /* type description */ static PyTypeObject Imaging_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingCore", /*tp_name*/ - sizeof(ImagingObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingCore", /*tp_name*/ + sizeof(ImagingObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - &image_as_sequence, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - getsetters, /*tp_getset*/ + (destructor)_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + &image_as_sequence, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + getsetters, /*tp_getset*/ }; #ifdef WITH_IMAGEDRAW static PyTypeObject ImagingFont_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingFont", /*tp_name*/ - sizeof(ImagingFontObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingFont", /*tp_name*/ + sizeof(ImagingFontObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_font_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - _font_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + (destructor)_font_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + _font_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; static PyTypeObject ImagingDraw_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingDraw", /*tp_name*/ - sizeof(ImagingDrawObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingDraw", /*tp_name*/ + sizeof(ImagingDrawObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_draw_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - _draw_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + (destructor)_draw_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + _draw_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; #endif static PyMappingMethods pixel_access_as_mapping = { - (lenfunc) NULL, /*mp_length*/ - (binaryfunc) pixel_access_getitem, /*mp_subscript*/ - (objobjargproc) pixel_access_setitem, /*mp_ass_subscript*/ + (lenfunc)NULL, /*mp_length*/ + (binaryfunc)pixel_access_getitem, /*mp_subscript*/ + (objobjargproc)pixel_access_setitem, /*mp_ass_subscript*/ }; /* type description */ static PyTypeObject PixelAccess_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "PixelAccess", sizeof(PixelAccessObject), 0, + PyVarObject_HEAD_INIT(NULL, 0) "PixelAccess", + sizeof(PixelAccessObject), + 0, /* methods */ (destructor)pixel_access_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - &pixel_access_as_mapping, /*tp_as_mapping */ - 0 /*tp_hash*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + &pixel_access_as_mapping, /*tp_as_mapping */ + 0 /*tp_hash*/ }; /* -------------------------------------------------------------------- */ -static PyObject* -_get_stats(PyObject* self, PyObject* args) -{ - PyObject* d; +static PyObject * +_get_stats(PyObject *self, PyObject *args) { + PyObject *d; ImagingMemoryArena arena = &ImagingDefaultArena; if (!PyArg_ParseTuple(args, ":get_stats")) { @@ -3798,27 +3733,23 @@ _get_stats(PyObject* self, PyObject* args) } d = PyDict_New(); - if ( ! d) { + if (!d) { return NULL; } - PyDict_SetItemString(d, "new_count", - PyLong_FromLong(arena->stats_new_count)); - PyDict_SetItemString(d, "allocated_blocks", - PyLong_FromLong(arena->stats_allocated_blocks)); - PyDict_SetItemString(d, "reused_blocks", - PyLong_FromLong(arena->stats_reused_blocks)); - PyDict_SetItemString(d, "reallocated_blocks", - PyLong_FromLong(arena->stats_reallocated_blocks)); - PyDict_SetItemString(d, "freed_blocks", - PyLong_FromLong(arena->stats_freed_blocks)); - PyDict_SetItemString(d, "blocks_cached", - PyLong_FromLong(arena->blocks_cached)); + PyDict_SetItemString(d, "new_count", PyLong_FromLong(arena->stats_new_count)); + PyDict_SetItemString( + d, "allocated_blocks", PyLong_FromLong(arena->stats_allocated_blocks)); + PyDict_SetItemString( + d, "reused_blocks", PyLong_FromLong(arena->stats_reused_blocks)); + PyDict_SetItemString( + d, "reallocated_blocks", PyLong_FromLong(arena->stats_reallocated_blocks)); + PyDict_SetItemString(d, "freed_blocks", PyLong_FromLong(arena->stats_freed_blocks)); + PyDict_SetItemString(d, "blocks_cached", PyLong_FromLong(arena->blocks_cached)); return d; } -static PyObject* -_reset_stats(PyObject* self, PyObject* args) -{ +static PyObject * +_reset_stats(PyObject *self, PyObject *args) { ImagingMemoryArena arena = &ImagingDefaultArena; if (!PyArg_ParseTuple(args, ":reset_stats")) { @@ -3835,9 +3766,8 @@ _reset_stats(PyObject* self, PyObject* args) return Py_None; } -static PyObject* -_get_alignment(PyObject* self, PyObject* args) -{ +static PyObject * +_get_alignment(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":get_alignment")) { return NULL; } @@ -3845,9 +3775,8 @@ _get_alignment(PyObject* self, PyObject* args) return PyLong_FromLong(ImagingDefaultArena.alignment); } -static PyObject* -_get_block_size(PyObject* self, PyObject* args) -{ +static PyObject * +_get_block_size(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":get_block_size")) { return NULL; } @@ -3855,9 +3784,8 @@ _get_block_size(PyObject* self, PyObject* args) return PyLong_FromLong(ImagingDefaultArena.block_size); } -static PyObject* -_get_blocks_max(PyObject* self, PyObject* args) -{ +static PyObject * +_get_blocks_max(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":get_blocks_max")) { return NULL; } @@ -3865,9 +3793,8 @@ _get_blocks_max(PyObject* self, PyObject* args) return PyLong_FromLong(ImagingDefaultArena.blocks_max); } -static PyObject* -_set_alignment(PyObject* self, PyObject* args) -{ +static PyObject * +_set_alignment(PyObject *self, PyObject *args) { int alignment; if (!PyArg_ParseTuple(args, "i:set_alignment", &alignment)) { return NULL; @@ -3889,23 +3816,20 @@ _set_alignment(PyObject* self, PyObject* args) return Py_None; } -static PyObject* -_set_block_size(PyObject* self, PyObject* args) -{ +static PyObject * +_set_block_size(PyObject *self, PyObject *args) { int block_size; if (!PyArg_ParseTuple(args, "i:set_block_size", &block_size)) { return NULL; } if (block_size <= 0) { - PyErr_SetString(PyExc_ValueError, - "block_size should be greater than 0"); + PyErr_SetString(PyExc_ValueError, "block_size should be greater than 0"); return NULL; } if (block_size & 0xfff) { - PyErr_SetString(PyExc_ValueError, - "block_size should be multiple of 4096"); + PyErr_SetString(PyExc_ValueError, "block_size should be multiple of 4096"); return NULL; } @@ -3915,27 +3839,24 @@ _set_block_size(PyObject* self, PyObject* args) return Py_None; } -static PyObject* -_set_blocks_max(PyObject* self, PyObject* args) -{ +static PyObject * +_set_blocks_max(PyObject *self, PyObject *args) { int blocks_max; if (!PyArg_ParseTuple(args, "i:set_blocks_max", &blocks_max)) { return NULL; } if (blocks_max < 0) { - PyErr_SetString(PyExc_ValueError, - "blocks_max should be greater than 0"); + PyErr_SetString(PyExc_ValueError, "blocks_max should be greater than 0"); return NULL; - } - else if ( (unsigned long)blocks_max > SIZE_MAX/sizeof(ImagingDefaultArena.blocks_pool[0])) { - PyErr_SetString(PyExc_ValueError, - "blocks_max is too large"); + } else if ( + (unsigned long)blocks_max > + SIZE_MAX / sizeof(ImagingDefaultArena.blocks_pool[0])) { + PyErr_SetString(PyExc_ValueError, "blocks_max is too large"); return NULL; } - - if ( ! ImagingMemorySetBlocksMax(&ImagingDefaultArena, blocks_max)) { + if (!ImagingMemorySetBlocksMax(&ImagingDefaultArena, blocks_max)) { return ImagingError_MemoryError(); } @@ -3943,9 +3864,8 @@ _set_blocks_max(PyObject* self, PyObject* args) return Py_None; } -static PyObject* -_clear_cache(PyObject* self, PyObject* args) -{ +static PyObject * +_clear_cache(PyObject *self, PyObject *args) { int i = 0; if (!PyArg_ParseTuple(args, "|i:clear_cache", &i)) { @@ -3964,59 +3884,99 @@ _clear_cache(PyObject* self, PyObject* args) pluggable codecs, but not before PIL 1.2 */ /* Decoders (in decode.c) */ -extern PyObject* PyImaging_BcnDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_BitDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_FliDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_GifDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_HexDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_PcxDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_RawDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_SgiRleDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_XbmDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_ZipDecoderNew(PyObject* self, PyObject* args); +extern PyObject * +PyImaging_BcnDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_BitDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_FliDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_GifDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_HexDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_JpegDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_Jpeg2KDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_PcdDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_PcxDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_RawDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_XbmDecoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_ZipDecoderNew(PyObject *self, PyObject *args); /* Encoders (in encode.c) */ -extern PyObject* PyImaging_EpsEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_GifEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_JpegEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_Jpeg2KEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_PcxEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_RawEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_XbmEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_ZipEncoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args); +extern PyObject * +PyImaging_EpsEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_GifEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_JpegEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_PcxEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_RawEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_TgaRleEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_XbmEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_ZipEncoderNew(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args); /* Display support etc (in display.c) */ #ifdef _WIN32 -extern PyObject* PyImaging_CreateWindowWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_DisplayWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_DisplayModeWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_GrabScreenWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_ListWindowsWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_EventLoopWin32(PyObject* self, PyObject* args); -extern PyObject* PyImaging_DrawWmf(PyObject* self, PyObject* args); +extern PyObject * +PyImaging_CreateWindowWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_DisplayWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_DisplayModeWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_GrabScreenWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_GrabClipboardWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_ListWindowsWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_EventLoopWin32(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_DrawWmf(PyObject *self, PyObject *args); #endif #ifdef HAVE_XCB -extern PyObject* PyImaging_GrabScreenX11(PyObject* self, PyObject* args); +extern PyObject * +PyImaging_GrabScreenX11(PyObject *self, PyObject *args); #endif /* Experimental path stuff (in path.c) */ -extern PyObject* PyPath_Create(ImagingObject* self, PyObject* args); +extern PyObject * +PyPath_Create(ImagingObject *self, PyObject *args); /* Experimental outline stuff (in outline.c) */ -extern PyObject* PyOutline_Create(ImagingObject* self, PyObject* args); +extern PyObject * +PyOutline_Create(ImagingObject *self, PyObject *args); -extern PyObject* PyImaging_Mapper(PyObject* self, PyObject* args); -extern PyObject* PyImaging_MapBuffer(PyObject* self, PyObject* args); +extern PyObject * +PyImaging_Mapper(PyObject *self, PyObject *args); +extern PyObject * +PyImaging_MapBuffer(PyObject *self, PyObject *args); static PyMethodDef functions[] = { @@ -4068,7 +4028,7 @@ static PyMethodDef functions[] = { {"zip_encoder", (PyCFunction)PyImaging_ZipEncoderNew, 1}, #endif - /* Memory mapping */ +/* Memory mapping */ #ifdef WITH_MAPPING #ifdef _WIN32 {"map", (PyCFunction)PyImaging_Mapper, 1}, @@ -4076,7 +4036,7 @@ static PyMethodDef functions[] = { {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, #endif - /* Display support */ +/* Display support */ #ifdef _WIN32 {"display", (PyCFunction)PyImaging_DisplayWin32, 1}, {"display_mode", (PyCFunction)PyImaging_DisplayModeWin32, 1}, @@ -4094,7 +4054,7 @@ static PyMethodDef functions[] = { /* Utilities */ {"getcodecstatus", (PyCFunction)_getcodecstatus, 1}, - /* Special effects (experimental) */ +/* Special effects (experimental) */ #ifdef WITH_EFFECTS {"effect_mandelbrot", (PyCFunction)_effect_mandelbrot, 1}, {"effect_noise", (PyCFunction)_effect_noise, 1}, @@ -4103,18 +4063,18 @@ static PyMethodDef functions[] = { {"wedge", (PyCFunction)_linear_gradient, 1}, /* Compatibility */ #endif - /* Drawing support stuff */ +/* Drawing support stuff */ #ifdef WITH_IMAGEDRAW {"font", (PyCFunction)_font_new, 1}, {"draw", (PyCFunction)_draw_new, 1}, #endif - /* Experimental path stuff */ +/* Experimental path stuff */ #ifdef WITH_IMAGEPATH {"path", (PyCFunction)PyPath_Create, 1}, #endif - /* Experimental arrow graphics stuff */ +/* Experimental arrow graphics stuff */ #ifdef WITH_ARROW {"outline", (PyCFunction)PyOutline_Create, 1}, #endif @@ -4134,9 +4094,9 @@ static PyMethodDef functions[] = { }; static int -setup_module(PyObject* m) { - PyObject* d = PyModule_GetDict(m); - const char* version = (char*)PILLOW_VERSION; +setup_module(PyObject *m) { + PyObject *d = PyModule_GetDict(m); + const char *version = (char *)PILLOW_VERSION; /* Ready object types */ if (PyType_Ready(&Imaging_Type) < 0) { @@ -4159,26 +4119,29 @@ setup_module(PyObject* m) { ImagingAccessInit(); #ifdef HAVE_LIBJPEG - { - extern const char* ImagingJpegVersion(void); - PyDict_SetItemString(d, "jpeglib_version", PyUnicode_FromString(ImagingJpegVersion())); - } + { + extern const char *ImagingJpegVersion(void); + PyDict_SetItemString( + d, "jpeglib_version", PyUnicode_FromString(ImagingJpegVersion())); + } #endif #ifdef HAVE_OPENJPEG - { - extern const char *ImagingJpeg2KVersion(void); - PyDict_SetItemString(d, "jp2klib_version", PyUnicode_FromString(ImagingJpeg2KVersion())); - } + { + extern const char *ImagingJpeg2KVersion(void); + PyDict_SetItemString( + d, "jp2klib_version", PyUnicode_FromString(ImagingJpeg2KVersion())); + } #endif #ifdef LIBJPEG_TURBO_VERSION PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_True); - #define tostr1(a) #a - #define tostr(a) tostr1(a) - PyDict_SetItemString(d, "libjpeg_turbo_version", PyUnicode_FromString(tostr(LIBJPEG_TURBO_VERSION))); - #undef tostr - #undef tostr1 +#define tostr1(a) #a +#define tostr(a) tostr1(a) + PyDict_SetItemString( + d, "libjpeg_turbo_version", PyUnicode_FromString(tostr(LIBJPEG_TURBO_VERSION))); +#undef tostr +#undef tostr1 #else PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_False); #endif @@ -4186,40 +4149,44 @@ setup_module(PyObject* m) { #ifdef HAVE_LIBIMAGEQUANT PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_True); { - extern const char* ImagingImageQuantVersion(void); - PyDict_SetItemString(d, "imagequant_version", PyUnicode_FromString(ImagingImageQuantVersion())); + extern const char *ImagingImageQuantVersion(void); + PyDict_SetItemString( + d, "imagequant_version", PyUnicode_FromString(ImagingImageQuantVersion())); } #else PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_False); #endif #ifdef HAVE_LIBZ - /* zip encoding strategies */ - PyModule_AddIntConstant(m, "DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY); - PyModule_AddIntConstant(m, "FILTERED", Z_FILTERED); - PyModule_AddIntConstant(m, "HUFFMAN_ONLY", Z_HUFFMAN_ONLY); - PyModule_AddIntConstant(m, "RLE", Z_RLE); - PyModule_AddIntConstant(m, "FIXED", Z_FIXED); - { - extern const char* ImagingZipVersion(void); - PyDict_SetItemString(d, "zlib_version", PyUnicode_FromString(ImagingZipVersion())); - } + /* zip encoding strategies */ + PyModule_AddIntConstant(m, "DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY); + PyModule_AddIntConstant(m, "FILTERED", Z_FILTERED); + PyModule_AddIntConstant(m, "HUFFMAN_ONLY", Z_HUFFMAN_ONLY); + PyModule_AddIntConstant(m, "RLE", Z_RLE); + PyModule_AddIntConstant(m, "FIXED", Z_FIXED); + { + extern const char *ImagingZipVersion(void); + PyDict_SetItemString( + d, "zlib_version", PyUnicode_FromString(ImagingZipVersion())); + } #endif #ifdef HAVE_LIBTIFF - { - extern const char * ImagingTiffVersion(void); - PyDict_SetItemString(d, "libtiff_version", PyUnicode_FromString(ImagingTiffVersion())); + { + extern const char *ImagingTiffVersion(void); + PyDict_SetItemString( + d, "libtiff_version", PyUnicode_FromString(ImagingTiffVersion())); - // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 - PyObject* support_custom_tags; -#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && TIFFLIB_VERSION != 20120922 - support_custom_tags = Py_True; + // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 + PyObject *support_custom_tags; +#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && \ + TIFFLIB_VERSION != 20120922 + support_custom_tags = Py_True; #else - support_custom_tags = Py_False; + support_custom_tags = Py_False; #endif - PyDict_SetItemString(d, "libtiff_support_custom_tags", support_custom_tags); - } + PyDict_SetItemString(d, "libtiff_support_custom_tags", support_custom_tags); + } #endif #ifdef HAVE_XCB @@ -4235,14 +4202,14 @@ setup_module(PyObject* m) { PyMODINIT_FUNC PyInit__imaging(void) { - PyObject* m; + PyObject *m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_imaging", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - functions, /* m_methods */ + "_imaging", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + functions, /* m_methods */ }; m = PyModule_Create(&module_def); diff --git a/src/_imagingcms.c b/src/_imagingcms.c index 491866f74..314150420 100644 --- a/src/_imagingcms.c +++ b/src/_imagingcms.c @@ -17,7 +17,8 @@ * March 2009, for distribution under the standard PIL license */ -#define COPYRIGHTINFO "\ +#define COPYRIGHTINFO \ + "\ pyCMS\n\ a Python / PIL interface to the littleCMS ICC Color Management System\n\ Copyright (C) 2002-2003 Kevin Cazabon\n\ @@ -26,7 +27,7 @@ http://www.cazabon.com\n\ " #define PY_SSIZE_T_CLEAN -#include "Python.h" // Include before wchar.h so _GNU_SOURCE is set +#include "Python.h" // Include before wchar.h so _GNU_SOURCE is set #include "wchar.h" #include "datetime.h" @@ -41,10 +42,11 @@ http://www.cazabon.com\n\ 1.0.0 pil Integrating littleCMS2 0.1.0 pil integration & refactoring 0.0.2 alpha: Minor updates, added interfaces to littleCMS features, Jan 6, 2003 - - fixed some memory holes in how transforms/profiles were created and passed back to Python - due to improper destructor setup for PyCObjects + - fixed some memory holes in how transforms/profiles were created and passed back to + Python due to improper destructor setup for PyCObjects - added buildProofTransformFromOpenProfiles() function - - eliminated some code redundancy, centralizing several common tasks with internal functions + - eliminated some code redundancy, centralizing several common tasks with internal + functions 0.0.1 alpha: First public release Dec 26, 2002 @@ -74,18 +76,16 @@ http://www.cazabon.com\n\ /* a profile represents the ICC characteristics for a specific device */ typedef struct { - PyObject_HEAD - cmsHPROFILE profile; + PyObject_HEAD cmsHPROFILE profile; } CmsProfileObject; static PyTypeObject CmsProfile_Type; #define CmsProfile_Check(op) (Py_TYPE(op) == &CmsProfile_Type) -static PyObject* -cms_profile_new(cmsHPROFILE profile) -{ - CmsProfileObject* self; +static PyObject * +cms_profile_new(cmsHPROFILE profile) { + CmsProfileObject *self; self = PyObject_New(CmsProfileObject, &CmsProfile_Type); if (!self) { @@ -94,15 +94,14 @@ cms_profile_new(cmsHPROFILE profile) self->profile = profile; - return (PyObject*) self; + return (PyObject *)self; } -static PyObject* -cms_profile_open(PyObject* self, PyObject* args) -{ +static PyObject * +cms_profile_open(PyObject *self, PyObject *args) { cmsHPROFILE hProfile; - char* sProfile; + char *sProfile; if (!PyArg_ParseTuple(args, "s:profile_open", &sProfile)) { return NULL; } @@ -116,12 +115,11 @@ cms_profile_open(PyObject* self, PyObject* args) return cms_profile_new(hProfile); } -static PyObject* -cms_profile_fromstring(PyObject* self, PyObject* args) -{ +static PyObject * +cms_profile_fromstring(PyObject *self, PyObject *args) { cmsHPROFILE hProfile; - char* pProfile; + char *pProfile; Py_ssize_t nProfile; if (!PyArg_ParseTuple(args, "y#:profile_frombytes", &pProfile, &nProfile)) { return NULL; @@ -136,28 +134,27 @@ cms_profile_fromstring(PyObject* self, PyObject* args) return cms_profile_new(hProfile); } -static PyObject* -cms_profile_tobytes(PyObject* self, PyObject* args) -{ - char *pProfile =NULL; +static PyObject * +cms_profile_tobytes(PyObject *self, PyObject *args) { + char *pProfile = NULL; cmsUInt32Number nProfile; - PyObject* CmsProfile; + PyObject *CmsProfile; cmsHPROFILE *profile; - PyObject* ret; - if (!PyArg_ParseTuple(args, "O", &CmsProfile)){ + PyObject *ret; + if (!PyArg_ParseTuple(args, "O", &CmsProfile)) { return NULL; } - profile = ((CmsProfileObject*)CmsProfile)->profile; + profile = ((CmsProfileObject *)CmsProfile)->profile; if (!cmsSaveProfileToMem(profile, pProfile, &nProfile)) { PyErr_SetString(PyExc_OSError, "Could not determine profile size"); return NULL; } - pProfile = (char*)malloc(nProfile); + pProfile = (char *)malloc(nProfile); if (!pProfile) { PyErr_SetString(PyExc_OSError, "Out of Memory"); return NULL; @@ -176,17 +173,15 @@ cms_profile_tobytes(PyObject* self, PyObject* args) } static void -cms_profile_dealloc(CmsProfileObject* self) -{ - (void) cmsCloseProfile(self->profile); +cms_profile_dealloc(CmsProfileObject *self) { + (void)cmsCloseProfile(self->profile); PyObject_Del(self); } /* a transform represents the mapping between two profiles */ typedef struct { - PyObject_HEAD - char mode_in[8]; + PyObject_HEAD char mode_in[8]; char mode_out[8]; cmsHTRANSFORM transform; } CmsTransformObject; @@ -195,10 +190,9 @@ static PyTypeObject CmsTransform_Type; #define CmsTransform_Check(op) (Py_TYPE(op) == &CmsTransform_Type) -static PyObject* -cms_transform_new(cmsHTRANSFORM transform, char* mode_in, char* mode_out) -{ - CmsTransformObject* self; +static PyObject * +cms_transform_new(cmsHTRANSFORM transform, char *mode_in, char *mode_out) { + CmsTransformObject *self; self = PyObject_New(CmsTransformObject, &CmsTransform_Type); if (!self) { @@ -210,12 +204,11 @@ cms_transform_new(cmsHTRANSFORM transform, char* mode_in, char* mode_out) strcpy(self->mode_in, mode_in); strcpy(self->mode_out, mode_out); - return (PyObject*) self; + return (PyObject *)self; } static void -cms_transform_dealloc(CmsTransformObject* self) -{ +cms_transform_dealloc(CmsTransformObject *self) { cmsDeleteTransform(self->transform); PyObject_Del(self); } @@ -224,41 +217,30 @@ cms_transform_dealloc(CmsTransformObject* self) /* internal functions */ static cmsUInt32Number -findLCMStype(char* PILmode) -{ +findLCMStype(char *PILmode) { if (strcmp(PILmode, "RGB") == 0) { return TYPE_RGBA_8; - } - else if (strcmp(PILmode, "RGBA") == 0) { + } else if (strcmp(PILmode, "RGBA") == 0) { return TYPE_RGBA_8; - } - else if (strcmp(PILmode, "RGBX") == 0) { + } else if (strcmp(PILmode, "RGBX") == 0) { return TYPE_RGBA_8; - } - else if (strcmp(PILmode, "RGBA;16B") == 0) { + } else if (strcmp(PILmode, "RGBA;16B") == 0) { return TYPE_RGBA_16; - } - else if (strcmp(PILmode, "CMYK") == 0) { + } else if (strcmp(PILmode, "CMYK") == 0) { return TYPE_CMYK_8; - } - else if (strcmp(PILmode, "L") == 0) { + } else if (strcmp(PILmode, "L") == 0) { return TYPE_GRAY_8; - } - else if (strcmp(PILmode, "L;16") == 0) { + } else if (strcmp(PILmode, "L;16") == 0) { return TYPE_GRAY_16; - } - else if (strcmp(PILmode, "L;16B") == 0) { + } else if (strcmp(PILmode, "L;16B") == 0) { return TYPE_GRAY_16_SE; - } - else if (strcmp(PILmode, "YCCA") == 0) { + } else if (strcmp(PILmode, "YCCA") == 0) { return TYPE_YCbCr_8; - } - else if (strcmp(PILmode, "YCC") == 0) { + } else if (strcmp(PILmode, "YCC") == 0) { return TYPE_YCbCr_8; - } - else if (strcmp(PILmode, "LAB") == 0) { + } else if (strcmp(PILmode, "LAB") == 0) { // LabX equivalent like ALab, but not reversed -- no #define in lcms2 - return (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)); + return (COLORSPACE_SH(PT_LabV2) | CHANNELS_SH(3) | BYTES_SH(1) | EXTRA_SH(1)); } else { @@ -270,8 +252,7 @@ findLCMStype(char* PILmode) #define Cms_Min(a, b) ((a) < (b) ? (a) : (b)) static int -pyCMSgetAuxChannelChannel (cmsUInt32Number format, int auxChannelNdx) -{ +pyCMSgetAuxChannelChannel(cmsUInt32Number format, int auxChannelNdx) { int numColors = T_CHANNELS(format); int numExtras = T_EXTRA(format); @@ -282,28 +263,24 @@ pyCMSgetAuxChannelChannel (cmsUInt32Number format, int auxChannelNdx) } else { return numExtras - 2 - auxChannelNdx; } - } - else if (T_SWAPFIRST(format)) { + } else if (T_SWAPFIRST(format)) { // in order, after color channels, but last extra is shifted to first if (auxChannelNdx == numExtras - 1) { return 0; } else { return numColors + 1 + auxChannelNdx; } - } - else if (T_DOSWAP(format)) { + } else if (T_DOSWAP(format)) { // reverse order, before anything return numExtras - 1 - auxChannelNdx; - } - else { + } else { // in order, after color channels return numColors + auxChannelNdx; } } static void -pyCMScopyAux (cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) -{ +pyCMScopyAux(cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) { cmsUInt32Number dstLCMSFormat; cmsUInt32Number srcLCMSFormat; int numSrcExtras; @@ -331,11 +308,11 @@ pyCMScopyAux (cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) // copy only if channel format is identical, except OPTIMIZED is ignored as it // does not affect the aux channel - if (T_FLOAT(dstLCMSFormat) != T_FLOAT(srcLCMSFormat) - || T_FLAVOR(dstLCMSFormat) != T_FLAVOR(srcLCMSFormat) - || T_ENDIAN16(dstLCMSFormat) != T_ENDIAN16(srcLCMSFormat) - || T_BYTES(dstLCMSFormat) != T_BYTES(srcLCMSFormat)) { - return; + if (T_FLOAT(dstLCMSFormat) != T_FLOAT(srcLCMSFormat) || + T_FLAVOR(dstLCMSFormat) != T_FLAVOR(srcLCMSFormat) || + T_ENDIAN16(dstLCMSFormat) != T_ENDIAN16(srcLCMSFormat) || + T_BYTES(dstLCMSFormat) != T_BYTES(srcLCMSFormat)) { + return; } numSrcExtras = T_EXTRA(srcLCMSFormat); @@ -354,19 +331,21 @@ pyCMScopyAux (cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) for (y = 0; y < ySize; y++) { int x; - char* pDstExtras = imDst->image[y] + dstChannel * channelSize; - const char* pSrcExtras = imSrc->image[y] + srcChannel * channelSize; + char *pDstExtras = imDst->image[y] + dstChannel * channelSize; + const char *pSrcExtras = imSrc->image[y] + srcChannel * channelSize; for (x = 0; x < xSize; x++) { - memcpy(pDstExtras + x * dstChunkSize, pSrcExtras + x * srcChunkSize, channelSize); + memcpy( + pDstExtras + x * dstChunkSize, + pSrcExtras + x * srcChunkSize, + channelSize); } } } } static int -pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) -{ +pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) { int i; if (im->xsize > imOut->xsize || im->ysize > imOut->ysize) { @@ -375,8 +354,8 @@ pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) Py_BEGIN_ALLOW_THREADS - // transform color channels only - for (i = 0; i < im->ysize; i++) { + // transform color channels only + for (i = 0; i < im->ysize; i++) { cmsDoTransform(hTransform, im->image[i], imOut->image[i], im->xsize); } @@ -391,26 +370,33 @@ pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) Py_END_ALLOW_THREADS - return 0; + return 0; } static cmsHTRANSFORM -_buildTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, char *sInMode, char *sOutMode, int iRenderingIntent, cmsUInt32Number cmsFLAGS) -{ +_buildTransform( + cmsHPROFILE hInputProfile, + cmsHPROFILE hOutputProfile, + char *sInMode, + char *sOutMode, + int iRenderingIntent, + cmsUInt32Number cmsFLAGS) { cmsHTRANSFORM hTransform; Py_BEGIN_ALLOW_THREADS - /* create the transform */ - hTransform = cmsCreateTransform(hInputProfile, - findLCMStype(sInMode), - hOutputProfile, - findLCMStype(sOutMode), - iRenderingIntent, cmsFLAGS); + /* create the transform */ + hTransform = cmsCreateTransform( + hInputProfile, + findLCMStype(sInMode), + hOutputProfile, + findLCMStype(sOutMode), + iRenderingIntent, + cmsFLAGS); Py_END_ALLOW_THREADS - if (!hTransform) { + if (!hTransform) { PyErr_SetString(PyExc_ValueError, "cannot build transform"); } @@ -418,25 +404,33 @@ _buildTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, char *sIn } static cmsHTRANSFORM -_buildProofTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, cmsHPROFILE hProofProfile, char *sInMode, char *sOutMode, int iRenderingIntent, int iProofIntent, cmsUInt32Number cmsFLAGS) -{ +_buildProofTransform( + cmsHPROFILE hInputProfile, + cmsHPROFILE hOutputProfile, + cmsHPROFILE hProofProfile, + char *sInMode, + char *sOutMode, + int iRenderingIntent, + int iProofIntent, + cmsUInt32Number cmsFLAGS) { cmsHTRANSFORM hTransform; Py_BEGIN_ALLOW_THREADS - /* create the transform */ - hTransform = cmsCreateProofingTransform(hInputProfile, - findLCMStype(sInMode), - hOutputProfile, - findLCMStype(sOutMode), - hProofProfile, - iRenderingIntent, - iProofIntent, - cmsFLAGS); + /* create the transform */ + hTransform = cmsCreateProofingTransform( + hInputProfile, + findLCMStype(sInMode), + hOutputProfile, + findLCMStype(sOutMode), + hProofProfile, + iRenderingIntent, + iProofIntent, + cmsFLAGS); Py_END_ALLOW_THREADS - if (!hTransform) { + if (!hTransform) { PyErr_SetString(PyExc_ValueError, "cannot build proof transform"); } @@ -457,11 +451,27 @@ buildTransform(PyObject *self, PyObject *args) { cmsHTRANSFORM transform = NULL; - if (!PyArg_ParseTuple(args, "O!O!ss|ii:buildTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &sInMode, &sOutMode, &iRenderingIntent, &cmsFLAGS)) { + if (!PyArg_ParseTuple( + args, + "O!O!ss|ii:buildTransform", + &CmsProfile_Type, + &pInputProfile, + &CmsProfile_Type, + &pOutputProfile, + &sInMode, + &sOutMode, + &iRenderingIntent, + &cmsFLAGS)) { return NULL; } - transform = _buildTransform(pInputProfile->profile, pOutputProfile->profile, sInMode, sOutMode, iRenderingIntent, cmsFLAGS); + transform = _buildTransform( + pInputProfile->profile, + pOutputProfile->profile, + sInMode, + sOutMode, + iRenderingIntent, + cmsFLAGS); if (!transform) { return NULL; @@ -471,8 +481,7 @@ buildTransform(PyObject *self, PyObject *args) { } static PyObject * -buildProofTransform(PyObject *self, PyObject *args) -{ +buildProofTransform(PyObject *self, PyObject *args) { CmsProfileObject *pInputProfile; CmsProfileObject *pOutputProfile; CmsProfileObject *pProofProfile; @@ -484,23 +493,42 @@ buildProofTransform(PyObject *self, PyObject *args) cmsHTRANSFORM transform = NULL; - if (!PyArg_ParseTuple(args, "O!O!O!ss|iii:buildProofTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &CmsProfile_Type, &pProofProfile, &sInMode, &sOutMode, &iRenderingIntent, &iProofIntent, &cmsFLAGS)) { + if (!PyArg_ParseTuple( + args, + "O!O!O!ss|iii:buildProofTransform", + &CmsProfile_Type, + &pInputProfile, + &CmsProfile_Type, + &pOutputProfile, + &CmsProfile_Type, + &pProofProfile, + &sInMode, + &sOutMode, + &iRenderingIntent, + &iProofIntent, + &cmsFLAGS)) { return NULL; } - transform = _buildProofTransform(pInputProfile->profile, pOutputProfile->profile, pProofProfile->profile, sInMode, sOutMode, iRenderingIntent, iProofIntent, cmsFLAGS); + transform = _buildProofTransform( + pInputProfile->profile, + pOutputProfile->profile, + pProofProfile->profile, + sInMode, + sOutMode, + iRenderingIntent, + iProofIntent, + cmsFLAGS); if (!transform) { return NULL; } return cms_transform_new(transform, sInMode, sOutMode); - } static PyObject * -cms_transform_apply(CmsTransformObject *self, PyObject *args) -{ +cms_transform_apply(CmsTransformObject *self, PyObject *args) { Py_ssize_t idIn; Py_ssize_t idOut; Imaging im; @@ -512,8 +540,8 @@ cms_transform_apply(CmsTransformObject *self, PyObject *args) return NULL; } - im = (Imaging) idIn; - imOut = (Imaging) idOut; + im = (Imaging)idIn; + imOut = (Imaging)idOut; result = pyCMSdoTransform(im, imOut, self->transform); @@ -524,8 +552,7 @@ cms_transform_apply(CmsTransformObject *self, PyObject *args) /* Python-Callable On-The-Fly profile creation functions */ static PyObject * -createProfile(PyObject *self, PyObject *args) -{ +createProfile(PyObject *self, PyObject *args) { char *sColorSpace; cmsHPROFILE hProfile; cmsFloat64Number dColorTemp = 0.0; @@ -540,21 +567,21 @@ createProfile(PyObject *self, PyObject *args) if (dColorTemp > 0.0) { result = cmsWhitePointFromTemp(&whitePoint, dColorTemp); if (!result) { - PyErr_SetString(PyExc_ValueError, "ERROR: Could not calculate white point from color temperature provided, must be float in degrees Kelvin"); + PyErr_SetString( + PyExc_ValueError, + "ERROR: Could not calculate white point from color temperature " + "provided, must be float in degrees Kelvin"); return NULL; } hProfile = cmsCreateLab2Profile(&whitePoint); } else { hProfile = cmsCreateLab2Profile(NULL); } - } - else if (strcmp(sColorSpace, "XYZ") == 0) { + } else if (strcmp(sColorSpace, "XYZ") == 0) { hProfile = cmsCreateXYZProfile(); - } - else if (strcmp(sColorSpace, "sRGB") == 0) { + } else if (strcmp(sColorSpace, "sRGB") == 0) { hProfile = cmsCreate_sRGBProfile(); - } - else { + } else { hProfile = NULL; } @@ -570,8 +597,7 @@ createProfile(PyObject *self, PyObject *args) /* profile methods */ static PyObject * -cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) -{ +cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) { cmsBool result; int intent; @@ -582,7 +608,8 @@ cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) result = cmsIsIntentSupported(self->profile, intent, direction); - /* printf("cmsIsIntentSupported(%p, %d, %d) => %d\n", self->profile, intent, direction, result); */ + /* printf("cmsIsIntentSupported(%p, %d, %d) => %d\n", self->profile, intent, + * direction, result); */ return PyLong_FromLong(result != 0); } @@ -596,30 +623,30 @@ cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) #endif static PyObject * -cms_get_display_profile_win32(PyObject* self, PyObject* args) -{ +cms_get_display_profile_win32(PyObject *self, PyObject *args) { char filename[MAX_PATH]; cmsUInt32Number filename_size; BOOL ok; HANDLE handle = 0; int is_dc = 0; - if (!PyArg_ParseTuple(args, "|" F_HANDLE "i:get_display_profile", &handle, &is_dc)) { + if (!PyArg_ParseTuple( + args, "|" F_HANDLE "i:get_display_profile", &handle, &is_dc)) { return NULL; } filename_size = sizeof(filename); if (is_dc) { - ok = GetICMProfile((HDC) handle, &filename_size, filename); + ok = GetICMProfile((HDC)handle, &filename_size, filename); } else { - HDC dc = GetDC((HWND) handle); + HDC dc = GetDC((HWND)handle); ok = GetICMProfile(dc, &filename_size, filename); - ReleaseDC((HWND) handle, dc); + ReleaseDC((HWND)handle, dc); } if (ok) { - return PyUnicode_FromStringAndSize(filename, filename_size-1); + return PyUnicode_FromStringAndSize(filename, filename_size - 1); } Py_INCREF(Py_None); @@ -630,9 +657,8 @@ cms_get_display_profile_win32(PyObject* self, PyObject* args) /* -------------------------------------------------------------------- */ /* Helper functions. */ -static PyObject* -_profile_read_mlu(CmsProfileObject* self, cmsTagSignature info) -{ +static PyObject * +_profile_read_mlu(CmsProfileObject *self, cmsTagSignature info) { PyObject *uni; char *lc = "en"; char *cc = cmsNoCountry; @@ -673,26 +699,22 @@ _profile_read_mlu(CmsProfileObject* self, cmsTagSignature info) return uni; } - -static PyObject* -_profile_read_int_as_string(cmsUInt32Number nr) -{ - PyObject* ret; +static PyObject * +_profile_read_int_as_string(cmsUInt32Number nr) { + PyObject *ret; char buf[5]; - buf[0] = (char) ((nr >> 24) & 0xff); - buf[1] = (char) ((nr >> 16) & 0xff); - buf[2] = (char) ((nr >> 8) & 0xff); - buf[3] = (char) (nr & 0xff); + buf[0] = (char)((nr >> 24) & 0xff); + buf[1] = (char)((nr >> 16) & 0xff); + buf[2] = (char)((nr >> 8) & 0xff); + buf[3] = (char)(nr & 0xff); buf[4] = 0; ret = PyUnicode_DecodeASCII(buf, 4, NULL); return ret; } - -static PyObject* -_profile_read_signature(CmsProfileObject* self, cmsTagSignature info) -{ +static PyObject * +_profile_read_signature(CmsProfileObject *self, cmsTagSignature info) { unsigned int *sig; if (!cmsIsTag(self->profile, info)) { @@ -700,7 +722,7 @@ _profile_read_signature(CmsProfileObject* self, cmsTagSignature info) return Py_None; } - sig = (unsigned int *) cmsReadTag(self->profile, info); + sig = (unsigned int *)cmsReadTag(self->profile, info); if (!sig) { Py_INCREF(Py_None); return Py_None; @@ -709,42 +731,53 @@ _profile_read_signature(CmsProfileObject* self, cmsTagSignature info) return _profile_read_int_as_string(*sig); } -static PyObject* -_xyz_py(cmsCIEXYZ* XYZ) -{ +static PyObject * +_xyz_py(cmsCIEXYZ *XYZ) { cmsCIExyY xyY; cmsXYZ2xyY(&xyY, XYZ); - return Py_BuildValue("((d,d,d),(d,d,d))", XYZ->X, XYZ->Y, XYZ->Z, xyY.x, xyY.y, xyY.Y); + return Py_BuildValue( + "((d,d,d),(d,d,d))", XYZ->X, XYZ->Y, XYZ->Z, xyY.x, xyY.y, xyY.Y); } -static PyObject* -_xyz3_py(cmsCIEXYZ* XYZ) -{ +static PyObject * +_xyz3_py(cmsCIEXYZ *XYZ) { cmsCIExyY xyY[3]; cmsXYZ2xyY(&xyY[0], &XYZ[0]); cmsXYZ2xyY(&xyY[1], &XYZ[1]); cmsXYZ2xyY(&xyY[2], &XYZ[2]); - return Py_BuildValue("(((d,d,d),(d,d,d),(d,d,d)),((d,d,d),(d,d,d),(d,d,d)))", - XYZ[0].X, XYZ[0].Y, XYZ[0].Z, - XYZ[1].X, XYZ[1].Y, XYZ[1].Z, - XYZ[2].X, XYZ[2].Y, XYZ[2].Z, - xyY[0].x, xyY[0].y, xyY[0].Y, - xyY[1].x, xyY[1].y, xyY[1].Y, - xyY[2].x, xyY[2].y, xyY[2].Y); + return Py_BuildValue( + "(((d,d,d),(d,d,d),(d,d,d)),((d,d,d),(d,d,d),(d,d,d)))", + XYZ[0].X, + XYZ[0].Y, + XYZ[0].Z, + XYZ[1].X, + XYZ[1].Y, + XYZ[1].Z, + XYZ[2].X, + XYZ[2].Y, + XYZ[2].Z, + xyY[0].x, + xyY[0].y, + xyY[0].Y, + xyY[1].x, + xyY[1].y, + xyY[1].Y, + xyY[2].x, + xyY[2].y, + xyY[2].Y); } -static PyObject* -_profile_read_ciexyz(CmsProfileObject* self, cmsTagSignature info, int multi) -{ - cmsCIEXYZ* XYZ; +static PyObject * +_profile_read_ciexyz(CmsProfileObject *self, cmsTagSignature info, int multi) { + cmsCIEXYZ *XYZ; if (!cmsIsTag(self->profile, info)) { Py_INCREF(Py_None); return Py_None; } - XYZ = (cmsCIEXYZ*) cmsReadTag(self->profile, info); + XYZ = (cmsCIEXYZ *)cmsReadTag(self->profile, info); if (!XYZ) { Py_INCREF(Py_None); return Py_None; @@ -756,17 +789,16 @@ _profile_read_ciexyz(CmsProfileObject* self, cmsTagSignature info, int multi) } } -static PyObject* -_profile_read_ciexyy_triple(CmsProfileObject* self, cmsTagSignature info) -{ - cmsCIExyYTRIPLE* triple; +static PyObject * +_profile_read_ciexyy_triple(CmsProfileObject *self, cmsTagSignature info) { + cmsCIExyYTRIPLE *triple; if (!cmsIsTag(self->profile, info)) { Py_INCREF(Py_None); return Py_None; } - triple = (cmsCIExyYTRIPLE*) cmsReadTag(self->profile, info); + triple = (cmsCIExyYTRIPLE *)cmsReadTag(self->profile, info); if (!triple) { Py_INCREF(Py_None); return Py_None; @@ -774,26 +806,32 @@ _profile_read_ciexyy_triple(CmsProfileObject* self, cmsTagSignature info) /* Note: lcms does all the heavy lifting and error checking (nr of channels == 3). */ - return Py_BuildValue("((d,d,d),(d,d,d),(d,d,d)),", - triple->Red.x, triple->Red.y, triple->Red.Y, - triple->Green.x, triple->Green.y, triple->Green.Y, - triple->Blue.x, triple->Blue.y, triple->Blue.Y); + return Py_BuildValue( + "((d,d,d),(d,d,d),(d,d,d)),", + triple->Red.x, + triple->Red.y, + triple->Red.Y, + triple->Green.x, + triple->Green.y, + triple->Green.Y, + triple->Blue.x, + triple->Blue.y, + triple->Blue.Y); } -static PyObject* -_profile_read_named_color_list(CmsProfileObject* self, cmsTagSignature info) -{ - cmsNAMEDCOLORLIST* ncl; +static PyObject * +_profile_read_named_color_list(CmsProfileObject *self, cmsTagSignature info) { + cmsNAMEDCOLORLIST *ncl; int i, n; char name[cmsMAX_PATH]; - PyObject* result; + PyObject *result; if (!cmsIsTag(self->profile, info)) { Py_INCREF(Py_None); return Py_None; } - ncl = (cmsNAMEDCOLORLIST*) cmsReadTag(self->profile, info); + ncl = (cmsNAMEDCOLORLIST *)cmsReadTag(self->profile, info); if (ncl == NULL) { Py_INCREF(Py_None); return Py_None; @@ -807,7 +845,7 @@ _profile_read_named_color_list(CmsProfileObject* self, cmsTagSignature info) } for (i = 0; i < n; i++) { - PyObject* str; + PyObject *str; cmsNamedColorInfo(ncl, i, name, NULL, NULL, NULL, NULL); str = PyUnicode_FromString(name); if (str == NULL) { @@ -821,9 +859,9 @@ _profile_read_named_color_list(CmsProfileObject* self, cmsTagSignature info) return result; } -static cmsBool _calculate_rgb_primaries(CmsProfileObject* self, cmsCIEXYZTRIPLE* result) -{ - double input[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; +static cmsBool +_calculate_rgb_primaries(CmsProfileObject *self, cmsCIEXYZTRIPLE *result) { + double input[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; cmsHPROFILE hXYZ; cmsHTRANSFORM hTransform; @@ -836,36 +874,41 @@ static cmsBool _calculate_rgb_primaries(CmsProfileObject* self, cmsCIEXYZTRIPLE* } // transform from our profile to XYZ using doubles for highest precision - hTransform = cmsCreateTransform(self->profile, TYPE_RGB_DBL, - hXYZ, TYPE_XYZ_DBL, - INTENT_RELATIVE_COLORIMETRIC, - cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); + hTransform = cmsCreateTransform( + self->profile, + TYPE_RGB_DBL, + hXYZ, + TYPE_XYZ_DBL, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hXYZ); if (hTransform == NULL) { return 0; } - cmsDoTransform(hTransform, (void*) input, result, 3); + cmsDoTransform(hTransform, (void *)input, result, 3); cmsDeleteTransform(hTransform); return 1; } -static cmsBool _check_intent(int clut, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) -{ +static cmsBool +_check_intent( + int clut, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number UsedDirection) { if (clut) { return cmsIsCLUT(hProfile, Intent, UsedDirection); - } - else { + } else { return cmsIsIntentSupported(hProfile, Intent, UsedDirection); } } #define INTENTS 200 -static PyObject* -_is_intent_supported(CmsProfileObject* self, int clut) -{ - PyObject* result; +static PyObject * +_is_intent_supported(CmsProfileObject *self, int clut) { + PyObject *result; int n; int i; cmsUInt32Number intent_ids[INTENTS]; @@ -877,26 +920,28 @@ _is_intent_supported(CmsProfileObject* self, int clut) return Py_None; } - - n = cmsGetSupportedIntents(INTENTS, - intent_ids, - intent_descs); + n = cmsGetSupportedIntents(INTENTS, intent_ids, intent_descs); for (i = 0; i < n; i++) { - int intent = (int) intent_ids[i]; - PyObject* id; - PyObject* entry; + int intent = (int)intent_ids[i]; + PyObject *id; + PyObject *entry; - /* Only valid for ICC Intents (otherwise we read invalid memory in lcms cmsio1.c). */ - if (!(intent == INTENT_PERCEPTUAL || intent == INTENT_RELATIVE_COLORIMETRIC - || intent == INTENT_SATURATION || intent == INTENT_ABSOLUTE_COLORIMETRIC)) { + /* Only valid for ICC Intents (otherwise we read invalid memory in lcms + * cmsio1.c). */ + if (!(intent == INTENT_PERCEPTUAL || intent == INTENT_RELATIVE_COLORIMETRIC || + intent == INTENT_SATURATION || intent == INTENT_ABSOLUTE_COLORIMETRIC)) { continue; } - id = PyLong_FromLong((long) intent); - entry = Py_BuildValue("(OOO)", - _check_intent(clut, self->profile, intent, LCMS_USED_AS_INPUT) ? Py_True : Py_False, - _check_intent(clut, self->profile, intent, LCMS_USED_AS_OUTPUT) ? Py_True : Py_False, - _check_intent(clut, self->profile, intent, LCMS_USED_AS_PROOF) ? Py_True : Py_False); + id = PyLong_FromLong((long)intent); + entry = Py_BuildValue( + "(OOO)", + _check_intent(clut, self->profile, intent, LCMS_USED_AS_INPUT) ? Py_True + : Py_False, + _check_intent(clut, self->profile, intent, LCMS_USED_AS_OUTPUT) ? Py_True + : Py_False, + _check_intent(clut, self->profile, intent, LCMS_USED_AS_PROOF) ? Py_True + : Py_False); if (id == NULL || entry == NULL) { Py_XDECREF(id); Py_XDECREF(entry); @@ -924,185 +969,161 @@ static PyMethodDef pyCMSdll_methods[] = { {"buildProofTransform", buildProofTransform, 1}, {"createProfile", createProfile, 1}, - /* platform specific tools */ +/* platform specific tools */ #ifdef _WIN32 {"get_display_profile_win32", cms_get_display_profile_win32, 1}, #endif - {NULL, NULL} -}; + {NULL, NULL}}; static struct PyMethodDef cms_profile_methods[] = { - {"is_intent_supported", (PyCFunction) cms_profile_is_intent_supported, 1}, + {"is_intent_supported", (PyCFunction)cms_profile_is_intent_supported, 1}, {NULL, NULL} /* sentinel */ }; -static PyObject* -cms_profile_getattr_rendering_intent(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_rendering_intent(CmsProfileObject *self, void *closure) { return PyLong_FromLong(cmsGetHeaderRenderingIntent(self->profile)); } /* New-style unicode interfaces. */ -static PyObject* -cms_profile_getattr_copyright(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_copyright(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigCopyrightTag); } -static PyObject* -cms_profile_getattr_target(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_target(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigCharTargetTag); } -static PyObject* -cms_profile_getattr_manufacturer(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_manufacturer(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigDeviceMfgDescTag); } -static PyObject* -cms_profile_getattr_model(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_model(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigDeviceModelDescTag); } -static PyObject* -cms_profile_getattr_profile_description(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_profile_description(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigProfileDescriptionTag); } -static PyObject* -cms_profile_getattr_screening_description(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_screening_description(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigScreeningDescTag); } -static PyObject* -cms_profile_getattr_viewing_condition(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_viewing_condition(CmsProfileObject *self, void *closure) { return _profile_read_mlu(self, cmsSigViewingCondDescTag); } -static PyObject* -cms_profile_getattr_creation_date(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_creation_date(CmsProfileObject *self, void *closure) { cmsBool result; struct tm ct; result = cmsGetHeaderCreationDateTime(self->profile, &ct); - if (! result) { + if (!result) { Py_INCREF(Py_None); return Py_None; } - return PyDateTime_FromDateAndTime(1900 + ct.tm_year, ct.tm_mon, ct.tm_mday, - ct.tm_hour, ct.tm_min, ct.tm_sec, 0); + return PyDateTime_FromDateAndTime( + 1900 + ct.tm_year, ct.tm_mon, ct.tm_mday, ct.tm_hour, ct.tm_min, ct.tm_sec, 0); } -static PyObject* -cms_profile_getattr_version(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_version(CmsProfileObject *self, void *closure) { cmsFloat64Number version = cmsGetProfileVersion(self->profile); return PyFloat_FromDouble(version); } -static PyObject* -cms_profile_getattr_icc_version(CmsProfileObject* self, void* closure) -{ - return PyLong_FromLong((long) cmsGetEncodedICCversion(self->profile)); +static PyObject * +cms_profile_getattr_icc_version(CmsProfileObject *self, void *closure) { + return PyLong_FromLong((long)cmsGetEncodedICCversion(self->profile)); } -static PyObject* -cms_profile_getattr_attributes(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_attributes(CmsProfileObject *self, void *closure) { cmsUInt64Number attr; cmsGetHeaderAttributes(self->profile, &attr); /* This works just as well on Windows (LLP64), 32-bit Linux (ILP32) and 64-bit Linux (LP64) systems. */ - return PyLong_FromUnsignedLongLong((unsigned long long) attr); + return PyLong_FromUnsignedLongLong((unsigned long long)attr); } -static PyObject* -cms_profile_getattr_header_flags(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_header_flags(CmsProfileObject *self, void *closure) { cmsUInt32Number flags = cmsGetHeaderFlags(self->profile); return PyLong_FromLong(flags); } -static PyObject* -cms_profile_getattr_header_manufacturer(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_header_manufacturer(CmsProfileObject *self, void *closure) { return _profile_read_int_as_string(cmsGetHeaderManufacturer(self->profile)); } -static PyObject* -cms_profile_getattr_header_model(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_header_model(CmsProfileObject *self, void *closure) { return _profile_read_int_as_string(cmsGetHeaderModel(self->profile)); } -static PyObject* -cms_profile_getattr_device_class(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_device_class(CmsProfileObject *self, void *closure) { return _profile_read_int_as_string(cmsGetDeviceClass(self->profile)); } -static PyObject* -cms_profile_getattr_connection_space(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_connection_space(CmsProfileObject *self, void *closure) { return _profile_read_int_as_string(cmsGetPCS(self->profile)); } -static PyObject* -cms_profile_getattr_xcolor_space(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_xcolor_space(CmsProfileObject *self, void *closure) { return _profile_read_int_as_string(cmsGetColorSpace(self->profile)); } -static PyObject* -cms_profile_getattr_profile_id(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_profile_id(CmsProfileObject *self, void *closure) { cmsUInt8Number id[16]; cmsGetHeaderProfileID(self->profile, id); - return PyBytes_FromStringAndSize((char *) id, 16); + return PyBytes_FromStringAndSize((char *)id, 16); } -static PyObject* -cms_profile_getattr_is_matrix_shaper(CmsProfileObject* self, void* closure) -{ - return PyBool_FromLong((long) cmsIsMatrixShaper(self->profile)); +static PyObject * +cms_profile_getattr_is_matrix_shaper(CmsProfileObject *self, void *closure) { + return PyBool_FromLong((long)cmsIsMatrixShaper(self->profile)); } -static PyObject* -cms_profile_getattr_technology(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_technology(CmsProfileObject *self, void *closure) { return _profile_read_signature(self, cmsSigTechnologyTag); } -static PyObject* -cms_profile_getattr_colorimetric_intent(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_colorimetric_intent(CmsProfileObject *self, void *closure) { return _profile_read_signature(self, cmsSigColorimetricIntentImageStateTag); } -static PyObject* -cms_profile_getattr_perceptual_rendering_intent_gamut(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_perceptual_rendering_intent_gamut( + CmsProfileObject *self, void *closure) { return _profile_read_signature(self, cmsSigPerceptualRenderingIntentGamutTag); } -static PyObject* -cms_profile_getattr_saturation_rendering_intent_gamut(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_saturation_rendering_intent_gamut( + CmsProfileObject *self, void *closure) { return _profile_read_signature(self, cmsSigSaturationRenderingIntentGamutTag); } -static PyObject* -cms_profile_getattr_red_colorant(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_red_colorant(CmsProfileObject *self, void *closure) { if (!cmsIsMatrixShaper(self->profile)) { Py_INCREF(Py_None); return Py_None; @@ -1110,10 +1131,8 @@ cms_profile_getattr_red_colorant(CmsProfileObject* self, void* closure) return _profile_read_ciexyz(self, cmsSigRedColorantTag, 0); } - -static PyObject* -cms_profile_getattr_green_colorant(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_green_colorant(CmsProfileObject *self, void *closure) { if (!cmsIsMatrixShaper(self->profile)) { Py_INCREF(Py_None); return Py_None; @@ -1121,10 +1140,8 @@ cms_profile_getattr_green_colorant(CmsProfileObject* self, void* closure) return _profile_read_ciexyz(self, cmsSigGreenColorantTag, 0); } - -static PyObject* -cms_profile_getattr_blue_colorant(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_blue_colorant(CmsProfileObject *self, void *closure) { if (!cmsIsMatrixShaper(self->profile)) { Py_INCREF(Py_None); return Py_None; @@ -1132,10 +1149,10 @@ cms_profile_getattr_blue_colorant(CmsProfileObject* self, void* closure) return _profile_read_ciexyz(self, cmsSigBlueColorantTag, 0); } -static PyObject* -cms_profile_getattr_media_white_point_temperature(CmsProfileObject *self, void* closure) -{ - cmsCIEXYZ* XYZ; +static PyObject * +cms_profile_getattr_media_white_point_temperature( + CmsProfileObject *self, void *closure) { + cmsCIEXYZ *XYZ; cmsCIExyY xyY; cmsFloat64Number tempK; cmsTagSignature info = cmsSigMediaWhitePointTag; @@ -1146,7 +1163,7 @@ cms_profile_getattr_media_white_point_temperature(CmsProfileObject *self, void* return Py_None; } - XYZ = (cmsCIEXYZ*) cmsReadTag(self->profile, info); + XYZ = (cmsCIEXYZ *)cmsReadTag(self->profile, info); if (XYZ == NULL || XYZ->X == 0) { Py_INCREF(Py_None); return Py_None; @@ -1161,47 +1178,40 @@ cms_profile_getattr_media_white_point_temperature(CmsProfileObject *self, void* return PyFloat_FromDouble(tempK); } -static PyObject* -cms_profile_getattr_media_white_point(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_media_white_point(CmsProfileObject *self, void *closure) { return _profile_read_ciexyz(self, cmsSigMediaWhitePointTag, 0); } - -static PyObject* -cms_profile_getattr_media_black_point(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_media_black_point(CmsProfileObject *self, void *closure) { return _profile_read_ciexyz(self, cmsSigMediaBlackPointTag, 0); } -static PyObject* -cms_profile_getattr_luminance(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_luminance(CmsProfileObject *self, void *closure) { return _profile_read_ciexyz(self, cmsSigLuminanceTag, 0); } -static PyObject* -cms_profile_getattr_chromatic_adaptation(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_chromatic_adaptation(CmsProfileObject *self, void *closure) { return _profile_read_ciexyz(self, cmsSigChromaticAdaptationTag, 1); } -static PyObject* -cms_profile_getattr_chromaticity(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_chromaticity(CmsProfileObject *self, void *closure) { return _profile_read_ciexyy_triple(self, cmsSigChromaticityTag); } -static PyObject* -cms_profile_getattr_red_primary(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_red_primary(CmsProfileObject *self, void *closure) { cmsBool result = 0; cmsCIEXYZTRIPLE primaries; if (cmsIsMatrixShaper(self->profile)) { result = _calculate_rgb_primaries(self, &primaries); } - if (! result) { + if (!result) { Py_INCREF(Py_None); return Py_None; } @@ -1209,16 +1219,15 @@ cms_profile_getattr_red_primary(CmsProfileObject* self, void* closure) return _xyz_py(&primaries.Red); } -static PyObject* -cms_profile_getattr_green_primary(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_green_primary(CmsProfileObject *self, void *closure) { cmsBool result = 0; cmsCIEXYZTRIPLE primaries; if (cmsIsMatrixShaper(self->profile)) { result = _calculate_rgb_primaries(self, &primaries); } - if (! result) { + if (!result) { Py_INCREF(Py_None); return Py_None; } @@ -1226,16 +1235,15 @@ cms_profile_getattr_green_primary(CmsProfileObject* self, void* closure) return _xyz_py(&primaries.Green); } -static PyObject* -cms_profile_getattr_blue_primary(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_blue_primary(CmsProfileObject *self, void *closure) { cmsBool result = 0; cmsCIEXYZTRIPLE primaries; if (cmsIsMatrixShaper(self->profile)) { result = _calculate_rgb_primaries(self, &primaries); } - if (! result) { + if (!result) { Py_INCREF(Py_None); return Py_None; } @@ -1243,61 +1251,55 @@ cms_profile_getattr_blue_primary(CmsProfileObject* self, void* closure) return _xyz_py(&primaries.Blue); } -static PyObject* -cms_profile_getattr_colorant_table(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_colorant_table(CmsProfileObject *self, void *closure) { return _profile_read_named_color_list(self, cmsSigColorantTableTag); } -static PyObject* -cms_profile_getattr_colorant_table_out(CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_colorant_table_out(CmsProfileObject *self, void *closure) { return _profile_read_named_color_list(self, cmsSigColorantTableOutTag); } -static PyObject* -cms_profile_getattr_is_intent_supported (CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_is_intent_supported(CmsProfileObject *self, void *closure) { return _is_intent_supported(self, 0); } -static PyObject* -cms_profile_getattr_is_clut (CmsProfileObject* self, void* closure) -{ +static PyObject * +cms_profile_getattr_is_clut(CmsProfileObject *self, void *closure) { return _is_intent_supported(self, 1); } -static const char* -_illu_map(int i) -{ - switch(i) { - case 0: - return "unknown"; - case 1: - return "D50"; - case 2: - return "D65"; - case 3: - return "D93"; - case 4: - return "F2"; - case 5: - return "D55"; - case 6: - return "A"; - case 7: - return "E"; - case 8: - return "F8"; - default: - return NULL; +static const char * +_illu_map(int i) { + switch (i) { + case 0: + return "unknown"; + case 1: + return "D50"; + case 2: + return "D65"; + case 3: + return "D93"; + case 4: + return "F2"; + case 5: + return "D55"; + case 6: + return "A"; + case 7: + return "E"; + case 8: + return "F8"; + default: + return NULL; } } -static PyObject* -cms_profile_getattr_icc_measurement_condition (CmsProfileObject* self, void* closure) -{ - cmsICCMeasurementConditions* mc; +static PyObject * +cms_profile_getattr_icc_measurement_condition(CmsProfileObject *self, void *closure) { + cmsICCMeasurementConditions *mc; cmsTagSignature info = cmsSigMeasurementTag; const char *geo; @@ -1306,7 +1308,7 @@ cms_profile_getattr_icc_measurement_condition (CmsProfileObject* self, void* clo return Py_None; } - mc = (cmsICCMeasurementConditions*) cmsReadTag(self->profile, info); + mc = (cmsICCMeasurementConditions *)cmsReadTag(self->profile, info); if (!mc) { Py_INCREF(Py_None); return Py_None; @@ -1320,18 +1322,25 @@ cms_profile_getattr_icc_measurement_condition (CmsProfileObject* self, void* clo geo = "unknown"; } - return Py_BuildValue("{s:i,s:(ddd),s:s,s:d,s:s}", - "observer", mc->Observer, - "backing", mc->Backing.X, mc->Backing.Y, mc->Backing.Z, - "geo", geo, - "flare", mc->Flare, - "illuminant_type", _illu_map(mc->IlluminantType)); + return Py_BuildValue( + "{s:i,s:(ddd),s:s,s:d,s:s}", + "observer", + mc->Observer, + "backing", + mc->Backing.X, + mc->Backing.Y, + mc->Backing.Z, + "geo", + geo, + "flare", + mc->Flare, + "illuminant_type", + _illu_map(mc->IlluminantType)); } -static PyObject* -cms_profile_getattr_icc_viewing_condition (CmsProfileObject* self, void* closure) -{ - cmsICCViewingConditions* vc; +static PyObject * +cms_profile_getattr_icc_viewing_condition(CmsProfileObject *self, void *closure) { + cmsICCViewingConditions *vc; cmsTagSignature info = cmsSigViewingConditionsTag; if (!cmsIsTag(self->profile, info)) { @@ -1339,158 +1348,164 @@ cms_profile_getattr_icc_viewing_condition (CmsProfileObject* self, void* closure return Py_None; } - vc = (cmsICCViewingConditions*) cmsReadTag(self->profile, info); + vc = (cmsICCViewingConditions *)cmsReadTag(self->profile, info); if (!vc) { Py_INCREF(Py_None); return Py_None; } - return Py_BuildValue("{s:(ddd),s:(ddd),s:s}", - "illuminant", vc->IlluminantXYZ.X, vc->IlluminantXYZ.Y, vc->IlluminantXYZ.Z, - "surround", vc->SurroundXYZ.X, vc->SurroundXYZ.Y, vc->SurroundXYZ.Z, - "illuminant_type", _illu_map(vc->IlluminantType)); + return Py_BuildValue( + "{s:(ddd),s:(ddd),s:s}", + "illuminant", + vc->IlluminantXYZ.X, + vc->IlluminantXYZ.Y, + vc->IlluminantXYZ.Z, + "surround", + vc->SurroundXYZ.X, + vc->SurroundXYZ.Y, + vc->SurroundXYZ.Z, + "illuminant_type", + _illu_map(vc->IlluminantType)); } - static struct PyGetSetDef cms_profile_getsetters[] = { /* New style interfaces. */ - { "rendering_intent", (getter) cms_profile_getattr_rendering_intent }, - { "creation_date", (getter) cms_profile_getattr_creation_date }, - { "copyright", (getter) cms_profile_getattr_copyright }, - { "target", (getter) cms_profile_getattr_target }, - { "manufacturer", (getter) cms_profile_getattr_manufacturer }, - { "model", (getter) cms_profile_getattr_model }, - { "profile_description", (getter) cms_profile_getattr_profile_description }, - { "screening_description", (getter) cms_profile_getattr_screening_description }, - { "viewing_condition", (getter) cms_profile_getattr_viewing_condition }, - { "version", (getter) cms_profile_getattr_version }, - { "icc_version", (getter) cms_profile_getattr_icc_version }, - { "attributes", (getter) cms_profile_getattr_attributes }, - { "header_flags", (getter) cms_profile_getattr_header_flags }, - { "header_manufacturer", (getter) cms_profile_getattr_header_manufacturer }, - { "header_model", (getter) cms_profile_getattr_header_model }, - { "device_class", (getter) cms_profile_getattr_device_class }, - { "connection_space", (getter) cms_profile_getattr_connection_space }, - { "xcolor_space", (getter) cms_profile_getattr_xcolor_space }, - { "profile_id", (getter) cms_profile_getattr_profile_id }, - { "is_matrix_shaper", (getter) cms_profile_getattr_is_matrix_shaper }, - { "technology", (getter) cms_profile_getattr_technology }, - { "colorimetric_intent", (getter) cms_profile_getattr_colorimetric_intent }, - { "perceptual_rendering_intent_gamut", (getter) cms_profile_getattr_perceptual_rendering_intent_gamut }, - { "saturation_rendering_intent_gamut", (getter) cms_profile_getattr_saturation_rendering_intent_gamut }, - { "red_colorant", (getter) cms_profile_getattr_red_colorant }, - { "green_colorant", (getter) cms_profile_getattr_green_colorant }, - { "blue_colorant", (getter) cms_profile_getattr_blue_colorant }, - { "red_primary", (getter) cms_profile_getattr_red_primary }, - { "green_primary", (getter) cms_profile_getattr_green_primary }, - { "blue_primary", (getter) cms_profile_getattr_blue_primary }, - { "media_white_point_temperature", (getter) cms_profile_getattr_media_white_point_temperature }, - { "media_white_point", (getter) cms_profile_getattr_media_white_point }, - { "media_black_point", (getter) cms_profile_getattr_media_black_point }, - { "luminance", (getter) cms_profile_getattr_luminance }, - { "chromatic_adaptation", (getter) cms_profile_getattr_chromatic_adaptation }, - { "chromaticity", (getter) cms_profile_getattr_chromaticity }, - { "colorant_table", (getter) cms_profile_getattr_colorant_table }, - { "colorant_table_out", (getter) cms_profile_getattr_colorant_table_out }, - { "intent_supported", (getter) cms_profile_getattr_is_intent_supported }, - { "clut", (getter) cms_profile_getattr_is_clut }, - { "icc_measurement_condition", (getter) cms_profile_getattr_icc_measurement_condition }, - { "icc_viewing_condition", (getter) cms_profile_getattr_icc_viewing_condition }, - - { NULL } -}; + {"rendering_intent", (getter)cms_profile_getattr_rendering_intent}, + {"creation_date", (getter)cms_profile_getattr_creation_date}, + {"copyright", (getter)cms_profile_getattr_copyright}, + {"target", (getter)cms_profile_getattr_target}, + {"manufacturer", (getter)cms_profile_getattr_manufacturer}, + {"model", (getter)cms_profile_getattr_model}, + {"profile_description", (getter)cms_profile_getattr_profile_description}, + {"screening_description", (getter)cms_profile_getattr_screening_description}, + {"viewing_condition", (getter)cms_profile_getattr_viewing_condition}, + {"version", (getter)cms_profile_getattr_version}, + {"icc_version", (getter)cms_profile_getattr_icc_version}, + {"attributes", (getter)cms_profile_getattr_attributes}, + {"header_flags", (getter)cms_profile_getattr_header_flags}, + {"header_manufacturer", (getter)cms_profile_getattr_header_manufacturer}, + {"header_model", (getter)cms_profile_getattr_header_model}, + {"device_class", (getter)cms_profile_getattr_device_class}, + {"connection_space", (getter)cms_profile_getattr_connection_space}, + {"xcolor_space", (getter)cms_profile_getattr_xcolor_space}, + {"profile_id", (getter)cms_profile_getattr_profile_id}, + {"is_matrix_shaper", (getter)cms_profile_getattr_is_matrix_shaper}, + {"technology", (getter)cms_profile_getattr_technology}, + {"colorimetric_intent", (getter)cms_profile_getattr_colorimetric_intent}, + {"perceptual_rendering_intent_gamut", + (getter)cms_profile_getattr_perceptual_rendering_intent_gamut}, + {"saturation_rendering_intent_gamut", + (getter)cms_profile_getattr_saturation_rendering_intent_gamut}, + {"red_colorant", (getter)cms_profile_getattr_red_colorant}, + {"green_colorant", (getter)cms_profile_getattr_green_colorant}, + {"blue_colorant", (getter)cms_profile_getattr_blue_colorant}, + {"red_primary", (getter)cms_profile_getattr_red_primary}, + {"green_primary", (getter)cms_profile_getattr_green_primary}, + {"blue_primary", (getter)cms_profile_getattr_blue_primary}, + {"media_white_point_temperature", + (getter)cms_profile_getattr_media_white_point_temperature}, + {"media_white_point", (getter)cms_profile_getattr_media_white_point}, + {"media_black_point", (getter)cms_profile_getattr_media_black_point}, + {"luminance", (getter)cms_profile_getattr_luminance}, + {"chromatic_adaptation", (getter)cms_profile_getattr_chromatic_adaptation}, + {"chromaticity", (getter)cms_profile_getattr_chromaticity}, + {"colorant_table", (getter)cms_profile_getattr_colorant_table}, + {"colorant_table_out", (getter)cms_profile_getattr_colorant_table_out}, + {"intent_supported", (getter)cms_profile_getattr_is_intent_supported}, + {"clut", (getter)cms_profile_getattr_is_clut}, + {"icc_measurement_condition", + (getter)cms_profile_getattr_icc_measurement_condition}, + {"icc_viewing_condition", (getter)cms_profile_getattr_icc_viewing_condition}, + {NULL}}; static PyTypeObject CmsProfile_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "PIL._imagingcms.CmsProfile", /*tp_name */ - sizeof(CmsProfileObject), 0,/*tp_basicsize, tp_itemsize */ + PyVarObject_HEAD_INIT(NULL, 0) "PIL._imagingcms.CmsProfile", /*tp_name */ + sizeof(CmsProfileObject), + 0, /*tp_basicsize, tp_itemsize */ /* methods */ - (destructor) cms_profile_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - cms_profile_methods, /*tp_methods*/ - 0, /*tp_members*/ - cms_profile_getsetters, /*tp_getset*/ + (destructor)cms_profile_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + cms_profile_methods, /*tp_methods*/ + 0, /*tp_members*/ + cms_profile_getsetters, /*tp_getset*/ }; static struct PyMethodDef cms_transform_methods[] = { - {"apply", (PyCFunction) cms_transform_apply, 1}, - {NULL, NULL} /* sentinel */ + {"apply", (PyCFunction)cms_transform_apply, 1}, {NULL, NULL} /* sentinel */ }; -static PyObject* -cms_transform_getattr_inputMode(CmsTransformObject* self, void* closure) -{ +static PyObject * +cms_transform_getattr_inputMode(CmsTransformObject *self, void *closure) { return PyUnicode_FromString(self->mode_in); } -static PyObject* -cms_transform_getattr_outputMode(CmsTransformObject* self, void* closure) -{ +static PyObject * +cms_transform_getattr_outputMode(CmsTransformObject *self, void *closure) { return PyUnicode_FromString(self->mode_out); } static struct PyGetSetDef cms_transform_getsetters[] = { - { "inputMode", (getter) cms_transform_getattr_inputMode }, - { "outputMode", (getter) cms_transform_getattr_outputMode }, - { NULL } -}; + {"inputMode", (getter)cms_transform_getattr_inputMode}, + {"outputMode", (getter)cms_transform_getattr_outputMode}, + {NULL}}; static PyTypeObject CmsTransform_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "CmsTransform", sizeof(CmsTransformObject), 0, + PyVarObject_HEAD_INIT(NULL, 0) "CmsTransform", + sizeof(CmsTransformObject), + 0, /* methods */ - (destructor) cms_transform_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - cms_transform_methods, /*tp_methods*/ - 0, /*tp_members*/ - cms_transform_getsetters, /*tp_getset*/ + (destructor)cms_transform_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + cms_transform_methods, /*tp_methods*/ + 0, /*tp_members*/ + cms_transform_getsetters, /*tp_getset*/ }; static int -setup_module(PyObject* m) { +setup_module(PyObject *m) { PyObject *d; PyObject *v; int vn; @@ -1524,14 +1539,14 @@ setup_module(PyObject* m) { PyMODINIT_FUNC PyInit__imagingcms(void) { - PyObject* m; + PyObject *m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_imagingcms", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - pyCMSdll_methods, /* m_methods */ + "_imagingcms", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + pyCMSdll_methods, /* m_methods */ }; m = PyModule_Create(&module_def); diff --git a/src/_imagingft.c b/src/_imagingft.c index 5566ee3da..d73c6c2d5 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -40,7 +40,7 @@ #endif #if !defined(FT_LOAD_TARGET_MONO) -#define FT_LOAD_TARGET_MONO FT_LOAD_MONOCHROME +#define FT_LOAD_TARGET_MONO FT_LOAD_MONOCHROME #endif /* -------------------------------------------------------------------- */ @@ -49,73 +49,61 @@ #undef FTERRORS_H #undef __FTERRORS_H__ -#define FT_ERRORDEF( e, v, s ) { e, s }, -#define FT_ERROR_START_LIST { -#define FT_ERROR_END_LIST { 0, 0 } }; +#define FT_ERRORDEF(e, v, s) {e, s}, +#define FT_ERROR_START_LIST { +#define FT_ERROR_END_LIST \ + { 0, 0 } \ + } \ + ; #include "libImaging/raqm.h" #define LAYOUT_FALLBACK 0 #define LAYOUT_RAQM 1 -typedef struct -{ - int index, x_offset, x_advance, y_offset, y_advance; - unsigned int cluster; +typedef struct { + int index, x_offset, x_advance, y_offset, y_advance; + unsigned int cluster; } GlyphInfo; struct { int code; - const char* message; + const char *message; } ft_errors[] = #include FT_ERRORS_H -/* -------------------------------------------------------------------- */ -/* font objects */ + /* -------------------------------------------------------------------- */ + /* font objects */ -static FT_Library library; + static FT_Library library; typedef struct { - PyObject_HEAD - FT_Face face; + PyObject_HEAD FT_Face face; unsigned char *font_bytes; int layout_engine; } FontObject; static PyTypeObject Font_Type; -typedef const char* (*t_raqm_version_string) (void); -typedef bool (*t_raqm_version_atleast)(unsigned int major, - unsigned int minor, - unsigned int micro); -typedef raqm_t* (*t_raqm_create)(void); -typedef int (*t_raqm_set_text)(raqm_t *rq, - const uint32_t *text, - size_t len); -typedef bool (*t_raqm_set_text_utf8) (raqm_t *rq, - const char *text, - size_t len); -typedef bool (*t_raqm_set_par_direction) (raqm_t *rq, - raqm_direction_t dir); -typedef bool (*t_raqm_set_language) (raqm_t *rq, - const char *lang, - size_t start, - size_t len); -typedef bool (*t_raqm_add_font_feature) (raqm_t *rq, - const char *feature, - int len); -typedef bool (*t_raqm_set_freetype_face) (raqm_t *rq, - FT_Face face); -typedef bool (*t_raqm_layout) (raqm_t *rq); -typedef raqm_glyph_t* (*t_raqm_get_glyphs) (raqm_t *rq, - size_t *length); -typedef raqm_glyph_t_01* (*t_raqm_get_glyphs_01) (raqm_t *rq, - size_t *length); -typedef void (*t_raqm_destroy) (raqm_t *rq); +typedef const char *(*t_raqm_version_string)(void); +typedef bool (*t_raqm_version_atleast)( + unsigned int major, unsigned int minor, unsigned int micro); +typedef raqm_t *(*t_raqm_create)(void); +typedef int (*t_raqm_set_text)(raqm_t *rq, const uint32_t *text, size_t len); +typedef bool (*t_raqm_set_text_utf8)(raqm_t *rq, const char *text, size_t len); +typedef bool (*t_raqm_set_par_direction)(raqm_t *rq, raqm_direction_t dir); +typedef bool (*t_raqm_set_language)( + raqm_t *rq, const char *lang, size_t start, size_t len); +typedef bool (*t_raqm_add_font_feature)(raqm_t *rq, const char *feature, int len); +typedef bool (*t_raqm_set_freetype_face)(raqm_t *rq, FT_Face face); +typedef bool (*t_raqm_layout)(raqm_t *rq); +typedef raqm_glyph_t *(*t_raqm_get_glyphs)(raqm_t *rq, size_t *length); +typedef raqm_glyph_t_01 *(*t_raqm_get_glyphs_01)(raqm_t *rq, size_t *length); +typedef void (*t_raqm_destroy)(raqm_t *rq); typedef struct { - void* raqm; + void *raqm; int version; t_raqm_version_string version_string; t_raqm_version_atleast version_atleast; @@ -134,13 +122,11 @@ typedef struct { static p_raqm_func p_raqm; - /* round a 26.6 pixel coordinate to the nearest integer */ -#define PIXEL(x) ((((x)+32) & -64)>>6) +#define PIXEL(x) ((((x) + 32) & -64) >> 6) -static PyObject* -geterror(int code) -{ +static PyObject * +geterror(int code) { int i; for (i = 0; ft_errors[i].message; i++) { @@ -155,8 +141,7 @@ geterror(int code) } static int -setraqm(void) -{ +setraqm(void) { /* set the static function pointers for dynamic raqm linking */ p_raqm.raqm = NULL; @@ -179,68 +164,72 @@ setraqm(void) } #ifndef _WIN32 - p_raqm.version_string = (t_raqm_version_string)dlsym(p_raqm.raqm, "raqm_version_string"); - p_raqm.version_atleast = (t_raqm_version_atleast)dlsym(p_raqm.raqm, "raqm_version_atleast"); + p_raqm.version_string = + (t_raqm_version_string)dlsym(p_raqm.raqm, "raqm_version_string"); + p_raqm.version_atleast = + (t_raqm_version_atleast)dlsym(p_raqm.raqm, "raqm_version_atleast"); p_raqm.create = (t_raqm_create)dlsym(p_raqm.raqm, "raqm_create"); p_raqm.set_text = (t_raqm_set_text)dlsym(p_raqm.raqm, "raqm_set_text"); - p_raqm.set_text_utf8 = (t_raqm_set_text_utf8)dlsym(p_raqm.raqm, "raqm_set_text_utf8"); - p_raqm.set_par_direction = (t_raqm_set_par_direction)dlsym(p_raqm.raqm, "raqm_set_par_direction"); + p_raqm.set_text_utf8 = + (t_raqm_set_text_utf8)dlsym(p_raqm.raqm, "raqm_set_text_utf8"); + p_raqm.set_par_direction = + (t_raqm_set_par_direction)dlsym(p_raqm.raqm, "raqm_set_par_direction"); p_raqm.set_language = (t_raqm_set_language)dlsym(p_raqm.raqm, "raqm_set_language"); - p_raqm.add_font_feature = (t_raqm_add_font_feature)dlsym(p_raqm.raqm, "raqm_add_font_feature"); - p_raqm.set_freetype_face = (t_raqm_set_freetype_face)dlsym(p_raqm.raqm, "raqm_set_freetype_face"); + p_raqm.add_font_feature = + (t_raqm_add_font_feature)dlsym(p_raqm.raqm, "raqm_add_font_feature"); + p_raqm.set_freetype_face = + (t_raqm_set_freetype_face)dlsym(p_raqm.raqm, "raqm_set_freetype_face"); p_raqm.layout = (t_raqm_layout)dlsym(p_raqm.raqm, "raqm_layout"); p_raqm.destroy = (t_raqm_destroy)dlsym(p_raqm.raqm, "raqm_destroy"); - if(dlsym(p_raqm.raqm, "raqm_index_to_position")) { + if (dlsym(p_raqm.raqm, "raqm_index_to_position")) { p_raqm.get_glyphs = (t_raqm_get_glyphs)dlsym(p_raqm.raqm, "raqm_get_glyphs"); p_raqm.version = 2; } else { p_raqm.version = 1; - p_raqm.get_glyphs_01 = (t_raqm_get_glyphs_01)dlsym(p_raqm.raqm, "raqm_get_glyphs"); + p_raqm.get_glyphs_01 = + (t_raqm_get_glyphs_01)dlsym(p_raqm.raqm, "raqm_get_glyphs"); } if (dlerror() || - !(p_raqm.create && - p_raqm.set_text && - p_raqm.set_text_utf8 && - p_raqm.set_par_direction && - p_raqm.set_language && - p_raqm.add_font_feature && - p_raqm.set_freetype_face && - p_raqm.layout && - (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && - p_raqm.destroy)) { + !(p_raqm.create && p_raqm.set_text && p_raqm.set_text_utf8 && + p_raqm.set_par_direction && p_raqm.set_language && p_raqm.add_font_feature && + p_raqm.set_freetype_face && p_raqm.layout && + (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && p_raqm.destroy)) { dlclose(p_raqm.raqm); p_raqm.raqm = NULL; return 2; } #else - p_raqm.version_string = (t_raqm_version_string)GetProcAddress(p_raqm.raqm, "raqm_version_string"); - p_raqm.version_atleast = (t_raqm_version_atleast)GetProcAddress(p_raqm.raqm, "raqm_version_atleast"); + p_raqm.version_string = + (t_raqm_version_string)GetProcAddress(p_raqm.raqm, "raqm_version_string"); + p_raqm.version_atleast = + (t_raqm_version_atleast)GetProcAddress(p_raqm.raqm, "raqm_version_atleast"); p_raqm.create = (t_raqm_create)GetProcAddress(p_raqm.raqm, "raqm_create"); p_raqm.set_text = (t_raqm_set_text)GetProcAddress(p_raqm.raqm, "raqm_set_text"); - p_raqm.set_text_utf8 = (t_raqm_set_text_utf8)GetProcAddress(p_raqm.raqm, "raqm_set_text_utf8"); - p_raqm.set_par_direction = (t_raqm_set_par_direction)GetProcAddress(p_raqm.raqm, "raqm_set_par_direction"); - p_raqm.set_language = (t_raqm_set_language)GetProcAddress(p_raqm.raqm, "raqm_set_language"); - p_raqm.add_font_feature = (t_raqm_add_font_feature)GetProcAddress(p_raqm.raqm, "raqm_add_font_feature"); - p_raqm.set_freetype_face = (t_raqm_set_freetype_face)GetProcAddress(p_raqm.raqm, "raqm_set_freetype_face"); + p_raqm.set_text_utf8 = + (t_raqm_set_text_utf8)GetProcAddress(p_raqm.raqm, "raqm_set_text_utf8"); + p_raqm.set_par_direction = + (t_raqm_set_par_direction)GetProcAddress(p_raqm.raqm, "raqm_set_par_direction"); + p_raqm.set_language = + (t_raqm_set_language)GetProcAddress(p_raqm.raqm, "raqm_set_language"); + p_raqm.add_font_feature = + (t_raqm_add_font_feature)GetProcAddress(p_raqm.raqm, "raqm_add_font_feature"); + p_raqm.set_freetype_face = + (t_raqm_set_freetype_face)GetProcAddress(p_raqm.raqm, "raqm_set_freetype_face"); p_raqm.layout = (t_raqm_layout)GetProcAddress(p_raqm.raqm, "raqm_layout"); p_raqm.destroy = (t_raqm_destroy)GetProcAddress(p_raqm.raqm, "raqm_destroy"); - if(GetProcAddress(p_raqm.raqm, "raqm_index_to_position")) { - p_raqm.get_glyphs = (t_raqm_get_glyphs)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); + if (GetProcAddress(p_raqm.raqm, "raqm_index_to_position")) { + p_raqm.get_glyphs = + (t_raqm_get_glyphs)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); p_raqm.version = 2; } else { p_raqm.version = 1; - p_raqm.get_glyphs_01 = (t_raqm_get_glyphs_01)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); + p_raqm.get_glyphs_01 = + (t_raqm_get_glyphs_01)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); } - if (!(p_raqm.create && - p_raqm.set_text && - p_raqm.set_text_utf8 && - p_raqm.set_par_direction && - p_raqm.set_language && - p_raqm.add_font_feature && - p_raqm.set_freetype_face && - p_raqm.layout && - (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && - p_raqm.destroy)) { + if (!(p_raqm.create && p_raqm.set_text && p_raqm.set_text_utf8 && + p_raqm.set_par_direction && p_raqm.set_language && p_raqm.add_font_feature && + p_raqm.set_freetype_face && p_raqm.layout && + (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && p_raqm.destroy)) { FreeLibrary(p_raqm.raqm); p_raqm.raqm = NULL; return 2; @@ -250,38 +239,41 @@ setraqm(void) return 0; } -static PyObject* -getfont(PyObject* self_, PyObject* args, PyObject* kw) -{ +static PyObject * +getfont(PyObject *self_, PyObject *args, PyObject *kw) { /* create a font object from a file name and a size (in pixels) */ - FontObject* self; + FontObject *self; int error = 0; - char* filename = NULL; + char *filename = NULL; Py_ssize_t size; Py_ssize_t index = 0; Py_ssize_t layout_engine = 0; - unsigned char* encoding; - unsigned char* font_bytes; + unsigned char *encoding; + unsigned char *font_bytes; Py_ssize_t font_bytes_size = 0; - static char* kwlist[] = { - "filename", "size", "index", "encoding", "font_bytes", - "layout_engine", NULL - }; + static char *kwlist[] = { + "filename", "size", "index", "encoding", "font_bytes", "layout_engine", NULL}; if (!library) { - PyErr_SetString( - PyExc_OSError, - "failed to initialize FreeType library" - ); + PyErr_SetString(PyExc_OSError, "failed to initialize FreeType library"); return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kw, "etn|nsy#n", kwlist, - Py_FileSystemDefaultEncoding, &filename, - &size, &index, &encoding, &font_bytes, - &font_bytes_size, &layout_engine)) { + if (!PyArg_ParseTupleAndKeywords( + args, + kw, + "etn|nsy#n", + kwlist, + Py_FileSystemDefaultEncoding, + &filename, + &size, + &index, + &encoding, + &font_bytes, + &font_bytes_size, + &layout_engine)) { return NULL; } @@ -304,12 +296,16 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) /* Don't free this before FT_Done_Face */ self->font_bytes = PyMem_Malloc(font_bytes_size); if (!self->font_bytes) { - error = 65; // Out of Memory in Freetype. + error = 65; // Out of Memory in Freetype. } if (!error) { memcpy(self->font_bytes, font_bytes, (size_t)font_bytes_size); - error = FT_New_Memory_Face(library, (FT_Byte*)self->font_bytes, - font_bytes_size, index, &self->face); + error = FT_New_Memory_Face( + library, + (FT_Byte *)self->font_bytes, + font_bytes_size, + index, + &self->face); } } @@ -317,14 +313,13 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) error = FT_Set_Pixel_Sizes(self->face, 0, size); } - if (!error && encoding && strlen((char*) encoding) == 4) { - FT_Encoding encoding_tag = FT_MAKE_TAG( - encoding[0], encoding[1], encoding[2], encoding[3] - ); + if (!error && encoding && strlen((char *)encoding) == 4) { + FT_Encoding encoding_tag = + FT_MAKE_TAG(encoding[0], encoding[1], encoding[2], encoding[3]); error = FT_Select_Charmap(self->face, encoding_tag); } if (filename) { - PyMem_Free(filename); + PyMem_Free(filename); } if (error) { @@ -336,12 +331,11 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) return geterror(error); } - return (PyObject*) self; + return (PyObject *)self; } static int -font_getchar(PyObject* string, int index, FT_ULong* char_out) -{ +font_getchar(PyObject *string, int index, FT_ULong *char_out) { if (PyUnicode_Check(string)) { if (index >= PyUnicode_GET_LENGTH(string)) { return 0; @@ -353,9 +347,15 @@ font_getchar(PyObject* string, int index, FT_ULong* char_out) } static size_t -text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features, - const char* lang, GlyphInfo **glyph_info, int mask, int color) -{ +text_layout_raqm( + PyObject *string, + FontObject *self, + const char *dir, + PyObject *features, + const char *lang, + GlyphInfo **glyph_info, + int mask, + int color) { size_t i = 0, count = 0, start = 0; raqm_t *rq; raqm_glyph_t *glyphs = NULL; @@ -388,8 +388,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * goto failed; } } - } - else { + } else { PyErr_SetString(PyExc_TypeError, "expected string"); goto failed; } @@ -403,11 +402,14 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject * } else if (strcmp(dir, "ttb") == 0) { direction = RAQM_DIRECTION_TTB; if (p_raqm.version_atleast == NULL || !(*p_raqm.version_atleast)(0, 7, 0)) { - PyErr_SetString(PyExc_ValueError, "libraqm 0.7 or greater required for 'ttb' direction"); + PyErr_SetString( + PyExc_ValueError, + "libraqm 0.7 or greater required for 'ttb' direction"); goto failed; } } else { - PyErr_SetString(PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); + PyErr_SetString( + PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); goto failed; } } @@ -510,9 +512,15 @@ failed: } static size_t -text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObject *features, - const char* lang, GlyphInfo **glyph_info, int mask, int color) -{ +text_layout_fallback( + PyObject *string, + FontObject *self, + const char *dir, + PyObject *features, + const char *lang, + GlyphInfo **glyph_info, + int mask, + int color) { int error, load_flags; FT_ULong ch; Py_ssize_t count; @@ -522,7 +530,10 @@ text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObje int i; if (features != Py_None || dir != NULL || lang != NULL) { - PyErr_SetString(PyExc_KeyError, "setting text direction, language or font features is not supported without libraqm"); + PyErr_SetString( + PyExc_KeyError, + "setting text direction, language or font features is not supported " + "without libraqm"); } if (!PyUnicode_Check(string)) { PyErr_SetString(PyExc_TypeError, "expected string"); @@ -531,7 +542,7 @@ text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObje count = 0; while (font_getchar(string, count, &ch)) { - count++; + count++; } if (count == 0) { return 0; @@ -560,14 +571,18 @@ text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObje return 0; } glyph = self->face->glyph; - (*glyph_info)[i].x_offset=0; - (*glyph_info)[i].y_offset=0; + (*glyph_info)[i].x_offset = 0; + (*glyph_info)[i].y_offset = 0; if (kerning && last_index && (*glyph_info)[i].index) { FT_Vector delta; - if (FT_Get_Kerning(self->face, last_index, (*glyph_info)[i].index, - ft_kerning_default,&delta) == 0) { - (*glyph_info)[i-1].x_advance += PIXEL(delta.x); - (*glyph_info)[i-1].y_advance += PIXEL(delta.y); + if (FT_Get_Kerning( + self->face, + last_index, + (*glyph_info)[i].index, + ft_kerning_default, + &delta) == 0) { + (*glyph_info)[i - 1].x_advance += PIXEL(delta.x); + (*glyph_info)[i - 1].y_advance += PIXEL(delta.y); } } @@ -581,28 +596,35 @@ text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObje } static size_t -text_layout(PyObject* string, FontObject* self, const char* dir, PyObject *features, - const char* lang, GlyphInfo **glyph_info, int mask, int color) -{ +text_layout( + PyObject *string, + FontObject *self, + const char *dir, + PyObject *features, + const char *lang, + GlyphInfo **glyph_info, + int mask, + int color) { size_t count; if (p_raqm.raqm && self->layout_engine == LAYOUT_RAQM) { - count = text_layout_raqm(string, self, dir, features, lang, glyph_info, mask, color); + count = text_layout_raqm( + string, self, dir, features, lang, glyph_info, mask, color); } else { - count = text_layout_fallback(string, self, dir, features, lang, glyph_info, mask, color); + count = text_layout_fallback( + string, self, dir, features, lang, glyph_info, mask, color); } return count; } -static PyObject* -font_getlength(FontObject* self, PyObject* args) -{ - int length; /* length along primary axis, in 26.6 precision */ +static PyObject * +font_getlength(FontObject *self, PyObject *args) { + int length; /* length along primary axis, in 26.6 precision */ GlyphInfo *glyph_info = NULL; /* computed text layout */ - size_t i, count; /* glyph_info index and length */ - int horizontal_dir; /* is primary axis horizontal? */ - int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ - int color = 0; /* is FT_LOAD_COLOR enabled? */ + size_t i, count; /* glyph_info index and length */ + int horizontal_dir; /* is primary axis horizontal? */ + int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ + int color = 0; /* is FT_LOAD_COLOR enabled? */ const char *mode = NULL; const char *dir = NULL; const char *lang = NULL; @@ -611,7 +633,8 @@ font_getlength(FontObject* self, PyObject* args) /* calculate size and bearing for a given string */ - if (!PyArg_ParseTuple(args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang)) { + if (!PyArg_ParseTuple( + args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang)) { return NULL; } @@ -642,24 +665,23 @@ font_getlength(FontObject* self, PyObject* args) return PyLong_FromLong(length); } -static PyObject* -font_getsize(FontObject* self, PyObject* args) -{ +static PyObject * +font_getsize(FontObject *self, PyObject *args) { int position; /* pen position along primary axis, in 26.6 precision */ int advanced; /* pen position along primary axis, in pixels */ - int px, py; /* position of current glyph, in pixels */ + int px, py; /* position of current glyph, in pixels */ int x_min, x_max, y_min, y_max; /* text bounding box, in pixels */ - int x_anchor, y_anchor; /* offset of point drawn at (0, 0), in pixels */ - int load_flags; /* FreeType load_flags parameter */ + int x_anchor, y_anchor; /* offset of point drawn at (0, 0), in pixels */ + int load_flags; /* FreeType load_flags parameter */ int error; FT_Face face; FT_Glyph glyph; - FT_BBox bbox; /* glyph bounding box */ + FT_BBox bbox; /* glyph bounding box */ GlyphInfo *glyph_info = NULL; /* computed text layout */ - size_t i, count; /* glyph_info index and length */ - int horizontal_dir; /* is primary axis horizontal? */ - int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ - int color = 0; /* is FT_LOAD_COLOR enabled? */ + size_t i, count; /* glyph_info index and length */ + int horizontal_dir; /* is primary axis horizontal? */ + int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ + int color = 0; /* is FT_LOAD_COLOR enabled? */ const char *mode = NULL; const char *dir = NULL; const char *lang = NULL; @@ -669,7 +691,8 @@ font_getsize(FontObject* self, PyObject* args) /* calculate size and bearing for a given string */ - if (!PyArg_ParseTuple(args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor)) { + if (!PyArg_ParseTuple( + args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor)) { return NULL; } @@ -771,95 +794,98 @@ font_getsize(FontObject* self, PyObject* args) if (face) { if (horizontal_dir) { switch (anchor[0]) { - case 'l': // left - x_anchor = 0; - break; - case 'm': // middle (left + right) / 2 - x_anchor = PIXEL(position / 2); - break; - case 'r': // right - x_anchor = PIXEL(position); - break; - case 's': // vertical baseline - default: - goto bad_anchor; + case 'l': // left + x_anchor = 0; + break; + case 'm': // middle (left + right) / 2 + x_anchor = PIXEL(position / 2); + break; + case 'r': // right + x_anchor = PIXEL(position); + break; + case 's': // vertical baseline + default: + goto bad_anchor; } switch (anchor[1]) { - case 'a': // ascender - y_anchor = PIXEL(self->face->size->metrics.ascender); - break; - case 't': // top - y_anchor = y_max; - break; - case 'm': // middle (ascender + descender) / 2 - y_anchor = PIXEL((self->face->size->metrics.ascender + self->face->size->metrics.descender) / 2); - break; - case 's': // horizontal baseline - y_anchor = 0; - break; - case 'b': // bottom - y_anchor = y_min; - break; - case 'd': // descender - y_anchor = PIXEL(self->face->size->metrics.descender); - break; - default: - goto bad_anchor; + case 'a': // ascender + y_anchor = PIXEL(self->face->size->metrics.ascender); + break; + case 't': // top + y_anchor = y_max; + break; + case 'm': // middle (ascender + descender) / 2 + y_anchor = PIXEL( + (self->face->size->metrics.ascender + + self->face->size->metrics.descender) / + 2); + break; + case 's': // horizontal baseline + y_anchor = 0; + break; + case 'b': // bottom + y_anchor = y_min; + break; + case 'd': // descender + y_anchor = PIXEL(self->face->size->metrics.descender); + break; + default: + goto bad_anchor; } } else { switch (anchor[0]) { - case 'l': // left - x_anchor = x_min; - break; - case 'm': // middle (left + right) / 2 - x_anchor = (x_min + x_max) / 2; - break; - case 'r': // right - x_anchor = x_max; - break; - case 's': // vertical baseline - x_anchor = 0; - break; - default: - goto bad_anchor; + case 'l': // left + x_anchor = x_min; + break; + case 'm': // middle (left + right) / 2 + x_anchor = (x_min + x_max) / 2; + break; + case 'r': // right + x_anchor = x_max; + break; + case 's': // vertical baseline + x_anchor = 0; + break; + default: + goto bad_anchor; } switch (anchor[1]) { - case 't': // top - y_anchor = 0; - break; - case 'm': // middle (top + bottom) / 2 - y_anchor = PIXEL(position / 2); - break; - case 'b': // bottom - y_anchor = PIXEL(position); - break; - case 'a': // ascender - case 's': // horizontal baseline - case 'd': // descender - default: - goto bad_anchor; + case 't': // top + y_anchor = 0; + break; + case 'm': // middle (top + bottom) / 2 + y_anchor = PIXEL(position / 2); + break; + case 'b': // bottom + y_anchor = PIXEL(position); + break; + case 'a': // ascender + case 's': // horizontal baseline + case 'd': // descender + default: + goto bad_anchor; } } } return Py_BuildValue( "(ii)(ii)", - (x_max - x_min), (y_max - y_min), - (-x_anchor + x_min), -(-y_anchor + y_max) - ); + (x_max - x_min), + (y_max - y_min), + (-x_anchor + x_min), + -(-y_anchor + y_max)); bad_anchor: PyErr_Format(PyExc_ValueError, "bad anchor specified: %s", anchor); return NULL; } -static PyObject* -font_render(FontObject* self, PyObject* args) -{ - int x, y; /* pen position, in 26.6 precision */ - int px, py; /* position of current glyph, in pixels */ +static PyObject * +font_render(FontObject *self, PyObject *args) { + int x, y; /* pen position, in 26.6 precision */ + int px, py; /* position of current glyph, in pixels */ int x_min, y_max; /* text offset in 26.6 precision */ - int load_flags; /* FreeType load_flags parameter */ + int load_flags; /* FreeType load_flags parameter */ int error; FT_Glyph glyph; FT_GlyphSlot glyph_slot; @@ -868,16 +894,16 @@ font_render(FontObject* self, PyObject* args) FT_BitmapGlyph bitmap_glyph; FT_Stroker stroker = NULL; int bitmap_converted_ready = 0; /* has bitmap_converted been initialized */ - GlyphInfo *glyph_info = NULL; /* computed text layout */ - size_t i, count; /* glyph_info index and length */ - int xx, yy; /* pixel offset of current glyph bitmap */ - int x0, x1; /* horizontal bounds of glyph bitmap to copy */ - unsigned int bitmap_y; /* glyph bitmap y index */ - unsigned char *source; /* glyph bitmap source buffer */ - unsigned char convert_scale; /* scale factor for non-8bpp bitmaps */ + GlyphInfo *glyph_info = NULL; /* computed text layout */ + size_t i, count; /* glyph_info index and length */ + int xx, yy; /* pixel offset of current glyph bitmap */ + int x0, x1; /* horizontal bounds of glyph bitmap to copy */ + unsigned int bitmap_y; /* glyph bitmap y index */ + unsigned char *source; /* glyph bitmap source buffer */ + unsigned char convert_scale; /* scale factor for non-8bpp bitmaps */ Imaging im; Py_ssize_t id; - int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ + int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ int color = 0; /* is FT_LOAD_COLOR enabled? */ int stroke_width = 0; PY_LONG_LONG foreground_ink_long = 0; @@ -886,13 +912,22 @@ font_render(FontObject* self, PyObject* args) const char *dir = NULL; const char *lang = NULL; PyObject *features = Py_None; - PyObject* string; + PyObject *string; /* render string into given buffer (the buffer *must* have the right size, or this will crash) */ - if (!PyArg_ParseTuple(args, "On|zzOziL:render", &string, &id, &mode, &dir, &features, &lang, - &stroke_width, &foreground_ink_long)) { + if (!PyArg_ParseTuple( + args, + "On|zzOziL:render", + &string, + &id, + &mode, + &dir, + &features, + &lang, + &stroke_width, + &foreground_ink_long)) { return NULL; } @@ -904,11 +939,12 @@ font_render(FontObject* self, PyObject* args) #ifdef FT_COLOR_H if (color) { FT_Color foreground_color; - FT_Byte* ink = (FT_Byte*)&foreground_ink; + FT_Byte *ink = (FT_Byte *)&foreground_ink; foreground_color.red = ink[0]; foreground_color.green = ink[1]; foreground_color.blue = ink[2]; - foreground_color.alpha = (FT_Byte) 255; /* ink alpha is handled in ImageDraw.text */ + foreground_color.alpha = + (FT_Byte)255; /* ink alpha is handled in ImageDraw.text */ FT_Palette_Set_Foreground_Color(self->face, foreground_color); } #endif @@ -927,10 +963,15 @@ font_render(FontObject* self, PyObject* args) return geterror(error); } - FT_Stroker_Set(stroker, (FT_Fixed)stroke_width*64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + FT_Stroker_Set( + stroker, + (FT_Fixed)stroke_width * 64, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINEJOIN_ROUND, + 0); } - im = (Imaging) id; + im = (Imaging)id; load_flags = FT_LOAD_DEFAULT; if (mask) { load_flags |= FT_LOAD_TARGET_MONO; @@ -950,7 +991,8 @@ font_render(FontObject* self, PyObject* args) px = PIXEL(x + glyph_info[i].x_offset); py = PIXEL(y + glyph_info[i].y_offset); - error = FT_Load_Glyph(self->face, glyph_info[i].index, load_flags | FT_LOAD_RENDER); + error = + FT_Load_Glyph(self->face, glyph_info[i].index, load_flags | FT_LOAD_RENDER); if (error) { return geterror(error); } @@ -1030,9 +1072,7 @@ font_render(FontObject* self, PyObject* args) case FT_PIXEL_MODE_GRAY2: case FT_PIXEL_MODE_GRAY4: if (!bitmap_converted_ready) { - -#if FREETYPE_MAJOR > 2 ||\ - (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 6) +#if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 6) FT_Bitmap_Init(&bitmap_converted); #else FT_Bitmap_New(&bitmap_converted); @@ -1070,18 +1110,18 @@ font_render(FontObject* self, PyObject* args) x1 = im->xsize - xx; } - source = (unsigned char*) bitmap.buffer; + source = (unsigned char *)bitmap.buffer; for (bitmap_y = 0; bitmap_y < bitmap.rows; bitmap_y++, yy++) { /* clip glyph bitmap height to target image bounds */ if (yy >= 0 && yy < im->ysize) { /* blend this glyph into the buffer */ int k; unsigned char v; - unsigned char* target; + unsigned char *target; if (color) { /* target[RGB] returns the color, target[A] returns the mask */ /* target bands get split again in ImageDraw.text */ - target = (unsigned char*)im->image[yy] + xx * 4; + target = (unsigned char *)im->image[yy] + xx * 4; } else { target = im->image8[yy] + xx; } @@ -1091,17 +1131,20 @@ font_render(FontObject* self, PyObject* args) for (k = x0; k < x1; k++) { if (target[k * 4 + 3] < source[k * 4 + 3]) { /* unpremultiply BGRa to RGBA */ - target[k * 4 + 0] = CLIP8((255 * (int)source[k * 4 + 2]) / source[k * 4 + 3]); - target[k * 4 + 1] = CLIP8((255 * (int)source[k * 4 + 1]) / source[k * 4 + 3]); - target[k * 4 + 2] = CLIP8((255 * (int)source[k * 4 + 0]) / source[k * 4 + 3]); + target[k * 4 + 0] = CLIP8( + (255 * (int)source[k * 4 + 2]) / source[k * 4 + 3]); + target[k * 4 + 1] = CLIP8( + (255 * (int)source[k * 4 + 1]) / source[k * 4 + 3]); + target[k * 4 + 2] = CLIP8( + (255 * (int)source[k * 4 + 0]) / source[k * 4 + 3]); target[k * 4 + 3] = source[k * 4 + 3]; } } } else #endif - if (bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { + if (bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { if (color) { - unsigned char* ink = (unsigned char*)&foreground_ink; + unsigned char *ink = (unsigned char *)&foreground_ink; for (k = x0; k < x1; k++) { v = source[k] * convert_scale; if (target[k * 4 + 3] < v) { @@ -1152,173 +1195,166 @@ glyph_error: return NULL; } -#if FREETYPE_MAJOR > 2 ||\ - (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) ||\ +#if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) || \ (FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 9 && FREETYPE_PATCH == 1) - static PyObject* - font_getvarnames(FontObject* self) - { - int error; - FT_UInt i, j, num_namedstyles, name_count; - FT_MM_Var *master; - FT_SfntName name; - PyObject *list_names, *list_name; +static PyObject * +font_getvarnames(FontObject *self) { + int error; + FT_UInt i, j, num_namedstyles, name_count; + FT_MM_Var *master; + FT_SfntName name; + PyObject *list_names, *list_name; - error = FT_Get_MM_Var(self->face, &master); + error = FT_Get_MM_Var(self->face, &master); + if (error) { + return geterror(error); + } + + num_namedstyles = master->num_namedstyles; + list_names = PyList_New(num_namedstyles); + + name_count = FT_Get_Sfnt_Name_Count(self->face); + for (i = 0; i < name_count; i++) { + error = FT_Get_Sfnt_Name(self->face, i, &name); if (error) { return geterror(error); } - num_namedstyles = master->num_namedstyles; - list_names = PyList_New(num_namedstyles); + for (j = 0; j < num_namedstyles; j++) { + if (PyList_GetItem(list_names, j) != NULL) { + continue; + } - name_count = FT_Get_Sfnt_Name_Count(self->face); - for (i = 0; i < name_count; i++) { - error = FT_Get_Sfnt_Name(self->face, i, &name); + if (master->namedstyle[j].strid == name.name_id) { + list_name = Py_BuildValue("y#", name.string, name.string_len); + PyList_SetItem(list_names, j, list_name); + break; + } + } + } + + FT_Done_MM_Var(library, master); + + return list_names; +} + +static PyObject * +font_getvaraxes(FontObject *self) { + int error; + FT_UInt i, j, num_axis, name_count; + FT_MM_Var *master; + FT_Var_Axis axis; + FT_SfntName name; + PyObject *list_axes, *list_axis, *axis_name; + error = FT_Get_MM_Var(self->face, &master); + if (error) { + return geterror(error); + } + + num_axis = master->num_axis; + name_count = FT_Get_Sfnt_Name_Count(self->face); + + list_axes = PyList_New(num_axis); + for (i = 0; i < num_axis; i++) { + axis = master->axis[i]; + + list_axis = PyDict_New(); + PyDict_SetItemString( + list_axis, "minimum", PyLong_FromLong(axis.minimum / 65536)); + PyDict_SetItemString(list_axis, "default", PyLong_FromLong(axis.def / 65536)); + PyDict_SetItemString( + list_axis, "maximum", PyLong_FromLong(axis.maximum / 65536)); + + for (j = 0; j < name_count; j++) { + error = FT_Get_Sfnt_Name(self->face, j, &name); if (error) { return geterror(error); } - for (j = 0; j < num_namedstyles; j++) { - if (PyList_GetItem(list_names, j) != NULL) { - continue; - } - - if (master->namedstyle[j].strid == name.name_id) { - list_name = Py_BuildValue("y#", name.string, name.string_len); - PyList_SetItem(list_names, j, list_name); - break; - } + if (name.name_id == axis.strid) { + axis_name = Py_BuildValue("y#", name.string, name.string_len); + PyDict_SetItemString(list_axis, "name", axis_name); + break; } } - FT_Done_MM_Var(library, master); - - return list_names; + PyList_SetItem(list_axes, i, list_axis); } - static PyObject* - font_getvaraxes(FontObject* self) - { - int error; - FT_UInt i, j, num_axis, name_count; - FT_MM_Var* master; - FT_Var_Axis axis; - FT_SfntName name; - PyObject *list_axes, *list_axis, *axis_name; - error = FT_Get_MM_Var(self->face, &master); - if (error) { - return geterror(error); - } + FT_Done_MM_Var(library, master); - num_axis = master->num_axis; - name_count = FT_Get_Sfnt_Name_Count(self->face); + return list_axes; +} - list_axes = PyList_New(num_axis); - for (i = 0; i < num_axis; i++) { - axis = master->axis[i]; +static PyObject * +font_setvarname(FontObject *self, PyObject *args) { + int error; - list_axis = PyDict_New(); - PyDict_SetItemString(list_axis, "minimum", - PyLong_FromLong(axis.minimum / 65536)); - PyDict_SetItemString(list_axis, "default", - PyLong_FromLong(axis.def / 65536)); - PyDict_SetItemString(list_axis, "maximum", - PyLong_FromLong(axis.maximum / 65536)); - - for (j = 0; j < name_count; j++) { - error = FT_Get_Sfnt_Name(self->face, j, &name); - if (error) { - return geterror(error); - } - - if (name.name_id == axis.strid) { - axis_name = Py_BuildValue("y#", name.string, name.string_len); - PyDict_SetItemString(list_axis, "name", axis_name); - break; - } - } - - PyList_SetItem(list_axes, i, list_axis); - } - - FT_Done_MM_Var(library, master); - - return list_axes; + int instance_index; + if (!PyArg_ParseTuple(args, "i", &instance_index)) { + return NULL; } - static PyObject* - font_setvarname(FontObject* self, PyObject* args) - { - int error; + error = FT_Set_Named_Instance(self->face, instance_index); + if (error) { + return geterror(error); + } - int instance_index; - if (!PyArg_ParseTuple(args, "i", &instance_index)) { + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * +font_setvaraxes(FontObject *self, PyObject *args) { + int error; + + PyObject *axes, *item; + Py_ssize_t i, num_coords; + FT_Fixed *coords; + FT_Fixed coord; + if (!PyArg_ParseTuple(args, "O", &axes)) { + return NULL; + } + + if (!PyList_Check(axes)) { + PyErr_SetString(PyExc_TypeError, "argument must be a list"); + return NULL; + } + + num_coords = PyObject_Length(axes); + coords = malloc(2 * sizeof(coords)); + if (coords == NULL) { + return PyErr_NoMemory(); + } + for (i = 0; i < num_coords; i++) { + item = PyList_GET_ITEM(axes, i); + if (PyFloat_Check(item)) { + coord = PyFloat_AS_DOUBLE(item); + } else if (PyLong_Check(item)) { + coord = (float)PyLong_AS_LONG(item); + } else if (PyNumber_Check(item)) { + coord = PyFloat_AsDouble(item); + } else { + free(coords); + PyErr_SetString(PyExc_TypeError, "list must contain numbers"); return NULL; } - - error = FT_Set_Named_Instance(self->face, instance_index); - if (error) { - return geterror(error); - } - - Py_INCREF(Py_None); - return Py_None; + coords[i] = coord * 65536; } - static PyObject* - font_setvaraxes(FontObject* self, PyObject* args) - { - int error; - - PyObject *axes, *item; - Py_ssize_t i, num_coords; - FT_Fixed *coords; - FT_Fixed coord; - if (!PyArg_ParseTuple(args, "O", &axes)) { - return NULL; - } - - if (!PyList_Check(axes)) { - PyErr_SetString(PyExc_TypeError, "argument must be a list"); - return NULL; - } - - num_coords = PyObject_Length(axes); - coords = malloc(2 * sizeof(coords)); - if (coords == NULL) { - return PyErr_NoMemory(); - } - for (i = 0; i < num_coords; i++) { - item = PyList_GET_ITEM(axes, i); - if (PyFloat_Check(item)) { - coord = PyFloat_AS_DOUBLE(item); - } else if (PyLong_Check(item)) { - coord = (float) PyLong_AS_LONG(item); - } else if (PyNumber_Check(item)) { - coord = PyFloat_AsDouble(item); - } else { - free(coords); - PyErr_SetString(PyExc_TypeError, "list must contain numbers"); - return NULL; - } - coords[i] = coord * 65536; - } - - error = FT_Set_Var_Design_Coordinates(self->face, num_coords, coords); - free(coords); - if (error) { - return geterror(error); - } - - Py_INCREF(Py_None); - return Py_None; + error = FT_Set_Var_Design_Coordinates(self->face, num_coords, coords); + free(coords); + if (error) { + return geterror(error); } + + Py_INCREF(Py_None); + return Py_None; +} #endif static void -font_dealloc(FontObject* self) -{ +font_dealloc(FontObject *self) { if (self->face) { FT_Done_Face(self->face); } @@ -1329,128 +1365,115 @@ font_dealloc(FontObject* self) } static PyMethodDef font_methods[] = { - {"render", (PyCFunction) font_render, METH_VARARGS}, - {"getsize", (PyCFunction) font_getsize, METH_VARARGS}, - {"getlength", (PyCFunction) font_getlength, METH_VARARGS}, -#if FREETYPE_MAJOR > 2 ||\ - (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) ||\ + {"render", (PyCFunction)font_render, METH_VARARGS}, + {"getsize", (PyCFunction)font_getsize, METH_VARARGS}, + {"getlength", (PyCFunction)font_getlength, METH_VARARGS}, +#if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) || \ (FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 9 && FREETYPE_PATCH == 1) - {"getvarnames", (PyCFunction) font_getvarnames, METH_NOARGS }, - {"getvaraxes", (PyCFunction) font_getvaraxes, METH_NOARGS }, - {"setvarname", (PyCFunction) font_setvarname, METH_VARARGS}, - {"setvaraxes", (PyCFunction) font_setvaraxes, METH_VARARGS}, + {"getvarnames", (PyCFunction)font_getvarnames, METH_NOARGS}, + {"getvaraxes", (PyCFunction)font_getvaraxes, METH_NOARGS}, + {"setvarname", (PyCFunction)font_setvarname, METH_VARARGS}, + {"setvaraxes", (PyCFunction)font_setvaraxes, METH_VARARGS}, #endif - {NULL, NULL} -}; + {NULL, NULL}}; -static PyObject* -font_getattr_family(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_family(FontObject *self, void *closure) { if (self->face->family_name) { return PyUnicode_FromString(self->face->family_name); } Py_RETURN_NONE; } -static PyObject* -font_getattr_style(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_style(FontObject *self, void *closure) { if (self->face->style_name) { return PyUnicode_FromString(self->face->style_name); } Py_RETURN_NONE; } -static PyObject* -font_getattr_ascent(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_ascent(FontObject *self, void *closure) { return PyLong_FromLong(PIXEL(self->face->size->metrics.ascender)); } -static PyObject* -font_getattr_descent(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_descent(FontObject *self, void *closure) { return PyLong_FromLong(-PIXEL(self->face->size->metrics.descender)); } -static PyObject* -font_getattr_height(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_height(FontObject *self, void *closure) { return PyLong_FromLong(PIXEL(self->face->size->metrics.height)); } -static PyObject* -font_getattr_x_ppem(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_x_ppem(FontObject *self, void *closure) { return PyLong_FromLong(self->face->size->metrics.x_ppem); } -static PyObject* -font_getattr_y_ppem(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_y_ppem(FontObject *self, void *closure) { return PyLong_FromLong(self->face->size->metrics.y_ppem); } - -static PyObject* -font_getattr_glyphs(FontObject* self, void* closure) -{ +static PyObject * +font_getattr_glyphs(FontObject *self, void *closure) { return PyLong_FromLong(self->face->num_glyphs); } static struct PyGetSetDef font_getsetters[] = { - { "family", (getter) font_getattr_family }, - { "style", (getter) font_getattr_style }, - { "ascent", (getter) font_getattr_ascent }, - { "descent", (getter) font_getattr_descent }, - { "height", (getter) font_getattr_height }, - { "x_ppem", (getter) font_getattr_x_ppem }, - { "y_ppem", (getter) font_getattr_y_ppem }, - { "glyphs", (getter) font_getattr_glyphs }, - { NULL } -}; + {"family", (getter)font_getattr_family}, + {"style", (getter)font_getattr_style}, + {"ascent", (getter)font_getattr_ascent}, + {"descent", (getter)font_getattr_descent}, + {"height", (getter)font_getattr_height}, + {"x_ppem", (getter)font_getattr_x_ppem}, + {"y_ppem", (getter)font_getattr_y_ppem}, + {"glyphs", (getter)font_getattr_glyphs}, + {NULL}}; static PyTypeObject Font_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "Font", sizeof(FontObject), 0, + PyVarObject_HEAD_INIT(NULL, 0) "Font", + sizeof(FontObject), + 0, /* methods */ (destructor)font_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - font_methods, /*tp_methods*/ - 0, /*tp_members*/ - font_getsetters, /*tp_getset*/ + 0, /* tp_print */ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + font_methods, /*tp_methods*/ + 0, /*tp_members*/ + font_getsetters, /*tp_getset*/ }; static PyMethodDef _functions[] = { - {"getfont", (PyCFunction) getfont, METH_VARARGS|METH_KEYWORDS}, - {NULL, NULL} -}; + {"getfont", (PyCFunction)getfont, METH_VARARGS | METH_KEYWORDS}, {NULL, NULL}}; static int -setup_module(PyObject* m) { - PyObject* d; - PyObject* v; +setup_module(PyObject *m) { + PyObject *d; + PyObject *v; int major, minor, patch; d = PyModule_GetDict(m); @@ -1467,12 +1490,12 @@ setup_module(PyObject* m) { v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch); PyDict_SetItemString(d, "freetype2_version", v); - setraqm(); v = PyBool_FromLong(!!p_raqm.raqm); PyDict_SetItemString(d, "HAVE_RAQM", v); if (p_raqm.version_string) { - PyDict_SetItemString(d, "raqm_version", PyUnicode_FromString(p_raqm.version_string())); + PyDict_SetItemString( + d, "raqm_version", PyUnicode_FromString(p_raqm.version_string())); } return 0; @@ -1480,14 +1503,14 @@ setup_module(PyObject* m) { PyMODINIT_FUNC PyInit__imagingft(void) { - PyObject* m; + PyObject *m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_imagingft", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - _functions, /* m_methods */ + "_imagingft", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + _functions, /* m_methods */ }; m = PyModule_Create(&module_def); diff --git a/src/_imagingmath.c b/src/_imagingmath.c index b99356d14..067c165b2 100644 --- a/src/_imagingmath.c +++ b/src/_imagingmath.c @@ -23,50 +23,51 @@ #define MAX_INT32 2147483647.0 #define MIN_INT32 -2147483648.0 -#define UNOP(name, op, type)\ -void name(Imaging out, Imaging im1)\ -{\ - int x, y;\ - for (y = 0; y < out->ysize; y++) {\ - type* p0 = (type*) out->image[y];\ - type* p1 = (type*) im1->image[y];\ - for (x = 0; x < out->xsize; x++) {\ - *p0 = op(type, *p1);\ - p0++; p1++;\ - }\ - }\ -} +#define UNOP(name, op, type) \ + void name(Imaging out, Imaging im1) { \ + int x, y; \ + for (y = 0; y < out->ysize; y++) { \ + type *p0 = (type *)out->image[y]; \ + type *p1 = (type *)im1->image[y]; \ + for (x = 0; x < out->xsize; x++) { \ + *p0 = op(type, *p1); \ + p0++; \ + p1++; \ + } \ + } \ + } -#define BINOP(name, op, type)\ -void name(Imaging out, Imaging im1, Imaging im2)\ -{\ - int x, y;\ - for (y = 0; y < out->ysize; y++) {\ - type* p0 = (type*) out->image[y];\ - type* p1 = (type*) im1->image[y];\ - type* p2 = (type*) im2->image[y];\ - for (x = 0; x < out->xsize; x++) {\ - *p0 = op(type, *p1, *p2);\ - p0++; p1++; p2++;\ - }\ - }\ -} +#define BINOP(name, op, type) \ + void name(Imaging out, Imaging im1, Imaging im2) { \ + int x, y; \ + for (y = 0; y < out->ysize; y++) { \ + type *p0 = (type *)out->image[y]; \ + type *p1 = (type *)im1->image[y]; \ + type *p2 = (type *)im2->image[y]; \ + for (x = 0; x < out->xsize; x++) { \ + *p0 = op(type, *p1, *p2); \ + p0++; \ + p1++; \ + p2++; \ + } \ + } \ + } #define NEG(type, v1) -(v1) #define INVERT(type, v1) ~(v1) -#define ADD(type, v1, v2) (v1)+(v2) -#define SUB(type, v1, v2) (v1)-(v2) -#define MUL(type, v1, v2) (v1)*(v2) +#define ADD(type, v1, v2) (v1) + (v2) +#define SUB(type, v1, v2) (v1) - (v2) +#define MUL(type, v1, v2) (v1) * (v2) -#define MIN(type, v1, v2) ((v1)<(v2))?(v1):(v2) -#define MAX(type, v1, v2) ((v1)>(v2))?(v1):(v2) +#define MIN(type, v1, v2) ((v1) < (v2)) ? (v1) : (v2) +#define MAX(type, v1, v2) ((v1) > (v2)) ? (v1) : (v2) -#define AND(type, v1, v2) (v1)&(v2) -#define OR(type, v1, v2) (v1)|(v2) -#define XOR(type, v1, v2) (v1)^(v2) -#define LSHIFT(type, v1, v2) (v1)<<(v2) -#define RSHIFT(type, v1, v2) (v1)>>(v2) +#define AND(type, v1, v2) (v1) & (v2) +#define OR(type, v1, v2) (v1) | (v2) +#define XOR(type, v1, v2) (v1) ^ (v2) +#define LSHIFT(type, v1, v2) (v1) << (v2) +#define RSHIFT(type, v1, v2) (v1) >> (v2) #define ABS_I(type, v1) abs((v1)) #define ABS_F(type, v1) fabs((v1)) @@ -79,14 +80,14 @@ void name(Imaging out, Imaging im1, Imaging im2)\ * PyFPE_END_PROTECT(result) */ -#define DIV_I(type, v1, v2) ((v2)!=0)?(v1)/(v2):0 -#define DIV_F(type, v1, v2) ((v2)!=0.0F)?(v1)/(v2):0.0F +#define DIV_I(type, v1, v2) ((v2) != 0) ? (v1) / (v2) : 0 +#define DIV_F(type, v1, v2) ((v2) != 0.0F) ? (v1) / (v2) : 0.0F -#define MOD_I(type, v1, v2) ((v2)!=0)?(v1)%(v2):0 -#define MOD_F(type, v1, v2) ((v2)!=0.0F)?fmod((v1),(v2)):0.0F +#define MOD_I(type, v1, v2) ((v2) != 0) ? (v1) % (v2) : 0 +#define MOD_F(type, v1, v2) ((v2) != 0.0F) ? fmod((v1), (v2)) : 0.0F -static int powi(int x, int y) -{ +static int +powi(int x, int y) { double v = pow(x, y) + 0.5; if (errno == EDOM) { return 0; @@ -96,21 +97,21 @@ static int powi(int x, int y) } else if (v > MAX_INT32) { v = MAX_INT32; } - return (int) v; + return (int)v; } #define POW_I(type, v1, v2) powi(v1, v2) #define POW_F(type, v1, v2) powf(v1, v2) /* FIXME: EDOM handling */ -#define DIFF_I(type, v1, v2) abs((v1)-(v2)) -#define DIFF_F(type, v1, v2) fabs((v1)-(v2)) +#define DIFF_I(type, v1, v2) abs((v1) - (v2)) +#define DIFF_F(type, v1, v2) fabs((v1) - (v2)) -#define EQ(type, v1, v2) (v1)==(v2) -#define NE(type, v1, v2) (v1)!=(v2) -#define LT(type, v1, v2) (v1)<(v2) -#define LE(type, v1, v2) (v1)<=(v2) -#define GT(type, v1, v2) (v1)>(v2) -#define GE(type, v1, v2) (v1)>=(v2) +#define EQ(type, v1, v2) (v1) == (v2) +#define NE(type, v1, v2) (v1) != (v2) +#define LT(type, v1, v2) (v1) < (v2) +#define LE(type, v1, v2) (v1) <= (v2) +#define GT(type, v1, v2) (v1) > (v2) +#define GE(type, v1, v2) (v1) >= (v2) UNOP(abs_I, ABS_I, INT32) UNOP(neg_I, NEG, INT32) @@ -162,8 +163,7 @@ BINOP(gt_F, GT, FLOAT32) BINOP(ge_F, GE, FLOAT32) static PyObject * -_unop(PyObject* self, PyObject* args) -{ +_unop(PyObject *self, PyObject *args) { Imaging out; Imaging im1; void (*unop)(Imaging, Imaging); @@ -173,10 +173,10 @@ _unop(PyObject* self, PyObject* args) return NULL; } - out = (Imaging) i0; - im1 = (Imaging) i1; + out = (Imaging)i0; + im1 = (Imaging)i1; - unop = (void*) op; + unop = (void *)op; unop(out, im1); @@ -185,8 +185,7 @@ _unop(PyObject* self, PyObject* args) } static PyObject * -_binop(PyObject* self, PyObject* args) -{ +_binop(PyObject *self, PyObject *args) { Imaging out; Imaging im1; Imaging im2; @@ -197,11 +196,11 @@ _binop(PyObject* self, PyObject* args) return NULL; } - out = (Imaging) i0; - im1 = (Imaging) i1; - im2 = (Imaging) i2; + out = (Imaging)i0; + im1 = (Imaging)i1; + im2 = (Imaging)i2; - binop = (void*) op; + binop = (void *)op; binop(out, im1, im2); @@ -210,15 +209,11 @@ _binop(PyObject* self, PyObject* args) } static PyMethodDef _functions[] = { - {"unop", _unop, 1}, - {"binop", _binop, 1}, - {NULL, NULL} -}; + {"unop", _unop, 1}, {"binop", _binop, 1}, {NULL, NULL}}; static void -install(PyObject *d, char* name, void* value) -{ - PyObject *v = PyLong_FromSsize_t((Py_ssize_t) value); +install(PyObject *d, char *name, void *value) { + PyObject *v = PyLong_FromSsize_t((Py_ssize_t)value); if (!v || PyDict_SetItemString(d, name, v)) { PyErr_Clear(); } @@ -226,8 +221,8 @@ install(PyObject *d, char* name, void* value) } static int -setup_module(PyObject* m) { - PyObject* d = PyModule_GetDict(m); +setup_module(PyObject *m) { + PyObject *d = PyModule_GetDict(m); install(d, "abs_I", abs_I); install(d, "neg_I", neg_I); @@ -279,14 +274,14 @@ setup_module(PyObject* m) { PyMODINIT_FUNC PyInit__imagingmath(void) { - PyObject* m; + PyObject *m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_imagingmath", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - _functions, /* m_methods */ + "_imagingmath", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + _functions, /* m_methods */ }; m = PyModule_Create(&module_def); diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index 0fe54ab77..c0644b616 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -14,7 +14,7 @@ #include "Python.h" #include "libImaging/Imaging.h" -#define LUT_SIZE (1<<9) +#define LUT_SIZE (1 << 9) /* Apply a morphologic LUT to a binary image. Outputs a a new binary image. @@ -27,9 +27,8 @@ Returns number of changed pixels. */ -static PyObject* -apply(PyObject *self, PyObject* args) -{ +static PyObject * +apply(PyObject *self, PyObject *args) { const char *lut; PyObject *py_lut; Py_ssize_t lut_len, i0, i1; @@ -58,18 +57,16 @@ apply(PyObject *self, PyObject* args) lut = PyBytes_AsString(py_lut); - imgin = (Imaging) i0; - imgout = (Imaging) i1; + imgin = (Imaging)i0; + imgout = (Imaging)i1; width = imgin->xsize; height = imgin->ysize; - if (imgin->type != IMAGING_TYPE_UINT8 || - imgin->bands != 1) { + if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } - if (imgout->type != IMAGING_TYPE_UINT8 || - imgout->bands != 1) { + if (imgout->type != IMAGING_TYPE_UINT8 || imgout->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } @@ -77,52 +74,46 @@ apply(PyObject *self, PyObject* args) inrows = imgin->image8; outrows = imgout->image8; - for (row_idx=0; row_idx < height; row_idx++) { + for (row_idx = 0; row_idx < height; row_idx++) { UINT8 *outrow = outrows[row_idx]; UINT8 *inrow = inrows[row_idx]; UINT8 *prow, *nrow; /* Previous and next row */ /* zero boundary conditions. TBD support other modes */ - outrow[0] = outrow[width-1] = 0; - if (row_idx==0 || row_idx == height-1) { - for(col_idx=0; col_idxtype != IMAGING_TYPE_UINT8 || - imgin->bands != 1) { + if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } @@ -177,39 +166,33 @@ match(PyObject *self, PyObject* args) width = imgin->xsize; height = imgin->ysize; - for (row_idx=1; row_idx < height-1; row_idx++) { + for (row_idx = 1; row_idx < height - 1; row_idx++) { UINT8 *inrow = inrows[row_idx]; UINT8 *prow, *nrow; - prow = inrows[row_idx-1]; - nrow = inrows[row_idx+1]; + prow = inrows[row_idx - 1]; + nrow = inrows[row_idx + 1]; - for (col_idx=1; col_idximage8; width = img->xsize; height = img->ysize; - for (row_idx=0; row_idx < height; row_idx++) { + for (row_idx = 0; row_idx < height; row_idx++) { UINT8 *row = rows[row_idx]; - for (col_idx=0; col_idxinterp; } @@ -69,10 +68,10 @@ PyMODINIT_FUNC PyInit__imagingtk(void) { static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_imagingtk", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - functions, /* m_methods */ + "_imagingtk", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + functions, /* m_methods */ }; PyObject *m; m = PyModule_Create(&module_def); diff --git a/src/_webp.c b/src/_webp.c index 6c6ca2aa6..c7875fa36 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -21,12 +21,14 @@ #endif -void ImagingSectionEnter(ImagingSectionCookie* cookie) { - *cookie = (PyThreadState *) PyEval_SaveThread(); +void +ImagingSectionEnter(ImagingSectionCookie *cookie) { + *cookie = (PyThreadState *)PyEval_SaveThread(); } -void ImagingSectionLeave(ImagingSectionCookie* cookie) { - PyEval_RestoreThread((PyThreadState*) *cookie); +void +ImagingSectionLeave(ImagingSectionCookie *cookie) { + PyEval_RestoreThread((PyThreadState *)*cookie); } /* -------------------------------------------------------------------- */ @@ -35,12 +37,15 @@ void ImagingSectionLeave(ImagingSectionCookie* cookie) { #ifdef HAVE_WEBPMUX -static const char* const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = { - "WEBP_MUX_NOT_FOUND", "WEBP_MUX_INVALID_ARGUMENT", "WEBP_MUX_BAD_DATA", - "WEBP_MUX_MEMORY_ERROR", "WEBP_MUX_NOT_ENOUGH_DATA" -}; +static const char *const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = { + "WEBP_MUX_NOT_FOUND", + "WEBP_MUX_INVALID_ARGUMENT", + "WEBP_MUX_BAD_DATA", + "WEBP_MUX_MEMORY_ERROR", + "WEBP_MUX_NOT_ENOUGH_DATA"}; -PyObject* HandleMuxError(WebPMuxError err, char* chunk) { +PyObject * +HandleMuxError(WebPMuxError err, char *chunk) { char message[100]; int message_len; assert(err <= WEBP_MUX_NOT_FOUND && err >= WEBP_MUX_NOT_ENOUGH_DATA); @@ -52,9 +57,11 @@ PyObject* HandleMuxError(WebPMuxError err, char* chunk) { // Create the error message if (chunk == NULL) { - message_len = sprintf(message, "could not assemble chunks: %s", kErrorMessages[-err]); + message_len = + sprintf(message, "could not assemble chunks: %s", kErrorMessages[-err]); } else { - message_len = sprintf(message, "could not set %.4s chunk: %s", chunk, kErrorMessages[-err]); + message_len = sprintf( + message, "could not set %.4s chunk: %s", chunk, kErrorMessages[-err]); } if (message_len < 0) { PyErr_SetString(PyExc_RuntimeError, "failed to construct error message"); @@ -90,8 +97,7 @@ PyObject* HandleMuxError(WebPMuxError err, char* chunk) { // Encoder type typedef struct { - PyObject_HEAD - WebPAnimEncoder* enc; + PyObject_HEAD WebPAnimEncoder *enc; WebPPicture frame; } WebPAnimEncoderObject; @@ -99,18 +105,17 @@ static PyTypeObject WebPAnimEncoder_Type; // Decoder type typedef struct { - PyObject_HEAD - WebPAnimDecoder* dec; + PyObject_HEAD WebPAnimDecoder *dec; WebPAnimInfo info; WebPData data; - char* mode; + char *mode; } WebPAnimDecoderObject; static PyTypeObject WebPAnimDecoder_Type; // Encoder functions -PyObject* _anim_encoder_new(PyObject* self, PyObject* args) -{ +PyObject * +_anim_encoder_new(PyObject *self, PyObject *args) { int width, height; uint32_t bgcolor; int loop_count; @@ -119,12 +124,21 @@ PyObject* _anim_encoder_new(PyObject* self, PyObject* args) int allow_mixed; int verbose; WebPAnimEncoderOptions enc_options; - WebPAnimEncoderObject* encp = NULL; - WebPAnimEncoder* enc = NULL; + WebPAnimEncoderObject *encp = NULL; + WebPAnimEncoder *enc = NULL; - if (!PyArg_ParseTuple(args, "iiIiiiiii", - &width, &height, &bgcolor, &loop_count, &minimize_size, - &kmin, &kmax, &allow_mixed, &verbose)) { + if (!PyArg_ParseTuple( + args, + "iiIiiiiii", + &width, + &height, + &bgcolor, + &loop_count, + &minimize_size, + &kmin, + &kmax, + &allow_mixed, + &verbose)) { return NULL; } @@ -154,7 +168,7 @@ PyObject* _anim_encoder_new(PyObject* self, PyObject* args) enc = WebPAnimEncoderNew(width, height, &enc_options); if (enc) { encp->enc = enc; - return (PyObject*) encp; + return (PyObject *)encp; } WebPPictureFree(&(encp->frame)); } @@ -164,33 +178,42 @@ PyObject* _anim_encoder_new(PyObject* self, PyObject* args) return NULL; } -PyObject* _anim_encoder_dealloc(PyObject* self) -{ - WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; +PyObject * +_anim_encoder_dealloc(PyObject *self) { + WebPAnimEncoderObject *encp = (WebPAnimEncoderObject *)self; WebPPictureFree(&(encp->frame)); WebPAnimEncoderDelete(encp->enc); Py_RETURN_NONE; } -PyObject* _anim_encoder_add(PyObject* self, PyObject* args) -{ - uint8_t* rgb; +PyObject * +_anim_encoder_add(PyObject *self, PyObject *args) { + uint8_t *rgb; Py_ssize_t size; int timestamp; int width; int height; - char* mode; + char *mode; int lossless; float quality_factor; int method; WebPConfig config; - WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; - WebPAnimEncoder* enc = encp->enc; - WebPPicture* frame = &(encp->frame); + WebPAnimEncoderObject *encp = (WebPAnimEncoderObject *)self; + WebPAnimEncoder *enc = encp->enc; + WebPPicture *frame = &(encp->frame); - if (!PyArg_ParseTuple(args, "z#iiisifi", - (char**)&rgb, &size, ×tamp, &width, &height, &mode, - &lossless, &quality_factor, &method)) { + if (!PyArg_ParseTuple( + args, + "z#iiisifi", + (char **)&rgb, + &size, + ×tamp, + &width, + &height, + &mode, + &lossless, + &quality_factor, + &method)) { return NULL; } @@ -218,10 +241,10 @@ PyObject* _anim_encoder_add(PyObject* self, PyObject* args) // Populate the frame with raw bytes passed to us frame->width = width; frame->height = height; - frame->use_argb = 1; // Don't convert RGB pixels to YUV - if (strcmp(mode, "RGBA")==0) { + frame->use_argb = 1; // Don't convert RGB pixels to YUV + if (strcmp(mode, "RGBA") == 0) { WebPPictureImportRGBA(frame, rgb, 4 * width); - } else if (strcmp(mode, "RGBX")==0) { + } else if (strcmp(mode, "RGBX") == 0) { WebPPictureImportRGBX(frame, rgb, 4 * width); } else { WebPPictureImportRGB(frame, rgb, 3 * width); @@ -236,22 +259,29 @@ PyObject* _anim_encoder_add(PyObject* self, PyObject* args) Py_RETURN_NONE; } -PyObject* _anim_encoder_assemble(PyObject* self, PyObject* args) -{ - uint8_t* icc_bytes; - uint8_t* exif_bytes; - uint8_t* xmp_bytes; +PyObject * +_anim_encoder_assemble(PyObject *self, PyObject *args) { + uint8_t *icc_bytes; + uint8_t *exif_bytes; + uint8_t *xmp_bytes; Py_ssize_t icc_size; Py_ssize_t exif_size; Py_ssize_t xmp_size; WebPData webp_data; - WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; - WebPAnimEncoder* enc = encp->enc; - WebPMux* mux = NULL; - PyObject* ret = NULL; + WebPAnimEncoderObject *encp = (WebPAnimEncoderObject *)self; + WebPAnimEncoder *enc = encp->enc; + WebPMux *mux = NULL; + PyObject *ret = NULL; - if (!PyArg_ParseTuple(args, "s#s#s#", - &icc_bytes, &icc_size, &exif_bytes, &exif_size, &xmp_bytes, &xmp_size)) { + if (!PyArg_ParseTuple( + args, + "s#s#s#", + &icc_bytes, + &icc_size, + &exif_bytes, + &exif_size, + &xmp_bytes, + &xmp_size)) { return NULL; } @@ -270,9 +300,9 @@ PyObject* _anim_encoder_assemble(PyObject* self, PyObject* args) int i_icc_size = (int)icc_size; int i_exif_size = (int)exif_size; int i_xmp_size = (int)xmp_size; - WebPData icc_profile = { icc_bytes, i_icc_size }; - WebPData exif = { exif_bytes, i_exif_size }; - WebPData xmp = { xmp_bytes, i_xmp_size }; + WebPData icc_profile = {icc_bytes, i_icc_size}; + WebPData exif = {exif_bytes, i_exif_size}; + WebPData xmp = {xmp_bytes, i_xmp_size}; mux = WebPMuxCreate(&webp_data, 1); if (mux == NULL) { @@ -312,7 +342,7 @@ PyObject* _anim_encoder_assemble(PyObject* self, PyObject* args) } // Convert to Python bytes - ret = PyBytes_FromStringAndSize((char*)webp_data.bytes, webp_data.size); + ret = PyBytes_FromStringAndSize((char *)webp_data.bytes, webp_data.size); WebPDataClear(&webp_data); // If we had to re-mux, we should free it now that we're done with it @@ -324,21 +354,21 @@ PyObject* _anim_encoder_assemble(PyObject* self, PyObject* args) } // Decoder functions -PyObject* _anim_decoder_new(PyObject* self, PyObject* args) -{ +PyObject * +_anim_decoder_new(PyObject *self, PyObject *args) { PyBytesObject *webp_string; const uint8_t *webp; Py_ssize_t size; WebPData webp_src; - char* mode; + char *mode; WebPDecoderConfig config; - WebPAnimDecoderObject* decp = NULL; - WebPAnimDecoder* dec = NULL; + WebPAnimDecoderObject *decp = NULL; + WebPAnimDecoder *dec = NULL; if (!PyArg_ParseTuple(args, "S", &webp_string)) { return NULL; } - PyBytes_AsStringAndSize((PyObject *)webp_string, (char**)&webp, &size); + PyBytes_AsStringAndSize((PyObject *)webp_string, (char **)&webp, &size); webp_src.bytes = webp; webp_src.size = size; @@ -359,7 +389,7 @@ PyObject* _anim_decoder_new(PyObject* self, PyObject* args) if (dec) { if (WebPAnimDecoderGetInfo(dec, &(decp->info))) { decp->dec = dec; - return (PyObject*)decp; + return (PyObject *)decp; } } } @@ -369,33 +399,34 @@ PyObject* _anim_decoder_new(PyObject* self, PyObject* args) return NULL; } -PyObject* _anim_decoder_dealloc(PyObject* self) -{ - WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; +PyObject * +_anim_decoder_dealloc(PyObject *self) { + WebPAnimDecoderObject *decp = (WebPAnimDecoderObject *)self; WebPDataClear(&(decp->data)); WebPAnimDecoderDelete(decp->dec); Py_RETURN_NONE; } -PyObject* _anim_decoder_get_info(PyObject* self) -{ - WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; - WebPAnimInfo* info = &(decp->info); +PyObject * +_anim_decoder_get_info(PyObject *self) { + WebPAnimDecoderObject *decp = (WebPAnimDecoderObject *)self; + WebPAnimInfo *info = &(decp->info); - return Py_BuildValue("IIIIIs", - info->canvas_width, info->canvas_height, + return Py_BuildValue( + "IIIIIs", + info->canvas_width, + info->canvas_height, info->loop_count, info->bgcolor, info->frame_count, - decp->mode - ); + decp->mode); } -PyObject* _anim_decoder_get_chunk(PyObject* self, PyObject* args) -{ - char* mode; - WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; - const WebPDemuxer* demux; +PyObject * +_anim_decoder_get_chunk(PyObject *self, PyObject *args) { + char *mode; + WebPAnimDecoderObject *decp = (WebPAnimDecoderObject *)self; + const WebPDemuxer *demux; WebPChunkIterator iter; PyObject *ret; @@ -408,27 +439,27 @@ PyObject* _anim_decoder_get_chunk(PyObject* self, PyObject* args) Py_RETURN_NONE; } - ret = PyBytes_FromStringAndSize((const char*)iter.chunk.bytes, iter.chunk.size); + ret = PyBytes_FromStringAndSize((const char *)iter.chunk.bytes, iter.chunk.size); WebPDemuxReleaseChunkIterator(&iter); return ret; } -PyObject* _anim_decoder_get_next(PyObject* self) -{ - uint8_t* buf; +PyObject * +_anim_decoder_get_next(PyObject *self) { + uint8_t *buf; int timestamp; - PyObject* bytes; - PyObject* ret; - WebPAnimDecoderObject* decp = (WebPAnimDecoderObject*)self; + PyObject *bytes; + PyObject *ret; + WebPAnimDecoderObject *decp = (WebPAnimDecoderObject *)self; if (!WebPAnimDecoderGetNext(decp->dec, &buf, ×tamp)) { PyErr_SetString(PyExc_OSError, "failed to read next frame"); return NULL; } - bytes = PyBytes_FromStringAndSize((char *)buf, - decp->info.canvas_width * 4 * decp->info.canvas_height); + bytes = PyBytes_FromStringAndSize( + (char *)buf, decp->info.canvas_width * 4 * decp->info.canvas_height); ret = Py_BuildValue("Si", bytes, timestamp); @@ -436,9 +467,9 @@ PyObject* _anim_decoder_get_next(PyObject* self) return ret; } -PyObject* _anim_decoder_reset(PyObject* self) -{ - WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; +PyObject * +_anim_decoder_reset(PyObject *self) { + WebPAnimDecoderObject *decp = (WebPAnimDecoderObject *)self; WebPAnimDecoderReset(decp->dec); Py_RETURN_NONE; } @@ -456,37 +487,36 @@ static struct PyMethodDef _anim_encoder_methods[] = { // WebPAnimDecoder type definition static PyTypeObject WebPAnimEncoder_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "WebPAnimEncoder", /*tp_name */ - sizeof(WebPAnimEncoderObject), /*tp_size */ - 0, /*tp_itemsize */ + PyVarObject_HEAD_INIT(NULL, 0) "WebPAnimEncoder", /*tp_name */ + sizeof(WebPAnimEncoderObject), /*tp_size */ + 0, /*tp_itemsize */ /* methods */ (destructor)_anim_encoder_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - _anim_encoder_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + _anim_encoder_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; // WebPAnimDecoder methods @@ -500,37 +530,36 @@ static struct PyMethodDef _anim_decoder_methods[] = { // WebPAnimDecoder type definition static PyTypeObject WebPAnimDecoder_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "WebPAnimDecoder", /*tp_name */ - sizeof(WebPAnimDecoderObject), /*tp_size */ - 0, /*tp_itemsize */ + PyVarObject_HEAD_INIT(NULL, 0) "WebPAnimDecoder", /*tp_name */ + sizeof(WebPAnimDecoderObject), /*tp_size */ + 0, /*tp_itemsize */ /* methods */ (destructor)_anim_decoder_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - _anim_decoder_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + _anim_decoder_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; #endif @@ -539,19 +568,19 @@ static PyTypeObject WebPAnimDecoder_Type = { /* Legacy WebP Support */ /* -------------------------------------------------------------------- */ -PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) -{ +PyObject * +WebPEncode_wrapper(PyObject *self, PyObject *args) { int width; int height; int lossless; float quality_factor; int method; - uint8_t* rgb; - uint8_t* icc_bytes; - uint8_t* exif_bytes; - uint8_t* xmp_bytes; - uint8_t* output; - char* mode; + uint8_t *rgb; + uint8_t *icc_bytes; + uint8_t *exif_bytes; + uint8_t *xmp_bytes; + uint8_t *output; + char *mode; Py_ssize_t size; Py_ssize_t icc_size; Py_ssize_t exif_size; @@ -565,9 +594,23 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) WebPMemoryWriter writer; WebPPicture pic; - if (!PyArg_ParseTuple(args, "y#iiifss#is#s#", - (char**)&rgb, &size, &width, &height, &lossless, &quality_factor, &mode, - &icc_bytes, &icc_size, &method, &exif_bytes, &exif_size, &xmp_bytes, &xmp_size)) { + if (!PyArg_ParseTuple( + args, + "y#iiifss#is#s#", + (char **)&rgb, + &size, + &width, + &height, + &lossless, + &quality_factor, + &mode, + &icc_bytes, + &icc_size, + &method, + &exif_bytes, + &exif_size, + &xmp_bytes, + &xmp_size)) { return NULL; } @@ -602,7 +645,7 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) } pic.width = width; pic.height = height; - pic.use_argb = 1; // Don't convert RGB pixels to YUV + pic.use_argb = 1; // Don't convert RGB pixels to YUV if (rgba_mode) { WebPPictureImportRGBA(&pic, rgb, channels * width); @@ -628,98 +671,100 @@ PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) #ifndef HAVE_WEBPMUX if (ret_size > 0) { - PyObject *ret = PyBytes_FromStringAndSize((char*)output, ret_size); + PyObject *ret = PyBytes_FromStringAndSize((char *)output, ret_size); free(output); return ret; } #else { - /* I want to truncate the *_size items that get passed into WebP - data. Pypy2.1.0 had some issues where the Py_ssize_t items had - data in the upper byte. (Not sure why, it shouldn't have been there) - */ - int i_icc_size = (int)icc_size; - int i_exif_size = (int)exif_size; - int i_xmp_size = (int)xmp_size; - WebPData output_data = {0}; - WebPData image = { output, ret_size }; - WebPData icc_profile = { icc_bytes, i_icc_size }; - WebPData exif = { exif_bytes, i_exif_size }; - WebPData xmp = { xmp_bytes, i_xmp_size }; - WebPMuxError err; - int dbg = 0; + /* I want to truncate the *_size items that get passed into WebP + data. Pypy2.1.0 had some issues where the Py_ssize_t items had + data in the upper byte. (Not sure why, it shouldn't have been there) + */ + int i_icc_size = (int)icc_size; + int i_exif_size = (int)exif_size; + int i_xmp_size = (int)xmp_size; + WebPData output_data = {0}; + WebPData image = {output, ret_size}; + WebPData icc_profile = {icc_bytes, i_icc_size}; + WebPData exif = {exif_bytes, i_exif_size}; + WebPData xmp = {xmp_bytes, i_xmp_size}; + WebPMuxError err; + int dbg = 0; - int copy_data = 0; // value 1 indicates given data WILL be copied to the mux - // and value 0 indicates data will NOT be copied. + int copy_data = 0; // value 1 indicates given data WILL be copied to the mux + // and value 0 indicates data will NOT be copied. - WebPMux* mux = WebPMuxNew(); - WebPMuxSetImage(mux, &image, copy_data); + WebPMux *mux = WebPMuxNew(); + WebPMuxSetImage(mux, &image, copy_data); - if (dbg) { - /* was getting %ld icc_size == 0, icc_size>0 was true */ - fprintf(stderr, "icc size %d, %d \n", i_icc_size, i_icc_size > 0); - } - - if (i_icc_size > 0) { if (dbg) { - fprintf(stderr, "Adding ICC Profile\n"); + /* was getting %ld icc_size == 0, icc_size>0 was true */ + fprintf(stderr, "icc size %d, %d \n", i_icc_size, i_icc_size > 0); + } + + if (i_icc_size > 0) { + if (dbg) { + fprintf(stderr, "Adding ICC Profile\n"); + } + err = WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); + if (err != WEBP_MUX_OK) { + return HandleMuxError(err, "ICCP"); + } } - err = WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); - if (err != WEBP_MUX_OK) { - return HandleMuxError(err, "ICCP"); - } - } - if (dbg) { - fprintf(stderr, "exif size %d \n", i_exif_size); - } - if (i_exif_size > 0) { if (dbg) { - fprintf(stderr, "Adding Exif Data\n"); + fprintf(stderr, "exif size %d \n", i_exif_size); } - err = WebPMuxSetChunk(mux, "EXIF", &exif, copy_data); - if (err != WEBP_MUX_OK) { - return HandleMuxError(err, "EXIF"); + if (i_exif_size > 0) { + if (dbg) { + fprintf(stderr, "Adding Exif Data\n"); + } + err = WebPMuxSetChunk(mux, "EXIF", &exif, copy_data); + if (err != WEBP_MUX_OK) { + return HandleMuxError(err, "EXIF"); + } } - } - if (dbg) { - fprintf(stderr, "xmp size %d \n", i_xmp_size); - } - if (i_xmp_size > 0) { - if (dbg){ - fprintf(stderr, "Adding XMP Data\n"); + if (dbg) { + fprintf(stderr, "xmp size %d \n", i_xmp_size); } - err = WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); - if (err != WEBP_MUX_OK) { - return HandleMuxError(err, "XMP "); + if (i_xmp_size > 0) { + if (dbg) { + fprintf(stderr, "Adding XMP Data\n"); + } + err = WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); + if (err != WEBP_MUX_OK) { + return HandleMuxError(err, "XMP "); + } } - } - WebPMuxAssemble(mux, &output_data); - WebPMuxDelete(mux); - free(output); + WebPMuxAssemble(mux, &output_data); + WebPMuxDelete(mux); + free(output); - ret_size = output_data.size; - if (ret_size > 0) { - PyObject *ret = PyBytes_FromStringAndSize((char*)output_data.bytes, ret_size); - WebPDataClear(&output_data); - return ret; - } + ret_size = output_data.size; + if (ret_size > 0) { + PyObject *ret = + PyBytes_FromStringAndSize((char *)output_data.bytes, ret_size); + WebPDataClear(&output_data); + return ret; + } } #endif Py_RETURN_NONE; } -PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) -{ - PyBytesObject* webp_string; - const uint8_t* webp; +PyObject * +WebPDecode_wrapper(PyObject *self, PyObject *args) { + PyBytesObject *webp_string; + const uint8_t *webp; Py_ssize_t size; - PyObject *ret = Py_None, *bytes = NULL, *pymode = NULL, *icc_profile = NULL, *exif = NULL; + PyObject *ret = Py_None, *bytes = NULL, *pymode = NULL, *icc_profile = NULL, + *exif = NULL; WebPDecoderConfig config; VP8StatusCode vp8_status_code = VP8_STATUS_OK; - char* mode = "RGB"; + char *mode = "RGB"; if (!PyArg_ParseTuple(args, "S", &webp_string)) { return NULL; @@ -729,7 +774,7 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) Py_RETURN_NONE; } - PyBytes_AsStringAndSize((PyObject*) webp_string, (char**)&webp, &size); + PyBytes_AsStringAndSize((PyObject *)webp_string, (char **)&webp, &size); vp8_status_code = WebPGetFeatures(webp, size, &config.input); if (vp8_status_code == VP8_STATUS_OK) { @@ -743,39 +788,40 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) #ifndef HAVE_WEBPMUX vp8_status_code = WebPDecode(webp, size, &config); #else - { - int copy_data = 0; - WebPData data = { webp, size }; - WebPMuxFrameInfo image; - WebPData icc_profile_data = {0}; - WebPData exif_data = {0}; - - WebPMux* mux = WebPMuxCreate(&data, copy_data); - if (NULL == mux) { - goto end; - } - - if (WEBP_MUX_OK != WebPMuxGetFrame(mux, 1, &image)) { + int copy_data = 0; + WebPData data = {webp, size}; + WebPMuxFrameInfo image; + WebPData icc_profile_data = {0}; + WebPData exif_data = {0}; + + WebPMux *mux = WebPMuxCreate(&data, copy_data); + if (NULL == mux) { + goto end; + } + + if (WEBP_MUX_OK != WebPMuxGetFrame(mux, 1, &image)) { + WebPMuxDelete(mux); + goto end; + } + + webp = image.bitstream.bytes; + size = image.bitstream.size; + + vp8_status_code = WebPDecode(webp, size, &config); + + if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "ICCP", &icc_profile_data)) { + icc_profile = PyBytes_FromStringAndSize( + (const char *)icc_profile_data.bytes, icc_profile_data.size); + } + + if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "EXIF", &exif_data)) { + exif = PyBytes_FromStringAndSize( + (const char *)exif_data.bytes, exif_data.size); + } + + WebPDataClear(&image.bitstream); WebPMuxDelete(mux); - goto end; - } - - webp = image.bitstream.bytes; - size = image.bitstream.size; - - vp8_status_code = WebPDecode(webp, size, &config); - - if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "ICCP", &icc_profile_data)) { - icc_profile = PyBytes_FromStringAndSize((const char*)icc_profile_data.bytes, icc_profile_data.size); - } - - if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "EXIF", &exif_data)) { - exif = PyBytes_FromStringAndSize((const char*)exif_data.bytes, exif_data.size); - } - - WebPDataClear(&image.bitstream); - WebPMuxDelete(mux); } #endif } @@ -785,20 +831,24 @@ PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) } if (config.output.colorspace < MODE_YUV) { - bytes = PyBytes_FromStringAndSize((char*)config.output.u.RGBA.rgba, - config.output.u.RGBA.size); + bytes = PyBytes_FromStringAndSize( + (char *)config.output.u.RGBA.rgba, config.output.u.RGBA.size); } else { // Skipping YUV for now. Need Test Images. // UNDONE -- unclear if we'll ever get here if we set mode_rgb* - bytes = PyBytes_FromStringAndSize((char*)config.output.u.YUVA.y, - config.output.u.YUVA.y_size); + bytes = PyBytes_FromStringAndSize( + (char *)config.output.u.YUVA.y, config.output.u.YUVA.y_size); } pymode = PyUnicode_FromString(mode); - ret = Py_BuildValue("SiiSSS", bytes, config.output.width, - config.output.height, pymode, - NULL == icc_profile ? Py_None : icc_profile, - NULL == exif ? Py_None : exif); + ret = Py_BuildValue( + "SiiSSS", + bytes, + config.output.width, + config.output.height, + pymode, + NULL == icc_profile ? Py_None : icc_profile, + NULL == exif ? Py_None : exif); end: WebPFreeDecBuffer(&config.output); @@ -817,17 +867,22 @@ end: // Return the decoder's version number, packed in hexadecimal using 8bits for // each of major/minor/revision. E.g: v2.5.7 is 0x020507. -PyObject* WebPDecoderVersion_wrapper() { +PyObject * +WebPDecoderVersion_wrapper() { return Py_BuildValue("i", WebPGetDecoderVersion()); } // Version as string -const char* -WebPDecoderVersion_str(void) -{ +const char * +WebPDecoderVersion_str(void) { static char version[20]; int version_number = WebPGetDecoderVersion(); - sprintf(version, "%d.%d.%d", version_number >> 16, (version_number >> 8) % 0x100, version_number % 0x100); + sprintf( + version, + "%d.%d.%d", + version_number >> 16, + (version_number >> 8) % 0x100, + version_number % 0x100); return version; } @@ -835,11 +890,13 @@ WebPDecoderVersion_str(void) * The version of webp that ships with (0.1.3) Ubuntu 12.04 doesn't handle alpha well. * Files that are valid with 0.3 are reported as being invalid. */ -int WebPDecoderBuggyAlpha(void) { - return WebPGetDecoderVersion()==0x0103; +int +WebPDecoderBuggyAlpha(void) { + return WebPGetDecoderVersion() == 0x0103; } -PyObject* WebPDecoderBuggyAlpha_wrapper() { +PyObject * +WebPDecoderBuggyAlpha_wrapper() { return Py_BuildValue("i", WebPDecoderBuggyAlpha()); } @@ -847,8 +904,7 @@ PyObject* WebPDecoderBuggyAlpha_wrapper() { /* Module Setup */ /* -------------------------------------------------------------------- */ -static PyMethodDef webpMethods[] = -{ +static PyMethodDef webpMethods[] = { #ifdef HAVE_WEBPANIM {"WebPAnimDecoder", _anim_decoder_new, METH_VARARGS, "WebPAnimDecoder"}, {"WebPAnimEncoder", _anim_encoder_new, METH_VARARGS, "WebPAnimEncoder"}, @@ -856,11 +912,14 @@ static PyMethodDef webpMethods[] = {"WebPEncode", WebPEncode_wrapper, METH_VARARGS, "WebPEncode"}, {"WebPDecode", WebPDecode_wrapper, METH_VARARGS, "WebPDecode"}, {"WebPDecoderVersion", WebPDecoderVersion_wrapper, METH_NOARGS, "WebPVersion"}, - {"WebPDecoderBuggyAlpha", WebPDecoderBuggyAlpha_wrapper, METH_NOARGS, "WebPDecoderBuggyAlpha"}, - {NULL, NULL} -}; + {"WebPDecoderBuggyAlpha", + WebPDecoderBuggyAlpha_wrapper, + METH_NOARGS, + "WebPDecoderBuggyAlpha"}, + {NULL, NULL}}; -void addMuxFlagToModule(PyObject* m) { +void +addMuxFlagToModule(PyObject *m) { #ifdef HAVE_WEBPMUX PyModule_AddObject(m, "HAVE_WEBPMUX", Py_True); #else @@ -868,7 +927,8 @@ void addMuxFlagToModule(PyObject* m) { #endif } -void addAnimFlagToModule(PyObject* m) { +void +addAnimFlagToModule(PyObject *m) { #ifdef HAVE_WEBPANIM PyModule_AddObject(m, "HAVE_WEBPANIM", Py_True); #else @@ -876,18 +936,21 @@ void addAnimFlagToModule(PyObject* m) { #endif } -void addTransparencyFlagToModule(PyObject* m) { - PyModule_AddObject(m, "HAVE_TRANSPARENCY", - PyBool_FromLong(!WebPDecoderBuggyAlpha())); +void +addTransparencyFlagToModule(PyObject *m) { + PyModule_AddObject( + m, "HAVE_TRANSPARENCY", PyBool_FromLong(!WebPDecoderBuggyAlpha())); } -static int setup_module(PyObject* m) { - PyObject* d = PyModule_GetDict(m); +static int +setup_module(PyObject *m) { + PyObject *d = PyModule_GetDict(m); addMuxFlagToModule(m); addAnimFlagToModule(m); addTransparencyFlagToModule(m); - PyDict_SetItemString(d, "webpdecoder_version", PyUnicode_FromString(WebPDecoderVersion_str())); + PyDict_SetItemString( + d, "webpdecoder_version", PyUnicode_FromString(WebPDecoderVersion_str())); #ifdef HAVE_WEBPANIM /* Ready object types */ @@ -901,14 +964,14 @@ static int setup_module(PyObject* m) { PyMODINIT_FUNC PyInit__webp(void) { - PyObject* m; + PyObject *m; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, - "_webp", /* m_name */ - NULL, /* m_doc */ - -1, /* m_size */ - webpMethods, /* m_methods */ + "_webp", /* m_name */ + NULL, /* m_doc */ + -1, /* m_size */ + webpMethods, /* m_methods */ }; m = PyModule_Create(&module_def); diff --git a/src/decode.c b/src/decode.c index 5c57fea5d..5d64bd0b9 100644 --- a/src/decode.c +++ b/src/decode.c @@ -39,31 +39,28 @@ #include "libImaging/Bit.h" #include "libImaging/Sgi.h" - /* -------------------------------------------------------------------- */ /* Common */ /* -------------------------------------------------------------------- */ typedef struct { - PyObject_HEAD - int (*decode)(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); + PyObject_HEAD int (*decode)( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); int (*cleanup)(ImagingCodecState state); struct ImagingCodecStateInstance state; Imaging im; - PyObject* lock; + PyObject *lock; int pulls_fd; } ImagingDecoderObject; static PyTypeObject ImagingDecoderType; -static ImagingDecoderObject* -PyImaging_DecoderNew(int contextsize) -{ +static ImagingDecoderObject * +PyImaging_DecoderNew(int contextsize) { ImagingDecoderObject *decoder; void *context; - if(PyType_Ready(&ImagingDecoderType) < 0) { + if (PyType_Ready(&ImagingDecoderType) < 0) { return NULL; } @@ -77,10 +74,10 @@ PyImaging_DecoderNew(int contextsize) /* Allocate decoder context */ if (contextsize > 0) { - context = (void*) calloc(1, contextsize); + context = (void *)calloc(1, contextsize); if (!context) { Py_DECREF(decoder); - (void) ImagingError_MemoryError(); + (void)ImagingError_MemoryError(); return NULL; } } else { @@ -105,8 +102,7 @@ PyImaging_DecoderNew(int contextsize) } static void -_dealloc(ImagingDecoderObject* decoder) -{ +_dealloc(ImagingDecoderObject *decoder) { if (decoder->cleanup) { decoder->cleanup(&decoder->state); } @@ -117,10 +113,9 @@ _dealloc(ImagingDecoderObject* decoder) PyObject_Del(decoder); } -static PyObject* -_decode(ImagingDecoderObject* decoder, PyObject* args) -{ - UINT8* buffer; +static PyObject * +_decode(ImagingDecoderObject *decoder, PyObject *args) { + UINT8 *buffer; Py_ssize_t bufsize; int status; ImagingSectionCookie cookie; @@ -142,26 +137,23 @@ _decode(ImagingDecoderObject* decoder, PyObject* args) return Py_BuildValue("ii", status, decoder->state.errcode); } -static PyObject* -_decode_cleanup(ImagingDecoderObject* decoder, PyObject* args) -{ +static PyObject * +_decode_cleanup(ImagingDecoderObject *decoder, PyObject *args) { int status = 0; - if (decoder->cleanup){ + if (decoder->cleanup) { status = decoder->cleanup(&decoder->state); } return Py_BuildValue("i", status); } +extern Imaging +PyImaging_AsImaging(PyObject *op); - -extern Imaging PyImaging_AsImaging(PyObject *op); - -static PyObject* -_setimage(ImagingDecoderObject* decoder, PyObject* args) -{ - PyObject* op; +static PyObject * +_setimage(ImagingDecoderObject *decoder, PyObject *args) { + PyObject *op; Imaging im; ImagingCodecState state; int x0, y0, x1, y1; @@ -192,10 +184,8 @@ _setimage(ImagingDecoderObject* decoder, PyObject* args) state->ysize = y1 - y0; } - if (state->xsize <= 0 || - state->xsize + state->xoff > (int) im->xsize || - state->ysize <= 0 || - state->ysize + state->yoff > (int) im->ysize) { + if (state->xsize <= 0 || state->xsize + state->xoff > (int)im->xsize || + state->ysize <= 0 || state->ysize + state->yoff > (int)im->ysize) { PyErr_SetString(PyExc_ValueError, "tile cannot extend outside image"); return NULL; } @@ -203,13 +193,13 @@ _setimage(ImagingDecoderObject* decoder, PyObject* args) /* Allocate memory buffer (if bits field is set) */ if (state->bits > 0) { if (!state->bytes) { - if (state->xsize > ((INT_MAX / state->bits)-7)){ + if (state->xsize > ((INT_MAX / state->bits) - 7)) { return ImagingError_MemoryError(); } - state->bytes = (state->bits * state->xsize+7)/8; + state->bytes = (state->bits * state->xsize + 7) / 8; } /* malloc check ok, overflow checked above */ - state->buffer = (UINT8*) malloc(state->bytes); + state->buffer = (UINT8 *)malloc(state->bytes); if (!state->buffer) { return ImagingError_MemoryError(); } @@ -225,10 +215,9 @@ _setimage(ImagingDecoderObject* decoder, PyObject* args) return Py_None; } -static PyObject* -_setfd(ImagingDecoderObject* decoder, PyObject* args) -{ - PyObject* fd; +static PyObject * +_setfd(ImagingDecoderObject *decoder, PyObject *args) { + PyObject *fd; ImagingCodecState state; if (!PyArg_ParseTuple(args, "O", &fd)) { @@ -244,10 +233,8 @@ _setfd(ImagingDecoderObject* decoder, PyObject* args) return Py_None; } - static PyObject * -_get_pulls_fd(ImagingDecoderObject *decoder) -{ +_get_pulls_fd(ImagingDecoderObject *decoder) { return PyBool_FromLong(decoder->pulls_fd); } @@ -260,52 +247,51 @@ static struct PyMethodDef methods[] = { }; static struct PyGetSetDef getseters[] = { - {"pulls_fd", (getter)_get_pulls_fd, NULL, + {"pulls_fd", + (getter)_get_pulls_fd, + NULL, "True if this decoder expects to pull from self.fd itself.", NULL}, {NULL, NULL, NULL, NULL, NULL} /* sentinel */ }; static PyTypeObject ImagingDecoderType = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingDecoder", /*tp_name*/ - sizeof(ImagingDecoderObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingDecoder", /*tp_name*/ + sizeof(ImagingDecoderObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - getseters, /*tp_getset*/ + (destructor)_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + getseters, /*tp_getset*/ }; /* -------------------------------------------------------------------- */ int -get_unpacker(ImagingDecoderObject* decoder, const char* mode, - const char* rawmode) -{ +get_unpacker(ImagingDecoderObject *decoder, const char *mode, const char *rawmode) { int bits; ImagingShuffler unpack; @@ -322,24 +308,21 @@ get_unpacker(ImagingDecoderObject* decoder, const char* mode, return 0; } - /* -------------------------------------------------------------------- */ /* BIT (packed fields) */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_BitDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_BitDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - int bits = 8; - int pad = 8; - int fill = 0; - int sign = 0; + char *mode; + int bits = 8; + int pad = 8; + int fill = 0; + int sign = 0; int ystep = 1; - if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, - &sign, &ystep)) { + if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, &sign, &ystep)) { return NULL; } @@ -357,26 +340,24 @@ PyImaging_BitDecoderNew(PyObject* self, PyObject* args) decoder->state.ystep = ystep; - ((BITSTATE*)decoder->state.context)->bits = bits; - ((BITSTATE*)decoder->state.context)->pad = pad; - ((BITSTATE*)decoder->state.context)->fill = fill; - ((BITSTATE*)decoder->state.context)->sign = sign; + ((BITSTATE *)decoder->state.context)->bits = bits; + ((BITSTATE *)decoder->state.context)->pad = pad; + ((BITSTATE *)decoder->state.context)->fill = fill; + ((BITSTATE *)decoder->state.context)->sign = sign; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* BCn: GPU block-compressed texture formats */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_BcnDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* actual; + char *mode; + char *actual; int n = 0; int ystep = 1; if (!PyArg_ParseTuple(args, "s|ii", &mode, &n, &ystep)) { @@ -384,20 +365,23 @@ PyImaging_BcnDecoderNew(PyObject* self, PyObject* args) } switch (n) { - case 1: /* BC1: 565 color, 1-bit alpha */ - case 2: /* BC2: 565 color, 4-bit alpha */ - case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */ - case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */ - case 7: /* BC7: 4-channel 8-bit via everything */ - actual = "RGBA"; break; - case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */ - actual = "L"; break; - case 6: /* BC6: 3-channel 16-bit float */ - /* TODO: support 4-channel floating point images */ - actual = "RGBAF"; break; - default: - PyErr_SetString(PyExc_ValueError, "block compression type unknown"); - return NULL; + case 1: /* BC1: 565 color, 1-bit alpha */ + case 2: /* BC2: 565 color, 4-bit alpha */ + case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */ + case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */ + case 7: /* BC7: 4-channel 8-bit via everything */ + actual = "RGBA"; + break; + case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */ + actual = "L"; + break; + case 6: /* BC6: 3-channel 16-bit float */ + /* TODO: support 4-channel floating point images */ + actual = "RGBAF"; + break; + default: + PyErr_SetString(PyExc_ValueError, "block compression type unknown"); + return NULL; } if (strcmp(mode, actual) != 0) { @@ -414,18 +398,16 @@ PyImaging_BcnDecoderNew(PyObject* self, PyObject* args) decoder->state.state = n; decoder->state.ystep = ystep; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* FLI */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_FliDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_FliDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) { @@ -434,20 +416,18 @@ PyImaging_FliDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingFliDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* GIF */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_GifDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_GifDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; + char *mode; int bits = 8; int interlace = 0; if (!PyArg_ParseTuple(args, "s|ii", &mode, &bits, &interlace)) { @@ -466,24 +446,22 @@ PyImaging_GifDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingGifDecode; - ((GIFDECODERSTATE*)decoder->state.context)->bits = bits; - ((GIFDECODERSTATE*)decoder->state.context)->interlace = interlace; + ((GIFDECODERSTATE *)decoder->state.context)->bits = bits; + ((GIFDECODERSTATE *)decoder->state.context)->interlace = interlace; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* HEX */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_HexDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_HexDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { return NULL; } @@ -499,10 +477,9 @@ PyImaging_HexDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingHexDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* LibTiff */ /* -------------------------------------------------------------------- */ @@ -513,17 +490,16 @@ PyImaging_HexDecoderNew(PyObject* self, PyObject* args) #include -PyObject* -PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; - char* mode; - char* rawmode; - char* compname; +PyObject * +PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; + char *mode; + char *rawmode; + char *compname; int fp; uint32 ifdoffset; - if (! PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) { + if (!PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) { return NULL; } @@ -538,31 +514,29 @@ PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) return NULL; } - if (! ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) { + if (!ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) { Py_DECREF(decoder); PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); return NULL; } - decoder->decode = ImagingLibTiffDecode; + decoder->decode = ImagingLibTiffDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } #endif - /* -------------------------------------------------------------------- */ /* PackBits */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_PackbitsDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { return NULL; } @@ -578,18 +552,16 @@ PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingPackbitsDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* PCD */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_PcdDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_PcdDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) { @@ -603,21 +575,19 @@ PyImaging_PcdDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingPcdDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* PCX */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_PcxDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_PcxDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; int stride; if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) { return NULL; @@ -636,23 +606,21 @@ PyImaging_PcxDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingPcxDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* RAW */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_RawDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_RawDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; int stride = 0; - int ystep = 1; + int ystep = 1; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) { return NULL; } @@ -670,23 +638,21 @@ PyImaging_RawDecoderNew(PyObject* self, PyObject* args) decoder->state.ystep = ystep; - ((RAWSTATE*)decoder->state.context)->stride = stride; + ((RAWSTATE *)decoder->state.context)->stride = stride; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* SGI RLE */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_SgiRleDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_SgiRleDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; int ystep = 1; int bpc = 1; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &bpc)) { @@ -706,23 +672,21 @@ PyImaging_SgiRleDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingSgiRleDecode; decoder->state.ystep = ystep; - ((SGISTATE*)decoder->state.context)->bpc = bpc; + ((SGISTATE *)decoder->state.context)->bpc = bpc; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* SUN RLE */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_SunRleDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { return NULL; } @@ -738,21 +702,19 @@ PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingSunRleDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* TGA RLE */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_TgaRleDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; int ystep = 1; int depth = 8; if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) { @@ -773,18 +735,16 @@ PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args) decoder->state.ystep = ystep; decoder->state.count = depth / 8; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* XBM */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_XbmDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_XbmDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; decoder = PyImaging_DecoderNew(0); if (decoder == NULL) { @@ -797,10 +757,9 @@ PyImaging_XbmDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingXbmDecode; - return (PyObject*) decoder; + return (PyObject *)decoder; } - /* -------------------------------------------------------------------- */ /* ZIP */ /* -------------------------------------------------------------------- */ @@ -809,13 +768,12 @@ PyImaging_XbmDecoderNew(PyObject* self, PyObject* args) #include "libImaging/ZipCodecs.h" -PyObject* -PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_ZipDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; int interlaced = 0; if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) { return NULL; @@ -833,13 +791,12 @@ PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingZipDecode; decoder->cleanup = ImagingZipDecodeCleanup; - ((ZIPSTATE*)decoder->state.context)->interlaced = interlaced; + ((ZIPSTATE *)decoder->state.context)->interlaced = interlaced; - return (PyObject*) decoder; + return (PyObject *)decoder; } #endif - /* -------------------------------------------------------------------- */ /* JPEG */ /* -------------------------------------------------------------------- */ @@ -849,31 +806,29 @@ PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) /* We better define this decoder last in this file, so the following undef's won't mess things up for the Imaging library proper. */ -#undef HAVE_PROTOTYPES -#undef HAVE_STDDEF_H -#undef HAVE_STDLIB_H -#undef UINT8 -#undef UINT16 -#undef UINT32 -#undef INT8 -#undef INT16 -#undef INT32 +#undef HAVE_PROTOTYPES +#undef HAVE_STDDEF_H +#undef HAVE_STDLIB_H +#undef UINT8 +#undef UINT16 +#undef UINT32 +#undef INT8 +#undef INT16 +#undef INT32 #include "libImaging/Jpeg.h" -PyObject* -PyImaging_JpegDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_JpegDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; - char* mode; - char* rawmode; /* what we want from the decoder */ - char* jpegmode; /* what's in the file */ + char *mode; + char *rawmode; /* what we want from the decoder */ + char *jpegmode; /* what's in the file */ int scale = 1; int draft = 0; - if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, - &scale, &draft)) { + if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, &scale, &draft)) { return NULL; } @@ -900,13 +855,13 @@ PyImaging_JpegDecoderNew(PyObject* self, PyObject* args) decoder->decode = ImagingJpegDecode; decoder->cleanup = ImagingJpegDecodeCleanup; - strncpy(((JPEGSTATE*)decoder->state.context)->rawmode, rawmode, 8); - strncpy(((JPEGSTATE*)decoder->state.context)->jpegmode, jpegmode, 8); + strncpy(((JPEGSTATE *)decoder->state.context)->rawmode, rawmode, 8); + strncpy(((JPEGSTATE *)decoder->state.context)->jpegmode, jpegmode, 8); - ((JPEGSTATE*)decoder->state.context)->scale = scale; - ((JPEGSTATE*)decoder->state.context)->draft = draft; + ((JPEGSTATE *)decoder->state.context)->scale = scale; + ((JPEGSTATE *)decoder->state.context)->draft = draft; - return (PyObject*) decoder; + return (PyObject *)decoder; } #endif @@ -918,22 +873,21 @@ PyImaging_JpegDecoderNew(PyObject* self, PyObject* args) #include "libImaging/Jpeg2K.h" -PyObject* -PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; +PyObject * +PyImaging_Jpeg2KDecoderNew(PyObject *self, PyObject *args) { + ImagingDecoderObject *decoder; JPEG2KDECODESTATE *context; - char* mode; - char* format; + char *mode; + char *format; OPJ_CODEC_FORMAT codec_format; int reduce = 0; int layers = 0; int fd = -1; PY_LONG_LONG length = -1; - if (!PyArg_ParseTuple(args, "ss|iiiL", &mode, &format, - &reduce, &layers, &fd, &length)) { + if (!PyArg_ParseTuple( + args, "ss|iiiL", &mode, &format, &reduce, &layers, &fd, &length)) { return NULL; } @@ -964,7 +918,6 @@ PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args) context->reduce = reduce; context->layers = layers; - return (PyObject*) decoder; + return (PyObject *)decoder; } #endif /* HAVE_OPENJPEG */ - diff --git a/src/display.c b/src/display.c index b8190db8c..3541655cf 100644 --- a/src/display.c +++ b/src/display.c @@ -41,15 +41,13 @@ #endif typedef struct { - PyObject_HEAD - ImagingDIB dib; + PyObject_HEAD ImagingDIB dib; } ImagingDisplayObject; static PyTypeObject ImagingDisplayType; -static ImagingDisplayObject* -_new(const char* mode, int xsize, int ysize) -{ +static ImagingDisplayObject * +_new(const char *mode, int xsize, int ysize) { ImagingDisplayObject *display; if (PyType_Ready(&ImagingDisplayType) < 0) { @@ -71,17 +69,15 @@ _new(const char* mode, int xsize, int ysize) } static void -_delete(ImagingDisplayObject* display) -{ +_delete(ImagingDisplayObject *display) { if (display->dib) { ImagingDeleteDIB(display->dib); } PyObject_Del(display); } -static PyObject* -_expose(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_expose(ImagingDisplayObject *display, PyObject *args) { HDC hdc; if (!PyArg_ParseTuple(args, F_HANDLE, &hdc)) { return NULL; @@ -93,15 +89,23 @@ _expose(ImagingDisplayObject* display, PyObject* args) return Py_None; } -static PyObject* -_draw(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_draw(ImagingDisplayObject *display, PyObject *args) { HDC hdc; int dst[4]; int src[4]; - if (!PyArg_ParseTuple(args, F_HANDLE "(iiii)(iiii)", &hdc, - dst+0, dst+1, dst+2, dst+3, - src+0, src+1, src+2, src+3)) { + if (!PyArg_ParseTuple( + args, + F_HANDLE "(iiii)(iiii)", + &hdc, + dst + 0, + dst + 1, + dst + 2, + dst + 3, + src + 0, + src + 1, + src + 2, + src + 3)) { return NULL; } @@ -111,17 +115,17 @@ _draw(ImagingDisplayObject* display, PyObject* args) return Py_None; } -extern Imaging PyImaging_AsImaging(PyObject *op); +extern Imaging +PyImaging_AsImaging(PyObject *op); -static PyObject* -_paste(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_paste(ImagingDisplayObject *display, PyObject *args) { Imaging im; - PyObject* op; + PyObject *op; int xy[4]; xy[0] = xy[1] = xy[2] = xy[3] = 0; - if (!PyArg_ParseTuple(args, "O|(iiii)", &op, xy+0, xy+1, xy+2, xy+3)) { + if (!PyArg_ParseTuple(args, "O|(iiii)", &op, xy + 0, xy + 1, xy + 2, xy + 3)) { return NULL; } im = PyImaging_AsImaging(op); @@ -142,9 +146,8 @@ _paste(ImagingDisplayObject* display, PyObject* args) return Py_None; } -static PyObject* -_query_palette(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_query_palette(ImagingDisplayObject *display, PyObject *args) { HDC hdc; int status; @@ -157,9 +160,8 @@ _query_palette(ImagingDisplayObject* display, PyObject* args) return Py_BuildValue("i", status); } -static PyObject* -_getdc(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_getdc(ImagingDisplayObject *display, PyObject *args) { HWND window; HDC dc; @@ -176,9 +178,8 @@ _getdc(ImagingDisplayObject* display, PyObject* args) return Py_BuildValue(F_HANDLE, dc); } -static PyObject* -_releasedc(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_releasedc(ImagingDisplayObject *display, PyObject *args) { HWND window; HDC dc; @@ -192,10 +193,9 @@ _releasedc(ImagingDisplayObject* display, PyObject* args) return Py_None; } -static PyObject* -_frombytes(ImagingDisplayObject* display, PyObject* args) -{ - char* ptr; +static PyObject * +_frombytes(ImagingDisplayObject *display, PyObject *args) { + char *ptr; Py_ssize_t bytes; if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes)) { @@ -213,16 +213,14 @@ _frombytes(ImagingDisplayObject* display, PyObject* args) return Py_None; } -static PyObject* -_tobytes(ImagingDisplayObject* display, PyObject* args) -{ +static PyObject * +_tobytes(ImagingDisplayObject *display, PyObject *args) { if (!PyArg_ParseTuple(args, ":tobytes")) { return NULL; } return PyBytes_FromStringAndSize( - display->dib->bits, display->dib->ysize * display->dib->linesize - ); + display->dib->bits, display->dib->ysize * display->dib->linesize); } static struct PyMethodDef methods[] = { @@ -237,62 +235,55 @@ static struct PyMethodDef methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject* -_getattr_mode(ImagingDisplayObject* self, void* closure) -{ +static PyObject * +_getattr_mode(ImagingDisplayObject *self, void *closure) { return Py_BuildValue("s", self->dib->mode); } -static PyObject* -_getattr_size(ImagingDisplayObject* self, void* closure) -{ +static PyObject * +_getattr_size(ImagingDisplayObject *self, void *closure) { return Py_BuildValue("ii", self->dib->xsize, self->dib->ysize); } static struct PyGetSetDef getsetters[] = { - { "mode", (getter) _getattr_mode }, - { "size", (getter) _getattr_size }, - { NULL } -}; + {"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, {NULL}}; static PyTypeObject ImagingDisplayType = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingDisplay", /*tp_name*/ - sizeof(ImagingDisplayObject),/*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingDisplay", /*tp_name*/ + sizeof(ImagingDisplayObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_delete, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - getsetters, /*tp_getset*/ + (destructor)_delete, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + getsetters, /*tp_getset*/ }; -PyObject* -PyImaging_DisplayWin32(PyObject* self, PyObject* args) -{ - ImagingDisplayObject* display; +PyObject * +PyImaging_DisplayWin32(PyObject *self, PyObject *args) { + ImagingDisplayObject *display; char *mode; int xsize, ysize; @@ -305,12 +296,11 @@ PyImaging_DisplayWin32(PyObject* self, PyObject* args) return NULL; } - return (PyObject*) display; + return (PyObject *)display; } -PyObject* -PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_DisplayModeWin32(PyObject *self, PyObject *args) { char *mode; int size[2]; @@ -322,18 +312,17 @@ PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) /* -------------------------------------------------------------------- */ /* Windows screen grabber */ -typedef HANDLE(__stdcall* Func_SetThreadDpiAwarenessContext)(HANDLE); +typedef HANDLE(__stdcall *Func_SetThreadDpiAwarenessContext)(HANDLE); -PyObject* -PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { int x = 0, y = 0, width, height; int includeLayeredWindows = 0, all_screens = 0; HBITMAP bitmap; BITMAPCOREHEADER core; HDC screen, screen_copy; DWORD rop; - PyObject* buffer; + PyObject *buffer; HANDLE dpiAwareness; HMODULE user32; Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; @@ -352,11 +341,11 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) // loaded dynamically to avoid link errors user32 = LoadLibraryA("User32.dll"); SetThreadDpiAwarenessContext_function = - (Func_SetThreadDpiAwarenessContext) - GetProcAddress(user32, "SetThreadDpiAwarenessContext"); + (Func_SetThreadDpiAwarenessContext)GetProcAddress( + user32, "SetThreadDpiAwarenessContext"); if (SetThreadDpiAwarenessContext_function != NULL) { // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) - dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE) -3); + dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); } if (all_screens) { @@ -396,7 +385,7 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) /* step 3: extract bits from bitmap */ - buffer = PyBytes_FromStringAndSize(NULL, height * ((width*3 + 3) & -4)); + buffer = PyBytes_FromStringAndSize(NULL, height * ((width * 3 + 3) & -4)); if (!buffer) { return NULL; } @@ -406,8 +395,14 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) core.bcHeight = height; core.bcPlanes = 1; core.bcBitCount = 24; - if (!GetDIBits(screen_copy, bitmap, 0, height, PyBytes_AS_STRING(buffer), - (BITMAPINFO*) &core, DIB_RGB_COLORS)) { + if (!GetDIBits( + screen_copy, + bitmap, + 0, + height, + PyBytes_AS_STRING(buffer), + (BITMAPINFO *)&core, + DIB_RGB_COLORS)) { goto error; } @@ -426,11 +421,11 @@ error: return NULL; } -static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) -{ - PyObject* window_list = (PyObject*) lParam; - PyObject* item; - PyObject* title; +static BOOL CALLBACK +list_windows_callback(HWND hwnd, LPARAM lParam) { + PyObject *window_list = (PyObject *)lParam; + PyObject *item; + PyObject *title; RECT inner, outer; int title_size; int status; @@ -440,7 +435,7 @@ static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) if (title_size > 0) { title = PyUnicode_FromStringAndSize(NULL, title_size); if (title) { - GetWindowTextW(hwnd, PyUnicode_AS_UNICODE(title), title_size+1); + GetWindowTextW(hwnd, PyUnicode_AS_UNICODE(title), title_size + 1); } } else { title = PyUnicode_FromString(""); @@ -454,10 +449,17 @@ static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) GetWindowRect(hwnd, &outer); item = Py_BuildValue( - F_HANDLE "N(iiii)(iiii)", hwnd, title, - inner.left, inner.top, inner.right, inner.bottom, - outer.left, outer.top, outer.right, outer.bottom - ); + F_HANDLE "N(iiii)(iiii)", + hwnd, + title, + inner.left, + inner.top, + inner.right, + inner.bottom, + outer.left, + outer.top, + outer.right, + outer.bottom); if (!item) { return 0; } @@ -473,17 +475,16 @@ static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) return 1; } -PyObject* -PyImaging_ListWindowsWin32(PyObject* self, PyObject* args) -{ - PyObject* window_list; +PyObject * +PyImaging_ListWindowsWin32(PyObject *self, PyObject *args) { + PyObject *window_list; window_list = PyList_New(0); if (!window_list) { return NULL; } - EnumWindows(list_windows_callback, (LPARAM) window_list); + EnumWindows(list_windows_callback, (LPARAM)window_list); if (PyErr_Occurred()) { Py_DECREF(window_list); @@ -496,17 +497,16 @@ PyImaging_ListWindowsWin32(PyObject* self, PyObject* args) /* -------------------------------------------------------------------- */ /* Windows clipboard grabber */ -PyObject* -PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_GrabClipboardWin32(PyObject *self, PyObject *args) { int clip; HANDLE handle = NULL; int size; - void* data; - PyObject* result; + void *data; + PyObject *result; UINT format; - UINT formats[] = { CF_DIB, CF_DIBV5, CF_HDROP, RegisterClipboardFormatA("PNG"), 0 }; - LPCSTR format_names[] = { "DIB", "DIB", "file", "png", NULL }; + UINT formats[] = {CF_DIB, CF_DIBV5, CF_HDROP, RegisterClipboardFormatA("PNG"), 0}; + LPCSTR format_names[] = {"DIB", "DIB", "file", "png", NULL}; if (!OpenClipboard(NULL)) { PyErr_SetString(PyExc_OSError, "failed to open clipboard"); @@ -551,15 +551,14 @@ PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args) static int mainloop = 0; static void -callback_error(const char* handler) -{ - PyObject* sys_stderr; +callback_error(const char *handler) { + PyObject *sys_stderr; sys_stderr = PySys_GetObject("stderr"); if (sys_stderr) { PyFile_WriteString("*** ImageWin: error in ", sys_stderr); - PyFile_WriteString((char*) handler, sys_stderr); + PyFile_WriteString((char *)handler, sys_stderr); PyFile_WriteString(":\n", sys_stderr); } @@ -568,109 +567,119 @@ callback_error(const char* handler) } static LRESULT CALLBACK -windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) -{ +windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; - PyObject* callback = NULL; - PyObject* result; - PyThreadState* threadstate; - PyThreadState* current_threadstate; + PyObject *callback = NULL; + PyObject *result; + PyThreadState *threadstate; + PyThreadState *current_threadstate; HDC dc; RECT rect; LRESULT status = 0; /* set up threadstate for messages that calls back into python */ switch (message) { - case WM_CREATE: - mainloop++; - break; - case WM_DESTROY: - mainloop--; - /* fall through... */ - case WM_PAINT: - case WM_SIZE: - callback = (PyObject*) GetWindowLongPtr(wnd, 0); - if (callback) { - threadstate = (PyThreadState*) - GetWindowLongPtr(wnd, sizeof(PyObject*)); - current_threadstate = PyThreadState_Swap(NULL); - PyEval_RestoreThread(threadstate); - } else { - return DefWindowProc(wnd, message, wParam, lParam); - } + case WM_CREATE: + mainloop++; + break; + case WM_DESTROY: + mainloop--; + /* fall through... */ + case WM_PAINT: + case WM_SIZE: + callback = (PyObject *)GetWindowLongPtr(wnd, 0); + if (callback) { + threadstate = + (PyThreadState *)GetWindowLongPtr(wnd, sizeof(PyObject *)); + current_threadstate = PyThreadState_Swap(NULL); + PyEval_RestoreThread(threadstate); + } else { + return DefWindowProc(wnd, message, wParam, lParam); + } } /* process message */ switch (message) { + case WM_PAINT: + /* redraw (part of) window. this generates a WCK-style + damage/clear/repair cascade */ + BeginPaint(wnd, &ps); + dc = GetDC(wnd); + GetWindowRect(wnd, &rect); /* in screen coordinates */ - case WM_PAINT: - /* redraw (part of) window. this generates a WCK-style - damage/clear/repair cascade */ - BeginPaint(wnd, &ps); - dc = GetDC(wnd); - GetWindowRect(wnd, &rect); /* in screen coordinates */ + result = PyObject_CallFunction( + callback, + "siiii", + "damage", + ps.rcPaint.left, + ps.rcPaint.top, + ps.rcPaint.right, + ps.rcPaint.bottom); + if (result) { + Py_DECREF(result); + } else { + callback_error("window damage callback"); + } - result = PyObject_CallFunction( - callback, "siiii", "damage", - ps.rcPaint.left, ps.rcPaint.top, - ps.rcPaint.right, ps.rcPaint.bottom - ); - if (result) { - Py_DECREF(result); - } else { - callback_error("window damage callback"); - } + result = PyObject_CallFunction( + callback, + "s" F_HANDLE "iiii", + "clear", + dc, + 0, + 0, + rect.right - rect.left, + rect.bottom - rect.top); + if (result) { + Py_DECREF(result); + } else { + callback_error("window clear callback"); + } - result = PyObject_CallFunction( - callback, "s" F_HANDLE "iiii", "clear", dc, - 0, 0, rect.right-rect.left, rect.bottom-rect.top - ); - if (result) { - Py_DECREF(result); - } else { - callback_error("window clear callback"); - } + result = PyObject_CallFunction( + callback, + "s" F_HANDLE "iiii", + "repair", + dc, + 0, + 0, + rect.right - rect.left, + rect.bottom - rect.top); + if (result) { + Py_DECREF(result); + } else { + callback_error("window repair callback"); + } - result = PyObject_CallFunction( - callback, "s" F_HANDLE "iiii", "repair", dc, - 0, 0, rect.right-rect.left, rect.bottom-rect.top - ); - if (result) { - Py_DECREF(result); - } else { - callback_error("window repair callback"); - } + ReleaseDC(wnd, dc); + EndPaint(wnd, &ps); + break; - ReleaseDC(wnd, dc); - EndPaint(wnd, &ps); - break; + case WM_SIZE: + /* resize window */ + result = PyObject_CallFunction( + callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam)); + if (result) { + InvalidateRect(wnd, NULL, 1); + Py_DECREF(result); + } else { + callback_error("window resize callback"); + } + break; - case WM_SIZE: - /* resize window */ - result = PyObject_CallFunction( - callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam) - ); - if (result) { - InvalidateRect(wnd, NULL, 1); - Py_DECREF(result); - } else { - callback_error("window resize callback"); - } - break; + case WM_DESTROY: + /* destroy window */ + result = PyObject_CallFunction(callback, "s", "destroy"); + if (result) { + Py_DECREF(result); + } else { + callback_error("window destroy callback"); + } + Py_DECREF(callback); + break; - case WM_DESTROY: - /* destroy window */ - result = PyObject_CallFunction(callback, "s", "destroy"); - if (result) { - Py_DECREF(result); - } else { - callback_error("window destroy callback"); - } - Py_DECREF(callback); - break; - - default: - status = DefWindowProc(wnd, message, wParam, lParam); + default: + status = DefWindowProc(wnd, message, wParam, lParam); } if (callback) { @@ -682,14 +691,13 @@ windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) return status; } -PyObject* -PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_CreateWindowWin32(PyObject *self, PyObject *args) { HWND wnd; WNDCLASS windowClass; - char* title; - PyObject* callback; + char *title; + PyObject *callback; int width = 0, height = 0; if (!PyArg_ParseTuple(args, "sO|ii", &title, &callback, &width, &height)) { return NULL; @@ -705,7 +713,7 @@ PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) /* register toplevel window class */ windowClass.style = CS_CLASSDC; windowClass.cbClsExtra = 0; - windowClass.cbWndExtra = sizeof(PyObject*) + sizeof(PyThreadState*); + windowClass.cbWndExtra = sizeof(PyObject *) + sizeof(PyThreadState *); windowClass.hInstance = GetModuleHandle(NULL); /* windowClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); */ windowClass.hbrBackground = NULL; @@ -718,11 +726,18 @@ PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) RegisterClass(&windowClass); /* FIXME: check return status */ wnd = CreateWindowEx( - 0, windowClass.lpszClassName, title, + 0, + windowClass.lpszClassName, + title, WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, width, height, - HWND_DESKTOP, NULL, NULL, NULL - ); + CW_USEDEFAULT, + CW_USEDEFAULT, + width, + height, + HWND_DESKTOP, + NULL, + NULL, + NULL); if (!wnd) { PyErr_SetString(PyExc_OSError, "failed to create window"); @@ -731,76 +746,76 @@ PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) /* register window callback */ Py_INCREF(callback); - SetWindowLongPtr(wnd, 0, (LONG_PTR) callback); - SetWindowLongPtr(wnd, sizeof(callback), (LONG_PTR) PyThreadState_Get()); + SetWindowLongPtr(wnd, 0, (LONG_PTR)callback); + SetWindowLongPtr(wnd, sizeof(callback), (LONG_PTR)PyThreadState_Get()); - Py_BEGIN_ALLOW_THREADS - ShowWindow(wnd, SW_SHOWNORMAL); + Py_BEGIN_ALLOW_THREADS ShowWindow(wnd, SW_SHOWNORMAL); SetForegroundWindow(wnd); /* to make sure it's visible */ Py_END_ALLOW_THREADS - return Py_BuildValue(F_HANDLE, wnd); + return Py_BuildValue(F_HANDLE, wnd); } -PyObject* -PyImaging_EventLoopWin32(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_EventLoopWin32(PyObject *self, PyObject *args) { MSG msg; - Py_BEGIN_ALLOW_THREADS - while (mainloop && GetMessage(&msg, NULL, 0, 0)) { + Py_BEGIN_ALLOW_THREADS while (mainloop && GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Py_END_ALLOW_THREADS - Py_INCREF(Py_None); + Py_INCREF(Py_None); return Py_None; } /* -------------------------------------------------------------------- */ /* windows WMF renderer */ -#define GET32(p,o) ((DWORD*)(p+o))[0] +#define GET32(p, o) ((DWORD *)(p + o))[0] PyObject * -PyImaging_DrawWmf(PyObject* self, PyObject* args) -{ +PyImaging_DrawWmf(PyObject *self, PyObject *args) { HBITMAP bitmap; HENHMETAFILE meta; BITMAPCOREHEADER core; HDC dc; RECT rect; - PyObject* buffer = NULL; - char* ptr; + PyObject *buffer = NULL; + char *ptr; - char* data; + char *data; Py_ssize_t datasize; int width, height; int x0, y0, x1, y1; - if (!PyArg_ParseTuple(args, "y#(ii)(iiii):_load", &data, &datasize, - &width, &height, &x0, &x1, &y0, &y1)) { + if (!PyArg_ParseTuple( + args, + "y#(ii)(iiii):_load", + &data, + &datasize, + &width, + &height, + &x0, + &x1, + &y0, + &y1)) { return NULL; } /* step 1: copy metafile contents into METAFILE object */ if (datasize > 22 && GET32(data, 0) == 0x9ac6cdd7) { - /* placeable windows metafile (22-byte aldus header) */ - meta = SetWinMetaFileBits(datasize-22, data+22, NULL, NULL); - - } else if (datasize > 80 && GET32(data, 0) == 1 && - GET32(data, 40) == 0x464d4520) { + meta = SetWinMetaFileBits(datasize - 22, data + 22, NULL, NULL); + } else if (datasize > 80 && GET32(data, 0) == 1 && GET32(data, 40) == 0x464d4520) { /* enhanced metafile */ meta = SetEnhMetaFileBits(datasize, data); } else { - /* unknown meta format */ meta = NULL; - } if (!meta) { @@ -818,9 +833,7 @@ PyImaging_DrawWmf(PyObject* self, PyObject* args) dc = CreateCompatibleDC(NULL); - bitmap = CreateDIBSection( - dc, (BITMAPINFO*) &core, DIB_RGB_COLORS, &ptr, NULL, 0 - ); + bitmap = CreateDIBSection(dc, (BITMAPINFO *)&core, DIB_RGB_COLORS, &ptr, NULL, 0); if (!bitmap) { PyErr_SetString(PyExc_OSError, "cannot create bitmap"); @@ -850,7 +863,7 @@ PyImaging_DrawWmf(PyObject* self, PyObject* args) GdiFlush(); - buffer = PyBytes_FromStringAndSize(ptr, height * ((width*3 + 3) & -4)); + buffer = PyBytes_FromStringAndSize(ptr, height * ((width * 3 + 3) & -4)); error: DeleteEnhMetaFile(meta); @@ -875,18 +888,17 @@ error: /* -------------------------------------------------------------------- */ /* X11 screen grabber */ -PyObject* -PyImaging_GrabScreenX11(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_GrabScreenX11(PyObject *self, PyObject *args) { int width, height; - char* display_name; - xcb_connection_t* connection; + char *display_name; + xcb_connection_t *connection; int screen_number; xcb_screen_iterator_t iter; - xcb_screen_t* screen = NULL; - xcb_get_image_reply_t* reply; - xcb_generic_error_t* error; - PyObject* buffer = NULL; + xcb_screen_t *screen = NULL; + xcb_get_image_reply_t *reply; + xcb_generic_error_t *error; + PyObject *buffer = NULL; if (!PyArg_ParseTuple(args, "|z", &display_name)) { return NULL; @@ -896,7 +908,10 @@ PyImaging_GrabScreenX11(PyObject* self, PyObject* args) connection = xcb_connect(display_name, &screen_number); if (xcb_connection_has_error(connection)) { - PyErr_Format(PyExc_OSError, "X connection failed: error %i", xcb_connection_has_error(connection)); + PyErr_Format( + PyExc_OSError, + "X connection failed: error %i", + xcb_connection_has_error(connection)); xcb_disconnect(connection); return NULL; } @@ -920,13 +935,26 @@ PyImaging_GrabScreenX11(PyObject* self, PyObject* args) /* get image data */ - reply = xcb_get_image_reply(connection, - xcb_get_image(connection, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root, - 0, 0, width, height, 0x00ffffff), - &error); + reply = xcb_get_image_reply( + connection, + xcb_get_image( + connection, + XCB_IMAGE_FORMAT_Z_PIXMAP, + screen->root, + 0, + 0, + width, + height, + 0x00ffffff), + &error); if (reply == NULL) { - PyErr_Format(PyExc_OSError, "X get_image failed: error %i (%i, %i, %i)", - error->error_code, error->major_code, error->minor_code, error->resource_id); + PyErr_Format( + PyExc_OSError, + "X get_image failed: error %i (%i, %i, %i)", + error->error_code, + error->major_code, + error->minor_code, + error->resource_id); free(error); xcb_disconnect(connection); return NULL; @@ -935,8 +963,8 @@ PyImaging_GrabScreenX11(PyObject* self, PyObject* args) /* store data in Python buffer */ if (reply->depth == 24) { - buffer = PyBytes_FromStringAndSize((char*)xcb_get_image_data(reply), - xcb_get_image_data_length(reply)); + buffer = PyBytes_FromStringAndSize( + (char *)xcb_get_image_data(reply), xcb_get_image_data_length(reply)); } else { PyErr_Format(PyExc_OSError, "unsupported bit depth: %i", reply->depth); } diff --git a/src/encode.c b/src/encode.c index 57ce42734..f92ba62c2 100644 --- a/src/encode.c +++ b/src/encode.c @@ -37,25 +37,23 @@ /* -------------------------------------------------------------------- */ typedef struct { - PyObject_HEAD - int (*encode)(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); + PyObject_HEAD int (*encode)( + Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); int (*cleanup)(ImagingCodecState state); struct ImagingCodecStateInstance state; Imaging im; - PyObject* lock; + PyObject *lock; int pushes_fd; } ImagingEncoderObject; static PyTypeObject ImagingEncoderType; -static ImagingEncoderObject* -PyImaging_EncoderNew(int contextsize) -{ +static ImagingEncoderObject * +PyImaging_EncoderNew(int contextsize) { ImagingEncoderObject *encoder; void *context; - if(PyType_Ready(&ImagingEncoderType) < 0) { + if (PyType_Ready(&ImagingEncoderType) < 0) { return NULL; } @@ -69,10 +67,10 @@ PyImaging_EncoderNew(int contextsize) /* Allocate encoder context */ if (contextsize > 0) { - context = (void*) calloc(1, contextsize); + context = (void *)calloc(1, contextsize); if (!context) { Py_DECREF(encoder); - (void) ImagingError_MemoryError(); + (void)ImagingError_MemoryError(); return NULL; } } else { @@ -94,8 +92,7 @@ PyImaging_EncoderNew(int contextsize) } static void -_dealloc(ImagingEncoderObject* encoder) -{ +_dealloc(ImagingEncoderObject *encoder) { if (encoder->cleanup) { encoder->cleanup(&encoder->state); } @@ -106,23 +103,21 @@ _dealloc(ImagingEncoderObject* encoder) PyObject_Del(encoder); } -static PyObject* -_encode_cleanup(ImagingEncoderObject* encoder, PyObject* args) -{ +static PyObject * +_encode_cleanup(ImagingEncoderObject *encoder, PyObject *args) { int status = 0; - if (encoder->cleanup){ + if (encoder->cleanup) { status = encoder->cleanup(&encoder->state); } return Py_BuildValue("i", status); } -static PyObject* -_encode(ImagingEncoderObject* encoder, PyObject* args) -{ - PyObject* buf; - PyObject* result; +static PyObject * +_encode(ImagingEncoderObject *encoder, PyObject *args) { + PyObject *buf; + PyObject *result; int status; /* Encode to a Python string (allocated by this method) */ @@ -138,8 +133,8 @@ _encode(ImagingEncoderObject* encoder, PyObject* args) return NULL; } - status = encoder->encode(encoder->im, &encoder->state, - (UINT8*) PyBytes_AsString(buf), bufsize); + status = encoder->encode( + encoder->im, &encoder->state, (UINT8 *)PyBytes_AsString(buf), bufsize); /* adjust string length to avoid slicing in encoder */ if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0) { @@ -153,31 +148,28 @@ _encode(ImagingEncoderObject* encoder, PyObject* args) return result; } -static PyObject* -_encode_to_pyfd(ImagingEncoderObject* encoder, PyObject* args) -{ - +static PyObject * +_encode_to_pyfd(ImagingEncoderObject *encoder, PyObject *args) { PyObject *result; int status; if (!encoder->pushes_fd) { // UNDONE, appropriate errcode??? - result = Py_BuildValue("ii", 0, IMAGING_CODEC_CONFIG);; + result = Py_BuildValue("ii", 0, IMAGING_CODEC_CONFIG); + ; return result; } - status = encoder->encode(encoder->im, &encoder->state, - (UINT8*) NULL, 0); + status = encoder->encode(encoder->im, &encoder->state, (UINT8 *)NULL, 0); result = Py_BuildValue("ii", status, encoder->state.errcode); return result; } -static PyObject* -_encode_to_file(ImagingEncoderObject* encoder, PyObject* args) -{ - UINT8* buf; +static PyObject * +_encode_to_file(ImagingEncoderObject *encoder, PyObject *args) { + UINT8 *buf; int status; ImagingSectionCookie cookie; @@ -192,7 +184,7 @@ _encode_to_file(ImagingEncoderObject* encoder, PyObject* args) /* Allocate an encoder buffer */ /* malloc check ok, either constant int, or checked by PyArg_ParseTuple */ - buf = (UINT8*) malloc(bufsize); + buf = (UINT8 *)malloc(bufsize); if (!buf) { return ImagingError_MemoryError(); } @@ -200,7 +192,6 @@ _encode_to_file(ImagingEncoderObject* encoder, PyObject* args) ImagingSectionEnter(&cookie); do { - /* This replaces the inner loop in the ImageFile _save function. */ @@ -223,12 +214,12 @@ _encode_to_file(ImagingEncoderObject* encoder, PyObject* args) return Py_BuildValue("i", encoder->state.errcode); } -extern Imaging PyImaging_AsImaging(PyObject *op); +extern Imaging +PyImaging_AsImaging(PyObject *op); -static PyObject* -_setimage(ImagingEncoderObject* encoder, PyObject* args) -{ - PyObject* op; +static PyObject * +_setimage(ImagingEncoderObject *encoder, PyObject *args) { + PyObject *op; Imaging im; ImagingCodecState state; Py_ssize_t x0, y0, x1, y1; @@ -260,22 +251,20 @@ _setimage(ImagingEncoderObject* encoder, PyObject* args) state->ysize = y1 - y0; } - if (state->xsize <= 0 || - state->xsize + state->xoff > im->xsize || - state->ysize <= 0 || - state->ysize + state->yoff > im->ysize) { + if (state->xsize <= 0 || state->xsize + state->xoff > im->xsize || + state->ysize <= 0 || state->ysize + state->yoff > im->ysize) { PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image"); return NULL; } /* Allocate memory buffer (if bits field is set) */ if (state->bits > 0) { - if (state->xsize > ((INT_MAX / state->bits)-7)) { + if (state->xsize > ((INT_MAX / state->bits) - 7)) { return ImagingError_MemoryError(); } - state->bytes = (state->bits * state->xsize+7)/8; + state->bytes = (state->bits * state->xsize + 7) / 8; /* malloc check ok, overflow checked above */ - state->buffer = (UINT8*) malloc(state->bytes); + state->buffer = (UINT8 *)malloc(state->bytes); if (!state->buffer) { return ImagingError_MemoryError(); } @@ -291,10 +280,9 @@ _setimage(ImagingEncoderObject* encoder, PyObject* args) return Py_None; } -static PyObject* -_setfd(ImagingEncoderObject* encoder, PyObject* args) -{ - PyObject* fd; +static PyObject * +_setfd(ImagingEncoderObject *encoder, PyObject *args) { + PyObject *fd; ImagingCodecState state; if (!PyArg_ParseTuple(args, "O", &fd)) { @@ -311,8 +299,7 @@ _setfd(ImagingEncoderObject* encoder, PyObject* args) } static PyObject * -_get_pushes_fd(ImagingEncoderObject *encoder) -{ +_get_pushes_fd(ImagingEncoderObject *encoder) { return PyBool_FromLong(encoder->pushes_fd); } @@ -327,52 +314,51 @@ static struct PyMethodDef methods[] = { }; static struct PyGetSetDef getseters[] = { - {"pushes_fd", (getter)_get_pushes_fd, NULL, + {"pushes_fd", + (getter)_get_pushes_fd, + NULL, "True if this decoder expects to push directly to self.fd", NULL}, {NULL, NULL, NULL, NULL, NULL} /* sentinel */ }; static PyTypeObject ImagingEncoderType = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingEncoder", /*tp_name*/ - sizeof(ImagingEncoderObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingEncoder", /*tp_name*/ + sizeof(ImagingEncoderObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - getseters, /*tp_getset*/ + (destructor)_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + getseters, /*tp_getset*/ }; /* -------------------------------------------------------------------- */ int -get_packer(ImagingEncoderObject* encoder, const char* mode, - const char* rawmode) -{ +get_packer(ImagingEncoderObject *encoder, const char *mode, const char *rawmode) { int bits; ImagingShuffler pack; @@ -389,15 +375,13 @@ get_packer(ImagingEncoderObject* encoder, const char* mode, return 0; } - /* -------------------------------------------------------------------- */ /* EPS */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_EpsEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_EpsEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) { @@ -406,18 +390,16 @@ PyImaging_EpsEncoderNew(PyObject* self, PyObject* args) encoder->encode = ImagingEpsEncode; - return (PyObject*) encoder; + return (PyObject *)encoder; } - /* -------------------------------------------------------------------- */ /* GIF */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_GifEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_GifEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; char *mode; char *rawmode; @@ -438,21 +420,19 @@ PyImaging_GifEncoderNew(PyObject* self, PyObject* args) encoder->encode = ImagingGifEncode; - ((GIFENCODERSTATE*)encoder->state.context)->bits = bits; - ((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace; + ((GIFENCODERSTATE *)encoder->state.context)->bits = bits; + ((GIFENCODERSTATE *)encoder->state.context)->interlace = interlace; - return (PyObject*) encoder; + return (PyObject *)encoder; } - /* -------------------------------------------------------------------- */ /* PCX */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_PcxEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_PcxEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; char *mode; char *rawmode; @@ -473,18 +453,16 @@ PyImaging_PcxEncoderNew(PyObject* self, PyObject* args) encoder->encode = ImagingPcxEncode; - return (PyObject*) encoder; + return (PyObject *)encoder; } - /* -------------------------------------------------------------------- */ /* RAW */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_RawEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_RawEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; char *mode; char *rawmode; @@ -509,18 +487,16 @@ PyImaging_RawEncoderNew(PyObject* self, PyObject* args) encoder->state.ystep = ystep; encoder->state.count = stride; - return (PyObject*) encoder; + return (PyObject *)encoder; } - /* -------------------------------------------------------------------- */ /* TGA */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_TgaRleEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; char *mode; char *rawmode; @@ -543,19 +519,16 @@ PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args) encoder->state.ystep = ystep; - return (PyObject*) encoder; + return (PyObject *)encoder; } - - /* -------------------------------------------------------------------- */ /* XBM */ /* -------------------------------------------------------------------- */ -PyObject* -PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_XbmEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; encoder = PyImaging_EncoderNew(0); if (encoder == NULL) { @@ -568,10 +541,9 @@ PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) encoder->encode = ImagingXbmEncode; - return (PyObject*) encoder; + return (PyObject *)encoder; } - /* -------------------------------------------------------------------- */ /* ZIP */ /* -------------------------------------------------------------------- */ @@ -580,29 +552,34 @@ PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) #include "libImaging/ZipCodecs.h" -PyObject* -PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; - char* mode; - char* rawmode; + char *mode; + char *rawmode; Py_ssize_t optimize = 0; Py_ssize_t compress_level = -1; Py_ssize_t compress_type = -1; - char* dictionary = NULL; + char *dictionary = NULL; Py_ssize_t dictionary_size = 0; - if (!PyArg_ParseTuple(args, "ss|nnny#", &mode, &rawmode, - &optimize, - &compress_level, &compress_type, - &dictionary, &dictionary_size)) { + if (!PyArg_ParseTuple( + args, + "ss|nnny#", + &mode, + &rawmode, + &optimize, + &compress_level, + &compress_type, + &dictionary, + &dictionary_size)) { return NULL; } /* Copy to avoid referencing Python's memory */ if (dictionary && dictionary_size > 0) { /* malloc check ok, size comes from PyArg_ParseTuple */ - char* p = malloc(dictionary_size); + char *p = malloc(dictionary_size); if (!p) { return ImagingError_MemoryError(); } @@ -628,20 +605,19 @@ PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) if (rawmode[0] == 'P') { /* disable filtering */ - ((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE; + ((ZIPSTATE *)encoder->state.context)->mode = ZIP_PNG_PALETTE; } - ((ZIPSTATE*)encoder->state.context)->optimize = optimize; - ((ZIPSTATE*)encoder->state.context)->compress_level = compress_level; - ((ZIPSTATE*)encoder->state.context)->compress_type = compress_type; - ((ZIPSTATE*)encoder->state.context)->dictionary = dictionary; - ((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size; + ((ZIPSTATE *)encoder->state.context)->optimize = optimize; + ((ZIPSTATE *)encoder->state.context)->compress_level = compress_level; + ((ZIPSTATE *)encoder->state.context)->compress_type = compress_type; + ((ZIPSTATE *)encoder->state.context)->dictionary = dictionary; + ((ZIPSTATE *)encoder->state.context)->dictionary_size = dictionary_size; - return (PyObject*) encoder; + return (PyObject *)encoder; } #endif - /* -------------------------------------------------------------------- */ /* LibTiff */ /* -------------------------------------------------------------------- */ @@ -652,15 +628,14 @@ PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) #include -PyObject* -PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; - char* mode; - char* rawmode; - char* compname; - char* filename; + char *mode; + char *rawmode; + char *compname; + char *filename; Py_ssize_t fp; PyObject *tags, *types; @@ -669,16 +644,24 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) int key_int, status, is_core_tag, is_var_length, num_core_tags, i; TIFFDataType type = TIFF_NOTYPE; // This list also exists in TiffTags.py - const int core_tags[] = { - 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, - 341, 282, 283, 284, 286, 287, 296, 297, 320, 321, 338, 32995, 32998, 32996, - 339, 32997, 330, 531, 530, 65537 - }; + const int core_tags[] = {256, 257, 258, 259, 262, 263, 266, 269, 274, + 277, 278, 280, 281, 340, 341, 282, 283, 284, + 286, 287, 296, 297, 320, 321, 338, 32995, 32998, + 32996, 339, 32997, 330, 531, 530, 65537}; Py_ssize_t tags_size; PyObject *item; - if (! PyArg_ParseTuple(args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types)) { + if (!PyArg_ParseTuple( + args, + "sssnsOO", + &mode, + &rawmode, + &compname, + &fp, + &filename, + &tags, + &types)) { return NULL; } @@ -688,11 +671,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) } else { tags_size = PyList_Size(tags); TRACE(("tags size: %d\n", (int)tags_size)); - for (pos=0;posstate, filename, fp)) { + if (!ImagingLibTiffEncodeInit(&encoder->state, filename, fp)) { Py_DECREF(encoder); PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); return NULL; @@ -731,7 +714,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) is_var_length = 0; type = TIFF_NOTYPE; - for (i=0; istate, type, key_int, is_var_length)) { + if (ImagingLibTiffMergeFieldInfo( + &encoder->state, type, key_int, is_var_length)) { continue; } } if (type == TIFF_BYTE || type == TIFF_UNDEFINED) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - PyBytes_Size(value), PyBytes_AsString(value)); + status = ImagingLibTiffSetField( + &encoder->state, + (ttag_t)key_int, + PyBytes_Size(value), + PyBytes_AsString(value)); } else if (is_var_length) { - Py_ssize_t len,i; + Py_ssize_t len, i; TRACE(("Setting from Tuple: %d \n", key_int)); len = PyTuple_Size(value); if (key_int == TIFFTAG_COLORMAP) { int stride = 256; if (len != 768) { - PyErr_SetString(PyExc_ValueError, "Requiring 768 items for for Colormap"); + PyErr_SetString( + PyExc_ValueError, "Requiring 768 items for for Colormap"); return NULL; } UINT16 *av; /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(UINT16)); if (av) { - for (i=0;istate, (ttag_t) key_int, - av, - av + stride, - av + stride * 2); + status = ImagingLibTiffSetField( + &encoder->state, + (ttag_t)key_int, + av, + av + stride, + av + stride * 2); free(av); } } else if (type == TIFF_SHORT) { @@ -825,10 +813,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(UINT16)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_LONG) { @@ -836,10 +825,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(UINT32)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_SBYTE) { @@ -847,10 +837,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(INT8)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_SSHORT) { @@ -858,10 +849,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(INT16)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_SLONG) { @@ -869,10 +861,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(INT32)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_FLOAT) { @@ -880,10 +873,11 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(FLOAT32)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } else if (type == TIFF_DOUBLE) { @@ -891,54 +885,47 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* malloc check ok, calloc checks for overflow */ av = calloc(len, sizeof(FLOAT64)); if (av) { - for (i=0;istate, (ttag_t) key_int, len, av); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, len, av); free(av); } } } else { if (type == TIFF_SHORT) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (UINT16)PyLong_AsLong(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (UINT16)PyLong_AsLong(value)); } else if (type == TIFF_LONG) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (UINT32)PyLong_AsLong(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (UINT32)PyLong_AsLong(value)); } else if (type == TIFF_SSHORT) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (INT16)PyLong_AsLong(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (INT16)PyLong_AsLong(value)); } else if (type == TIFF_SLONG) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (INT32)PyLong_AsLong(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (INT32)PyLong_AsLong(value)); } else if (type == TIFF_FLOAT) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (FLOAT32)PyFloat_AsDouble(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (FLOAT32)PyFloat_AsDouble(value)); } else if (type == TIFF_DOUBLE) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (FLOAT64)PyFloat_AsDouble(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)); } else if (type == TIFF_SBYTE) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (INT8)PyLong_AsLong(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value)); } else if (type == TIFF_ASCII) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - PyBytes_AsString(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, PyBytes_AsString(value)); } else if (type == TIFF_RATIONAL) { - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) key_int, - (FLOAT64)PyFloat_AsDouble(value)); + status = ImagingLibTiffSetField( + &encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)); } else { - TRACE(("Unhandled type for key %d : %s \n", - key_int, - PyBytes_AsString(PyObject_Str(value)))); + TRACE( + ("Unhandled type for key %d : %s \n", + key_int, + PyBytes_AsString(PyObject_Str(value)))); } } if (!status) { @@ -949,9 +936,9 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) } } - encoder->encode = ImagingLibTiffEncode; + encoder->encode = ImagingLibTiffEncode; - return (PyObject*) encoder; + return (PyObject *)encoder; } #endif @@ -965,26 +952,27 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) /* We better define this encoder last in this file, so the following undef's won't mess things up for the Imaging library proper. */ -#undef HAVE_PROTOTYPES -#undef HAVE_STDDEF_H -#undef HAVE_STDLIB_H -#undef UINT8 -#undef UINT16 -#undef UINT32 -#undef INT8 -#undef INT16 -#undef INT32 +#undef HAVE_PROTOTYPES +#undef HAVE_STDDEF_H +#undef HAVE_STDLIB_H +#undef UINT8 +#undef UINT16 +#undef UINT32 +#undef INT8 +#undef INT16 +#undef INT32 #include "libImaging/Jpeg.h" -static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { - PyObject* tables; - PyObject* table; - PyObject* table_data; +static unsigned int * +get_qtables_arrays(PyObject *qtables, int *qtablesLen) { + PyObject *tables; + PyObject *table; + PyObject *table_data; int i, j, num_tables; unsigned int *qarrays; - if ((qtables == NULL) || (qtables == Py_None)) { + if ((qtables == NULL) || (qtables == Py_None)) { return NULL; } @@ -996,13 +984,14 @@ static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { tables = PySequence_Fast(qtables, "expected a sequence"); num_tables = PySequence_Size(qtables); if (num_tables < 1 || num_tables > NUM_QUANT_TBLS) { - PyErr_SetString(PyExc_ValueError, + PyErr_SetString( + PyExc_ValueError, "Not a valid number of quantization tables. Should be between 1 and 4."); Py_DECREF(tables); return NULL; } /* malloc check ok, num_tables <4, DCTSIZE2 == 64 from jpeglib.h */ - qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); + qarrays = (unsigned int *)malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); if (!qarrays) { Py_DECREF(tables); return ImagingError_MemoryError(); @@ -1019,7 +1008,8 @@ static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { } table_data = PySequence_Fast(table, "expected a sequence"); for (j = 0; j < DCTSIZE2; j++) { - qarrays[i * DCTSIZE2 + j] = PyLong_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j)); + qarrays[i * DCTSIZE2 + j] = + PyLong_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j)); } Py_DECREF(table_data); } @@ -1037,10 +1027,9 @@ JPEG_QTABLES_ERR: return qarrays; } -PyObject* -PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) -{ - ImagingEncoderObject* encoder; +PyObject * +PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) { + ImagingEncoderObject *encoder; char *mode; char *rawmode; @@ -1051,19 +1040,32 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) Py_ssize_t streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */ Py_ssize_t xdpi = 0, ydpi = 0; Py_ssize_t subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */ - PyObject* qtables=NULL; + PyObject *qtables = NULL; unsigned int *qarrays = NULL; int qtablesLen = 0; - char* extra = NULL; + char *extra = NULL; Py_ssize_t extra_size; - char* rawExif = NULL; + char *rawExif = NULL; Py_ssize_t rawExifLen = 0; - if (!PyArg_ParseTuple(args, "ss|nnnnnnnnOy#y#", - &mode, &rawmode, &quality, - &progressive, &smooth, &optimize, &streamtype, - &xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size, - &rawExif, &rawExifLen)) { + if (!PyArg_ParseTuple( + args, + "ss|nnnnnnnnOy#y#", + &mode, + &rawmode, + &quality, + &progressive, + &smooth, + &optimize, + &streamtype, + &xdpi, + &ydpi, + &subsampling, + &qtables, + &extra, + &extra_size, + &rawExif, + &rawExifLen)) { return NULL; } @@ -1088,7 +1090,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) if (extra && extra_size > 0) { /* malloc check ok, length is from python parsearg */ - char* p = malloc(extra_size); // Freed in JpegEncode, Case 5 + char *p = malloc(extra_size); // Freed in JpegEncode, Case 5 if (!p) { return ImagingError_MemoryError(); } @@ -1100,7 +1102,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) if (rawExif && rawExifLen > 0) { /* malloc check ok, length is from python parsearg */ - char* pp = malloc(rawExifLen); // Freed in JpegEncode, Case 5 + char *pp = malloc(rawExifLen); // Freed in JpegEncode, Case 5 if (!pp) { if (extra) { free(extra); @@ -1115,29 +1117,28 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) encoder->encode = ImagingJpegEncode; - strncpy(((JPEGENCODERSTATE*)encoder->state.context)->rawmode, rawmode, 8); + strncpy(((JPEGENCODERSTATE *)encoder->state.context)->rawmode, rawmode, 8); - ((JPEGENCODERSTATE*)encoder->state.context)->quality = quality; - ((JPEGENCODERSTATE*)encoder->state.context)->qtables = qarrays; - ((JPEGENCODERSTATE*)encoder->state.context)->qtablesLen = qtablesLen; - ((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling; - ((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive; - ((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth; - ((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize; - ((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype; - ((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi; - ((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi; - ((JPEGENCODERSTATE*)encoder->state.context)->extra = extra; - ((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size; - ((JPEGENCODERSTATE*)encoder->state.context)->rawExif = rawExif; - ((JPEGENCODERSTATE*)encoder->state.context)->rawExifLen = rawExifLen; + ((JPEGENCODERSTATE *)encoder->state.context)->quality = quality; + ((JPEGENCODERSTATE *)encoder->state.context)->qtables = qarrays; + ((JPEGENCODERSTATE *)encoder->state.context)->qtablesLen = qtablesLen; + ((JPEGENCODERSTATE *)encoder->state.context)->subsampling = subsampling; + ((JPEGENCODERSTATE *)encoder->state.context)->progressive = progressive; + ((JPEGENCODERSTATE *)encoder->state.context)->smooth = smooth; + ((JPEGENCODERSTATE *)encoder->state.context)->optimize = optimize; + ((JPEGENCODERSTATE *)encoder->state.context)->streamtype = streamtype; + ((JPEGENCODERSTATE *)encoder->state.context)->xdpi = xdpi; + ((JPEGENCODERSTATE *)encoder->state.context)->ydpi = ydpi; + ((JPEGENCODERSTATE *)encoder->state.context)->extra = extra; + ((JPEGENCODERSTATE *)encoder->state.context)->extra_size = extra_size; + ((JPEGENCODERSTATE *)encoder->state.context)->rawExif = rawExif; + ((JPEGENCODERSTATE *)encoder->state.context)->rawExifLen = rawExifLen; - return (PyObject*) encoder; + return (PyObject *)encoder; } #endif - /* -------------------------------------------------------------------- */ /* JPEG 2000 */ /* -------------------------------------------------------------------- */ @@ -1147,8 +1148,7 @@ PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) #include "libImaging/Jpeg2K.h" static void -j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y) -{ +j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y) { *x = *y = 0; if (tuple && PyTuple_Check(tuple) && PyTuple_GET_SIZE(tuple) == 2) { @@ -1164,9 +1164,8 @@ j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y) } } -PyObject* -PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) -{ +PyObject * +PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) { ImagingEncoderObject *encoder; JPEG2KENCODESTATE *context; @@ -1185,20 +1184,31 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) OPJ_CINEMA_MODE cine_mode; Py_ssize_t fd = -1; - if (!PyArg_ParseTuple(args, "ss|OOOsOnOOOssn", &mode, &format, - &offset, &tile_offset, &tile_size, - &quality_mode, &quality_layers, &num_resolutions, - &cblk_size, &precinct_size, - &irreversible, &progression, &cinema_mode, - &fd)) { + if (!PyArg_ParseTuple( + args, + "ss|OOOsOnOOOssn", + &mode, + &format, + &offset, + &tile_offset, + &tile_size, + &quality_mode, + &quality_layers, + &num_resolutions, + &cblk_size, + &precinct_size, + &irreversible, + &progression, + &cinema_mode, + &fd)) { return NULL; } - if (strcmp (format, "j2k") == 0) { + if (strcmp(format, "j2k") == 0) { codec_format = OPJ_CODEC_J2K; - } else if (strcmp (format, "jpt") == 0) { + } else if (strcmp(format, "jpt") == 0) { codec_format = OPJ_CODEC_JPT; - } else if (strcmp (format, "jp2") == 0) { + } else if (strcmp(format, "jp2") == 0) { codec_format = OPJ_CODEC_JP2; } else { return NULL; @@ -1245,49 +1255,44 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) context->format = codec_format; context->offset_x = context->offset_y = 0; - j2k_decode_coord_tuple(offset, &context->offset_x, &context->offset_y); - j2k_decode_coord_tuple(tile_offset, - &context->tile_offset_x, - &context->tile_offset_y); - j2k_decode_coord_tuple(tile_size, - &context->tile_size_x, - &context->tile_size_y); + j2k_decode_coord_tuple( + tile_offset, &context->tile_offset_x, &context->tile_offset_y); + j2k_decode_coord_tuple(tile_size, &context->tile_size_x, &context->tile_size_y); /* Error on illegal tile offsets */ if (context->tile_size_x && context->tile_size_y) { - if (context->tile_offset_x <= context->offset_x - context->tile_size_x - || context->tile_offset_y <= context->offset_y - context->tile_size_y) { - PyErr_SetString(PyExc_ValueError, - "JPEG 2000 tile offset too small; top left tile must " - "intersect image area"); + if (context->tile_offset_x <= context->offset_x - context->tile_size_x || + context->tile_offset_y <= context->offset_y - context->tile_size_y) { + PyErr_SetString( + PyExc_ValueError, + "JPEG 2000 tile offset too small; top left tile must " + "intersect image area"); Py_DECREF(encoder); return NULL; } - if (context->tile_offset_x > context->offset_x - || context->tile_offset_y > context->offset_y) { - PyErr_SetString(PyExc_ValueError, - "JPEG 2000 tile offset too large to cover image area"); + if (context->tile_offset_x > context->offset_x || + context->tile_offset_y > context->offset_y) { + PyErr_SetString( + PyExc_ValueError, + "JPEG 2000 tile offset too large to cover image area"); Py_DECREF(encoder); return NULL; } } if (quality_layers && PySequence_Check(quality_layers)) { - context->quality_is_in_db = strcmp (quality_mode, "dB") == 0; + context->quality_is_in_db = strcmp(quality_mode, "dB") == 0; context->quality_layers = quality_layers; Py_INCREF(quality_layers); } context->num_resolutions = num_resolutions; - j2k_decode_coord_tuple(cblk_size, - &context->cblk_width, - &context->cblk_height); - j2k_decode_coord_tuple(precinct_size, - &context->precinct_width, - &context->precinct_height); + j2k_decode_coord_tuple(cblk_size, &context->cblk_width, &context->cblk_height); + j2k_decode_coord_tuple( + precinct_size, &context->precinct_width, &context->precinct_height); context->irreversible = PyObject_IsTrue(irreversible); context->progression = prog_order; diff --git a/src/libImaging/Access.c b/src/libImaging/Access.c index 755e2639a..6bb16fe3a 100644 --- a/src/libImaging/Access.c +++ b/src/libImaging/Access.c @@ -9,7 +9,6 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" /* use Tests/make_hash.py to calculate these values */ @@ -19,23 +18,25 @@ static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE]; static inline UINT32 -hash(const char* mode) -{ +hash(const char *mode) { UINT32 i = ACCESS_TABLE_HASH; while (*mode) { - i = ((i<<5) + i) ^ (UINT8) *mode++; + i = ((i << 5) + i) ^ (UINT8)*mode++; } return i % ACCESS_TABLE_SIZE; } static ImagingAccess -add_item(const char* mode) -{ +add_item(const char *mode) { UINT32 i = hash(mode); /* printf("hash %s => %d\n", mode, i); */ if (access_table[i].mode && strcmp(access_table[i].mode, mode) != 0) { - fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n", - i, mode, access_table[i].mode); + fprintf( + stderr, + "AccessInit: hash collision: %d for both %s and %s\n", + i, + mode, + access_table[i].mode); exit(1); } access_table[i].mode = mode; @@ -44,37 +45,33 @@ add_item(const char* mode) /* fetch pointer to pixel line */ -static void* -line_8(Imaging im, int x, int y) -{ +static void * +line_8(Imaging im, int x, int y) { return &im->image8[y][x]; } -static void* -line_16(Imaging im, int x, int y) -{ - return &im->image8[y][x+x]; +static void * +line_16(Imaging im, int x, int y) { + return &im->image8[y][x + x]; } -static void* -line_32(Imaging im, int x, int y) -{ +static void * +line_32(Imaging im, int x, int y) { return &im->image32[y][x]; } /* fetch individual pixel */ static void -get_pixel(Imaging im, int x, int y, void* color) -{ - char* out = color; +get_pixel(Imaging im, int x, int y, void *color) { + char *out = color; /* generic pixel access*/ if (im->image8) { out[0] = im->image8[y][x]; } else { - UINT8* p = (UINT8*) &im->image32[y][x]; + UINT8 *p = (UINT8 *)&im->image32[y][x]; if (im->type == IMAGING_TYPE_UINT8 && im->bands == 2) { out[0] = p[0]; out[1] = p[3]; @@ -85,18 +82,16 @@ get_pixel(Imaging im, int x, int y, void* color) } static void -get_pixel_8(Imaging im, int x, int y, void* color) -{ - char* out = color; +get_pixel_8(Imaging im, int x, int y, void *color) { + char *out = color; out[0] = im->image8[y][x]; } static void -get_pixel_16L(Imaging im, int x, int y, void* color) -{ - UINT8* in = (UINT8*) &im->image[y][x+x]; +get_pixel_16L(Imaging im, int x, int y, void *color) { + UINT8 *in = (UINT8 *)&im->image[y][x + x]; #ifdef WORDS_BIGENDIAN - UINT16 out = in[0] + (in[1]<<8); + UINT16 out = in[0] + (in[1] << 8); memcpy(color, &out, sizeof(out)); #else memcpy(color, in, sizeof(UINT16)); @@ -104,29 +99,26 @@ get_pixel_16L(Imaging im, int x, int y, void* color) } static void -get_pixel_16B(Imaging im, int x, int y, void* color) -{ - UINT8* in = (UINT8*) &im->image[y][x+x]; +get_pixel_16B(Imaging im, int x, int y, void *color) { + UINT8 *in = (UINT8 *)&im->image[y][x + x]; #ifdef WORDS_BIGENDIAN memcpy(color, in, sizeof(UINT16)); #else - UINT16 out = in[1] + (in[0]<<8); + UINT16 out = in[1] + (in[0] << 8); memcpy(color, &out, sizeof(out)); #endif } static void -get_pixel_32(Imaging im, int x, int y, void* color) -{ +get_pixel_32(Imaging im, int x, int y, void *color) { memcpy(color, &im->image32[y][x], sizeof(INT32)); } static void -get_pixel_32L(Imaging im, int x, int y, void* color) -{ - UINT8* in = (UINT8*) &im->image[y][x*4]; +get_pixel_32L(Imaging im, int x, int y, void *color) { + UINT8 *in = (UINT8 *)&im->image[y][x * 4]; #ifdef WORDS_BIGENDIAN - INT32 out = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24); + INT32 out = in[0] + (in[1] << 8) + (in[2] << 16) + (in[3] << 24); memcpy(color, &out, sizeof(out)); #else memcpy(color, in, sizeof(INT32)); @@ -134,13 +126,12 @@ get_pixel_32L(Imaging im, int x, int y, void* color) } static void -get_pixel_32B(Imaging im, int x, int y, void* color) -{ - UINT8* in = (UINT8*) &im->image[y][x*4]; +get_pixel_32B(Imaging im, int x, int y, void *color) { + UINT8 *in = (UINT8 *)&im->image[y][x * 4]; #ifdef WORDS_BIGENDIAN memcpy(color, in, sizeof(INT32)); #else - INT32 out = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24); + INT32 out = in[3] + (in[2] << 8) + (in[1] << 16) + (in[0] << 24); memcpy(color, &out, sizeof(out)); #endif } @@ -148,47 +139,41 @@ get_pixel_32B(Imaging im, int x, int y, void* color) /* store individual pixel */ static void -put_pixel(Imaging im, int x, int y, const void* color) -{ +put_pixel(Imaging im, int x, int y, const void *color) { if (im->image8) { - im->image8[y][x] = *((UINT8*) color); + im->image8[y][x] = *((UINT8 *)color); } else { memcpy(&im->image32[y][x], color, sizeof(INT32)); } } static void -put_pixel_8(Imaging im, int x, int y, const void* color) -{ - im->image8[y][x] = *((UINT8*) color); +put_pixel_8(Imaging im, int x, int y, const void *color) { + im->image8[y][x] = *((UINT8 *)color); } static void -put_pixel_16L(Imaging im, int x, int y, const void* color) -{ - memcpy(&im->image8[y][x+x], color, 2); +put_pixel_16L(Imaging im, int x, int y, const void *color) { + memcpy(&im->image8[y][x + x], color, 2); } static void -put_pixel_16B(Imaging im, int x, int y, const void* color) -{ - const char* in = color; - UINT8* out = (UINT8*) &im->image8[y][x+x]; +put_pixel_16B(Imaging im, int x, int y, const void *color) { + const char *in = color; + UINT8 *out = (UINT8 *)&im->image8[y][x + x]; out[0] = in[1]; out[1] = in[0]; } static void -put_pixel_32L(Imaging im, int x, int y, const void* color) -{ - memcpy(&im->image8[y][x*4], color, 4); +put_pixel_32L(Imaging im, int x, int y, const void *color) { + memcpy(&im->image8[y][x * 4], color, 4); } static void -put_pixel_32B(Imaging im, int x, int y, const void* color) -{ - const char* in = color; - UINT8* out = (UINT8*) &im->image8[y][x*4]; +put_pixel_32B(Imaging im, int x, int y, const void *color) { + const char *in = color; + UINT8 *out = (UINT8 *)&im->image8[y][x * 4]; out[0] = in[3]; out[1] = in[2]; out[2] = in[1]; @@ -196,19 +181,18 @@ put_pixel_32B(Imaging im, int x, int y, const void* color) } static void -put_pixel_32(Imaging im, int x, int y, const void* color) -{ +put_pixel_32(Imaging im, int x, int y, const void *color) { memcpy(&im->image32[y][x], color, sizeof(INT32)); } void -ImagingAccessInit() -{ -#define ADD(mode_, line_, get_pixel_, put_pixel_) \ - { ImagingAccess access = add_item(mode_); \ - access->line = line_; \ - access->get_pixel = get_pixel_; \ - access->put_pixel = put_pixel_; \ +ImagingAccessInit() { +#define ADD(mode_, line_, get_pixel_, put_pixel_) \ + { \ + ImagingAccess access = add_item(mode_); \ + access->line = line_; \ + access->get_pixel = get_pixel_; \ + access->put_pixel = put_pixel_; \ } /* populate access table */ @@ -236,8 +220,7 @@ ImagingAccessInit() } ImagingAccess -ImagingAccessNew(Imaging im) -{ +ImagingAccessNew(Imaging im) { ImagingAccess access = &access_table[hash(im->mode)]; if (im->mode[0] != access->mode[0] || strcmp(im->mode, access->mode) != 0) { return NULL; @@ -246,7 +229,4 @@ ImagingAccessNew(Imaging im) } void -_ImagingAccessDelete(Imaging im, ImagingAccess access) -{ - -} +_ImagingAccessDelete(Imaging im, ImagingAccess access) {} diff --git a/src/libImaging/AlphaComposite.c b/src/libImaging/AlphaComposite.c index 20b1df9e5..6d728f908 100644 --- a/src/libImaging/AlphaComposite.c +++ b/src/libImaging/AlphaComposite.c @@ -8,39 +8,30 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" #define PRECISION_BITS 7 -typedef struct -{ +typedef struct { UINT8 r; UINT8 g; UINT8 b; UINT8 a; } rgba8; - - Imaging -ImagingAlphaComposite(Imaging imDst, Imaging imSrc) -{ +ImagingAlphaComposite(Imaging imDst, Imaging imSrc) { Imaging imOut; int x, y; /* Check arguments */ - if (!imDst || !imSrc || - strcmp(imDst->mode, "RGBA") || - imDst->type != IMAGING_TYPE_UINT8 || - imDst->bands != 4) { + if (!imDst || !imSrc || strcmp(imDst->mode, "RGBA") || + imDst->type != IMAGING_TYPE_UINT8 || imDst->bands != 4) { return ImagingError_ModeError(); } - if (strcmp(imDst->mode, imSrc->mode) || - imDst->type != imSrc->type || - imDst->bands != imSrc->bands || - imDst->xsize != imSrc->xsize || + if (strcmp(imDst->mode, imSrc->mode) || imDst->type != imSrc->type || + imDst->bands != imSrc->bands || imDst->xsize != imSrc->xsize || imDst->ysize != imSrc->ysize) { return ImagingError_Mismatch(); } @@ -51,11 +42,11 @@ ImagingAlphaComposite(Imaging imDst, Imaging imSrc) } for (y = 0; y < imDst->ysize; y++) { - rgba8* dst = (rgba8*) imDst->image[y]; - rgba8* src = (rgba8*) imSrc->image[y]; - rgba8* out = (rgba8*) imOut->image[y]; + rgba8 *dst = (rgba8 *)imDst->image[y]; + rgba8 *src = (rgba8 *)imSrc->image[y]; + rgba8 *out = (rgba8 *)imOut->image[y]; - for (x = 0; x < imDst->xsize; x ++) { + for (x = 0; x < imDst->xsize; x++) { if (src->a == 0) { // Copy 4 bytes at once. *out = *dst; @@ -69,21 +60,25 @@ ImagingAlphaComposite(Imaging imDst, Imaging imSrc) UINT32 outa255 = src->a * 255 + blend; // There we use 7 bits for precision. // We could use more, but we go beyond 32 bits. - UINT32 coef1 = src->a * 255 * 255 * (1<a * 255 * 255 * (1 << PRECISION_BITS) / outa255; + UINT32 coef2 = 255 * (1 << PRECISION_BITS) - coef1; tmpr = src->r * coef1 + dst->r * coef2; tmpg = src->g * coef1 + dst->g * coef2; tmpb = src->b * coef1 + dst->b * coef2; - out->r = SHIFTFORDIV255(tmpr + (0x80<> PRECISION_BITS; - out->g = SHIFTFORDIV255(tmpg + (0x80<> PRECISION_BITS; - out->b = SHIFTFORDIV255(tmpb + (0x80<> PRECISION_BITS; + out->r = + SHIFTFORDIV255(tmpr + (0x80 << PRECISION_BITS)) >> PRECISION_BITS; + out->g = + SHIFTFORDIV255(tmpg + (0x80 << PRECISION_BITS)) >> PRECISION_BITS; + out->b = + SHIFTFORDIV255(tmpb + (0x80 << PRECISION_BITS)) >> PRECISION_BITS; out->a = SHIFTFORDIV255(outa255 + 0x80); } - dst++; src++; out++; + dst++; + src++; + out++; } - } return imOut; diff --git a/src/libImaging/Bands.c b/src/libImaging/Bands.c index 39ce5c49c..e1b16b34a 100644 --- a/src/libImaging/Bands.c +++ b/src/libImaging/Bands.c @@ -15,23 +15,20 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" - Imaging -ImagingGetBand(Imaging imIn, int band) -{ +ImagingGetBand(Imaging imIn, int band) { Imaging imOut; int x, y; /* Check arguments */ if (!imIn || imIn->type != IMAGING_TYPE_UINT8) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (band < 0 || band >= imIn->bands) { - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging)ImagingError_ValueError("band index out of range"); } /* Shortcuts */ @@ -51,8 +48,8 @@ ImagingGetBand(Imaging imIn, int band) /* Extract band from image */ for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y] + band; - UINT8* out = imOut->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y] + band; + UINT8 *out = imOut->image8[y]; x = 0; for (; x < imIn->xsize - 3; x += 4) { UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); @@ -68,15 +65,13 @@ ImagingGetBand(Imaging imIn, int band) return imOut; } - int -ImagingSplit(Imaging imIn, Imaging bands[4]) -{ +ImagingSplit(Imaging imIn, Imaging bands[4]) { int i, j, x, y; /* Check arguments */ if (!imIn || imIn->type != IMAGING_TYPE_UINT8) { - (void) ImagingError_ModeError(); + (void)ImagingError_ModeError(); return 0; } @@ -88,7 +83,7 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) for (i = 0; i < imIn->bands; i++) { bands[i] = ImagingNewDirty("L", imIn->xsize, imIn->ysize); - if ( ! bands[i]) { + if (!bands[i]) { for (j = 0; j < i; ++j) { ImagingDelete(bands[j]); } @@ -99,14 +94,14 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) /* Extract bands from image */ if (imIn->bands == 2) { for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out0 = bands[0]->image8[y]; - UINT8* out1 = bands[1]->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out0 = bands[0]->image8[y]; + UINT8 *out1 = bands[1]->image8[y]; x = 0; for (; x < imIn->xsize - 3; x += 4) { UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); memcpy(out0 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); + v = MAKE_UINT32(in[0 + 3], in[4 + 3], in[8 + 3], in[12 + 3]); memcpy(out1 + x, &v, sizeof(v)); in += 16; } @@ -118,17 +113,17 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) } } else if (imIn->bands == 3) { for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out0 = bands[0]->image8[y]; - UINT8* out1 = bands[1]->image8[y]; - UINT8* out2 = bands[2]->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out0 = bands[0]->image8[y]; + UINT8 *out1 = bands[1]->image8[y]; + UINT8 *out2 = bands[2]->image8[y]; x = 0; for (; x < imIn->xsize - 3; x += 4) { UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); memcpy(out0 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); + v = MAKE_UINT32(in[0 + 1], in[4 + 1], in[8 + 1], in[12 + 1]); memcpy(out1 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); + v = MAKE_UINT32(in[0 + 2], in[4 + 2], in[8 + 2], in[12 + 2]); memcpy(out2 + x, &v, sizeof(v)); in += 16; } @@ -141,20 +136,20 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) } } else { for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out0 = bands[0]->image8[y]; - UINT8* out1 = bands[1]->image8[y]; - UINT8* out2 = bands[2]->image8[y]; - UINT8* out3 = bands[3]->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out0 = bands[0]->image8[y]; + UINT8 *out1 = bands[1]->image8[y]; + UINT8 *out2 = bands[2]->image8[y]; + UINT8 *out3 = bands[3]->image8[y]; x = 0; for (; x < imIn->xsize - 3; x += 4) { UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); memcpy(out0 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); + v = MAKE_UINT32(in[0 + 1], in[4 + 1], in[8 + 1], in[12 + 1]); memcpy(out1 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); + v = MAKE_UINT32(in[0 + 2], in[4 + 2], in[8 + 2], in[12 + 2]); memcpy(out2 + x, &v, sizeof(v)); - v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); + v = MAKE_UINT32(in[0 + 3], in[4 + 3], in[8 + 3], in[12 + 3]); memcpy(out3 + x, &v, sizeof(v)); in += 16; } @@ -171,25 +166,22 @@ ImagingSplit(Imaging imIn, Imaging bands[4]) return imIn->bands; } - Imaging -ImagingPutBand(Imaging imOut, Imaging imIn, int band) -{ +ImagingPutBand(Imaging imOut, Imaging imIn, int band) { int x, y; /* Check arguments */ if (!imIn || imIn->bands != 1 || !imOut) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (band < 0 || band >= imOut->bands) { - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging)ImagingError_ValueError("band index out of range"); } - if (imIn->type != imOut->type || - imIn->xsize != imOut->xsize || + if (imIn->type != imOut->type || imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } /* Shortcuts */ @@ -204,8 +196,8 @@ ImagingPutBand(Imaging imOut, Imaging imIn, int band) /* Insert band into image */ for (y = 0; y < imIn->ysize; y++) { - UINT8* in = imIn->image8[y]; - UINT8* out = (UINT8*) imOut->image[y] + band; + UINT8 *in = imIn->image8[y]; + UINT8 *out = (UINT8 *)imOut->image[y] + band; for (x = 0; x < imIn->xsize; x++) { *out = in[x]; out += 4; @@ -216,17 +208,16 @@ ImagingPutBand(Imaging imOut, Imaging imIn, int band) } Imaging -ImagingFillBand(Imaging imOut, int band, int color) -{ +ImagingFillBand(Imaging imOut, int band, int color) { int x, y; /* Check arguments */ if (!imOut || imOut->type != IMAGING_TYPE_UINT8) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (band < 0 || band >= imOut->bands) { - return (Imaging) ImagingError_ValueError("band index out of range"); + return (Imaging)ImagingError_ValueError("band index out of range"); } /* Special case for LXXA etc */ @@ -238,9 +229,9 @@ ImagingFillBand(Imaging imOut, int band, int color) /* Insert color into image */ for (y = 0; y < imOut->ysize; y++) { - UINT8* out = (UINT8*) imOut->image[y] + band; + UINT8 *out = (UINT8 *)imOut->image[y] + band; for (x = 0; x < imOut->xsize; x++) { - *out = (UINT8) color; + *out = (UINT8)color; out += 4; } } @@ -249,40 +240,39 @@ ImagingFillBand(Imaging imOut, int band, int color) } Imaging -ImagingMerge(const char* mode, Imaging bands[4]) -{ +ImagingMerge(const char *mode, Imaging bands[4]) { int i, x, y; int bandsCount = 0; Imaging imOut; Imaging firstBand; firstBand = bands[0]; - if ( ! firstBand) { - return (Imaging) ImagingError_ValueError("wrong number of bands"); + if (!firstBand) { + return (Imaging)ImagingError_ValueError("wrong number of bands"); } for (i = 0; i < 4; ++i) { - if ( ! bands[i]) { + if (!bands[i]) { break; } if (bands[i]->bands != 1) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } - if (bands[i]->xsize != firstBand->xsize - || bands[i]->ysize != firstBand->ysize) { - return (Imaging) ImagingError_Mismatch(); + if (bands[i]->xsize != firstBand->xsize || + bands[i]->ysize != firstBand->ysize) { + return (Imaging)ImagingError_Mismatch(); } } bandsCount = i; imOut = ImagingNewDirty(mode, firstBand->xsize, firstBand->ysize); - if ( ! imOut) { + if (!imOut) { return NULL; } if (imOut->bands != bandsCount) { ImagingDelete(imOut); - return (Imaging) ImagingError_ValueError("wrong number of bands"); + return (Imaging)ImagingError_ValueError("wrong number of bands"); } if (imOut->bands == 1) { @@ -291,30 +281,30 @@ ImagingMerge(const char* mode, Imaging bands[4]) if (imOut->bands == 2) { for (y = 0; y < imOut->ysize; y++) { - UINT8* in0 = bands[0]->image8[y]; - UINT8* in1 = bands[1]->image8[y]; - UINT32* out = (UINT32*) imOut->image32[y]; + UINT8 *in0 = bands[0]->image8[y]; + UINT8 *in1 = bands[1]->image8[y]; + UINT32 *out = (UINT32 *)imOut->image32[y]; for (x = 0; x < imOut->xsize; x++) { out[x] = MAKE_UINT32(in0[x], 0, 0, in1[x]); } } } else if (imOut->bands == 3) { for (y = 0; y < imOut->ysize; y++) { - UINT8* in0 = bands[0]->image8[y]; - UINT8* in1 = bands[1]->image8[y]; - UINT8* in2 = bands[2]->image8[y]; - UINT32* out = (UINT32*) imOut->image32[y]; + UINT8 *in0 = bands[0]->image8[y]; + UINT8 *in1 = bands[1]->image8[y]; + UINT8 *in2 = bands[2]->image8[y]; + UINT32 *out = (UINT32 *)imOut->image32[y]; for (x = 0; x < imOut->xsize; x++) { out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], 0); } } } else if (imOut->bands == 4) { for (y = 0; y < imOut->ysize; y++) { - UINT8* in0 = bands[0]->image8[y]; - UINT8* in1 = bands[1]->image8[y]; - UINT8* in2 = bands[2]->image8[y]; - UINT8* in3 = bands[3]->image8[y]; - UINT32* out = (UINT32*) imOut->image32[y]; + UINT8 *in0 = bands[0]->image8[y]; + UINT8 *in1 = bands[1]->image8[y]; + UINT8 *in2 = bands[2]->image8[y]; + UINT8 *in3 = bands[3]->image8[y]; + UINT32 *out = (UINT32 *)imOut->image32[y]; for (x = 0; x < imOut->xsize; x++) { out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], in3[x]); } diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index f908a03ad..b6a4cbadc 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -11,10 +11,8 @@ * https://creativecommons.org/publicdomain/zero/1.0/ */ - #include "Imaging.h" - typedef struct { UINT8 r, g, b, a; } rgba; @@ -37,23 +35,24 @@ typedef struct { UINT8 lut[6]; } bc3_alpha; -#define LOAD16(p) \ - (p)[0] | ((p)[1] << 8) +#define LOAD16(p) (p)[0] | ((p)[1] << 8) -#define LOAD32(p) \ - (p)[0] | ((p)[1] << 8) | ((p)[2] << 16) | ((p)[3] << 24) +#define LOAD32(p) (p)[0] | ((p)[1] << 8) | ((p)[2] << 16) | ((p)[3] << 24) -static void bc1_color_load(bc1_color *dst, const UINT8 *src) { +static void +bc1_color_load(bc1_color *dst, const UINT8 *src) { dst->c0 = LOAD16(src); dst->c1 = LOAD16(src + 2); dst->lut = LOAD32(src + 4); } -static void bc3_alpha_load(bc3_alpha *dst, const UINT8 *src) { +static void +bc3_alpha_load(bc3_alpha *dst, const UINT8 *src) { memcpy(dst, src, sizeof(bc3_alpha)); } -static rgba decode_565(UINT16 x) { +static rgba +decode_565(UINT16 x) { rgba c; int r, g, b; r = (x & 0xf800) >> 8; @@ -69,7 +68,8 @@ static rgba decode_565(UINT16 x) { return c; } -static void decode_bc1_color(rgba *dst, const UINT8 *src) { +static void +decode_bc1_color(rgba *dst, const UINT8 *src) { bc1_color col; rgba p[4]; int n, cw; @@ -85,13 +85,13 @@ static void decode_bc1_color(rgba *dst, const UINT8 *src) { g1 = p[1].g; b1 = p[1].b; if (col.c0 > col.c1) { - p[2].r = (2*r0 + 1*r1) / 3; - p[2].g = (2*g0 + 1*g1) / 3; - p[2].b = (2*b0 + 1*b1) / 3; + p[2].r = (2 * r0 + 1 * r1) / 3; + p[2].g = (2 * g0 + 1 * g1) / 3; + p[2].b = (2 * b0 + 1 * b1) / 3; p[2].a = 0xff; - p[3].r = (1*r0 + 2*r1) / 3; - p[3].g = (1*g0 + 2*g1) / 3; - p[3].b = (1*b0 + 2*b1) / 3; + p[3].r = (1 * r0 + 2 * r1) / 3; + p[3].g = (1 * g0 + 2 * g1) / 3; + p[3].b = (1 * b0 + 2 * b1) / 3; p[3].a = 0xff; } else { p[2].r = (r0 + r1) / 2; @@ -109,7 +109,8 @@ static void decode_bc1_color(rgba *dst, const UINT8 *src) { } } -static void decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { +static void +decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { bc3_alpha b; UINT16 a0, a1; UINT8 a[8]; @@ -121,17 +122,17 @@ static void decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { a[0] = (UINT8)a0; a[1] = (UINT8)a1; if (a0 > a1) { - a[2] = (6*a0 + 1*a1) / 7; - a[3] = (5*a0 + 2*a1) / 7; - a[4] = (4*a0 + 3*a1) / 7; - a[5] = (3*a0 + 4*a1) / 7; - a[6] = (2*a0 + 5*a1) / 7; - a[7] = (1*a0 + 6*a1) / 7; + a[2] = (6 * a0 + 1 * a1) / 7; + a[3] = (5 * a0 + 2 * a1) / 7; + a[4] = (4 * a0 + 3 * a1) / 7; + a[5] = (3 * a0 + 4 * a1) / 7; + a[6] = (2 * a0 + 5 * a1) / 7; + a[7] = (1 * a0 + 6 * a1) / 7; } else { - a[2] = (4*a0 + 1*a1) / 5; - a[3] = (3*a0 + 2*a1) / 5; - a[4] = (2*a0 + 3*a1) / 5; - a[5] = (1*a0 + 4*a1) / 5; + a[2] = (4 * a0 + 1 * a1) / 5; + a[3] = (3 * a0 + 2 * a1) / 5; + a[4] = (2 * a0 + 3 * a1) / 5; + a[5] = (1 * a0 + 4 * a1) / 5; a[6] = 0; a[7] = 0xff; } @@ -143,15 +144,17 @@ static void decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { lut = b.lut[3] | (b.lut[4] << 8) | (b.lut[5] << 16); for (n = 0; n < 8; n++) { aw = 7 & (lut >> (3 * n)); - dst[stride * (8+n) + o] = a[aw]; + dst[stride * (8 + n) + o] = a[aw]; } } -static void decode_bc1_block(rgba *col, const UINT8* src) { +static void +decode_bc1_block(rgba *col, const UINT8 *src) { decode_bc1_color(col, src); } -static void decode_bc2_block(rgba *col, const UINT8* src) { +static void +decode_bc2_block(rgba *col, const UINT8 *src) { int n, bitI, byI, av; decode_bc1_color(col, src + 8); for (n = 0; n < 16; n++) { @@ -163,30 +166,36 @@ static void decode_bc2_block(rgba *col, const UINT8* src) { } } -static void decode_bc3_block(rgba *col, const UINT8* src) { +static void +decode_bc3_block(rgba *col, const UINT8 *src) { decode_bc1_color(col, src + 8); decode_bc3_alpha((char *)col, src, sizeof(col[0]), 3); } -static void decode_bc4_block(lum *col, const UINT8* src) { +static void +decode_bc4_block(lum *col, const UINT8 *src) { decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); } -static void decode_bc5_block(rgba *col, const UINT8* src) { +static void +decode_bc5_block(rgba *col, const UINT8 *src) { decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); decode_bc3_alpha((char *)col, src + 8, sizeof(col[0]), 1); } /* BC6 and BC7 are described here: - https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_compression_bptc.txt */ + https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_compression_bptc.txt + */ -static UINT8 get_bit(const UINT8* src, int bit) { +static UINT8 +get_bit(const UINT8 *src, int bit) { int by = bit >> 3; bit &= 7; return (src[by] >> bit) & 1; } -static UINT8 get_bits(const UINT8* src, int bit, int count) { +static UINT8 +get_bits(const UINT8 *src, int bit, int count) { UINT8 v; int x; int by = bit >> 3; @@ -197,7 +206,7 @@ static UINT8 get_bits(const UINT8* src, int bit, int count) { if (bit + count <= 8) { v = (src[by] >> bit) & ((1 << count) - 1); } else { - x = src[by] | (src[by+1] << 8); + x = src[by] | (src[by + 1] << 8); v = (x >> bit) & ((1 << count) - 1); } return v; @@ -225,73 +234,51 @@ static const bc7_mode_info bc7_modes[] = { {1, 0, 2, 1, 5, 6, 0, 0, 2, 3}, {1, 0, 2, 0, 7, 8, 0, 0, 2, 2}, {1, 0, 0, 0, 7, 7, 1, 0, 4, 0}, - {2, 6, 0, 0, 5, 5, 1, 0, 2, 0} -}; + {2, 6, 0, 0, 5, 5, 1, 0, 2, 0}}; /* Subset indices: Table.P2, 1 bit per index */ static const UINT16 bc7_si2[] = { - 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, - 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, - 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, - 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, - 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, - 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, - 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, - 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22}; + 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, + 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, 0xf710, 0x008e, 0x7100, 0x08ce, + 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, + 0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, + 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4, + 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, + 0xccf0, 0x0fcc, 0x7744, 0xee22}; /* Table.P3, 2 bits per index */ static const UINT32 bc7_si3[] = { - 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, - 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, - 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, - 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, - 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, - 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, - 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, - 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, - 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, - 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, - 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, - 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, - 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, - 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, - 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, - 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254}; + 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, + 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, + 0xa9a59450, 0x2a0a4250, 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, + 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, + 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, 0xa9a58000, 0x5090a0a8, 0xa8a09050, + 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, + 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444, + 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, + 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, + 0x2a4a5254}; /* Anchor indices: Table.A2 */ static const char bc7_ai0[] = { - 15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15, - 15, 2, 8, 2, 2, 8, 8,15, - 2, 8, 2, 2, 8, 8, 2, 2, - 15,15, 6, 8, 2, 8,15,15, - 2, 8, 2, 2, 2,15,15, 6, - 6, 2, 6, 8,15,15, 2, 2, - 15,15,15,15,15, 2, 2,15}; + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, + 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, + 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15}; /* Table.A3a */ static const char bc7_ai1[] = { - 3, 3,15,15, 8, 3,15,15, - 8, 8, 6, 6, 6, 5, 3, 3, - 3, 3, 8,15, 3, 3, 6,10, - 5, 8, 8, 6, 8, 5,15,15, - 8,15, 3, 5, 6,10, 8,15, - 15, 3,15, 5,15,15,15,15, - 3,15, 5, 5, 5, 8, 5,10, - 5,10, 8,13,15,12, 3, 3}; + 3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, + 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, + 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3}; /* Table.A3b */ -static const char bc7_ai2[] = { - 15, 8, 8, 3,15,15, 3, 8, - 15,15,15,15,15,15,15, 8, - 15, 8,15, 3,15, 8,15, 8, - 3,15, 6,10,15,15,10, 8, - 15, 3,15,10,10, 8, 9,10, - 6,15, 8,15, 3, 6, 6, 8, - 15, 3,15,15,15,15,15,15, - 15,15,15,15, 3,15,15, 8}; +static const char bc7_ai2[] = {15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, + 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, + 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, + 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8}; /* Interpolation weights */ static const char bc7_weights2[] = {0, 21, 43, 64}; @@ -299,7 +286,8 @@ static const char bc7_weights3[] = {0, 9, 18, 27, 37, 46, 55, 64}; static const char bc7_weights4[] = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64}; -static const char *bc7_get_weights(int n) { +static const char * +bc7_get_weights(int n) { if (n == 2) { return bc7_weights2; } @@ -309,7 +297,8 @@ static const char *bc7_get_weights(int n) { return bc7_weights4; } -static int bc7_get_subset(int ns, int partition, int n) { +static int +bc7_get_subset(int ns, int partition, int n) { if (ns == 2) { return 1 & (bc7_si2[partition] >> n); } @@ -319,12 +308,14 @@ static int bc7_get_subset(int ns, int partition, int n) { return 0; } -static UINT8 expand_quantized(UINT8 v, int bits) { +static UINT8 +expand_quantized(UINT8 v, int bits) { v = v << (8 - bits); return v | (v >> bits); } -static void bc7_lerp(rgba *dst, const rgba *e, int s0, int s1) { +static void +bc7_lerp(rgba *dst, const rgba *e, int s0, int s1) { int t0 = 64 - s0; int t1 = 64 - s1; dst->r = (UINT8)((t0 * e[0].r + s0 * e[1].r + 32) >> 6); @@ -333,7 +324,8 @@ static void bc7_lerp(rgba *dst, const rgba *e, int s0, int s1) { dst->a = (UINT8)((t1 * e[0].a + s1 * e[1].a + 32) >> 6); } -static void decode_bc7_block(rgba *col, const UINT8* src) { +static void +decode_bc7_block(rgba *col, const UINT8 *src) { rgba endpoints[6]; int bit = 0, cibit, aibit; int mode = src[0]; @@ -352,7 +344,8 @@ static void decode_bc7_block(rgba *col, const UINT8* src) { } return; } - while (!(mode & (1 << bit++))) ; + while (!(mode & (1 << bit++))) + ; mode = bit - 1; info = &bc7_modes[mode]; /* color selection bits: {subset}{endpoint} */ @@ -361,7 +354,7 @@ static void decode_bc7_block(rgba *col, const UINT8* src) { cw = bc7_get_weights(info->ib); aw = bc7_get_weights((ab && info->ib2) ? info->ib2 : info->ib); -#define LOAD(DST, N) \ +#define LOAD(DST, N) \ DST = get_bits(src, bit, N); \ bit += N; LOAD(partition, info->pb); @@ -421,14 +414,14 @@ static void decode_bc7_block(rgba *col, const UINT8* src) { if (ab) { ab++; } - for (i = 0; i < numep; i+=2) { + for (i = 0; i < numep; i += 2) { LOAD(val, 1); for (j = 0; j < 2; j++) { - ASSIGN_P(endpoints[i+j].r); - ASSIGN_P(endpoints[i+j].g); - ASSIGN_P(endpoints[i+j].b); + ASSIGN_P(endpoints[i + j].r); + ASSIGN_P(endpoints[i + j].g); + ASSIGN_P(endpoints[i + j].b); if (ab) { - ASSIGN_P(endpoints[i+j].a); + ASSIGN_P(endpoints[i + j].a); } } } @@ -482,9 +475,9 @@ static void decode_bc7_block(rgba *col, const UINT8* src) { bc7_lerp(&col[i], &endpoints[s], cw[i0], cw[i0]); } #define ROTATE(x, y) \ - val = x; \ - x = y; \ - y = val + val = x; \ + x = y; \ + y = val if (rotation == 1) { ROTATE(col[i].r, col[i].a); } else if (rotation == 2) { @@ -498,106 +491,102 @@ static void decode_bc7_block(rgba *col, const UINT8* src) { /* BC6 */ typedef struct { - char ns; /* number of subsets (also called regions) */ - char tr; /* whether endpoints are delta-compressed */ - char pb; /* partition bits */ + char ns; /* number of subsets (also called regions) */ + char tr; /* whether endpoints are delta-compressed */ + char pb; /* partition bits */ char epb; /* endpoint bits */ - char rb; /* red bits (delta) */ - char gb; /* green bits (delta) */ - char bb; /* blue bits (delta) */ + char rb; /* red bits (delta) */ + char gb; /* green bits (delta) */ + char bb; /* blue bits (delta) */ } bc6_mode_info; static const bc6_mode_info bc6_modes[] = { // 00 {2, 1, 5, 10, 5, 5, 5}, // 01 - {2, 1, 5, 7, 6, 6, 6}, + {2, 1, 5, 7, 6, 6, 6}, // 10 {2, 1, 5, 11, 5, 4, 4}, {2, 1, 5, 11, 4, 5, 4}, {2, 1, 5, 11, 4, 4, 5}, - {2, 1, 5, 9, 5, 5, 5}, - {2, 1, 5, 8, 6, 5, 5}, - {2, 1, 5, 8, 5, 6, 5}, - {2, 1, 5, 8, 5, 5, 6}, - {2, 0, 5, 6, 6, 6, 6}, + {2, 1, 5, 9, 5, 5, 5}, + {2, 1, 5, 8, 6, 5, 5}, + {2, 1, 5, 8, 5, 6, 5}, + {2, 1, 5, 8, 5, 5, 6}, + {2, 0, 5, 6, 6, 6, 6}, // 11 {1, 0, 0, 10, 10, 10, 10}, - {1, 1, 0, 11, 9, 9, 9}, - {1, 1, 0, 12, 8, 8, 8}, - {1, 1, 0, 16, 4, 4, 4} -}; + {1, 1, 0, 11, 9, 9, 9}, + {1, 1, 0, 12, 8, 8, 8}, + {1, 1, 0, 16, 4, 4, 4}}; /* Table.F, encoded as a sequence of bit indices */ static const UINT8 bc6_bit_packings[][75] = { - {116, 132, 176, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, - 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, - 81, 82, 83, 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, - 145, 146, 147, 148, 175}, - {117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 172, 173, 132, 16, 17, 18, 19, 20, 21, - 22, 133, 174, 116, 32, 33, 34, 35, 36, 37, 38, 175, 177, 176, 48, 49, 50, - 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, - 80, 81, 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, - 145, 146, 147, 148, 149}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 10, 112, 113, 114, - 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, - 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, - 175}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 164, 112, 113, 114, - 115, 64, 65, 66, 67, 68, 26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, - 128, 129, 130, 131, 96, 97, 98, 99, 172, 174, 144, 145, 146, 147, 116, - 175}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 132, 112, 113, 114, - 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, - 128, 129, 130, 131, 96, 97, 98, 99, 173, 174, 144, 145, 146, 147, 176, - 175}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20, 21, 22, 23, 24, 116, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 176, 48, 49, 50, 51, 52, 164, 112, 113, - 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, - 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, - 175}, - {0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20, 21, 22, 23, 174, 116, - 32, 33, 34, 35, 36, 37, 38, 39, 175, 176, 48, 49, 50, 51, 52, 53, 112, 113, - 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, - 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, - 149}, - {0, 1, 2, 3, 4, 5, 6, 7, 172, 132, 16, 17, 18, 19, 20, 21, 22, 23, 117, 116, - 32, 33, 34, 35, 36, 37, 38, 39, 165, 176, 48, 49, 50, 51, 52, 164, 112, - 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, - 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, - 148, 175}, - {0, 1, 2, 3, 4, 5, 6, 7, 173, 132, 16, 17, 18, 19, 20, 21, 22, 23, 133, 116, - 32, 33, 34, 35, 36, 37, 38, 39, 177, 176, 48, 49, 50, 51, 52, 164, 112, - 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, - 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, - 148, 175}, - {0, 1, 2, 3, 4, 5, 164, 172, 173, 132, 16, 17, 18, 19, 20, 21, 117, 133, - 174, 116, 32, 33, 34, 35, 36, 37, 165, 175, 177, 176, 48, 49, 50, 51, 52, - 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, - 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, - 146, 147, 148, 149}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 10, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 26, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 42}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 11, 10, - 64, 65, 66, 67, 68, 69, 70, 71, 27, 26, 80, 81, 82, 83, 84, 85, 86, 87, 43, - 42}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 15, 14, 13, 12, 11, 10, - 64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, - 42}}; + {116, 132, 176, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, + 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, + 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175}, + {117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 172, 173, 132, 16, 17, + 18, 19, 20, 21, 22, 133, 174, 116, 32, 33, 34, 35, 36, 37, 38, + 175, 177, 176, 48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, + 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, + 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 48, 49, 50, 51, 52, 10, 112, 113, 114, 115, 64, 65, 66, 67, 26, + 172, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 48, 49, 50, 51, 10, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, 128, 129, 130, 131, + 96, 97, 98, 99, 172, 174, 144, 145, 146, 147, 116, 175}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 48, 49, 50, 51, 10, 132, 112, 113, 114, 115, 64, 65, 66, 67, 26, + 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, 128, 129, 130, 131, + 96, 97, 98, 99, 173, 174, 144, 145, 146, 147, 176, 175}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 176, + 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175}, + {0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20, + 21, 22, 23, 174, 116, 32, 33, 34, 35, 36, 37, 38, 39, 175, 176, + 48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149}, + {0, 1, 2, 3, 4, 5, 6, 7, 172, 132, 16, 17, 18, 19, 20, + 21, 22, 23, 117, 116, 32, 33, 34, 35, 36, 37, 38, 39, 165, 176, + 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175}, + {0, 1, 2, 3, 4, 5, 6, 7, 173, 132, 16, 17, 18, 19, 20, + 21, 22, 23, 133, 116, 32, 33, 34, 35, 36, 37, 38, 39, 177, 176, + 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175}, + {0, 1, 2, 3, 4, 5, 164, 172, 173, 132, 16, 17, 18, 19, 20, + 21, 117, 133, 174, 116, 32, 33, 34, 35, 36, 37, 165, 175, 177, 176, + 48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, + 69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131, + 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 10, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 26, 80, 81, 82, 83, 84, 85, 86, 87, 88, 42}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 11, 10, + 64, 65, 66, 67, 68, 69, 70, 71, 27, 26, 80, 81, 82, 83, 84, 85, 86, 87, 43, 42}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 15, 14, 13, 12, 11, 10, + 64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, 42}}; -static void bc6_sign_extend(UINT16 *v, int prec) { +static void +bc6_sign_extend(UINT16 *v, int prec) { int x = *v; if (x & (1 << (prec - 1))) { x |= -1 << prec; @@ -605,7 +594,8 @@ static void bc6_sign_extend(UINT16 *v, int prec) { *v = (UINT16)x; } -static int bc6_unquantize(UINT16 v, int prec, int sign) { +static int +bc6_unquantize(UINT16 v, int prec, int sign) { int s = 0; int x; if (!sign) { @@ -645,7 +635,8 @@ static int bc6_unquantize(UINT16 v, int prec, int sign) { } } -static float half_to_float(UINT16 h) { +static float +half_to_float(UINT16 h) { /* https://gist.github.com/rygorous/2144712 */ union { UINT32 u; @@ -662,7 +653,8 @@ static float half_to_float(UINT16 h) { return o.f; } -static float bc6_finalize(int v, int sign) { +static float +bc6_finalize(int v, int sign) { if (sign) { if (v < 0) { v = ((-v) * 31) / 32; @@ -675,7 +667,8 @@ static float bc6_finalize(int v, int sign) { } } -static void bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) { +static void +bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) { int r, g, b; int t = 64 - s; r = (e0[0] * t + e1[0] * s) >> 6; @@ -686,7 +679,8 @@ static void bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) { col->b = bc6_finalize(b, sign); } -static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { +static void +decode_bc6_block(rgb32f *col, const UINT8 *src, int sign) { UINT16 endpoints[12]; /* storage for r0, g0, b0, r1, ... */ int ueps[12]; int i, i0, ib2, di, dw, mask, numep, s; @@ -736,9 +730,9 @@ static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { } if (sign || info->tr) { /* sign-extend e1,2,3 if signed or deltas */ for (i = 3; i < numep; i += 3) { - bc6_sign_extend(&endpoints[i+0], info->rb); - bc6_sign_extend(&endpoints[i+1], info->gb); - bc6_sign_extend(&endpoints[i+2], info->bb); + bc6_sign_extend(&endpoints[i + 0], info->rb); + bc6_sign_extend(&endpoints[i + 1], info->gb); + bc6_sign_extend(&endpoints[i + 2], info->bb); } } if (info->tr) { /* apply deltas */ @@ -747,9 +741,9 @@ static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { } if (sign) { for (i = 3; i < numep; i += 3) { - bc6_sign_extend(&endpoints[i+0], info->rb); - bc6_sign_extend(&endpoints[i+1], info->gb); - bc6_sign_extend(&endpoints[i+2], info->bb); + bc6_sign_extend(&endpoints[i + 0], info->rb); + bc6_sign_extend(&endpoints[i + 1], info->gb); + bc6_sign_extend(&endpoints[i + 2], info->bb); } } } @@ -769,11 +763,12 @@ static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { i0 = get_bits(src, bit, ib2); bit += ib2; - bc6_lerp(&col[i], &ueps[s], &ueps[s+3], cw[i0], sign); + bc6_lerp(&col[i], &ueps[s], &ueps[s + 3], cw[i0], sign); } } -static void put_block(Imaging im, ImagingCodecState state, const char *col, int sz, int C) { +static void +put_block(Imaging im, ImagingCodecState state, const char *col, int sz, int C) { int width = state->xsize; int height = state->ysize; int xmax = width + state->xoff; @@ -795,15 +790,15 @@ static void put_block(Imaging im, ImagingCodecState state, const char *col, int if (x >= width) { continue; } - memcpy(dst + sz*x, col + sz*(j*4 + i), sz); + memcpy(dst + sz * x, col + sz * (j * 4 + i), sz); } } else { if (state->ystep < 0) { y = state->yoff + ymax - y - 1; } x = state->x; - dst = im->image[y] + sz*x; - memcpy(dst, col + sz*(j*4), 4 * sz); + dst = im->image[y] + sz * x; + memcpy(dst, col + sz * (j * 4), 4 * sz); } } state->x += 4; @@ -813,23 +808,25 @@ static void put_block(Imaging im, ImagingCodecState state, const char *col, int } } -static int decode_bcn(Imaging im, ImagingCodecState state, const UINT8* src, int bytes, int N, int C) { +static int +decode_bcn( + Imaging im, ImagingCodecState state, const UINT8 *src, int bytes, int N, int C) { int ymax = state->ysize + state->yoff; const UINT8 *ptr = src; switch (N) { -#define DECODE_LOOP(NN, SZ, TY, ...) \ - case NN: \ - while (bytes >= SZ) { \ - TY col[16]; \ - memset(col, 0, 16 * sizeof(col[0])); \ - decode_bc##NN##_block(col, ptr); \ +#define DECODE_LOOP(NN, SZ, TY, ...) \ + case NN: \ + while (bytes >= SZ) { \ + TY col[16]; \ + memset(col, 0, 16 * sizeof(col[0])); \ + decode_bc##NN##_block(col, ptr); \ put_block(im, state, (const char *)col, sizeof(col[0]), C); \ - ptr += SZ; \ - bytes -= SZ; \ - if (state->y >= ymax) {\ - return -1; \ - }\ - } \ + ptr += SZ; \ + bytes -= SZ; \ + if (state->y >= ymax) { \ + return -1; \ + } \ + } \ break DECODE_LOOP(1, 8, rgba); @@ -844,18 +841,19 @@ static int decode_bcn(Imaging im, ImagingCodecState state, const UINT8* src, int put_block(im, state, (const char *)col, sizeof(col[0]), C); ptr += 16; bytes -= 16; - if (state->y >= ymax) {\ - return -1; \ - }\ + if (state->y >= ymax) { + return -1; + } } break; - DECODE_LOOP(7, 16, rgba); + DECODE_LOOP(7, 16, rgba); #undef DECODE_LOOP } return (int)(ptr - src); } -int ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) { +int +ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { int N = state->state & 0xf; int width = state->xsize; int height = state->ysize; diff --git a/src/libImaging/Bit.h b/src/libImaging/Bit.h index 56e3a17d2..f64bfb469 100644 --- a/src/libImaging/Bit.h +++ b/src/libImaging/Bit.h @@ -1,7 +1,6 @@ /* Bit.h */ typedef struct { - /* CONFIGURATION */ /* Number of bits per pixel */ @@ -19,7 +18,7 @@ typedef struct { /* Lookup table (not implemented) */ unsigned long lutsize; - FLOAT32* lut; + FLOAT32 *lut; /* INTERNAL */ unsigned long mask; diff --git a/src/libImaging/BitDecode.c b/src/libImaging/BitDecode.c index 92edd746f..28baa8b7e 100644 --- a/src/libImaging/BitDecode.c +++ b/src/libImaging/BitDecode.c @@ -13,20 +13,16 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include "Bit.h" - int -ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - BITSTATE* bitstate = state->context; - UINT8* ptr; +ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + BITSTATE *bitstate = state->context; + UINT8 *ptr; if (state->state == 0) { - /* Initialize context variables */ /* this decoder only works for float32 image buffers */ @@ -41,37 +37,35 @@ ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt return -1; } - bitstate->mask = (1<bits)-1; + bitstate->mask = (1 << bitstate->bits) - 1; if (bitstate->sign) { - bitstate->signmask = (1<<(bitstate->bits-1)); + bitstate->signmask = (1 << (bitstate->bits - 1)); } /* check image orientation */ if (state->ystep < 0) { - state->y = state->ysize-1; + state->y = state->ysize - 1; state->ystep = -1; } else { state->ystep = 1; } state->state = 1; - } ptr = buf; while (bytes > 0) { - UINT8 byte = *ptr; ptr++; bytes--; /* get a byte from the input stream and insert in the bit buffer */ - if (bitstate->fill&1) { + if (bitstate->fill & 1) { /* fill MSB first */ - bitstate->bitbuffer |= (unsigned long) byte << bitstate->bitcount; + bitstate->bitbuffer |= (unsigned long)byte << bitstate->bitcount; } else { /* fill LSB first */ bitstate->bitbuffer = (bitstate->bitbuffer << 8) | byte; @@ -80,26 +74,24 @@ ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt bitstate->bitcount += 8; while (bitstate->bitcount >= bitstate->bits) { - /* get a pixel from the bit buffer */ unsigned long data; FLOAT32 pixel; - if (bitstate->fill&2) { + if (bitstate->fill & 2) { /* store LSB first */ data = bitstate->bitbuffer & bitstate->mask; if (bitstate->bitcount > 32) { /* bitbuffer overflow; restore it from last input byte */ - bitstate->bitbuffer = byte >> (8 - (bitstate->bitcount - - bitstate->bits)); + bitstate->bitbuffer = + byte >> (8 - (bitstate->bitcount - bitstate->bits)); } else { bitstate->bitbuffer >>= bitstate->bits; } } else { /* store MSB first */ - data = (bitstate->bitbuffer >> (bitstate->bitcount - - bitstate->bits)) - & bitstate->mask; + data = (bitstate->bitbuffer >> (bitstate->bitcount - bitstate->bits)) & + bitstate->mask; } bitstate->bitcount -= bitstate->bits; @@ -109,7 +101,7 @@ ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt if (data <= 0) { pixel = bitstate->lut[0]; } else if (data >= bitstate->lutsize) { - pixel = bitstate->lut[bitstate->lutsize-1]; + pixel = bitstate->lut[bitstate->lutsize - 1]; } else { pixel = bitstate->lut[data]; } @@ -117,13 +109,13 @@ ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* convert */ if (data & bitstate->signmask) { /* image memory contains signed data */ - pixel = (FLOAT32) (INT32) (data | ~bitstate->mask); + pixel = (FLOAT32)(INT32)(data | ~bitstate->mask); } else { - pixel = (FLOAT32) data; + pixel = (FLOAT32)data; } } - *(FLOAT32*)(&im->image32[state->y][state->x]) = pixel; + *(FLOAT32 *)(&im->image32[state->y][state->x]) = pixel; /* step forward */ if (++state->x >= state->xsize) { diff --git a/src/libImaging/Blend.c b/src/libImaging/Blend.c index 0bac4cda9..a53ae0fad 100644 --- a/src/libImaging/Blend.c +++ b/src/libImaging/Blend.c @@ -15,27 +15,22 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" - Imaging -ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) -{ +ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) { Imaging imOut; int x, y; /* Check arguments */ - if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 - || imIn1->palette || strcmp(imIn1->mode, "1") == 0 - || imIn2->palette || strcmp(imIn2->mode, "1") == 0) { + if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 || imIn1->palette || + strcmp(imIn1->mode, "1") == 0 || imIn2->palette || + strcmp(imIn2->mode, "1") == 0) { return ImagingError_ModeError(); } - if (imIn1->type != imIn2->type || - imIn1->bands != imIn2->bands || - imIn1->xsize != imIn2->xsize || - imIn1->ysize != imIn2->ysize) { + if (imIn1->type != imIn2->type || imIn1->bands != imIn2->bands || + imIn1->xsize != imIn2->xsize || imIn1->ysize != imIn2->ysize) { return ImagingError_Mismatch(); } @@ -54,29 +49,27 @@ ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) if (alpha >= 0 && alpha <= 1.0) { /* Interpolate between bands */ for (y = 0; y < imIn1->ysize; y++) { - UINT8* in1 = (UINT8*) imIn1->image[y]; - UINT8* in2 = (UINT8*) imIn2->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in1 = (UINT8 *)imIn1->image[y]; + UINT8 *in2 = (UINT8 *)imIn2->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < imIn1->linesize; x++) { - out[x] = (UINT8) - ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); + out[x] = (UINT8)((int)in1[x] + alpha * ((int)in2[x] - (int)in1[x])); } } } else { /* Extrapolation; must make sure to clip resulting values */ for (y = 0; y < imIn1->ysize; y++) { - UINT8* in1 = (UINT8*) imIn1->image[y]; - UINT8* in2 = (UINT8*) imIn2->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in1 = (UINT8 *)imIn1->image[y]; + UINT8 *in2 = (UINT8 *)imIn2->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < imIn1->linesize; x++) { - float temp = (float) - ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); + float temp = (float)((int)in1[x] + alpha * ((int)in2[x] - (int)in1[x])); if (temp <= 0.0) { out[x] = 0; } else if (temp >= 255.0) { out[x] = 255; } else { - out[x] = (UINT8) temp; + out[x] = (UINT8)temp; } } } diff --git a/src/libImaging/BoxBlur.c b/src/libImaging/BoxBlur.c index dcdc52cbc..88862eb73 100644 --- a/src/libImaging/BoxBlur.c +++ b/src/libImaging/BoxBlur.c @@ -1,37 +1,40 @@ #include "Imaging.h" - #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MIN(x, y) (((x) < (y)) ? (x) : (y)) - typedef UINT8 pixel[4]; -void static inline -ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, - int edgeB, UINT32 ww, UINT32 fw) -{ +void static inline ImagingLineBoxBlur32( + pixel *lineOut, + pixel *lineIn, + int lastx, + int radius, + int edgeA, + int edgeB, + UINT32 ww, + UINT32 fw) { int x; UINT32 acc[4]; UINT32 bulk[4]; - #define MOVE_ACC(acc, subtract, add) \ - acc[0] += lineIn[add][0] - lineIn[subtract][0]; \ - acc[1] += lineIn[add][1] - lineIn[subtract][1]; \ - acc[2] += lineIn[add][2] - lineIn[subtract][2]; \ - acc[3] += lineIn[add][3] - lineIn[subtract][3]; +#define MOVE_ACC(acc, subtract, add) \ + acc[0] += lineIn[add][0] - lineIn[subtract][0]; \ + acc[1] += lineIn[add][1] - lineIn[subtract][1]; \ + acc[2] += lineIn[add][2] - lineIn[subtract][2]; \ + acc[3] += lineIn[add][3] - lineIn[subtract][3]; - #define ADD_FAR(bulk, acc, left, right) \ - bulk[0] = (acc[0] * ww) + (lineIn[left][0] + lineIn[right][0]) * fw; \ - bulk[1] = (acc[1] * ww) + (lineIn[left][1] + lineIn[right][1]) * fw; \ - bulk[2] = (acc[2] * ww) + (lineIn[left][2] + lineIn[right][2]) * fw; \ - bulk[3] = (acc[3] * ww) + (lineIn[left][3] + lineIn[right][3]) * fw; +#define ADD_FAR(bulk, acc, left, right) \ + bulk[0] = (acc[0] * ww) + (lineIn[left][0] + lineIn[right][0]) * fw; \ + bulk[1] = (acc[1] * ww) + (lineIn[left][1] + lineIn[right][1]) * fw; \ + bulk[2] = (acc[2] * ww) + (lineIn[left][2] + lineIn[right][2]) * fw; \ + bulk[3] = (acc[3] * ww) + (lineIn[left][3] + lineIn[right][3]) * fw; - #define SAVE(x, bulk) \ - lineOut[x][0] = (UINT8)((bulk[0] + (1 << 23)) >> 24); \ - lineOut[x][1] = (UINT8)((bulk[1] + (1 << 23)) >> 24); \ - lineOut[x][2] = (UINT8)((bulk[2] + (1 << 23)) >> 24); \ - lineOut[x][3] = (UINT8)((bulk[3] + (1 << 23)) >> 24); +#define SAVE(x, bulk) \ + lineOut[x][0] = (UINT8)((bulk[0] + (1 << 23)) >> 24); \ + lineOut[x][1] = (UINT8)((bulk[1] + (1 << 23)) >> 24); \ + lineOut[x][2] = (UINT8)((bulk[2] + (1 << 23)) >> 24); \ + lineOut[x][3] = (UINT8)((bulk[3] + (1 << 23)) >> 24); /* Compute acc for -1 pixel (outside of image): From "-radius-1" to "-1" get first pixel, @@ -53,8 +56,7 @@ ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int e acc[2] += lineIn[lastx][2] * (radius - edgeA + 1); acc[3] += lineIn[lastx][3] * (radius - edgeA + 1); - if (edgeA <= edgeB) - { + if (edgeA <= edgeB) { /* Subtract pixel from left ("0"). Add pixels from radius. */ for (x = 0; x < edgeA; x++) { @@ -76,9 +78,7 @@ ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int e ADD_FAR(bulk, acc, x - radius - 1, lastx); SAVE(x, bulk); } - } - else - { + } else { for (x = 0; x < edgeB; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); @@ -96,28 +96,30 @@ ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int e } } - #undef MOVE_ACC - #undef ADD_FAR - #undef SAVE +#undef MOVE_ACC +#undef ADD_FAR +#undef SAVE } - -void static inline -ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int edgeA, - int edgeB, UINT32 ww, UINT32 fw) -{ +void static inline ImagingLineBoxBlur8( + UINT8 *lineOut, + UINT8 *lineIn, + int lastx, + int radius, + int edgeA, + int edgeB, + UINT32 ww, + UINT32 fw) { int x; UINT32 acc; UINT32 bulk; - #define MOVE_ACC(acc, subtract, add) \ - acc += lineIn[add] - lineIn[subtract]; +#define MOVE_ACC(acc, subtract, add) acc += lineIn[add] - lineIn[subtract]; - #define ADD_FAR(bulk, acc, left, right) \ - bulk = (acc * ww) + (lineIn[left] + lineIn[right]) * fw; +#define ADD_FAR(bulk, acc, left, right) \ + bulk = (acc * ww) + (lineIn[left] + lineIn[right]) * fw; - #define SAVE(x, bulk) \ - lineOut[x] = (UINT8)((bulk + (1 << 23)) >> 24) +#define SAVE(x, bulk) lineOut[x] = (UINT8)((bulk + (1 << 23)) >> 24) acc = lineIn[0] * (radius + 1); for (x = 0; x < edgeA - 1; x++) { @@ -125,8 +127,7 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed } acc += lineIn[lastx] * (radius - edgeA + 1); - if (edgeA <= edgeB) - { + if (edgeA <= edgeB) { for (x = 0; x < edgeA; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); @@ -142,9 +143,7 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed ADD_FAR(bulk, acc, x - radius - 1, lastx); SAVE(x, bulk); } - } - else - { + } else { for (x = 0; x < edgeB; x++) { MOVE_ACC(acc, 0, x + radius); ADD_FAR(bulk, acc, 0, x + radius + 1); @@ -162,22 +161,19 @@ ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int ed } } - #undef MOVE_ACC - #undef ADD_FAR - #undef SAVE +#undef MOVE_ACC +#undef ADD_FAR +#undef SAVE } - - Imaging -ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) -{ +ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) { ImagingSectionCookie cookie; int y; - int radius = (int) floatRadius; - UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); + int radius = (int)floatRadius; + UINT32 ww = (UINT32)(1 << 24) / (floatRadius * 2 + 1); UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; int edgeA = MIN(radius + 1, imIn->xsize); @@ -192,32 +188,33 @@ ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) ImagingSectionEnter(&cookie); - if (imIn->image8) - { + if (imIn->image8) { for (y = 0; y < imIn->ysize; y++) { ImagingLineBoxBlur8( - (imIn == imOut ? (UINT8 *) lineOut : imOut->image8[y]), + (imIn == imOut ? (UINT8 *)lineOut : imOut->image8[y]), imIn->image8[y], imIn->xsize - 1, - radius, edgeA, edgeB, - ww, fw - ); + radius, + edgeA, + edgeB, + ww, + fw); if (imIn == imOut) { // Commit. memcpy(imOut->image8[y], lineOut, imIn->xsize); } } - } - else - { + } else { for (y = 0; y < imIn->ysize; y++) { ImagingLineBoxBlur32( - imIn == imOut ? (pixel *) lineOut : (pixel *) imOut->image32[y], - (pixel *) imIn->image32[y], + imIn == imOut ? (pixel *)lineOut : (pixel *)imOut->image32[y], + (pixel *)imIn->image32[y], imIn->xsize - 1, - radius, edgeA, edgeB, - ww, fw - ); + radius, + edgeA, + edgeB, + ww, + fw); if (imIn == imOut) { // Commit. memcpy(imOut->image32[y], lineOut, imIn->xsize * 4); @@ -232,23 +229,17 @@ ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) return imOut; } - Imaging -ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) -{ +ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) { int i; Imaging imTransposed; if (n < 1) { - return ImagingError_ValueError( - "number of passes must be greater than zero" - ); + return ImagingError_ValueError("number of passes must be greater than zero"); } - if (strcmp(imIn->mode, imOut->mode) || - imIn->type != imOut->type || - imIn->bands != imOut->bands || - imIn->xsize != imOut->xsize || + if (strcmp(imIn->mode, imOut->mode) || imIn->type != imOut->type || + imIn->bands != imOut->bands || imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { return ImagingError_Mismatch(); } @@ -257,14 +248,10 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) return ImagingError_ModeError(); } - if (!(strcmp(imIn->mode, "RGB") == 0 || - strcmp(imIn->mode, "RGBA") == 0 || - strcmp(imIn->mode, "RGBa") == 0 || - strcmp(imIn->mode, "RGBX") == 0 || - strcmp(imIn->mode, "CMYK") == 0 || - strcmp(imIn->mode, "L") == 0 || - strcmp(imIn->mode, "LA") == 0 || - strcmp(imIn->mode, "La") == 0)) { + if (!(strcmp(imIn->mode, "RGB") == 0 || strcmp(imIn->mode, "RGBA") == 0 || + strcmp(imIn->mode, "RGBa") == 0 || strcmp(imIn->mode, "RGBX") == 0 || + strcmp(imIn->mode, "CMYK") == 0 || strcmp(imIn->mode, "L") == 0 || + strcmp(imIn->mode, "LA") == 0 || strcmp(imIn->mode, "La") == 0)) { return ImagingError_ModeError(); } @@ -277,14 +264,14 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) Use imOut as a destination at first pass, then use imOut as a source too. */ ImagingHorizontalBoxBlur(imOut, imIn, radius); - for (i = 1; i < n; i ++) { + for (i = 1; i < n; i++) { ImagingHorizontalBoxBlur(imOut, imOut, radius); } /* Transpose result for blur in another direction. */ ImagingTranspose(imTransposed, imOut); /* Reuse imTransposed as a source and destination there. */ - for (i = 0; i < n; i ++) { + for (i = 0; i < n; i++) { ImagingHorizontalBoxBlur(imTransposed, imTransposed, radius); } /* Restore original orientation. */ @@ -295,10 +282,8 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) return imOut; } - -Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, - int passes) -{ +Imaging +ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes) { float sigma2, L, l, a; sigma2 = radius * radius / passes; diff --git a/src/libImaging/Chops.c b/src/libImaging/Chops.c index a0a70abd9..f9c005efe 100644 --- a/src/libImaging/Chops.c +++ b/src/libImaging/Chops.c @@ -16,62 +16,59 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" -#define CHOP(operation)\ - int x, y;\ - Imaging imOut;\ - imOut = create(imIn1, imIn2, NULL);\ - if (!imOut) {\ - return NULL;\ - }\ - for (y = 0; y < imOut->ysize; y++) {\ - UINT8* out = (UINT8*) imOut->image[y];\ - UINT8* in1 = (UINT8*) imIn1->image[y];\ - UINT8* in2 = (UINT8*) imIn2->image[y];\ - for (x = 0; x < imOut->linesize; x++) {\ - int temp = operation;\ - if (temp <= 0) {\ - out[x] = 0;\ - } else if (temp >= 255) {\ - out[x] = 255;\ - } else {\ - out[x] = temp;\ - }\ - }\ - }\ +#define CHOP(operation) \ + int x, y; \ + Imaging imOut; \ + imOut = create(imIn1, imIn2, NULL); \ + if (!imOut) { \ + return NULL; \ + } \ + for (y = 0; y < imOut->ysize; y++) { \ + UINT8 *out = (UINT8 *)imOut->image[y]; \ + UINT8 *in1 = (UINT8 *)imIn1->image[y]; \ + UINT8 *in2 = (UINT8 *)imIn2->image[y]; \ + for (x = 0; x < imOut->linesize; x++) { \ + int temp = operation; \ + if (temp <= 0) { \ + out[x] = 0; \ + } else if (temp >= 255) { \ + out[x] = 255; \ + } else { \ + out[x] = temp; \ + } \ + } \ + } \ return imOut; -#define CHOP2(operation, mode)\ - int x, y;\ - Imaging imOut;\ - imOut = create(imIn1, imIn2, mode);\ - if (!imOut) {\ - return NULL;\ - }\ - for (y = 0; y < imOut->ysize; y++) {\ - UINT8* out = (UINT8*) imOut->image[y];\ - UINT8* in1 = (UINT8*) imIn1->image[y];\ - UINT8* in2 = (UINT8*) imIn2->image[y];\ - for (x = 0; x < imOut->linesize; x++) {\ - out[x] = operation;\ - }\ - }\ +#define CHOP2(operation, mode) \ + int x, y; \ + Imaging imOut; \ + imOut = create(imIn1, imIn2, mode); \ + if (!imOut) { \ + return NULL; \ + } \ + for (y = 0; y < imOut->ysize; y++) { \ + UINT8 *out = (UINT8 *)imOut->image[y]; \ + UINT8 *in1 = (UINT8 *)imIn1->image[y]; \ + UINT8 *in2 = (UINT8 *)imIn2->image[y]; \ + for (x = 0; x < imOut->linesize; x++) { \ + out[x] = operation; \ + } \ + } \ return imOut; static Imaging -create(Imaging im1, Imaging im2, char* mode) -{ +create(Imaging im1, Imaging im2, char *mode) { int xsize, ysize; if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 || (mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1")))) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } - if (im1->type != im2->type || - im1->bands != im2->bands) { - return (Imaging) ImagingError_Mismatch(); + if (im1->type != im2->type || im1->bands != im2->bands) { + return (Imaging)ImagingError_Mismatch(); } xsize = (im1->xsize < im2->xsize) ? im1->xsize : im2->xsize; @@ -81,97 +78,85 @@ create(Imaging im1, Imaging im2, char* mode) } Imaging -ImagingChopLighter(Imaging imIn1, Imaging imIn2) -{ +ImagingChopLighter(Imaging imIn1, Imaging imIn2) { CHOP((in1[x] > in2[x]) ? in1[x] : in2[x]); } Imaging -ImagingChopDarker(Imaging imIn1, Imaging imIn2) -{ +ImagingChopDarker(Imaging imIn1, Imaging imIn2) { CHOP((in1[x] < in2[x]) ? in1[x] : in2[x]); } Imaging -ImagingChopDifference(Imaging imIn1, Imaging imIn2) -{ - CHOP(abs((int) in1[x] - (int) in2[x])); +ImagingChopDifference(Imaging imIn1, Imaging imIn2) { + CHOP(abs((int)in1[x] - (int)in2[x])); } Imaging -ImagingChopMultiply(Imaging imIn1, Imaging imIn2) -{ - CHOP((int) in1[x] * (int) in2[x] / 255); +ImagingChopMultiply(Imaging imIn1, Imaging imIn2) { + CHOP((int)in1[x] * (int)in2[x] / 255); } Imaging -ImagingChopScreen(Imaging imIn1, Imaging imIn2) -{ - CHOP(255 - ((int) (255 - in1[x]) * (int) (255 - in2[x])) / 255); +ImagingChopScreen(Imaging imIn1, Imaging imIn2) { + CHOP(255 - ((int)(255 - in1[x]) * (int)(255 - in2[x])) / 255); } Imaging -ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset) -{ - CHOP(((int) in1[x] + (int) in2[x]) / scale + offset); +ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset) { + CHOP(((int)in1[x] + (int)in2[x]) / scale + offset); } Imaging -ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) -{ - CHOP(((int) in1[x] - (int) in2[x]) / scale + offset); +ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) { + CHOP(((int)in1[x] - (int)in2[x]) / scale + offset); } Imaging -ImagingChopAnd(Imaging imIn1, Imaging imIn2) -{ +ImagingChopAnd(Imaging imIn1, Imaging imIn2) { CHOP2((in1[x] && in2[x]) ? 255 : 0, "1"); } Imaging -ImagingChopOr(Imaging imIn1, Imaging imIn2) -{ +ImagingChopOr(Imaging imIn1, Imaging imIn2) { CHOP2((in1[x] || in2[x]) ? 255 : 0, "1"); } Imaging -ImagingChopXor(Imaging imIn1, Imaging imIn2) -{ +ImagingChopXor(Imaging imIn1, Imaging imIn2) { CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1"); } Imaging -ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) -{ +ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) { CHOP2(in1[x] + in2[x], NULL); } Imaging -ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) -{ +ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) { CHOP2(in1[x] - in2[x], NULL); } Imaging -ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) -{ - CHOP2( (((255-in1[x]) * (in1[x]*in2[x]) ) / 65536) + - (in1[x] * ( 255 - ( (255 - in1[x]) * (255 - in2[x] ) / 255) )) / 255 - , NULL ); +ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) { + CHOP2( + (((255 - in1[x]) * (in1[x] * in2[x])) / 65536) + + (in1[x] * (255 - ((255 - in1[x]) * (255 - in2[x]) / 255))) / 255, + NULL); } Imaging -ImagingChopHardLight(Imaging imIn1, Imaging imIn2) -{ - CHOP2( (in2[x]<128) ? ( (in1[x]*in2[x])/127) - : 255 - ( ((255-in2[x]) * (255-in1[x])) / 127) - , NULL); +ImagingChopHardLight(Imaging imIn1, Imaging imIn2) { + CHOP2( + (in2[x] < 128) ? ((in1[x] * in2[x]) / 127) + : 255 - (((255 - in2[x]) * (255 - in1[x])) / 127), + NULL); } Imaging -ImagingOverlay(Imaging imIn1, Imaging imIn2) -{ - CHOP2( (in1[x]<128) ? ( (in1[x]*in2[x])/127) - : 255 - ( ((255-in1[x]) * (255-in2[x])) / 127) - , NULL); +ImagingOverlay(Imaging imIn1, Imaging imIn2) { + CHOP2( + (in1[x] < 128) ? ((in1[x] * in2[x]) / 127) + : 255 - (((255 - in1[x]) * (255 - in2[x])) / 127), + NULL); } diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index f01d38993..fd6e268b5 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -1,52 +1,45 @@ #include "Imaging.h" #include - /* 8 bits for result. Table can overflow [0, 1.0] range, so we need extra bits for overflow and negative values. NOTE: This value should be the same as in _imaging/_prepare_lut_table() */ #define PRECISION_BITS (16 - 8 - 2) -#define PRECISION_ROUNDING (1<<(PRECISION_BITS-1)) +#define PRECISION_ROUNDING (1 << (PRECISION_BITS - 1)) /* 8 — scales are multiplied on byte. 6 — max index in the table (max size is 65, but index 64 is not reachable) */ #define SCALE_BITS (32 - 8 - 6) -#define SCALE_MASK ((1<> PRECISION_BITS]; } static inline void -interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) -{ - out[0] = (a[0] * ((1<> SHIFT_BITS; - out[1] = (a[1] * ((1<> SHIFT_BITS; - out[2] = (a[2] * ((1<> SHIFT_BITS; +interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) { + out[0] = (a[0] * ((1 << SHIFT_BITS) - shift) + b[0] * shift) >> SHIFT_BITS; + out[1] = (a[1] * ((1 << SHIFT_BITS) - shift) + b[1] * shift) >> SHIFT_BITS; + out[2] = (a[2] * ((1 << SHIFT_BITS) - shift) + b[2] * shift) >> SHIFT_BITS; } static inline void -interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) -{ - out[0] = (a[0] * ((1<> SHIFT_BITS; - out[1] = (a[1] * ((1<> SHIFT_BITS; - out[2] = (a[2] * ((1<> SHIFT_BITS; - out[3] = (a[3] * ((1<> SHIFT_BITS; +interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) { + out[0] = (a[0] * ((1 << SHIFT_BITS) - shift) + b[0] * shift) >> SHIFT_BITS; + out[1] = (a[1] * ((1 << SHIFT_BITS) - shift) + b[1] * shift) >> SHIFT_BITS; + out[2] = (a[2] * ((1 << SHIFT_BITS) - shift) + b[2] * shift) >> SHIFT_BITS; + out[3] = (a[3] * ((1 << SHIFT_BITS) - shift) + b[3] * shift) >> SHIFT_BITS; } static inline int -table_index3D(int index1D, int index2D, int index3D, - int size1D, int size1D_2D) -{ +table_index3D(int index1D, int index2D, int index3D, int size1D, int size1D_2D) { return index1D + index2D * size1D + index3D * size1D_2D; } - /* Transforms colors of imIn using provided 3D lookup table and puts the result in imOut. Returns imOut on success or 0 on error. @@ -63,10 +56,14 @@ table_index3D(int index1D, int index2D, int index3D, and 255 << PRECISION_BITS (16320) is highest value. */ Imaging -ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, - int size1D, int size2D, int size3D, - INT16* table) -{ +ImagingColorLUT3D_linear( + Imaging imOut, + Imaging imIn, + int table_channels, + int size1D, + int size2D, + int size3D, + INT16 *table) { /* This float to int conversion doesn't have rounding error compensation (+0.5) for two reasons: 1. As we don't hit the highest value, @@ -77,9 +74,9 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, +1 cells will be outside of the table. With this compensation we never hit the upper cells but this also doesn't introduce any noticeable difference. */ - UINT32 scale1D = (size1D - 1) / 255.0 * (1<type != IMAGING_TYPE_UINT8 || - imOut->type != IMAGING_TYPE_UINT8 || - imIn->bands < 3 || - imOut->bands < table_channels - ) { - return (Imaging) ImagingError_ModeError(); + if (imIn->type != IMAGING_TYPE_UINT8 || imOut->type != IMAGING_TYPE_UINT8 || + imIn->bands < 3 || imOut->bands < table_channels) { + return (Imaging)ImagingError_ModeError(); } /* In case we have one extra band in imOut and don't have in imIn.*/ if (imOut->bands > table_channels && imOut->bands > imIn->bands) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } ImagingSectionEnter(&cookie); for (y = 0; y < imOut->ysize; y++) { - UINT8* rowIn = (UINT8 *)imIn->image[y]; - char* rowOut = (char *)imOut->image[y]; + UINT8 *rowIn = (UINT8 *)imIn->image[y]; + char *rowOut = (char *)imOut->image[y]; for (x = 0; x < imOut->xsize; x++) { - UINT32 index1D = rowIn[x*4 + 0] * scale1D; - UINT32 index2D = rowIn[x*4 + 1] * scale2D; - UINT32 index3D = rowIn[x*4 + 2] * scale3D; + UINT32 index1D = rowIn[x * 4 + 0] * scale1D; + UINT32 index2D = rowIn[x * 4 + 1] * scale2D; + UINT32 index3D = rowIn[x * 4 + 2] * scale3D; INT16 shift1D = (SCALE_MASK & index1D) >> (SCALE_BITS - SHIFT_BITS); INT16 shift2D = (SCALE_MASK & index2D) >> (SCALE_BITS - SHIFT_BITS); INT16 shift3D = (SCALE_MASK & index3D) >> (SCALE_BITS - SHIFT_BITS); int idx = table_channels * table_index3D( - index1D >> SCALE_BITS, index2D >> SCALE_BITS, - index3D >> SCALE_BITS, size1D, size1D_2D); + index1D >> SCALE_BITS, + index2D >> SCALE_BITS, + index3D >> SCALE_BITS, + size1D, + size1D_2D); INT16 result[4], left[4], right[4]; INT16 leftleft[4], leftright[4], rightleft[4], rightright[4]; if (table_channels == 3) { UINT32 v; interpolate3(leftleft, &table[idx + 0], &table[idx + 3], shift1D); - interpolate3(leftright, &table[idx + size1D*3], - &table[idx + size1D*3 + 3], shift1D); + interpolate3( + leftright, + &table[idx + size1D * 3], + &table[idx + size1D * 3 + 3], + shift1D); interpolate3(left, leftleft, leftright, shift2D); - interpolate3(rightleft, &table[idx + size1D_2D*3], - &table[idx + size1D_2D*3 + 3], shift1D); - interpolate3(rightright, &table[idx + size1D_2D*3 + size1D*3], - &table[idx + size1D_2D*3 + size1D*3 + 3], shift1D); + interpolate3( + rightleft, + &table[idx + size1D_2D * 3], + &table[idx + size1D_2D * 3 + 3], + shift1D); + interpolate3( + rightright, + &table[idx + size1D_2D * 3 + size1D * 3], + &table[idx + size1D_2D * 3 + size1D * 3 + 3], + shift1D); interpolate3(right, rightleft, rightright, shift2D); interpolate3(result, left, right, shift3D); v = MAKE_UINT32( - clip8(result[0]), clip8(result[1]), - clip8(result[2]), rowIn[x*4 + 3]); + clip8(result[0]), + clip8(result[1]), + clip8(result[2]), + rowIn[x * 4 + 3]); memcpy(rowOut + x * sizeof(v), &v, sizeof(v)); } if (table_channels == 4) { UINT32 v; interpolate4(leftleft, &table[idx + 0], &table[idx + 4], shift1D); - interpolate4(leftright, &table[idx + size1D*4], - &table[idx + size1D*4 + 4], shift1D); + interpolate4( + leftright, + &table[idx + size1D * 4], + &table[idx + size1D * 4 + 4], + shift1D); interpolate4(left, leftleft, leftright, shift2D); - interpolate4(rightleft, &table[idx + size1D_2D*4], - &table[idx + size1D_2D*4 + 4], shift1D); - interpolate4(rightright, &table[idx + size1D_2D*4 + size1D*4], - &table[idx + size1D_2D*4 + size1D*4 + 4], shift1D); + interpolate4( + rightleft, + &table[idx + size1D_2D * 4], + &table[idx + size1D_2D * 4 + 4], + shift1D); + interpolate4( + rightright, + &table[idx + size1D_2D * 4 + size1D * 4], + &table[idx + size1D_2D * 4 + size1D * 4 + 4], + shift1D); interpolate4(right, rightleft, rightright, shift2D); interpolate4(result, left, right, shift3D); v = MAKE_UINT32( - clip8(result[0]), clip8(result[1]), - clip8(result[2]), clip8(result[3])); + clip8(result[0]), + clip8(result[1]), + clip8(result[2]), + clip8(result[3])); memcpy(rowOut + x * sizeof(v), &v, sizeof(v)); } } diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index b0b794d72..8c7be36a2 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -32,24 +32,21 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" -#define MAX(a, b) (a)>(b) ? (a) : (b) -#define MIN(a, b) (a)<(b) ? (a) : (b) +#define MAX(a, b) (a) > (b) ? (a) : (b) +#define MIN(a, b) (a) < (b) ? (a) : (b) #define CLIP16(v) ((v) <= -32768 ? -32768 : (v) >= 32767 ? 32767 : (v)) /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ -#define L(rgb)\ - ((INT32) (rgb)[0]*299 + (INT32) (rgb)[1]*587 + (INT32) (rgb)[2]*114) -#define L24(rgb)\ - ((rgb)[0]*19595 + (rgb)[1]*38470 + (rgb)[2]*7471 + 0x8000) - +#define L(rgb) ((INT32)(rgb)[0] * 299 + (INT32)(rgb)[1] * 587 + (INT32)(rgb)[2] * 114) +#define L24(rgb) ((rgb)[0] * 19595 + (rgb)[1] * 38470 + (rgb)[2] * 7471 + 0x8000) #ifndef round -double round(double x) { - return floor(x+0.5); +double +round(double x) { + return floor(x + 0.5); } #endif @@ -58,16 +55,13 @@ double round(double x) { /* ------------------- */ static void -bit2l(UINT8* out, const UINT8* in, int xsize) -{ +bit2l(UINT8 *out, const UINT8 *in, int xsize) { int x; - for (x = 0; x < xsize; x++) - *out++ = (*in++ != 0) ? 255 : 0; + for (x = 0; x < xsize; x++) *out++ = (*in++ != 0) ? 255 : 0; } static void -bit2rgb(UINT8* out, const UINT8* in, int xsize) -{ +bit2rgb(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = (*in++ != 0) ? 255 : 0; @@ -79,8 +73,7 @@ bit2rgb(UINT8* out, const UINT8* in, int xsize) } static void -bit2cmyk(UINT8* out, const UINT8* in, int xsize) -{ +bit2cmyk(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = 0; @@ -91,8 +84,7 @@ bit2cmyk(UINT8* out, const UINT8* in, int xsize) } static void -bit2ycbcr(UINT8* out, const UINT8* in, int xsize) -{ +bit2ycbcr(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = (*in++ != 0) ? 255 : 0; @@ -103,8 +95,7 @@ bit2ycbcr(UINT8* out, const UINT8* in, int xsize) } static void -bit2hsv(UINT8* out, const UINT8* in, int xsize) -{ +bit2hsv(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out += 4) { UINT8 v = (*in++ != 0) ? 255 : 0; @@ -120,8 +111,7 @@ bit2hsv(UINT8* out, const UINT8* in, int xsize) /* ----------------- */ static void -l2bit(UINT8* out, const UINT8* in, int xsize) -{ +l2bit(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = (*in++ >= 128) ? 255 : 0; @@ -129,44 +119,41 @@ l2bit(UINT8* out, const UINT8* in, int xsize) } static void -lA2la(UINT8* out, const UINT8* in, int xsize) -{ +lA2la(UINT8 *out, const UINT8 *in, int xsize) { int x; unsigned int alpha, pixel, tmp; for (x = 0; x < xsize; x++, in += 4) { alpha = in[3]; pixel = MULDIV255(in[0], alpha, tmp); - *out++ = (UINT8) pixel; - *out++ = (UINT8) pixel; - *out++ = (UINT8) pixel; - *out++ = (UINT8) alpha; + *out++ = (UINT8)pixel; + *out++ = (UINT8)pixel; + *out++ = (UINT8)pixel; + *out++ = (UINT8)alpha; } } /* RGBa -> RGBA conversion to remove premultiplication Needed for correct transforms/resizing on RGBA images */ static void -la2lA(UINT8* out, const UINT8* in, int xsize) -{ +la2lA(UINT8 *out, const UINT8 *in, int xsize) { int x; unsigned int alpha, pixel; - for (x = 0; x < xsize; x++, in+=4) { + for (x = 0; x < xsize; x++, in += 4) { alpha = in[3]; if (alpha == 255 || alpha == 0) { pixel = in[0]; } else { pixel = CLIP8((255 * in[0]) / alpha); } - *out++ = (UINT8) pixel; - *out++ = (UINT8) pixel; - *out++ = (UINT8) pixel; - *out++ = (UINT8) alpha; + *out++ = (UINT8)pixel; + *out++ = (UINT8)pixel; + *out++ = (UINT8)pixel; + *out++ = (UINT8)alpha; } } static void -l2la(UINT8* out, const UINT8* in, int xsize) -{ +l2la(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = *in++; @@ -178,8 +165,7 @@ l2la(UINT8* out, const UINT8* in, int xsize) } static void -l2rgb(UINT8* out, const UINT8* in, int xsize) -{ +l2rgb(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { UINT8 v = *in++; @@ -191,8 +177,7 @@ l2rgb(UINT8* out, const UINT8* in, int xsize) } static void -l2hsv(UINT8* out, const UINT8* in, int xsize) -{ +l2hsv(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out += 4) { UINT8 v = *in++; @@ -204,8 +189,7 @@ l2hsv(UINT8* out, const UINT8* in, int xsize) } static void -la2l(UINT8* out, const UINT8* in, int xsize) -{ +la2l(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = in[0]; @@ -213,8 +197,7 @@ la2l(UINT8* out, const UINT8* in, int xsize) } static void -la2rgb(UINT8* out, const UINT8* in, int xsize) -{ +la2rgb(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { UINT8 v = in[0]; @@ -226,8 +209,7 @@ la2rgb(UINT8* out, const UINT8* in, int xsize) } static void -la2hsv(UINT8* out, const UINT8* in, int xsize) -{ +la2hsv(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { UINT8 v = in[0]; @@ -239,8 +221,7 @@ la2hsv(UINT8* out, const UINT8* in, int xsize) } static void -rgb2bit(UINT8* out, const UINT8* in, int xsize) -{ +rgb2bit(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ @@ -249,8 +230,7 @@ rgb2bit(UINT8* out, const UINT8* in, int xsize) } static void -rgb2l(UINT8* out, const UINT8* in, int xsize) -{ +rgb2l(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ @@ -259,8 +239,7 @@ rgb2l(UINT8* out, const UINT8* in, int xsize) } static void -rgb2la(UINT8* out, const UINT8* in, int xsize) -{ +rgb2la(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ @@ -270,8 +249,7 @@ rgb2la(UINT8* out, const UINT8* in, int xsize) } static void -rgb2i(UINT8* out_, const UINT8* in, int xsize) -{ +rgb2i(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out_ += 4) { INT32 v = L24(in) >> 16; @@ -280,44 +258,38 @@ rgb2i(UINT8* out_, const UINT8* in, int xsize) } static void -rgb2f(UINT8* out_, const UINT8* in, int xsize) -{ +rgb2f(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out_ += 4) { - FLOAT32 v = (float) L(in) / 1000.0F; + FLOAT32 v = (float)L(in) / 1000.0F; memcpy(out_, &v, sizeof(v)); } } static void -rgb2bgr15(UINT8* out_, const UINT8* in, int xsize) -{ +rgb2bgr15(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out_ += 2) { - UINT16 v = - ((((UINT16)in[0])<<7)&0x7c00) + - ((((UINT16)in[1])<<2)&0x03e0) + - ((((UINT16)in[2])>>3)&0x001f); + UINT16 v = ((((UINT16)in[0]) << 7) & 0x7c00) + + ((((UINT16)in[1]) << 2) & 0x03e0) + + ((((UINT16)in[2]) >> 3) & 0x001f); memcpy(out_, &v, sizeof(v)); } } static void -rgb2bgr16(UINT8* out_, const UINT8* in, int xsize) -{ +rgb2bgr16(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out_ += 2) { - UINT16 v = - ((((UINT16)in[0])<<8)&0xf800) + - ((((UINT16)in[1])<<3)&0x07e0) + - ((((UINT16)in[2])>>3)&0x001f); + UINT16 v = ((((UINT16)in[0]) << 8) & 0xf800) + + ((((UINT16)in[1]) << 3) & 0x07e0) + + ((((UINT16)in[2]) >> 3) & 0x001f); memcpy(out_, &v, sizeof(v)); } } static void -rgb2bgr24(UINT8* out, const UINT8* in, int xsize) -{ +rgb2bgr24(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = in[2]; @@ -327,40 +299,39 @@ rgb2bgr24(UINT8* out, const UINT8* in, int xsize) } static void -rgb2hsv_row(UINT8* out, const UINT8* in) -{ // following colorsys.py - float h,s,rc,gc,bc,cr; - UINT8 maxc,minc; +rgb2hsv_row(UINT8 *out, const UINT8 *in) { // following colorsys.py + float h, s, rc, gc, bc, cr; + UINT8 maxc, minc; UINT8 r, g, b; - UINT8 uh,us,uv; + UINT8 uh, us, uv; r = in[0]; g = in[1]; b = in[2]; - maxc = MAX(r,MAX(g,b)); - minc = MIN(r,MIN(g,b)); + maxc = MAX(r, MAX(g, b)); + minc = MIN(r, MIN(g, b)); uv = maxc; - if (minc == maxc){ + if (minc == maxc) { uh = 0; us = 0; } else { - cr = (float)(maxc-minc); - s = cr/(float)maxc; - rc = ((float)(maxc-r))/cr; - gc = ((float)(maxc-g))/cr; - bc = ((float)(maxc-b))/cr; + cr = (float)(maxc - minc); + s = cr / (float)maxc; + rc = ((float)(maxc - r)) / cr; + gc = ((float)(maxc - g)) / cr; + bc = ((float)(maxc - b)) / cr; if (r == maxc) { - h = bc-gc; + h = bc - gc; } else if (g == maxc) { - h = 2.0 + rc-bc; + h = 2.0 + rc - bc; } else { - h = 4.0 + gc-rc; + h = 4.0 + gc - rc; } // incorrect hue happens if h/6 is negative. - h = fmod((h/6.0 + 1.0), 1.0); + h = fmod((h / 6.0 + 1.0), 1.0); - uh = (UINT8)CLIP8((int)(h*255.0)); - us = (UINT8)CLIP8((int)(s*255.0)); + uh = (UINT8)CLIP8((int)(h * 255.0)); + us = (UINT8)CLIP8((int)(s * 255.0)); } out[0] = uh; out[1] = us; @@ -368,8 +339,7 @@ rgb2hsv_row(UINT8* out, const UINT8* in) } static void -rgb2hsv(UINT8* out, const UINT8* in, int xsize) -{ +rgb2hsv(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { rgb2hsv_row(out, in); @@ -377,98 +347,91 @@ rgb2hsv(UINT8* out, const UINT8* in, int xsize) } } - - static void -hsv2rgb(UINT8* out, const UINT8* in, int xsize) -{ // following colorsys.py +hsv2rgb(UINT8 *out, const UINT8 *in, int xsize) { // following colorsys.py - int p,q,t; - UINT8 up,uq,ut; + int p, q, t; + UINT8 up, uq, ut; int i, x; float f, fs; - UINT8 h,s,v; + UINT8 h, s, v; for (x = 0; x < xsize; x++, in += 4) { h = in[0]; s = in[1]; v = in[2]; - if (s==0){ + if (s == 0) { *out++ = v; *out++ = v; *out++ = v; } else { - i = floor((float)h * 6.0 / 255.0); // 0 - 6 - f = (float)h * 6.0 / 255.0 - (float)i; // 0-1 : remainder. - fs = ((float)s)/255.0; + i = floor((float)h * 6.0 / 255.0); // 0 - 6 + f = (float)h * 6.0 / 255.0 - (float)i; // 0-1 : remainder. + fs = ((float)s) / 255.0; - p = round((float)v * (1.0-fs)); - q = round((float)v * (1.0-fs*f)); - t = round((float)v * (1.0-fs*(1.0-f))); + p = round((float)v * (1.0 - fs)); + q = round((float)v * (1.0 - fs * f)); + t = round((float)v * (1.0 - fs * (1.0 - f))); up = (UINT8)CLIP8(p); uq = (UINT8)CLIP8(q); ut = (UINT8)CLIP8(t); - switch (i%6) { - case 0: - *out++ = v; - *out++ = ut; - *out++ = up; - break; - case 1: - *out++ = uq; - *out++ = v; - *out++ = up; - break; - case 2: - *out++ = up; - *out++ = v; - *out++ = ut; - break; - case 3: - *out++ = up; - *out++ = uq; - *out++ = v; - break; - case 4: - *out++ = ut; - *out++ = up; - *out++ = v; - break; - case 5: - *out++ = v; - *out++ = up; - *out++ = uq; - break; - + switch (i % 6) { + case 0: + *out++ = v; + *out++ = ut; + *out++ = up; + break; + case 1: + *out++ = uq; + *out++ = v; + *out++ = up; + break; + case 2: + *out++ = up; + *out++ = v; + *out++ = ut; + break; + case 3: + *out++ = up; + *out++ = uq; + *out++ = v; + break; + case 4: + *out++ = ut; + *out++ = up; + *out++ = v; + break; + case 5: + *out++ = v; + *out++ = up; + *out++ = uq; + break; } } *out++ = in[3]; } } - - /* ---------------- */ /* RGBA conversions */ /* ---------------- */ static void -rgb2rgba(UINT8* out, const UINT8* in, int xsize) -{ +rgb2rgba(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; *out++ = *in++; *out++ = *in++; - *out++ = 255; in++; + *out++ = 255; + in++; } } static void -rgba2la(UINT8* out, const UINT8* in, int xsize) -{ +rgba2la(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ @@ -478,20 +441,19 @@ rgba2la(UINT8* out, const UINT8* in, int xsize) } static void -rgba2rgb(UINT8* out, const UINT8* in, int xsize) -{ +rgba2rgb(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; *out++ = *in++; *out++ = *in++; - *out++ = 255; in++; + *out++ = 255; + in++; } } static void -rgbA2rgba(UINT8* out, const UINT8* in, int xsize) -{ +rgbA2rgba(UINT8 *out, const UINT8 *in, int xsize) { int x; unsigned int alpha, tmp; for (x = 0; x < xsize; x++) { @@ -506,11 +468,10 @@ rgbA2rgba(UINT8* out, const UINT8* in, int xsize) /* RGBa -> RGBA conversion to remove premultiplication Needed for correct transforms/resizing on RGBA images */ static void -rgba2rgbA(UINT8* out, const UINT8* in, int xsize) -{ +rgba2rgbA(UINT8 *out, const UINT8 *in, int xsize) { int x; unsigned int alpha; - for (x = 0; x < xsize; x++, in+=4) { + for (x = 0; x < xsize; x++, in += 4) { alpha = in[3]; if (alpha == 255 || alpha == 0) { *out++ = in[0]; @@ -532,35 +493,32 @@ rgba2rgbA(UINT8* out, const UINT8* in, int xsize) */ static void -rgbT2rgba(UINT8* out, int xsize, int r, int g, int b) -{ +rgbT2rgba(UINT8 *out, int xsize, int r, int g, int b) { #ifdef WORDS_BIGENDIAN - UINT32 trns = ((r & 0xff)<<24) | ((g & 0xff)<<16) | ((b & 0xff)<<8) | 0xff; + UINT32 trns = ((r & 0xff) << 24) | ((g & 0xff) << 16) | ((b & 0xff) << 8) | 0xff; UINT32 repl = trns & 0xffffff00; #else - UINT32 trns = (0xff <<24) | ((b & 0xff)<<16) | ((g & 0xff)<<8) | (r & 0xff); + UINT32 trns = (0xff << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff); UINT32 repl = trns & 0x00ffffff; #endif int i; - for (i=0; i < xsize; i++ ,out += sizeof(trns)) { + for (i = 0; i < xsize; i++, out += sizeof(trns)) { UINT32 v; memcpy(&v, out, sizeof(v)); - if (v==trns) { + if (v == trns) { memcpy(out, &repl, sizeof(repl)); } } } - /* ---------------- */ /* CMYK conversions */ /* ---------------- */ static void -l2cmyk(UINT8* out, const UINT8* in, int xsize) -{ +l2cmyk(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = 0; @@ -571,8 +529,7 @@ l2cmyk(UINT8* out, const UINT8* in, int xsize) } static void -la2cmyk(UINT8* out, const UINT8* in, int xsize) -{ +la2cmyk(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = 0; @@ -583,21 +540,20 @@ la2cmyk(UINT8* out, const UINT8* in, int xsize) } static void -rgb2cmyk(UINT8* out, const UINT8* in, int xsize) -{ +rgb2cmyk(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { /* Note: no undercolour removal */ *out++ = ~(*in++); *out++ = ~(*in++); *out++ = ~(*in++); - *out++ = 0; in++; + *out++ = 0; + in++; } } static void -cmyk2rgb(UINT8* out, const UINT8* in, int xsize) -{ +cmyk2rgb(UINT8 *out, const UINT8 *in, int xsize) { int x, nk, tmp; for (x = 0; x < xsize; x++) { nk = 255 - in[3]; @@ -611,8 +567,7 @@ cmyk2rgb(UINT8* out, const UINT8* in, int xsize) } static void -cmyk2hsv(UINT8* out, const UINT8* in, int xsize) -{ +cmyk2hsv(UINT8 *out, const UINT8 *in, int xsize) { int x, nk, tmp; for (x = 0; x < xsize; x++) { nk = 255 - in[3]; @@ -631,8 +586,7 @@ cmyk2hsv(UINT8* out, const UINT8* in, int xsize) /* ------------- */ static void -bit2i(UINT8* out_, const UINT8* in, int xsize) -{ +bit2i(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out_ += 4) { INT32 v = (*in++ != 0) ? 255 : 0; @@ -641,8 +595,7 @@ bit2i(UINT8* out_, const UINT8* in, int xsize) } static void -l2i(UINT8* out_, const UINT8* in, int xsize) -{ +l2i(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out_ += 4) { INT32 v = *in++; @@ -651,8 +604,7 @@ l2i(UINT8* out_, const UINT8* in, int xsize) } static void -i2l(UINT8* out, const UINT8* in_, int xsize) -{ +i2l(UINT8 *out, const UINT8 *in_, int xsize) { int x; for (x = 0; x < xsize; x++, out++, in_ += 4) { INT32 v; @@ -662,14 +614,13 @@ i2l(UINT8* out, const UINT8* in_, int xsize) } else if (v >= 255) { *out = 255; } else { - *out = (UINT8) v; + *out = (UINT8)v; } } } static void -i2f(UINT8* out_, const UINT8* in_, int xsize) -{ +i2f(UINT8 *out_, const UINT8 *in_, int xsize) { int x; for (x = 0; x < xsize; x++, in_ += 4, out_ += 4) { INT32 i; @@ -681,28 +632,26 @@ i2f(UINT8* out_, const UINT8* in_, int xsize) } static void -i2rgb(UINT8* out, const UINT8* in_, int xsize) -{ +i2rgb(UINT8 *out, const UINT8 *in_, int xsize) { int x; - INT32* in = (INT32*) in_; - for (x = 0; x < xsize; x++, in++, out+=4) { + INT32 *in = (INT32 *)in_; + for (x = 0; x < xsize; x++, in++, out += 4) { if (*in <= 0) { out[0] = out[1] = out[2] = 0; } else if (*in >= 255) { out[0] = out[1] = out[2] = 255; } else { - out[0] = out[1] = out[2] = (UINT8) *in; + out[0] = out[1] = out[2] = (UINT8)*in; } out[3] = 255; } } static void -i2hsv(UINT8* out, const UINT8* in_, int xsize) -{ +i2hsv(UINT8 *out, const UINT8 *in_, int xsize) { int x; - INT32* in = (INT32*) in_; - for (x = 0; x < xsize; x++, in++, out+=4) { + INT32 *in = (INT32 *)in_; + for (x = 0; x < xsize; x++, in++, out += 4) { out[0] = 0; out[1] = 0; if (*in <= 0) { @@ -710,7 +659,7 @@ i2hsv(UINT8* out, const UINT8* in_, int xsize) } else if (*in >= 255) { out[2] = 255; } else { - out[2] = (UINT8) *in; + out[2] = (UINT8)*in; } out[3] = 255; } @@ -721,8 +670,7 @@ i2hsv(UINT8* out, const UINT8* in_, int xsize) /* ------------- */ static void -bit2f(UINT8* out_, const UINT8* in, int xsize) -{ +bit2f(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out_ += 4) { FLOAT32 f = (*in++ != 0) ? 255.0F : 0.0F; @@ -731,18 +679,16 @@ bit2f(UINT8* out_, const UINT8* in, int xsize) } static void -l2f(UINT8* out_, const UINT8* in, int xsize) -{ +l2f(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, out_ += 4) { - FLOAT32 f = (FLOAT32) *in++; + FLOAT32 f = (FLOAT32)*in++; memcpy(out_, &f, sizeof(f)); } } static void -f2l(UINT8* out, const UINT8* in_, int xsize) -{ +f2l(UINT8 *out, const UINT8 *in_, int xsize) { int x; for (x = 0; x < xsize; x++, out++, in_ += 4) { FLOAT32 v; @@ -752,14 +698,13 @@ f2l(UINT8* out, const UINT8* in_, int xsize) } else if (v >= 255.0) { *out = 255; } else { - *out = (UINT8) v; + *out = (UINT8)v; } } } static void -f2i(UINT8* out_, const UINT8* in_, int xsize) -{ +f2i(UINT8 *out_, const UINT8 *in_, int xsize) { int x; for (x = 0; x < xsize; x++, in_ += 4, out_ += 4) { FLOAT32 f; @@ -777,8 +722,7 @@ f2i(UINT8* out_, const UINT8* in_, int xsize) /* See ConvertYCbCr.c for RGB/YCbCr tables */ static void -l2ycbcr(UINT8* out, const UINT8* in, int xsize) -{ +l2ycbcr(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++) { *out++ = *in++; @@ -789,8 +733,7 @@ l2ycbcr(UINT8* out, const UINT8* in, int xsize) } static void -la2ycbcr(UINT8* out, const UINT8* in, int xsize) -{ +la2ycbcr(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = in[0]; @@ -801,8 +744,7 @@ la2ycbcr(UINT8* out, const UINT8* in, int xsize) } static void -ycbcr2l(UINT8* out, const UINT8* in, int xsize) -{ +ycbcr2l(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4) { *out++ = in[0]; @@ -810,8 +752,7 @@ ycbcr2l(UINT8* out, const UINT8* in, int xsize) } static void -ycbcr2la(UINT8* out, const UINT8* in, int xsize) -{ +ycbcr2la(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { out[0] = out[1] = out[2] = in[0]; @@ -824,77 +765,67 @@ ycbcr2la(UINT8* out, const UINT8* in, int xsize) /* ------------------------- */ static void -I_I16L(UINT8* out, const UINT8* in_, int xsize) -{ +I_I16L(UINT8 *out, const UINT8 *in_, int xsize) { int x, v; for (x = 0; x < xsize; x++, in_ += 4) { INT32 i; memcpy(&i, in_, sizeof(i)); v = CLIP16(i); - *out++ = (UINT8) v; - *out++ = (UINT8) (v >> 8); + *out++ = (UINT8)v; + *out++ = (UINT8)(v >> 8); } } static void -I_I16B(UINT8* out, const UINT8* in_, int xsize) -{ +I_I16B(UINT8 *out, const UINT8 *in_, int xsize) { int x, v; for (x = 0; x < xsize; x++, in_ += 4) { INT32 i; memcpy(&i, in_, sizeof(i)); v = CLIP16(i); - *out++ = (UINT8) (v >> 8); - *out++ = (UINT8) v; + *out++ = (UINT8)(v >> 8); + *out++ = (UINT8)v; } } - static void -I16L_I(UINT8* out_, const UINT8* in, int xsize) -{ +I16L_I(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2, out_ += 4) { - INT32 v = in[0] + ((int) in[1] << 8); - memcpy(out_, &v, sizeof(v)); - } -} - - -static void -I16B_I(UINT8* out_, const UINT8* in, int xsize) -{ - int x; - for (x = 0; x < xsize; x++, in += 2, out_ += 4) { - INT32 v = in[1] + ((int) in[0] << 8); + INT32 v = in[0] + ((int)in[1] << 8); memcpy(out_, &v, sizeof(v)); } } static void -I16L_F(UINT8* out_, const UINT8* in, int xsize) -{ +I16B_I(UINT8 *out_, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2, out_ += 4) { - FLOAT32 v = in[0] + ((int) in[1] << 8); - memcpy(out_, &v, sizeof(v)); - } -} - - -static void -I16B_F(UINT8* out_, const UINT8* in, int xsize) -{ - int x; - for (x = 0; x < xsize; x++, in += 2, out_ += 4) { - FLOAT32 v = in[1] + ((int) in[0] << 8); + INT32 v = in[1] + ((int)in[0] << 8); memcpy(out_, &v, sizeof(v)); } } static void -L_I16L(UINT8* out, const UINT8* in, int xsize) -{ +I16L_F(UINT8 *out_, const UINT8 *in, int xsize) { + int x; + for (x = 0; x < xsize; x++, in += 2, out_ += 4) { + FLOAT32 v = in[0] + ((int)in[1] << 8); + memcpy(out_, &v, sizeof(v)); + } +} + +static void +I16B_F(UINT8 *out_, const UINT8 *in, int xsize) { + int x; + for (x = 0; x < xsize; x++, in += 2, out_ += 4) { + FLOAT32 v = in[1] + ((int)in[0] << 8); + memcpy(out_, &v, sizeof(v)); + } +} + +static void +L_I16L(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in++) { *out++ = *in; @@ -903,8 +834,7 @@ L_I16L(UINT8* out, const UINT8* in, int xsize) } static void -L_I16B(UINT8* out, const UINT8* in, int xsize) -{ +L_I16B(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in++) { *out++ = 0; @@ -913,8 +843,7 @@ L_I16B(UINT8* out, const UINT8* in, int xsize) } static void -I16L_L(UINT8* out, const UINT8* in, int xsize) -{ +I16L_L(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2) { if (in[1] != 0) { @@ -926,8 +855,7 @@ I16L_L(UINT8* out, const UINT8* in, int xsize) } static void -I16B_L(UINT8* out, const UINT8* in, int xsize) -{ +I16B_L(UINT8 *out, const UINT8 *in, int xsize) { int x; for (x = 0; x < xsize; x++, in += 2) { if (in[0] != 0) { @@ -939,123 +867,122 @@ I16B_L(UINT8* out, const UINT8* in, int xsize) } static struct { - const char* from; - const char* to; + const char *from; + const char *to; ImagingShuffler convert; } converters[] = { - { "1", "L", bit2l }, - { "1", "I", bit2i }, - { "1", "F", bit2f }, - { "1", "RGB", bit2rgb }, - { "1", "RGBA", bit2rgb }, - { "1", "RGBX", bit2rgb }, - { "1", "CMYK", bit2cmyk }, - { "1", "YCbCr", bit2ycbcr }, - { "1", "HSV", bit2hsv }, + {"1", "L", bit2l}, + {"1", "I", bit2i}, + {"1", "F", bit2f}, + {"1", "RGB", bit2rgb}, + {"1", "RGBA", bit2rgb}, + {"1", "RGBX", bit2rgb}, + {"1", "CMYK", bit2cmyk}, + {"1", "YCbCr", bit2ycbcr}, + {"1", "HSV", bit2hsv}, - { "L", "1", l2bit }, - { "L", "LA", l2la }, - { "L", "I", l2i }, - { "L", "F", l2f }, - { "L", "RGB", l2rgb }, - { "L", "RGBA", l2rgb }, - { "L", "RGBX", l2rgb }, - { "L", "CMYK", l2cmyk }, - { "L", "YCbCr", l2ycbcr }, - { "L", "HSV", l2hsv }, + {"L", "1", l2bit}, + {"L", "LA", l2la}, + {"L", "I", l2i}, + {"L", "F", l2f}, + {"L", "RGB", l2rgb}, + {"L", "RGBA", l2rgb}, + {"L", "RGBX", l2rgb}, + {"L", "CMYK", l2cmyk}, + {"L", "YCbCr", l2ycbcr}, + {"L", "HSV", l2hsv}, - { "LA", "L", la2l }, - { "LA", "La", lA2la }, - { "LA", "RGB", la2rgb }, - { "LA", "RGBA", la2rgb }, - { "LA", "RGBX", la2rgb }, - { "LA", "CMYK", la2cmyk }, - { "LA", "YCbCr", la2ycbcr }, - { "LA", "HSV", la2hsv }, + {"LA", "L", la2l}, + {"LA", "La", lA2la}, + {"LA", "RGB", la2rgb}, + {"LA", "RGBA", la2rgb}, + {"LA", "RGBX", la2rgb}, + {"LA", "CMYK", la2cmyk}, + {"LA", "YCbCr", la2ycbcr}, + {"LA", "HSV", la2hsv}, - { "La", "LA", la2lA }, + {"La", "LA", la2lA}, - { "I", "L", i2l }, - { "I", "F", i2f }, - { "I", "RGB", i2rgb }, - { "I", "RGBA", i2rgb }, - { "I", "RGBX", i2rgb }, - { "I", "HSV", i2hsv }, + {"I", "L", i2l}, + {"I", "F", i2f}, + {"I", "RGB", i2rgb}, + {"I", "RGBA", i2rgb}, + {"I", "RGBX", i2rgb}, + {"I", "HSV", i2hsv}, - { "F", "L", f2l }, - { "F", "I", f2i }, + {"F", "L", f2l}, + {"F", "I", f2i}, - { "RGB", "1", rgb2bit }, - { "RGB", "L", rgb2l }, - { "RGB", "LA", rgb2la }, - { "RGB", "I", rgb2i }, - { "RGB", "F", rgb2f }, - { "RGB", "BGR;15", rgb2bgr15 }, - { "RGB", "BGR;16", rgb2bgr16 }, - { "RGB", "BGR;24", rgb2bgr24 }, - { "RGB", "RGBA", rgb2rgba }, - { "RGB", "RGBX", rgb2rgba }, - { "RGB", "CMYK", rgb2cmyk }, - { "RGB", "YCbCr", ImagingConvertRGB2YCbCr }, - { "RGB", "HSV", rgb2hsv }, + {"RGB", "1", rgb2bit}, + {"RGB", "L", rgb2l}, + {"RGB", "LA", rgb2la}, + {"RGB", "I", rgb2i}, + {"RGB", "F", rgb2f}, + {"RGB", "BGR;15", rgb2bgr15}, + {"RGB", "BGR;16", rgb2bgr16}, + {"RGB", "BGR;24", rgb2bgr24}, + {"RGB", "RGBA", rgb2rgba}, + {"RGB", "RGBX", rgb2rgba}, + {"RGB", "CMYK", rgb2cmyk}, + {"RGB", "YCbCr", ImagingConvertRGB2YCbCr}, + {"RGB", "HSV", rgb2hsv}, - { "RGBA", "1", rgb2bit }, - { "RGBA", "L", rgb2l }, - { "RGBA", "LA", rgba2la }, - { "RGBA", "I", rgb2i }, - { "RGBA", "F", rgb2f }, - { "RGBA", "RGB", rgba2rgb }, - { "RGBA", "RGBa", rgbA2rgba }, - { "RGBA", "RGBX", rgb2rgba }, - { "RGBA", "CMYK", rgb2cmyk }, - { "RGBA", "YCbCr", ImagingConvertRGB2YCbCr }, - { "RGBA", "HSV", rgb2hsv }, + {"RGBA", "1", rgb2bit}, + {"RGBA", "L", rgb2l}, + {"RGBA", "LA", rgba2la}, + {"RGBA", "I", rgb2i}, + {"RGBA", "F", rgb2f}, + {"RGBA", "RGB", rgba2rgb}, + {"RGBA", "RGBa", rgbA2rgba}, + {"RGBA", "RGBX", rgb2rgba}, + {"RGBA", "CMYK", rgb2cmyk}, + {"RGBA", "YCbCr", ImagingConvertRGB2YCbCr}, + {"RGBA", "HSV", rgb2hsv}, - { "RGBa", "RGBA", rgba2rgbA }, + {"RGBa", "RGBA", rgba2rgbA}, - { "RGBX", "1", rgb2bit }, - { "RGBX", "L", rgb2l }, - { "RGBX", "LA", rgb2la }, - { "RGBX", "I", rgb2i }, - { "RGBX", "F", rgb2f }, - { "RGBX", "RGB", rgba2rgb }, - { "RGBX", "CMYK", rgb2cmyk }, - { "RGBX", "YCbCr", ImagingConvertRGB2YCbCr }, - { "RGBX", "HSV", rgb2hsv }, + {"RGBX", "1", rgb2bit}, + {"RGBX", "L", rgb2l}, + {"RGBX", "LA", rgb2la}, + {"RGBX", "I", rgb2i}, + {"RGBX", "F", rgb2f}, + {"RGBX", "RGB", rgba2rgb}, + {"RGBX", "CMYK", rgb2cmyk}, + {"RGBX", "YCbCr", ImagingConvertRGB2YCbCr}, + {"RGBX", "HSV", rgb2hsv}, - { "CMYK", "RGB", cmyk2rgb }, - { "CMYK", "RGBA", cmyk2rgb }, - { "CMYK", "RGBX", cmyk2rgb }, - { "CMYK", "HSV", cmyk2hsv }, + {"CMYK", "RGB", cmyk2rgb}, + {"CMYK", "RGBA", cmyk2rgb}, + {"CMYK", "RGBX", cmyk2rgb}, + {"CMYK", "HSV", cmyk2hsv}, - { "YCbCr", "L", ycbcr2l }, - { "YCbCr", "LA", ycbcr2la }, - { "YCbCr", "RGB", ImagingConvertYCbCr2RGB }, + {"YCbCr", "L", ycbcr2l}, + {"YCbCr", "LA", ycbcr2la}, + {"YCbCr", "RGB", ImagingConvertYCbCr2RGB}, - { "HSV", "RGB", hsv2rgb }, + {"HSV", "RGB", hsv2rgb}, - { "I", "I;16", I_I16L }, - { "I;16", "I", I16L_I }, - { "L", "I;16", L_I16L }, - { "I;16", "L", I16L_L }, + {"I", "I;16", I_I16L}, + {"I;16", "I", I16L_I}, + {"L", "I;16", L_I16L}, + {"I;16", "L", I16L_L}, - { "I", "I;16L", I_I16L }, - { "I;16L", "I", I16L_I }, - { "I", "I;16B", I_I16B }, - { "I;16B", "I", I16B_I }, + {"I", "I;16L", I_I16L}, + {"I;16L", "I", I16L_I}, + {"I", "I;16B", I_I16B}, + {"I;16B", "I", I16B_I}, - { "L", "I;16L", L_I16L }, - { "I;16L", "L", I16L_L }, - { "L", "I;16B", L_I16B }, - { "I;16B", "L", I16B_L }, + {"L", "I;16L", L_I16L}, + {"I;16L", "L", I16L_L}, + {"L", "I;16B", L_I16B}, + {"I;16B", "L", I16B_L}, - { "I;16", "F", I16L_F }, - { "I;16L", "F", I16L_F }, - { "I;16B", "F", I16B_F }, + {"I;16", "F", I16L_F}, + {"I;16L", "F", I16L_F}, + {"I;16B", "F", I16B_F}, - { NULL } -}; + {NULL}}; /* FIXME: translate indexed versions to pointer versions below this line */ @@ -1064,51 +991,46 @@ static struct { /* ------------------- */ static void -p2bit(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2bit(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++) { - *out++ = (L(&palette[in[x]*4]) >= 128000) ? 255 : 0; + *out++ = (L(&palette[in[x] * 4]) >= 128000) ? 255 : 0; } } static void -pa2bit(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2bit(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++, in += 4) { - *out++ = (L(&palette[in[0]*4]) >= 128000) ? 255 : 0; + *out++ = (L(&palette[in[0] * 4]) >= 128000) ? 255 : 0; } } static void -p2l(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2l(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++) { - *out++ = L(&palette[in[x]*4]) / 1000; + *out++ = L(&palette[in[x] * 4]) / 1000; } } static void -pa2l(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2l(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++, in += 4) { - *out++ = L(&palette[in[0]*4]) / 1000; + *out++ = L(&palette[in[0] * 4]) / 1000; } } static void -p2pa(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2pa(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, in++) { - const UINT8* rgba = &palette[in[0]]; + const UINT8 *rgba = &palette[in[0]]; *out++ = in[0]; *out++ = in[0]; *out++ = in[0]; @@ -1117,74 +1039,67 @@ p2pa(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) } static void -p2la(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2la(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ - for (x = 0; x < xsize; x++, out+=4) { - const UINT8* rgba = &palette[*in++ * 4]; + for (x = 0; x < xsize; x++, out += 4) { + const UINT8 *rgba = &palette[*in++ * 4]; out[0] = out[1] = out[2] = L(rgba) / 1000; out[3] = rgba[3]; } } static void -pa2la(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2la(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; /* FIXME: precalculate greyscale palette? */ for (x = 0; x < xsize; x++, in += 4, out += 4) { - out[0] = out[1] = out[2] = L(&palette[in[0]*4]) / 1000; + out[0] = out[1] = out[2] = L(&palette[in[0] * 4]) / 1000; out[3] = in[3]; } } static void -p2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -{ +p2i(UINT8 *out_, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, out_ += 4) { - INT32 v = L(&palette[in[x]*4]) / 1000; + INT32 v = L(&palette[in[x] * 4]) / 1000; memcpy(out_, &v, sizeof(v)); } } static void -pa2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2i(UINT8 *out_, const UINT8 *in, int xsize, const UINT8 *palette) { int x; - INT32* out = (INT32*) out_; + INT32 *out = (INT32 *)out_; for (x = 0; x < xsize; x++, in += 4) { - *out++ = L(&palette[in[0]*4]) / 1000; + *out++ = L(&palette[in[0] * 4]) / 1000; } } static void -p2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -{ +p2f(UINT8 *out_, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, out_ += 4) { - FLOAT32 v = L(&palette[in[x]*4]) / 1000.0F; + FLOAT32 v = L(&palette[in[x] * 4]) / 1000.0F; memcpy(out_, &v, sizeof(v)); } } static void -pa2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2f(UINT8 *out_, const UINT8 *in, int xsize, const UINT8 *palette) { int x; - FLOAT32* out = (FLOAT32*) out_; + FLOAT32 *out = (FLOAT32 *)out_; for (x = 0; x < xsize; x++, in += 4) { - *out++ = (float) L(&palette[in[0]*4]) / 1000.0F; + *out++ = (float)L(&palette[in[0] * 4]) / 1000.0F; } } static void -p2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2rgb(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++) { - const UINT8* rgb = &palette[*in++ * 4]; + const UINT8 *rgb = &palette[*in++ * 4]; *out++ = rgb[0]; *out++ = rgb[1]; *out++ = rgb[2]; @@ -1193,11 +1108,10 @@ p2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) } static void -pa2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2rgb(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, in += 4) { - const UINT8* rgb = &palette[in[0] * 4]; + const UINT8 *rgb = &palette[in[0] * 4]; *out++ = rgb[0]; *out++ = rgb[1]; *out++ = rgb[2]; @@ -1206,33 +1120,30 @@ pa2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) } static void -p2hsv(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2hsv(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, out += 4) { - const UINT8* rgb = &palette[*in++ * 4]; + const UINT8 *rgb = &palette[*in++ * 4]; rgb2hsv_row(out, rgb); out[3] = 255; } } static void -pa2hsv(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2hsv(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, in += 4, out += 4) { - const UINT8* rgb = &palette[in[0] * 4]; + const UINT8 *rgb = &palette[in[0] * 4]; rgb2hsv_row(out, rgb); out[3] = 255; } } static void -p2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2rgba(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++) { - const UINT8* rgba = &palette[*in++ * 4]; + const UINT8 *rgba = &palette[*in++ * 4]; *out++ = rgba[0]; *out++ = rgba[1]; *out++ = rgba[2]; @@ -1241,11 +1152,10 @@ p2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) } static void -pa2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2rgba(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { int x; for (x = 0; x < xsize; x++, in += 4) { - const UINT8* rgb = &palette[in[0] * 4]; + const UINT8 *rgb = &palette[in[0] * 4]; *out++ = rgb[0]; *out++ = rgb[1]; *out++ = rgb[2]; @@ -1254,45 +1164,40 @@ pa2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) } static void -p2cmyk(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2cmyk(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { p2rgb(out, in, xsize, palette); rgb2cmyk(out, out, xsize); } static void -pa2cmyk(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2cmyk(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { pa2rgb(out, in, xsize, palette); rgb2cmyk(out, out, xsize); } static void -p2ycbcr(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +p2ycbcr(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { p2rgb(out, in, xsize, palette); ImagingConvertRGB2YCbCr(out, out, xsize); } static void -pa2ycbcr(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -{ +pa2ycbcr(UINT8 *out, const UINT8 *in, int xsize, const UINT8 *palette) { pa2rgb(out, in, xsize, palette); ImagingConvertRGB2YCbCr(out, out, xsize); } static Imaging -frompalette(Imaging imOut, Imaging imIn, const char *mode) -{ +frompalette(Imaging imOut, Imaging imIn, const char *mode) { ImagingSectionCookie cookie; int alpha; int y; - void (*convert)(UINT8*, const UINT8*, int, const UINT8*); + void (*convert)(UINT8 *, const UINT8 *, int, const UINT8 *); /* Map palette image to L, RGB, RGBA, or CMYK */ if (!imIn->palette) { - return (Imaging) ImagingError_ValueError("no palette"); + return (Imaging)ImagingError_ValueError("no palette"); } alpha = !strcmp(imIn->mode, "PA"); @@ -1322,7 +1227,7 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) } else if (strcmp(mode, "HSV") == 0) { convert = alpha ? pa2hsv : p2hsv; } else { - return (Imaging) ImagingError_ValueError("conversion not supported"); + return (Imaging)ImagingError_ValueError("conversion not supported"); } imOut = ImagingNew2Dirty(mode, imOut, imIn); @@ -1332,8 +1237,11 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], - imIn->xsize, imIn->palette->palette); + (*convert)( + (UINT8 *)imOut->image[y], + (UINT8 *)imIn->image[y], + imIn->xsize, + imIn->palette->palette); } ImagingSectionLeave(&cookie); @@ -1344,39 +1252,44 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) #pragma optimize("", off) #endif static Imaging -topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalette, int dither) -{ +topalette( + Imaging imOut, + Imaging imIn, + const char *mode, + ImagingPalette inpalette, + int dither) { ImagingSectionCookie cookie; int alpha; int x, y; - ImagingPalette palette = inpalette;; + ImagingPalette palette = inpalette; + ; /* Map L or RGB/RGBX/RGBA to palette image */ if (strcmp(imIn->mode, "L") != 0 && strncmp(imIn->mode, "RGB", 3) != 0) { - return (Imaging) ImagingError_ValueError("conversion not supported"); + return (Imaging)ImagingError_ValueError("conversion not supported"); } alpha = !strcmp(mode, "PA"); if (palette == NULL) { - /* FIXME: make user configurable */ - if (imIn->bands == 1) { - palette = ImagingPaletteNew("RGB"); /* Initialised to grey ramp */ - } else { - palette = ImagingPaletteNewBrowser(); /* Standard colour cube */ - } + /* FIXME: make user configurable */ + if (imIn->bands == 1) { + palette = ImagingPaletteNew("RGB"); /* Initialised to grey ramp */ + } else { + palette = ImagingPaletteNewBrowser(); /* Standard colour cube */ + } } if (!palette) { - return (Imaging) ImagingError_ValueError("no palette"); + return (Imaging)ImagingError_ValueError("no palette"); } imOut = ImagingNew2Dirty(mode, imOut, imIn); if (!imOut) { - if (palette != inpalette) { - ImagingPaletteDelete(palette); - } - return NULL; + if (palette != inpalette) { + ImagingPaletteDelete(palette); + } + return NULL; } ImagingPaletteDelete(imOut->palette); @@ -1389,7 +1302,7 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { if (alpha) { - l2la((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], imIn->xsize); + l2la((UINT8 *)imOut->image[y], (UINT8 *)imIn->image[y], imIn->xsize); } else { memcpy(imOut->image[y], imIn->image[y], imIn->linesize); } @@ -1403,7 +1316,7 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett if (ImagingPaletteCachePrepare(palette) < 0) { ImagingDelete(imOut); if (palette != inpalette) { - ImagingPaletteDelete(palette); + ImagingPaletteDelete(palette); } return NULL; } @@ -1411,7 +1324,7 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett if (dither) { /* floyd-steinberg dither */ - int* errors; + int *errors; errors = calloc(imIn->xsize + 1, sizeof(int) * 3); if (!errors) { ImagingDelete(imOut); @@ -1424,9 +1337,9 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett int r, r0, r1, r2; int g, g0, g1, g2; int b, b0, b1, b2; - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = alpha ? (UINT8*) imOut->image32[y] : imOut->image8[y]; - int* e = errors; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = alpha ? (UINT8 *)imOut->image32[y] : imOut->image8[y]; + int *e = errors; r = r0 = r1 = 0; g = g0 = g1 = 0; @@ -1434,11 +1347,11 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett for (x = 0; x < imIn->xsize; x++, in += 4) { int d2; - INT16* cache; + INT16 *cache; - r = CLIP8(in[0] + (r + e[3+0])/16); - g = CLIP8(in[1] + (g + e[3+1])/16); - b = CLIP8(in[2] + (b + e[3+2])/16); + r = CLIP8(in[0] + (r + e[3 + 0]) / 16); + g = CLIP8(in[1] + (g + e[3 + 1]) / 16); + b = CLIP8(in[2] + (b + e[3 + 2]) / 16); /* get closest colour */ cache = &ImagingPaletteCache(palette, r, g, b); @@ -1446,49 +1359,66 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett ImagingPaletteCacheUpdate(palette, r, g, b); } if (alpha) { - out[x*4] = out[x*4+1] = out[x*4+2] = (UINT8) cache[0]; - out[x*4+3] = 255; + out[x * 4] = out[x * 4 + 1] = out[x * 4 + 2] = (UINT8)cache[0]; + out[x * 4 + 3] = 255; } else { - out[x] = (UINT8) cache[0]; + out[x] = (UINT8)cache[0]; } - r -= (int) palette->palette[cache[0]*4]; - g -= (int) palette->palette[cache[0]*4+1]; - b -= (int) palette->palette[cache[0]*4+2]; + r -= (int)palette->palette[cache[0] * 4]; + g -= (int)palette->palette[cache[0] * 4 + 1]; + b -= (int)palette->palette[cache[0] * 4 + 2]; /* propagate errors (don't ask ;-) */ - r2 = r; d2 = r + r; r += d2; e[0] = r + r0; - r += d2; r0 = r + r1; r1 = r2; r += d2; - g2 = g; d2 = g + g; g += d2; e[1] = g + g0; - g += d2; g0 = g + g1; g1 = g2; g += d2; - b2 = b; d2 = b + b; b += d2; e[2] = b + b0; - b += d2; b0 = b + b1; b1 = b2; b += d2; + r2 = r; + d2 = r + r; + r += d2; + e[0] = r + r0; + r += d2; + r0 = r + r1; + r1 = r2; + r += d2; + g2 = g; + d2 = g + g; + g += d2; + e[1] = g + g0; + g += d2; + g0 = g + g1; + g1 = g2; + g += d2; + b2 = b; + d2 = b + b; + b += d2; + e[2] = b + b0; + b += d2; + b0 = b + b1; + b1 = b2; + b += d2; e += 3; - } e[0] = b0; e[1] = b1; e[2] = b2; - } ImagingSectionLeave(&cookie); free(errors); } else { - /* closest colour */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int r, g, b; - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = alpha ? (UINT8*) imOut->image32[y] : imOut->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = alpha ? (UINT8 *)imOut->image32[y] : imOut->image8[y]; for (x = 0; x < imIn->xsize; x++, in += 4) { - INT16* cache; + INT16 *cache; - r = in[0]; g = in[1]; b = in[2]; + r = in[0]; + g = in[1]; + b = in[2]; /* get closest colour */ cache = &ImagingPaletteCache(palette, r, g, b); @@ -1496,38 +1426,36 @@ topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalett ImagingPaletteCacheUpdate(palette, r, g, b); } if (alpha) { - out[x*4] = out[x*4+1] = out[x*4+2] = (UINT8) cache[0]; - out[x*4+3] = 255; + out[x * 4] = out[x * 4 + 1] = out[x * 4 + 2] = (UINT8)cache[0]; + out[x * 4 + 3] = 255; } else { - out[x] = (UINT8) cache[0]; + out[x] = (UINT8)cache[0]; } } } ImagingSectionLeave(&cookie); - } if (inpalette != palette) { - ImagingPaletteCacheDelete(palette); + ImagingPaletteCacheDelete(palette); } } if (inpalette != palette) { - ImagingPaletteDelete(palette); + ImagingPaletteDelete(palette); } return imOut; } static Imaging -tobilevel(Imaging imOut, Imaging imIn, int dither) -{ +tobilevel(Imaging imOut, Imaging imIn, int dither) { ImagingSectionCookie cookie; int x, y; - int* errors; + int *errors; /* Map L or RGB to dithered 1 image */ if (strcmp(imIn->mode, "L") != 0 && strcmp(imIn->mode, "RGB") != 0) { - return (Imaging) ImagingError_ValueError("conversion not supported"); + return (Imaging)ImagingError_ValueError("conversion not supported"); } imOut = ImagingNew2Dirty("1", imOut, imIn); @@ -1542,59 +1470,64 @@ tobilevel(Imaging imOut, Imaging imIn, int dither) } if (imIn->bands == 1) { - /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int l, l0, l1, l2, d2; - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = imOut->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = imOut->image8[y]; l = l0 = l1 = 0; for (x = 0; x < imIn->xsize; x++) { - /* pick closest colour */ - l = CLIP8(in[x] + (l + errors[x+1])/16); + l = CLIP8(in[x] + (l + errors[x + 1]) / 16); out[x] = (l > 128) ? 255 : 0; /* propagate errors */ - l -= (int) out[x]; - l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; - l += d2; l0 = l + l1; l1 = l2; l += d2; + l -= (int)out[x]; + l2 = l; + d2 = l + l; + l += d2; + errors[x] = l + l0; + l += d2; + l0 = l + l1; + l1 = l2; + l += d2; } errors[x] = l0; - } ImagingSectionLeave(&cookie); } else { - /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { int l, l0, l1, l2, d2; - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = imOut->image8[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = imOut->image8[y]; l = l0 = l1 = 0; for (x = 0; x < imIn->xsize; x++, in += 4) { - /* pick closest colour */ - l = CLIP8(L(in)/1000 + (l + errors[x+1])/16); + l = CLIP8(L(in) / 1000 + (l + errors[x + 1]) / 16); out[x] = (l > 128) ? 255 : 0; /* propagate errors */ - l -= (int) out[x]; - l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; - l += d2; l0 = l + l1; l1 = l2; l += d2; - + l -= (int)out[x]; + l2 = l; + d2 = l + l; + l += d2; + errors[x] = l + l0; + l += d2; + l0 = l + l1; + l1 = l2; + l += d2; } errors[x] = l0; - } ImagingSectionLeave(&cookie); } @@ -1608,21 +1541,20 @@ tobilevel(Imaging imOut, Imaging imIn, int dither) #endif static Imaging -convert(Imaging imOut, Imaging imIn, const char *mode, - ImagingPalette palette, int dither) -{ +convert( + Imaging imOut, Imaging imIn, const char *mode, ImagingPalette palette, int dither) { ImagingSectionCookie cookie; ImagingShuffler convert; int y; if (!imIn) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (!mode) { /* Map palette image to full depth */ if (!imIn->palette) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } mode = imIn->palette->mode; } else { @@ -1632,7 +1564,6 @@ convert(Imaging imOut, Imaging imIn, const char *mode, } } - /* test for special conversions */ if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "PA") == 0) { @@ -1647,7 +1578,6 @@ convert(Imaging imOut, Imaging imIn, const char *mode, return tobilevel(imOut, imIn, dither); } - /* standard conversion machinery */ convert = NULL; @@ -1662,12 +1592,12 @@ convert(Imaging imOut, Imaging imIn, const char *mode, if (!convert) { #ifdef notdef - return (Imaging) ImagingError_ValueError("conversion not supported"); + return (Imaging)ImagingError_ValueError("conversion not supported"); #else static char buf[256]; /* FIXME: may overflow if mode is too large */ sprintf(buf, "conversion from %s to %s not supported", imIn->mode, mode); - return (Imaging) ImagingError_ValueError(buf); + return (Imaging)ImagingError_ValueError(buf); #endif } @@ -1678,8 +1608,7 @@ convert(Imaging imOut, Imaging imIn, const char *mode, ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], - imIn->xsize); + (*convert)((UINT8 *)imOut->image[y], (UINT8 *)imIn->image[y], imIn->xsize); } ImagingSectionLeave(&cookie); @@ -1687,47 +1616,43 @@ convert(Imaging imOut, Imaging imIn, const char *mode, } Imaging -ImagingConvert(Imaging imIn, const char *mode, - ImagingPalette palette, int dither) -{ +ImagingConvert(Imaging imIn, const char *mode, ImagingPalette palette, int dither) { return convert(NULL, imIn, mode, palette, dither); } Imaging -ImagingConvert2(Imaging imOut, Imaging imIn) -{ +ImagingConvert2(Imaging imOut, Imaging imIn) { return convert(imOut, imIn, imOut->mode, NULL, 0); } - Imaging -ImagingConvertTransparent(Imaging imIn, const char *mode, - int r, int g, int b) -{ +ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) { ImagingSectionCookie cookie; ImagingShuffler convert; Imaging imOut = NULL; int y; - if (!imIn){ - return (Imaging) ImagingError_ModeError(); + if (!imIn) { + return (Imaging)ImagingError_ModeError(); } - if (!((strcmp(imIn->mode, "RGB") == 0 || - strcmp(imIn->mode, "1") == 0 || - strcmp(imIn->mode, "I") == 0 || - strcmp(imIn->mode, "L") == 0) - && strcmp(mode, "RGBA") == 0)) + if (!((strcmp(imIn->mode, "RGB") == 0 || strcmp(imIn->mode, "1") == 0 || + strcmp(imIn->mode, "I") == 0 || strcmp(imIn->mode, "L") == 0) && + strcmp(mode, "RGBA") == 0)) #ifdef notdef { - return (Imaging) ImagingError_ValueError("conversion not supported"); + return (Imaging)ImagingError_ValueError("conversion not supported"); } #else { - static char buf[256]; - /* FIXME: may overflow if mode is too large */ - sprintf(buf, "conversion from %s to %s not supported in convert_transparent", imIn->mode, mode); - return (Imaging) ImagingError_ValueError(buf); + static char buf[256]; + /* FIXME: may overflow if mode is too large */ + sprintf( + buf, + "conversion from %s to %s not supported in convert_transparent", + imIn->mode, + mode); + return (Imaging)ImagingError_ValueError(buf); } #endif @@ -1745,25 +1670,22 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, } imOut = ImagingNew2Dirty(mode, imOut, imIn); - if (!imOut){ + if (!imOut) { return NULL; } ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], - imIn->xsize); - rgbT2rgba((UINT8*) imOut->image[y], imIn->xsize, r, g, b); + (*convert)((UINT8 *)imOut->image[y], (UINT8 *)imIn->image[y], imIn->xsize); + rgbT2rgba((UINT8 *)imOut->image[y], imIn->xsize, r, g, b); } ImagingSectionLeave(&cookie); return imOut; - } Imaging -ImagingConvertInPlace(Imaging imIn, const char* mode) -{ +ImagingConvertInPlace(Imaging imIn, const char *mode) { ImagingSectionCookie cookie; ImagingShuffler convert; int y; @@ -1779,8 +1701,7 @@ ImagingConvertInPlace(Imaging imIn, const char* mode) ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - (*convert)((UINT8*) imIn->image[y], (UINT8*) imIn->image[y], - imIn->xsize); + (*convert)((UINT8 *)imIn->image[y], (UINT8 *)imIn->image[y], imIn->xsize); } ImagingSectionLeave(&cookie); diff --git a/src/libImaging/ConvertYCbCr.c b/src/libImaging/ConvertYCbCr.c index 47de4ff71..142f065e5 100644 --- a/src/libImaging/ConvertYCbCr.c +++ b/src/libImaging/ConvertYCbCr.c @@ -28,356 +28,332 @@ #define SCALE 6 /* bits */ -static INT16 Y_R[] = { 0, 19, 38, 57, 77, 96, 115, 134, 153, 172, 191, -210, 230, 249, 268, 287, 306, 325, 344, 364, 383, 402, 421, 440, 459, -478, 498, 517, 536, 555, 574, 593, 612, 631, 651, 670, 689, 708, 727, -746, 765, 785, 804, 823, 842, 861, 880, 899, 919, 938, 957, 976, 995, -1014, 1033, 1052, 1072, 1091, 1110, 1129, 1148, 1167, 1186, 1206, -1225, 1244, 1263, 1282, 1301, 1320, 1340, 1359, 1378, 1397, 1416, -1435, 1454, 1473, 1493, 1512, 1531, 1550, 1569, 1588, 1607, 1627, -1646, 1665, 1684, 1703, 1722, 1741, 1761, 1780, 1799, 1818, 1837, -1856, 1875, 1894, 1914, 1933, 1952, 1971, 1990, 2009, 2028, 2048, -2067, 2086, 2105, 2124, 2143, 2162, 2182, 2201, 2220, 2239, 2258, -2277, 2296, 2315, 2335, 2354, 2373, 2392, 2411, 2430, 2449, 2469, -2488, 2507, 2526, 2545, 2564, 2583, 2602, 2622, 2641, 2660, 2679, -2698, 2717, 2736, 2756, 2775, 2794, 2813, 2832, 2851, 2870, 2890, -2909, 2928, 2947, 2966, 2985, 3004, 3023, 3043, 3062, 3081, 3100, -3119, 3138, 3157, 3177, 3196, 3215, 3234, 3253, 3272, 3291, 3311, -3330, 3349, 3368, 3387, 3406, 3425, 3444, 3464, 3483, 3502, 3521, -3540, 3559, 3578, 3598, 3617, 3636, 3655, 3674, 3693, 3712, 3732, -3751, 3770, 3789, 3808, 3827, 3846, 3865, 3885, 3904, 3923, 3942, -3961, 3980, 3999, 4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, -4172, 4191, 4210, 4229, 4248, 4267, 4286, 4306, 4325, 4344, 4363, -4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535, 4554, 4574, -4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, -4803, 4822, 4841, 4861, 4880 }; +static INT16 Y_R[] = { + 0, 19, 38, 57, 77, 96, 115, 134, 153, 172, 191, 210, 230, 249, + 268, 287, 306, 325, 344, 364, 383, 402, 421, 440, 459, 478, 498, 517, + 536, 555, 574, 593, 612, 631, 651, 670, 689, 708, 727, 746, 765, 785, + 804, 823, 842, 861, 880, 899, 919, 938, 957, 976, 995, 1014, 1033, 1052, + 1072, 1091, 1110, 1129, 1148, 1167, 1186, 1206, 1225, 1244, 1263, 1282, 1301, 1320, + 1340, 1359, 1378, 1397, 1416, 1435, 1454, 1473, 1493, 1512, 1531, 1550, 1569, 1588, + 1607, 1627, 1646, 1665, 1684, 1703, 1722, 1741, 1761, 1780, 1799, 1818, 1837, 1856, + 1875, 1894, 1914, 1933, 1952, 1971, 1990, 2009, 2028, 2048, 2067, 2086, 2105, 2124, + 2143, 2162, 2182, 2201, 2220, 2239, 2258, 2277, 2296, 2315, 2335, 2354, 2373, 2392, + 2411, 2430, 2449, 2469, 2488, 2507, 2526, 2545, 2564, 2583, 2602, 2622, 2641, 2660, + 2679, 2698, 2717, 2736, 2756, 2775, 2794, 2813, 2832, 2851, 2870, 2890, 2909, 2928, + 2947, 2966, 2985, 3004, 3023, 3043, 3062, 3081, 3100, 3119, 3138, 3157, 3177, 3196, + 3215, 3234, 3253, 3272, 3291, 3311, 3330, 3349, 3368, 3387, 3406, 3425, 3444, 3464, + 3483, 3502, 3521, 3540, 3559, 3578, 3598, 3617, 3636, 3655, 3674, 3693, 3712, 3732, + 3751, 3770, 3789, 3808, 3827, 3846, 3865, 3885, 3904, 3923, 3942, 3961, 3980, 3999, + 4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, 4172, 4191, 4210, 4229, 4248, 4267, + 4286, 4306, 4325, 4344, 4363, 4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535, + 4554, 4574, 4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, 4803, + 4822, 4841, 4861, 4880}; -static INT16 Y_G[] = { 0, 38, 75, 113, 150, 188, 225, 263, 301, 338, -376, 413, 451, 488, 526, 564, 601, 639, 676, 714, 751, 789, 826, 864, -902, 939, 977, 1014, 1052, 1089, 1127, 1165, 1202, 1240, 1277, 1315, -1352, 1390, 1428, 1465, 1503, 1540, 1578, 1615, 1653, 1691, 1728, -1766, 1803, 1841, 1878, 1916, 1954, 1991, 2029, 2066, 2104, 2141, -2179, 2217, 2254, 2292, 2329, 2367, 2404, 2442, 2479, 2517, 2555, -2592, 2630, 2667, 2705, 2742, 2780, 2818, 2855, 2893, 2930, 2968, -3005, 3043, 3081, 3118, 3156, 3193, 3231, 3268, 3306, 3344, 3381, -3419, 3456, 3494, 3531, 3569, 3607, 3644, 3682, 3719, 3757, 3794, -3832, 3870, 3907, 3945, 3982, 4020, 4057, 4095, 4132, 4170, 4208, -4245, 4283, 4320, 4358, 4395, 4433, 4471, 4508, 4546, 4583, 4621, -4658, 4696, 4734, 4771, 4809, 4846, 4884, 4921, 4959, 4997, 5034, -5072, 5109, 5147, 5184, 5222, 5260, 5297, 5335, 5372, 5410, 5447, -5485, 5522, 5560, 5598, 5635, 5673, 5710, 5748, 5785, 5823, 5861, -5898, 5936, 5973, 6011, 6048, 6086, 6124, 6161, 6199, 6236, 6274, -6311, 6349, 6387, 6424, 6462, 6499, 6537, 6574, 6612, 6650, 6687, -6725, 6762, 6800, 6837, 6875, 6913, 6950, 6988, 7025, 7063, 7100, -7138, 7175, 7213, 7251, 7288, 7326, 7363, 7401, 7438, 7476, 7514, -7551, 7589, 7626, 7664, 7701, 7739, 7777, 7814, 7852, 7889, 7927, -7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, -8378, 8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, -8791, 8828, 8866, 8904, 8941, 8979, 9016, 9054, 9091, 9129, 9167, -9204, 9242, 9279, 9317, 9354, 9392, 9430, 9467, 9505, 9542, 9580 }; +static INT16 Y_G[] = { + 0, 38, 75, 113, 150, 188, 225, 263, 301, 338, 376, 413, 451, 488, + 526, 564, 601, 639, 676, 714, 751, 789, 826, 864, 902, 939, 977, 1014, + 1052, 1089, 1127, 1165, 1202, 1240, 1277, 1315, 1352, 1390, 1428, 1465, 1503, 1540, + 1578, 1615, 1653, 1691, 1728, 1766, 1803, 1841, 1878, 1916, 1954, 1991, 2029, 2066, + 2104, 2141, 2179, 2217, 2254, 2292, 2329, 2367, 2404, 2442, 2479, 2517, 2555, 2592, + 2630, 2667, 2705, 2742, 2780, 2818, 2855, 2893, 2930, 2968, 3005, 3043, 3081, 3118, + 3156, 3193, 3231, 3268, 3306, 3344, 3381, 3419, 3456, 3494, 3531, 3569, 3607, 3644, + 3682, 3719, 3757, 3794, 3832, 3870, 3907, 3945, 3982, 4020, 4057, 4095, 4132, 4170, + 4208, 4245, 4283, 4320, 4358, 4395, 4433, 4471, 4508, 4546, 4583, 4621, 4658, 4696, + 4734, 4771, 4809, 4846, 4884, 4921, 4959, 4997, 5034, 5072, 5109, 5147, 5184, 5222, + 5260, 5297, 5335, 5372, 5410, 5447, 5485, 5522, 5560, 5598, 5635, 5673, 5710, 5748, + 5785, 5823, 5861, 5898, 5936, 5973, 6011, 6048, 6086, 6124, 6161, 6199, 6236, 6274, + 6311, 6349, 6387, 6424, 6462, 6499, 6537, 6574, 6612, 6650, 6687, 6725, 6762, 6800, + 6837, 6875, 6913, 6950, 6988, 7025, 7063, 7100, 7138, 7175, 7213, 7251, 7288, 7326, + 7363, 7401, 7438, 7476, 7514, 7551, 7589, 7626, 7664, 7701, 7739, 7777, 7814, 7852, + 7889, 7927, 7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, 8378, + 8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, 8791, 8828, 8866, 8904, + 8941, 8979, 9016, 9054, 9091, 9129, 9167, 9204, 9242, 9279, 9317, 9354, 9392, 9430, + 9467, 9505, 9542, 9580}; -static INT16 Y_B[] = { 0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, -88, 95, 102, 109, 117, 124, 131, 139, 146, 153, 161, 168, 175, 182, -190, 197, 204, 212, 219, 226, 233, 241, 248, 255, 263, 270, 277, 285, -292, 299, 306, 314, 321, 328, 336, 343, 350, 358, 365, 372, 379, 387, -394, 401, 409, 416, 423, 430, 438, 445, 452, 460, 467, 474, 482, 489, -496, 503, 511, 518, 525, 533, 540, 547, 554, 562, 569, 576, 584, 591, -598, 606, 613, 620, 627, 635, 642, 649, 657, 664, 671, 679, 686, 693, -700, 708, 715, 722, 730, 737, 744, 751, 759, 766, 773, 781, 788, 795, -803, 810, 817, 824, 832, 839, 846, 854, 861, 868, 876, 883, 890, 897, -905, 912, 919, 927, 934, 941, 948, 956, 963, 970, 978, 985, 992, 1000, -1007, 1014, 1021, 1029, 1036, 1043, 1051, 1058, 1065, 1073, 1080, -1087, 1094, 1102, 1109, 1116, 1124, 1131, 1138, 1145, 1153, 1160, -1167, 1175, 1182, 1189, 1197, 1204, 1211, 1218, 1226, 1233, 1240, -1248, 1255, 1262, 1270, 1277, 1284, 1291, 1299, 1306, 1313, 1321, -1328, 1335, 1342, 1350, 1357, 1364, 1372, 1379, 1386, 1394, 1401, -1408, 1415, 1423, 1430, 1437, 1445, 1452, 1459, 1466, 1474, 1481, -1488, 1496, 1503, 1510, 1518, 1525, 1532, 1539, 1547, 1554, 1561, -1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627, 1634, 1642, -1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, -1729, 1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, -1809, 1817, 1824, 1831, 1839, 1846, 1853, 1860 }; +static INT16 Y_B[] = { + 0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, 88, 95, + 102, 109, 117, 124, 131, 139, 146, 153, 161, 168, 175, 182, 190, 197, + 204, 212, 219, 226, 233, 241, 248, 255, 263, 270, 277, 285, 292, 299, + 306, 314, 321, 328, 336, 343, 350, 358, 365, 372, 379, 387, 394, 401, + 409, 416, 423, 430, 438, 445, 452, 460, 467, 474, 482, 489, 496, 503, + 511, 518, 525, 533, 540, 547, 554, 562, 569, 576, 584, 591, 598, 606, + 613, 620, 627, 635, 642, 649, 657, 664, 671, 679, 686, 693, 700, 708, + 715, 722, 730, 737, 744, 751, 759, 766, 773, 781, 788, 795, 803, 810, + 817, 824, 832, 839, 846, 854, 861, 868, 876, 883, 890, 897, 905, 912, + 919, 927, 934, 941, 948, 956, 963, 970, 978, 985, 992, 1000, 1007, 1014, + 1021, 1029, 1036, 1043, 1051, 1058, 1065, 1073, 1080, 1087, 1094, 1102, 1109, 1116, + 1124, 1131, 1138, 1145, 1153, 1160, 1167, 1175, 1182, 1189, 1197, 1204, 1211, 1218, + 1226, 1233, 1240, 1248, 1255, 1262, 1270, 1277, 1284, 1291, 1299, 1306, 1313, 1321, + 1328, 1335, 1342, 1350, 1357, 1364, 1372, 1379, 1386, 1394, 1401, 1408, 1415, 1423, + 1430, 1437, 1445, 1452, 1459, 1466, 1474, 1481, 1488, 1496, 1503, 1510, 1518, 1525, + 1532, 1539, 1547, 1554, 1561, 1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627, + 1634, 1642, 1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, 1729, + 1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, 1809, 1817, 1824, 1831, + 1839, 1846, 1853, 1860}; -static INT16 Cb_R[] = { 0, -10, -21, -31, -42, -53, -64, -75, -85, --96, -107, -118, -129, -139, -150, -161, -172, -183, -193, -204, -215, --226, -237, -247, -258, -269, -280, -291, -301, -312, -323, -334, --345, -355, -366, -377, -388, -399, -409, -420, -431, -442, -453, --463, -474, -485, -496, -507, -517, -528, -539, -550, -561, -571, --582, -593, -604, -615, -625, -636, -647, -658, -669, -679, -690, --701, -712, -723, -733, -744, -755, -766, -777, -787, -798, -809, --820, -831, -841, -852, -863, -874, -885, -895, -906, -917, -928, --939, -949, -960, -971, -982, -993, -1003, -1014, -1025, -1036, -1047, --1057, -1068, -1079, -1090, -1101, -1111, -1122, -1133, -1144, -1155, --1165, -1176, -1187, -1198, -1209, -1219, -1230, -1241, -1252, -1263, --1273, -1284, -1295, -1306, -1317, -1327, -1338, -1349, -1360, -1371, --1381, -1392, -1403, -1414, -1425, -1435, -1446, -1457, -1468, -1479, --1489, -1500, -1511, -1522, -1533, -1543, -1554, -1565, -1576, -1587, --1597, -1608, -1619, -1630, -1641, -1651, -1662, -1673, -1684, -1694, --1705, -1716, -1727, -1738, -1748, -1759, -1770, -1781, -1792, -1802, --1813, -1824, -1835, -1846, -1856, -1867, -1878, -1889, -1900, -1910, --1921, -1932, -1943, -1954, -1964, -1975, -1986, -1997, -2008, -2018, --2029, -2040, -2051, -2062, -2072, -2083, -2094, -2105, -2116, -2126, --2137, -2148, -2159, -2170, -2180, -2191, -2202, -2213, -2224, -2234, --2245, -2256, -2267, -2278, -2288, -2299, -2310, -2321, -2332, -2342, --2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450, --2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, --2569, -2580, -2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, --2677, -2688, -2699, -2710, -2720, -2731, -2742, -2753 }; +static INT16 Cb_R[] = { + 0, -10, -21, -31, -42, -53, -64, -75, -85, -96, -107, -118, + -129, -139, -150, -161, -172, -183, -193, -204, -215, -226, -237, -247, + -258, -269, -280, -291, -301, -312, -323, -334, -345, -355, -366, -377, + -388, -399, -409, -420, -431, -442, -453, -463, -474, -485, -496, -507, + -517, -528, -539, -550, -561, -571, -582, -593, -604, -615, -625, -636, + -647, -658, -669, -679, -690, -701, -712, -723, -733, -744, -755, -766, + -777, -787, -798, -809, -820, -831, -841, -852, -863, -874, -885, -895, + -906, -917, -928, -939, -949, -960, -971, -982, -993, -1003, -1014, -1025, + -1036, -1047, -1057, -1068, -1079, -1090, -1101, -1111, -1122, -1133, -1144, -1155, + -1165, -1176, -1187, -1198, -1209, -1219, -1230, -1241, -1252, -1263, -1273, -1284, + -1295, -1306, -1317, -1327, -1338, -1349, -1360, -1371, -1381, -1392, -1403, -1414, + -1425, -1435, -1446, -1457, -1468, -1479, -1489, -1500, -1511, -1522, -1533, -1543, + -1554, -1565, -1576, -1587, -1597, -1608, -1619, -1630, -1641, -1651, -1662, -1673, + -1684, -1694, -1705, -1716, -1727, -1738, -1748, -1759, -1770, -1781, -1792, -1802, + -1813, -1824, -1835, -1846, -1856, -1867, -1878, -1889, -1900, -1910, -1921, -1932, + -1943, -1954, -1964, -1975, -1986, -1997, -2008, -2018, -2029, -2040, -2051, -2062, + -2072, -2083, -2094, -2105, -2116, -2126, -2137, -2148, -2159, -2170, -2180, -2191, + -2202, -2213, -2224, -2234, -2245, -2256, -2267, -2278, -2288, -2299, -2310, -2321, + -2332, -2342, -2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450, + -2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, -2569, -2580, + -2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, -2677, -2688, -2699, -2710, + -2720, -2731, -2742, -2753}; -static INT16 Cb_G[] = { 0, -20, -41, -63, -84, -105, -126, -147, -169, --190, -211, -232, -253, -275, -296, -317, -338, -359, -381, -402, --423, -444, -465, -487, -508, -529, -550, -571, -593, -614, -635, --656, -677, -699, -720, -741, -762, -783, -805, -826, -847, -868, --889, -911, -932, -953, -974, -995, -1017, -1038, -1059, -1080, -1101, --1123, -1144, -1165, -1186, -1207, -1229, -1250, -1271, -1292, -1313, --1335, -1356, -1377, -1398, -1419, -1441, -1462, -1483, -1504, -1525, --1547, -1568, -1589, -1610, -1631, -1653, -1674, -1695, -1716, -1737, --1759, -1780, -1801, -1822, -1843, -1865, -1886, -1907, -1928, -1949, --1971, -1992, -2013, -2034, -2055, -2077, -2098, -2119, -2140, -2161, --2183, -2204, -2225, -2246, -2267, -2289, -2310, -2331, -2352, -2373, --2395, -2416, -2437, -2458, -2479, -2501, -2522, -2543, -2564, -2585, --2607, -2628, -2649, -2670, -2691, -2713, -2734, -2755, -2776, -2797, --2819, -2840, -2861, -2882, -2903, -2925, -2946, -2967, -2988, -3009, --3031, -3052, -3073, -3094, -3115, -3137, -3158, -3179, -3200, -3221, --3243, -3264, -3285, -3306, -3328, -3349, -3370, -3391, -3412, -3434, --3455, -3476, -3497, -3518, -3540, -3561, -3582, -3603, -3624, -3646, --3667, -3688, -3709, -3730, -3752, -3773, -3794, -3815, -3836, -3858, --3879, -3900, -3921, -3942, -3964, -3985, -4006, -4027, -4048, -4070, --4091, -4112, -4133, -4154, -4176, -4197, -4218, -4239, -4260, -4282, --4303, -4324, -4345, -4366, -4388, -4409, -4430, -4451, -4472, -4494, --4515, -4536, -4557, -4578, -4600, -4621, -4642, -4663, -4684, -4706, --4727, -4748, -4769, -4790, -4812, -4833, -4854, -4875, -4896, -4918, --4939, -4960, -4981, -5002, -5024, -5045, -5066, -5087, -5108, -5130, --5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320, -5342, --5363, -5384, -5405 }; +static INT16 Cb_G[] = { + 0, -20, -41, -63, -84, -105, -126, -147, -169, -190, -211, -232, + -253, -275, -296, -317, -338, -359, -381, -402, -423, -444, -465, -487, + -508, -529, -550, -571, -593, -614, -635, -656, -677, -699, -720, -741, + -762, -783, -805, -826, -847, -868, -889, -911, -932, -953, -974, -995, + -1017, -1038, -1059, -1080, -1101, -1123, -1144, -1165, -1186, -1207, -1229, -1250, + -1271, -1292, -1313, -1335, -1356, -1377, -1398, -1419, -1441, -1462, -1483, -1504, + -1525, -1547, -1568, -1589, -1610, -1631, -1653, -1674, -1695, -1716, -1737, -1759, + -1780, -1801, -1822, -1843, -1865, -1886, -1907, -1928, -1949, -1971, -1992, -2013, + -2034, -2055, -2077, -2098, -2119, -2140, -2161, -2183, -2204, -2225, -2246, -2267, + -2289, -2310, -2331, -2352, -2373, -2395, -2416, -2437, -2458, -2479, -2501, -2522, + -2543, -2564, -2585, -2607, -2628, -2649, -2670, -2691, -2713, -2734, -2755, -2776, + -2797, -2819, -2840, -2861, -2882, -2903, -2925, -2946, -2967, -2988, -3009, -3031, + -3052, -3073, -3094, -3115, -3137, -3158, -3179, -3200, -3221, -3243, -3264, -3285, + -3306, -3328, -3349, -3370, -3391, -3412, -3434, -3455, -3476, -3497, -3518, -3540, + -3561, -3582, -3603, -3624, -3646, -3667, -3688, -3709, -3730, -3752, -3773, -3794, + -3815, -3836, -3858, -3879, -3900, -3921, -3942, -3964, -3985, -4006, -4027, -4048, + -4070, -4091, -4112, -4133, -4154, -4176, -4197, -4218, -4239, -4260, -4282, -4303, + -4324, -4345, -4366, -4388, -4409, -4430, -4451, -4472, -4494, -4515, -4536, -4557, + -4578, -4600, -4621, -4642, -4663, -4684, -4706, -4727, -4748, -4769, -4790, -4812, + -4833, -4854, -4875, -4896, -4918, -4939, -4960, -4981, -5002, -5024, -5045, -5066, + -5087, -5108, -5130, -5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320, + -5342, -5363, -5384, -5405}; -static INT16 Cb_B[] = { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, -320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, -768, 800, 832, 864, 896, 928, 960, 992, 1024, 1056, 1088, 1120, 1152, -1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472, 1504, -1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, -1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, -2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, -2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, 2880, 2912, -2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, -3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, -3648, 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, -4000, 4032, 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, -4352, 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, -4704, 4736, 4768, 4800, 4832, 4864, 4896, 4928, 4960, 4992, 5024, -5056, 5088, 5120, 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376, -5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, -5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, -6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, -6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, 6752, 6784, -6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, -7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, -7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, -7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160 }; +static INT16 Cb_B[] = { + 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, + 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, + 896, 928, 960, 992, 1024, 1056, 1088, 1120, 1152, 1184, 1216, 1248, 1280, 1312, + 1344, 1376, 1408, 1440, 1472, 1504, 1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, + 1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, + 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, 2592, 2624, 2656, + 2688, 2720, 2752, 2784, 2816, 2848, 2880, 2912, 2944, 2976, 3008, 3040, 3072, 3104, + 3136, 3168, 3200, 3232, 3264, 3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, + 3584, 3616, 3648, 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, 4000, + 4032, 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352, 4384, 4416, 4448, + 4480, 4512, 4544, 4576, 4608, 4640, 4672, 4704, 4736, 4768, 4800, 4832, 4864, 4896, + 4928, 4960, 4992, 5024, 5056, 5088, 5120, 5152, 5184, 5216, 5248, 5280, 5312, 5344, + 5376, 5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, 5760, 5792, + 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, 6112, 6144, 6176, 6208, 6240, + 6272, 6304, 6336, 6368, 6400, 6432, 6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, + 6720, 6752, 6784, 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, + 7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584, + 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, 7872, 7904, 7936, 7968, 8000, 8032, + 8064, 8096, 8128, 8160}; #define Cr_R Cb_B -static INT16 Cr_G[] = { 0, -26, -53, -79, -106, -133, -160, -187, --213, -240, -267, -294, -321, -347, -374, -401, -428, -455, -481, --508, -535, -562, -589, -615, -642, -669, -696, -722, -749, -776, --803, -830, -856, -883, -910, -937, -964, -990, -1017, -1044, -1071, --1098, -1124, -1151, -1178, -1205, -1232, -1258, -1285, -1312, -1339, --1366, -1392, -1419, -1446, -1473, -1500, -1526, -1553, -1580, -1607, --1634, -1660, -1687, -1714, -1741, -1768, -1794, -1821, -1848, -1875, --1902, -1928, -1955, -1982, -2009, -2036, -2062, -2089, -2116, -2143, --2169, -2196, -2223, -2250, -2277, -2303, -2330, -2357, -2384, -2411, --2437, -2464, -2491, -2518, -2545, -2571, -2598, -2625, -2652, -2679, --2705, -2732, -2759, -2786, -2813, -2839, -2866, -2893, -2920, -2947, --2973, -3000, -3027, -3054, -3081, -3107, -3134, -3161, -3188, -3215, --3241, -3268, -3295, -3322, -3349, -3375, -3402, -3429, -3456, -3483, --3509, -3536, -3563, -3590, -3616, -3643, -3670, -3697, -3724, -3750, --3777, -3804, -3831, -3858, -3884, -3911, -3938, -3965, -3992, -4018, --4045, -4072, -4099, -4126, -4152, -4179, -4206, -4233, -4260, -4286, --4313, -4340, -4367, -4394, -4420, -4447, -4474, -4501, -4528, -4554, --4581, -4608, -4635, -4662, -4688, -4715, -4742, -4769, -4796, -4822, --4849, -4876, -4903, -4929, -4956, -4983, -5010, -5037, -5063, -5090, --5117, -5144, -5171, -5197, -5224, -5251, -5278, -5305, -5331, -5358, --5385, -5412, -5439, -5465, -5492, -5519, -5546, -5573, -5599, -5626, --5653, -5680, -5707, -5733, -5760, -5787, -5814, -5841, -5867, -5894, --5921, -5948, -5975, -6001, -6028, -6055, -6082, -6109, -6135, -6162, --6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403, -6430, --6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, --6725, -6752, -6778, -6805, -6832 }; +static INT16 Cr_G[] = { + 0, -26, -53, -79, -106, -133, -160, -187, -213, -240, -267, -294, + -321, -347, -374, -401, -428, -455, -481, -508, -535, -562, -589, -615, + -642, -669, -696, -722, -749, -776, -803, -830, -856, -883, -910, -937, + -964, -990, -1017, -1044, -1071, -1098, -1124, -1151, -1178, -1205, -1232, -1258, + -1285, -1312, -1339, -1366, -1392, -1419, -1446, -1473, -1500, -1526, -1553, -1580, + -1607, -1634, -1660, -1687, -1714, -1741, -1768, -1794, -1821, -1848, -1875, -1902, + -1928, -1955, -1982, -2009, -2036, -2062, -2089, -2116, -2143, -2169, -2196, -2223, + -2250, -2277, -2303, -2330, -2357, -2384, -2411, -2437, -2464, -2491, -2518, -2545, + -2571, -2598, -2625, -2652, -2679, -2705, -2732, -2759, -2786, -2813, -2839, -2866, + -2893, -2920, -2947, -2973, -3000, -3027, -3054, -3081, -3107, -3134, -3161, -3188, + -3215, -3241, -3268, -3295, -3322, -3349, -3375, -3402, -3429, -3456, -3483, -3509, + -3536, -3563, -3590, -3616, -3643, -3670, -3697, -3724, -3750, -3777, -3804, -3831, + -3858, -3884, -3911, -3938, -3965, -3992, -4018, -4045, -4072, -4099, -4126, -4152, + -4179, -4206, -4233, -4260, -4286, -4313, -4340, -4367, -4394, -4420, -4447, -4474, + -4501, -4528, -4554, -4581, -4608, -4635, -4662, -4688, -4715, -4742, -4769, -4796, + -4822, -4849, -4876, -4903, -4929, -4956, -4983, -5010, -5037, -5063, -5090, -5117, + -5144, -5171, -5197, -5224, -5251, -5278, -5305, -5331, -5358, -5385, -5412, -5439, + -5465, -5492, -5519, -5546, -5573, -5599, -5626, -5653, -5680, -5707, -5733, -5760, + -5787, -5814, -5841, -5867, -5894, -5921, -5948, -5975, -6001, -6028, -6055, -6082, + -6109, -6135, -6162, -6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403, + -6430, -6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, -6725, + -6752, -6778, -6805, -6832}; -static INT16 Cr_B[] = { 0, -4, -9, -15, -20, -25, -30, -35, -41, -46, --51, -56, -61, -67, -72, -77, -82, -87, -93, -98, -103, -108, -113, --119, -124, -129, -134, -140, -145, -150, -155, -160, -166, -171, --176, -181, -186, -192, -197, -202, -207, -212, -218, -223, -228, --233, -238, -244, -249, -254, -259, -264, -270, -275, -280, -285, --290, -296, -301, -306, -311, -316, -322, -327, -332, -337, -342, --348, -353, -358, -363, -368, -374, -379, -384, -389, -394, -400, --405, -410, -415, -421, -426, -431, -436, -441, -447, -452, -457, --462, -467, -473, -478, -483, -488, -493, -499, -504, -509, -514, --519, -525, -530, -535, -540, -545, -551, -556, -561, -566, -571, --577, -582, -587, -592, -597, -603, -608, -613, -618, -623, -629, --634, -639, -644, -649, -655, -660, -665, -670, -675, -681, -686, --691, -696, -702, -707, -712, -717, -722, -728, -733, -738, -743, --748, -754, -759, -764, -769, -774, -780, -785, -790, -795, -800, --806, -811, -816, -821, -826, -832, -837, -842, -847, -852, -858, --863, -868, -873, -878, -884, -889, -894, -899, -904, -910, -915, --920, -925, -930, -936, -941, -946, -951, -957, -962, -967, -972, --977, -983, -988, -993, -998, -1003, -1009, -1014, -1019, -1024, --1029, -1035, -1040, -1045, -1050, -1055, -1061, -1066, -1071, -1076, --1081, -1087, -1092, -1097, -1102, -1107, -1113, -1118, -1123, -1128, --1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180, --1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, --1238, -1243, -1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, --1290, -1295, -1300, -1305, -1310, -1316, -1321, -1326 }; +static INT16 Cr_B[] = { + 0, -4, -9, -15, -20, -25, -30, -35, -41, -46, -51, -56, + -61, -67, -72, -77, -82, -87, -93, -98, -103, -108, -113, -119, + -124, -129, -134, -140, -145, -150, -155, -160, -166, -171, -176, -181, + -186, -192, -197, -202, -207, -212, -218, -223, -228, -233, -238, -244, + -249, -254, -259, -264, -270, -275, -280, -285, -290, -296, -301, -306, + -311, -316, -322, -327, -332, -337, -342, -348, -353, -358, -363, -368, + -374, -379, -384, -389, -394, -400, -405, -410, -415, -421, -426, -431, + -436, -441, -447, -452, -457, -462, -467, -473, -478, -483, -488, -493, + -499, -504, -509, -514, -519, -525, -530, -535, -540, -545, -551, -556, + -561, -566, -571, -577, -582, -587, -592, -597, -603, -608, -613, -618, + -623, -629, -634, -639, -644, -649, -655, -660, -665, -670, -675, -681, + -686, -691, -696, -702, -707, -712, -717, -722, -728, -733, -738, -743, + -748, -754, -759, -764, -769, -774, -780, -785, -790, -795, -800, -806, + -811, -816, -821, -826, -832, -837, -842, -847, -852, -858, -863, -868, + -873, -878, -884, -889, -894, -899, -904, -910, -915, -920, -925, -930, + -936, -941, -946, -951, -957, -962, -967, -972, -977, -983, -988, -993, + -998, -1003, -1009, -1014, -1019, -1024, -1029, -1035, -1040, -1045, -1050, -1055, + -1061, -1066, -1071, -1076, -1081, -1087, -1092, -1097, -1102, -1107, -1113, -1118, + -1123, -1128, -1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180, + -1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, -1238, -1243, + -1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, -1290, -1295, -1300, -1305, + -1310, -1316, -1321, -1326}; -static INT16 R_Cr[] = { -11484, -11394, -11305, -11215, -11125, --11036, -10946, -10856, -10766, -10677, -10587, -10497, -10407, --10318, -10228, -10138, -10049, -9959, -9869, -9779, -9690, -9600, --9510, -9420, -9331, -9241, -9151, -9062, -8972, -8882, -8792, -8703, --8613, -8523, -8433, -8344, -8254, -8164, -8075, -7985, -7895, -7805, --7716, -7626, -7536, -7446, -7357, -7267, -7177, -7088, -6998, -6908, --6818, -6729, -6639, -6549, -6459, -6370, -6280, -6190, -6101, -6011, --5921, -5831, -5742, -5652, -5562, -5472, -5383, -5293, -5203, -5113, --5024, -4934, -4844, -4755, -4665, -4575, -4485, -4396, -4306, -4216, --4126, -4037, -3947, -3857, -3768, -3678, -3588, -3498, -3409, -3319, --3229, -3139, -3050, -2960, -2870, -2781, -2691, -2601, -2511, -2422, --2332, -2242, -2152, -2063, -1973, -1883, -1794, -1704, -1614, -1524, --1435, -1345, -1255, -1165, -1076, -986, -896, -807, -717, -627, -537, --448, -358, -268, -178, -89, 0, 90, 179, 269, 359, 449, 538, 628, 718, -808, 897, 987, 1077, 1166, 1256, 1346, 1436, 1525, 1615, 1705, 1795, -1884, 1974, 2064, 2153, 2243, 2333, 2423, 2512, 2602, 2692, 2782, -2871, 2961, 3051, 3140, 3230, 3320, 3410, 3499, 3589, 3679, 3769, -3858, 3948, 4038, 4127, 4217, 4307, 4397, 4486, 4576, 4666, 4756, -4845, 4935, 5025, 5114, 5204, 5294, 5384, 5473, 5563, 5653, 5743, -5832, 5922, 6012, 6102, 6191, 6281, 6371, 6460, 6550, 6640, 6730, -6819, 6909, 6999, 7089, 7178, 7268, 7358, 7447, 7537, 7627, 7717, -7806, 7896, 7986, 8076, 8165, 8255, 8345, 8434, 8524, 8614, 8704, -8793, 8883, 8973, 9063, 9152, 9242, 9332, 9421, 9511, 9601, 9691, -9780, 9870, 9960, 10050, 10139, 10229, 10319, 10408, 10498, 10588, -10678, 10767, 10857, 10947, 11037, 11126, 11216, 11306, 11395 }; +static INT16 R_Cr[] = { + -11484, -11394, -11305, -11215, -11125, -11036, -10946, -10856, -10766, -10677, + -10587, -10497, -10407, -10318, -10228, -10138, -10049, -9959, -9869, -9779, + -9690, -9600, -9510, -9420, -9331, -9241, -9151, -9062, -8972, -8882, + -8792, -8703, -8613, -8523, -8433, -8344, -8254, -8164, -8075, -7985, + -7895, -7805, -7716, -7626, -7536, -7446, -7357, -7267, -7177, -7088, + -6998, -6908, -6818, -6729, -6639, -6549, -6459, -6370, -6280, -6190, + -6101, -6011, -5921, -5831, -5742, -5652, -5562, -5472, -5383, -5293, + -5203, -5113, -5024, -4934, -4844, -4755, -4665, -4575, -4485, -4396, + -4306, -4216, -4126, -4037, -3947, -3857, -3768, -3678, -3588, -3498, + -3409, -3319, -3229, -3139, -3050, -2960, -2870, -2781, -2691, -2601, + -2511, -2422, -2332, -2242, -2152, -2063, -1973, -1883, -1794, -1704, + -1614, -1524, -1435, -1345, -1255, -1165, -1076, -986, -896, -807, + -717, -627, -537, -448, -358, -268, -178, -89, 0, 90, + 179, 269, 359, 449, 538, 628, 718, 808, 897, 987, + 1077, 1166, 1256, 1346, 1436, 1525, 1615, 1705, 1795, 1884, + 1974, 2064, 2153, 2243, 2333, 2423, 2512, 2602, 2692, 2782, + 2871, 2961, 3051, 3140, 3230, 3320, 3410, 3499, 3589, 3679, + 3769, 3858, 3948, 4038, 4127, 4217, 4307, 4397, 4486, 4576, + 4666, 4756, 4845, 4935, 5025, 5114, 5204, 5294, 5384, 5473, + 5563, 5653, 5743, 5832, 5922, 6012, 6102, 6191, 6281, 6371, + 6460, 6550, 6640, 6730, 6819, 6909, 6999, 7089, 7178, 7268, + 7358, 7447, 7537, 7627, 7717, 7806, 7896, 7986, 8076, 8165, + 8255, 8345, 8434, 8524, 8614, 8704, 8793, 8883, 8973, 9063, + 9152, 9242, 9332, 9421, 9511, 9601, 9691, 9780, 9870, 9960, + 10050, 10139, 10229, 10319, 10408, 10498, 10588, 10678, 10767, 10857, + 10947, 11037, 11126, 11216, 11306, 11395}; -static INT16 G_Cb[] = { 2819, 2797, 2775, 2753, 2731, 2709, 2687, -2665, 2643, 2621, 2599, 2577, 2555, 2533, 2511, 2489, 2467, 2445, -2423, 2401, 2379, 2357, 2335, 2313, 2291, 2269, 2247, 2225, 2202, -2180, 2158, 2136, 2114, 2092, 2070, 2048, 2026, 2004, 1982, 1960, -1938, 1916, 1894, 1872, 1850, 1828, 1806, 1784, 1762, 1740, 1718, -1696, 1674, 1652, 1630, 1608, 1586, 1564, 1542, 1520, 1498, 1476, -1454, 1432, 1410, 1388, 1366, 1344, 1321, 1299, 1277, 1255, 1233, -1211, 1189, 1167, 1145, 1123, 1101, 1079, 1057, 1035, 1013, 991, 969, -947, 925, 903, 881, 859, 837, 815, 793, 771, 749, 727, 705, 683, 661, -639, 617, 595, 573, 551, 529, 507, 485, 463, 440, 418, 396, 374, 352, -330, 308, 286, 264, 242, 220, 198, 176, 154, 132, 110, 88, 66, 44, 22, -0, -21, -43, -65, -87, -109, -131, -153, -175, -197, -219, -241, -263, --285, -307, -329, -351, -373, -395, -417, -439, -462, -484, -506, --528, -550, -572, -594, -616, -638, -660, -682, -704, -726, -748, --770, -792, -814, -836, -858, -880, -902, -924, -946, -968, -990, --1012, -1034, -1056, -1078, -1100, -1122, -1144, -1166, -1188, -1210, --1232, -1254, -1276, -1298, -1320, -1343, -1365, -1387, -1409, -1431, --1453, -1475, -1497, -1519, -1541, -1563, -1585, -1607, -1629, -1651, --1673, -1695, -1717, -1739, -1761, -1783, -1805, -1827, -1849, -1871, --1893, -1915, -1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, --2113, -2135, -2157, -2179, -2201, -2224, -2246, -2268, -2290, -2312, --2334, -2356, -2378, -2400, -2422, -2444, -2466, -2488, -2510, -2532, --2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708, -2730, -2752, --2774, -2796 }; +static INT16 G_Cb[] = { + 2819, 2797, 2775, 2753, 2731, 2709, 2687, 2665, 2643, 2621, 2599, 2577, + 2555, 2533, 2511, 2489, 2467, 2445, 2423, 2401, 2379, 2357, 2335, 2313, + 2291, 2269, 2247, 2225, 2202, 2180, 2158, 2136, 2114, 2092, 2070, 2048, + 2026, 2004, 1982, 1960, 1938, 1916, 1894, 1872, 1850, 1828, 1806, 1784, + 1762, 1740, 1718, 1696, 1674, 1652, 1630, 1608, 1586, 1564, 1542, 1520, + 1498, 1476, 1454, 1432, 1410, 1388, 1366, 1344, 1321, 1299, 1277, 1255, + 1233, 1211, 1189, 1167, 1145, 1123, 1101, 1079, 1057, 1035, 1013, 991, + 969, 947, 925, 903, 881, 859, 837, 815, 793, 771, 749, 727, + 705, 683, 661, 639, 617, 595, 573, 551, 529, 507, 485, 463, + 440, 418, 396, 374, 352, 330, 308, 286, 264, 242, 220, 198, + 176, 154, 132, 110, 88, 66, 44, 22, 0, -21, -43, -65, + -87, -109, -131, -153, -175, -197, -219, -241, -263, -285, -307, -329, + -351, -373, -395, -417, -439, -462, -484, -506, -528, -550, -572, -594, + -616, -638, -660, -682, -704, -726, -748, -770, -792, -814, -836, -858, + -880, -902, -924, -946, -968, -990, -1012, -1034, -1056, -1078, -1100, -1122, + -1144, -1166, -1188, -1210, -1232, -1254, -1276, -1298, -1320, -1343, -1365, -1387, + -1409, -1431, -1453, -1475, -1497, -1519, -1541, -1563, -1585, -1607, -1629, -1651, + -1673, -1695, -1717, -1739, -1761, -1783, -1805, -1827, -1849, -1871, -1893, -1915, + -1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, -2113, -2135, -2157, -2179, + -2201, -2224, -2246, -2268, -2290, -2312, -2334, -2356, -2378, -2400, -2422, -2444, + -2466, -2488, -2510, -2532, -2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708, + -2730, -2752, -2774, -2796}; -static INT16 G_Cr[] = { 5850, 5805, 5759, 5713, 5667, 5622, 5576, -5530, 5485, 5439, 5393, 5347, 5302, 5256, 5210, 5165, 5119, 5073, -5028, 4982, 4936, 4890, 4845, 4799, 4753, 4708, 4662, 4616, 4570, -4525, 4479, 4433, 4388, 4342, 4296, 4251, 4205, 4159, 4113, 4068, -4022, 3976, 3931, 3885, 3839, 3794, 3748, 3702, 3656, 3611, 3565, -3519, 3474, 3428, 3382, 3336, 3291, 3245, 3199, 3154, 3108, 3062, -3017, 2971, 2925, 2879, 2834, 2788, 2742, 2697, 2651, 2605, 2559, -2514, 2468, 2422, 2377, 2331, 2285, 2240, 2194, 2148, 2102, 2057, -2011, 1965, 1920, 1874, 1828, 1782, 1737, 1691, 1645, 1600, 1554, -1508, 1463, 1417, 1371, 1325, 1280, 1234, 1188, 1143, 1097, 1051, -1006, 960, 914, 868, 823, 777, 731, 686, 640, 594, 548, 503, 457, 411, -366, 320, 274, 229, 183, 137, 91, 46, 0, -45, -90, -136, -182, -228, --273, -319, -365, -410, -456, -502, -547, -593, -639, -685, -730, --776, -822, -867, -913, -959, -1005, -1050, -1096, -1142, -1187, --1233, -1279, -1324, -1370, -1416, -1462, -1507, -1553, -1599, -1644, --1690, -1736, -1781, -1827, -1873, -1919, -1964, -2010, -2056, -2101, --2147, -2193, -2239, -2284, -2330, -2376, -2421, -2467, -2513, -2558, --2604, -2650, -2696, -2741, -2787, -2833, -2878, -2924, -2970, -3016, --3061, -3107, -3153, -3198, -3244, -3290, -3335, -3381, -3427, -3473, --3518, -3564, -3610, -3655, -3701, -3747, -3793, -3838, -3884, -3930, --3975, -4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, --4432, -4478, -4524, -4569, -4615, -4661, -4707, -4752, -4798, -4844, --4889, -4935, -4981, -5027, -5072, -5118, -5164, -5209, -5255, -5301, --5346, -5392, -5438, -5484, -5529, -5575, -5621, -5666, -5712, -5758, --5804 }; - -static INT16 B_Cb[] = { -14515, -14402, -14288, -14175, -14062, --13948, -13835, -13721, -13608, -13495, -13381, -13268, -13154, --13041, -12928, -12814, -12701, -12587, -12474, -12360, -12247, --12134, -12020, -11907, -11793, -11680, -11567, -11453, -11340, --11226, -11113, -11000, -10886, -10773, -10659, -10546, -10433, --10319, -10206, -10092, -9979, -9865, -9752, -9639, -9525, -9412, --9298, -9185, -9072, -8958, -8845, -8731, -8618, -8505, -8391, -8278, --8164, -8051, -7938, -7824, -7711, -7597, -7484, -7371, -7257, -7144, --7030, -6917, -6803, -6690, -6577, -6463, -6350, -6236, -6123, -6010, --5896, -5783, -5669, -5556, -5443, -5329, -5216, -5102, -4989, -4876, --4762, -4649, -4535, -4422, -4309, -4195, -4082, -3968, -3855, -3741, --3628, -3515, -3401, -3288, -3174, -3061, -2948, -2834, -2721, -2607, --2494, -2381, -2267, -2154, -2040, -1927, -1814, -1700, -1587, -1473, --1360, -1246, -1133, -1020, -906, -793, -679, -566, -453, -339, -226, --112, 0, 113, 227, 340, 454, 567, 680, 794, 907, 1021, 1134, 1247, -1361, 1474, 1588, 1701, 1815, 1928, 2041, 2155, 2268, 2382, 2495, -2608, 2722, 2835, 2949, 3062, 3175, 3289, 3402, 3516, 3629, 3742, -3856, 3969, 4083, 4196, 4310, 4423, 4536, 4650, 4763, 4877, 4990, -5103, 5217, 5330, 5444, 5557, 5670, 5784, 5897, 6011, 6124, 6237, -6351, 6464, 6578, 6691, 6804, 6918, 7031, 7145, 7258, 7372, 7485, -7598, 7712, 7825, 7939, 8052, 8165, 8279, 8392, 8506, 8619, 8732, -8846, 8959, 9073, 9186, 9299, 9413, 9526, 9640, 9753, 9866, 9980, -10093, 10207, 10320, 10434, 10547, 10660, 10774, 10887, 11001, 11114, -11227, 11341, 11454, 11568, 11681, 11794, 11908, 12021, 12135, 12248, -12361, 12475, 12588, 12702, 12815, 12929, 13042, 13155, 13269, 13382, -13496, 13609, 13722, 13836, 13949, 14063, 14176, 14289, 14403 }; +static INT16 G_Cr[] = { + 5850, 5805, 5759, 5713, 5667, 5622, 5576, 5530, 5485, 5439, 5393, 5347, + 5302, 5256, 5210, 5165, 5119, 5073, 5028, 4982, 4936, 4890, 4845, 4799, + 4753, 4708, 4662, 4616, 4570, 4525, 4479, 4433, 4388, 4342, 4296, 4251, + 4205, 4159, 4113, 4068, 4022, 3976, 3931, 3885, 3839, 3794, 3748, 3702, + 3656, 3611, 3565, 3519, 3474, 3428, 3382, 3336, 3291, 3245, 3199, 3154, + 3108, 3062, 3017, 2971, 2925, 2879, 2834, 2788, 2742, 2697, 2651, 2605, + 2559, 2514, 2468, 2422, 2377, 2331, 2285, 2240, 2194, 2148, 2102, 2057, + 2011, 1965, 1920, 1874, 1828, 1782, 1737, 1691, 1645, 1600, 1554, 1508, + 1463, 1417, 1371, 1325, 1280, 1234, 1188, 1143, 1097, 1051, 1006, 960, + 914, 868, 823, 777, 731, 686, 640, 594, 548, 503, 457, 411, + 366, 320, 274, 229, 183, 137, 91, 46, 0, -45, -90, -136, + -182, -228, -273, -319, -365, -410, -456, -502, -547, -593, -639, -685, + -730, -776, -822, -867, -913, -959, -1005, -1050, -1096, -1142, -1187, -1233, + -1279, -1324, -1370, -1416, -1462, -1507, -1553, -1599, -1644, -1690, -1736, -1781, + -1827, -1873, -1919, -1964, -2010, -2056, -2101, -2147, -2193, -2239, -2284, -2330, + -2376, -2421, -2467, -2513, -2558, -2604, -2650, -2696, -2741, -2787, -2833, -2878, + -2924, -2970, -3016, -3061, -3107, -3153, -3198, -3244, -3290, -3335, -3381, -3427, + -3473, -3518, -3564, -3610, -3655, -3701, -3747, -3793, -3838, -3884, -3930, -3975, + -4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, -4432, -4478, -4524, + -4569, -4615, -4661, -4707, -4752, -4798, -4844, -4889, -4935, -4981, -5027, -5072, + -5118, -5164, -5209, -5255, -5301, -5346, -5392, -5438, -5484, -5529, -5575, -5621, + -5666, -5712, -5758, -5804}; +static INT16 B_Cb[] = { + -14515, -14402, -14288, -14175, -14062, -13948, -13835, -13721, -13608, -13495, + -13381, -13268, -13154, -13041, -12928, -12814, -12701, -12587, -12474, -12360, + -12247, -12134, -12020, -11907, -11793, -11680, -11567, -11453, -11340, -11226, + -11113, -11000, -10886, -10773, -10659, -10546, -10433, -10319, -10206, -10092, + -9979, -9865, -9752, -9639, -9525, -9412, -9298, -9185, -9072, -8958, + -8845, -8731, -8618, -8505, -8391, -8278, -8164, -8051, -7938, -7824, + -7711, -7597, -7484, -7371, -7257, -7144, -7030, -6917, -6803, -6690, + -6577, -6463, -6350, -6236, -6123, -6010, -5896, -5783, -5669, -5556, + -5443, -5329, -5216, -5102, -4989, -4876, -4762, -4649, -4535, -4422, + -4309, -4195, -4082, -3968, -3855, -3741, -3628, -3515, -3401, -3288, + -3174, -3061, -2948, -2834, -2721, -2607, -2494, -2381, -2267, -2154, + -2040, -1927, -1814, -1700, -1587, -1473, -1360, -1246, -1133, -1020, + -906, -793, -679, -566, -453, -339, -226, -112, 0, 113, + 227, 340, 454, 567, 680, 794, 907, 1021, 1134, 1247, + 1361, 1474, 1588, 1701, 1815, 1928, 2041, 2155, 2268, 2382, + 2495, 2608, 2722, 2835, 2949, 3062, 3175, 3289, 3402, 3516, + 3629, 3742, 3856, 3969, 4083, 4196, 4310, 4423, 4536, 4650, + 4763, 4877, 4990, 5103, 5217, 5330, 5444, 5557, 5670, 5784, + 5897, 6011, 6124, 6237, 6351, 6464, 6578, 6691, 6804, 6918, + 7031, 7145, 7258, 7372, 7485, 7598, 7712, 7825, 7939, 8052, + 8165, 8279, 8392, 8506, 8619, 8732, 8846, 8959, 9073, 9186, + 9299, 9413, 9526, 9640, 9753, 9866, 9980, 10093, 10207, 10320, + 10434, 10547, 10660, 10774, 10887, 11001, 11114, 11227, 11341, 11454, + 11568, 11681, 11794, 11908, 12021, 12135, 12248, 12361, 12475, 12588, + 12702, 12815, 12929, 13042, 13155, 13269, 13382, 13496, 13609, 13722, + 13836, 13949, 14063, 14176, 14289, 14403}; void -ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels) -{ - int x; - UINT8 a; - int r, g, b; - int y, cr, cb; - - for (x = 0; x < pixels; x++, in +=4, out += 4) { - - r = in[0]; - g = in[1]; - b = in[2]; - a = in[3]; - - y = (Y_R[r] + Y_G[g] + Y_B[b]) >> SCALE; - cb = ((Cb_R[r] + Cb_G[g] + Cb_B[b]) >> SCALE) + 128; - cr = ((Cr_R[r] + Cr_G[g] + Cr_B[b]) >> SCALE) + 128; - - out[0] = (UINT8) y; - out[1] = (UINT8) cb; - out[2] = (UINT8) cr; - out[3] = a; - } -} - -void -ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels) -{ +ImagingConvertRGB2YCbCr(UINT8 *out, const UINT8 *in, int pixels) { int x; UINT8 a; int r, g, b; int y, cr, cb; for (x = 0; x < pixels; x++, in += 4, out += 4) { + r = in[0]; + g = in[1]; + b = in[2]; + a = in[3]; + y = (Y_R[r] + Y_G[g] + Y_B[b]) >> SCALE; + cb = ((Cb_R[r] + Cb_G[g] + Cb_B[b]) >> SCALE) + 128; + cr = ((Cr_R[r] + Cr_G[g] + Cr_B[b]) >> SCALE) + 128; + + out[0] = (UINT8)y; + out[1] = (UINT8)cb; + out[2] = (UINT8)cr; + out[3] = a; + } +} + +void +ImagingConvertYCbCr2RGB(UINT8 *out, const UINT8 *in, int pixels) { + int x; + UINT8 a; + int r, g, b; + int y, cr, cb; + + for (x = 0; x < pixels; x++, in += 4, out += 4) { y = in[0]; cb = in[1]; cr = in[2]; a = in[3]; - r = y + (( R_Cr[cr]) >> SCALE); + r = y + ((R_Cr[cr]) >> SCALE); g = y + ((G_Cb[cb] + G_Cr[cr]) >> SCALE); - b = y + ((B_Cb[cb] ) >> SCALE); + b = y + ((B_Cb[cb]) >> SCALE); out[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r; out[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g; diff --git a/src/libImaging/Copy.c b/src/libImaging/Copy.c index 5b4899f39..571133e14 100644 --- a/src/libImaging/Copy.c +++ b/src/libImaging/Copy.c @@ -15,18 +15,15 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" - static Imaging -_copy(Imaging imOut, Imaging imIn) -{ +_copy(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int y; if (!imIn) { - return (Imaging) ImagingError_ValueError(NULL); + return (Imaging)ImagingError_ValueError(NULL); } imOut = ImagingNew2Dirty(imIn->mode, imOut, imIn); @@ -50,13 +47,11 @@ _copy(Imaging imOut, Imaging imIn) } Imaging -ImagingCopy(Imaging imIn) -{ +ImagingCopy(Imaging imIn) { return _copy(NULL, imIn); } Imaging -ImagingCopy2(Imaging imOut, Imaging imIn) -{ +ImagingCopy2(Imaging imOut, Imaging imIn) { return _copy(imOut, imIn); } diff --git a/src/libImaging/Crop.c b/src/libImaging/Crop.c index d136edbfc..2425b4cd5 100644 --- a/src/libImaging/Crop.c +++ b/src/libImaging/Crop.c @@ -15,20 +15,17 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - Imaging -ImagingCrop(Imaging imIn, int sx0, int sy0, int sx1, int sy1) -{ +ImagingCrop(Imaging imIn, int sx0, int sy0, int sx1, int sy1) { Imaging imOut; int xsize, ysize; int dx0, dy0, dx1, dy1; INT32 zero = 0; if (!imIn) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } xsize = sx1 - sx0; @@ -48,7 +45,7 @@ ImagingCrop(Imaging imIn, int sx0, int sy0, int sx1, int sy1) ImagingCopyPalette(imOut, imIn); if (sx0 < 0 || sy0 < 0 || sx1 > imIn->xsize || sy1 > imIn->ysize) { - (void) ImagingFill(imOut, &zero); + (void)ImagingFill(imOut, &zero); } dx0 = -sx0; diff --git a/src/libImaging/Dib.c b/src/libImaging/Dib.c index 202b0c9fa..f8a2901b8 100644 --- a/src/libImaging/Dib.c +++ b/src/libImaging/Dib.c @@ -19,21 +19,18 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #ifdef _WIN32 #include "ImDib.h" - -char* -ImagingGetModeDIB(int size_out[2]) -{ +char * +ImagingGetModeDIB(int size_out[2]) { /* Get device characteristics */ HDC dc; - char* mode; + char *mode; dc = CreateCompatibleDC(NULL); @@ -55,10 +52,8 @@ ImagingGetModeDIB(int size_out[2]) return mode; } - ImagingDIB -ImagingNewDIB(const char *mode, int xsize, int ysize) -{ +ImagingNewDIB(const char *mode, int xsize, int ysize) { /* Create a Windows bitmap */ ImagingDIB dib; @@ -66,23 +61,21 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) int i; /* Check mode */ - if (strcmp(mode, "1") != 0 && strcmp(mode, "L") != 0 && - strcmp(mode, "RGB") != 0) { - return (ImagingDIB) ImagingError_ModeError(); + if (strcmp(mode, "1") != 0 && strcmp(mode, "L") != 0 && strcmp(mode, "RGB") != 0) { + return (ImagingDIB)ImagingError_ModeError(); } /* Create DIB context and info header */ /* malloc check ok, small constant allocation */ - dib = (ImagingDIB) malloc(sizeof(*dib)); + dib = (ImagingDIB)malloc(sizeof(*dib)); if (!dib) { - return (ImagingDIB) ImagingError_MemoryError(); + return (ImagingDIB)ImagingError_MemoryError(); } /* malloc check ok, small constant allocation */ - dib->info = (BITMAPINFO*) malloc(sizeof(BITMAPINFOHEADER) + - 256 * sizeof(RGBQUAD)); + dib->info = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); if (!dib->info) { free(dib); - return (ImagingDIB) ImagingError_MemoryError(); + return (ImagingDIB)ImagingError_MemoryError(); } memset(dib->info, 0, sizeof(BITMAPINFOHEADER)); @@ -90,7 +83,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) dib->info->bmiHeader.biWidth = xsize; dib->info->bmiHeader.biHeight = ysize; dib->info->bmiHeader.biPlanes = 1; - dib->info->bmiHeader.biBitCount = strlen(mode)*8; + dib->info->bmiHeader.biBitCount = strlen(mode) * 8; dib->info->bmiHeader.biCompression = BI_RGB; /* Create DIB */ @@ -98,15 +91,15 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) if (!dib->dc) { free(dib->info); free(dib); - return (ImagingDIB) ImagingError_MemoryError(); + return (ImagingDIB)ImagingError_MemoryError(); } - dib->bitmap = CreateDIBSection(dib->dc, dib->info, DIB_RGB_COLORS, - &dib->bits, NULL, 0); + dib->bitmap = + CreateDIBSection(dib->dc, dib->info, DIB_RGB_COLORS, &dib->bits, NULL, 0); if (!dib->bitmap) { free(dib->info); free(dib); - return (ImagingDIB) ImagingError_MemoryError(); + return (ImagingDIB)ImagingError_MemoryError(); } strcpy(dib->mode, mode); @@ -117,7 +110,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) dib->linesize = (xsize * dib->pixelsize + 3) & -4; if (dib->pixelsize == 1) { - dib->pack = dib->unpack = (ImagingShuffler) memcpy; + dib->pack = dib->unpack = (ImagingShuffler)memcpy; } else { dib->pack = ImagingPackBGR; dib->unpack = ImagingPackBGR; @@ -131,9 +124,7 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) /* Bind a palette to it as well (only required for 8-bit DIBs) */ if (dib->pixelsize == 1) { for (i = 0; i < 256; i++) { - palette[i].rgbRed = - palette[i].rgbGreen = - palette[i].rgbBlue = i; + palette[i].rgbRed = palette[i].rgbGreen = palette[i].rgbBlue = i; palette[i].rgbReserved = 0; } SetDIBColorTable(dib->dc, 0, 256, palette); @@ -141,9 +132,8 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) /* Create an associated palette (for 8-bit displays only) */ if (strcmp(ImagingGetModeDIB(NULL), "P") == 0) { - - char palbuf[sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY)]; - LPLOGPALETTE pal = (LPLOGPALETTE) palbuf; + char palbuf[sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)]; + LPLOGPALETTE pal = (LPLOGPALETTE)palbuf; int i, r, g, b; /* Load system palette */ @@ -152,7 +142,6 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) GetSystemPaletteEntries(dib->dc, 0, 256, pal->palPalEntry); if (strcmp(mode, "L") == 0) { - /* Greyscale DIB. Fill all 236 slots with a greyscale ramp * (this is usually overkill on Windows since VGA only offers * 6 bits greyscale resolution). Ignore the slots already @@ -160,16 +149,14 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) i = 10; for (r = 0; r < 236; r++) { - pal->palPalEntry[i].peRed = - pal->palPalEntry[i].peGreen = - pal->palPalEntry[i].peBlue = i; + pal->palPalEntry[i].peRed = pal->palPalEntry[i].peGreen = + pal->palPalEntry[i].peBlue = i; i++; } dib->palette = CreatePalette(pal); } else if (strcmp(mode, "RGB") == 0) { - #ifdef CUBE216 /* Colour DIB. Create a 6x6x6 colour cube (216 entries) and @@ -187,11 +174,10 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) } } } - for (r = 1; r < 22-1; r++) { + for (r = 1; r < 22 - 1; r++) { /* Black and white are already provided by the cube. */ - pal->palPalEntry[i].peRed = - pal->palPalEntry[i].peGreen = - pal->palPalEntry[i].peBlue = r * 255 / (22-1); + pal->palPalEntry[i].peRed = pal->palPalEntry[i].peGreen = + pal->palPalEntry[i].peBlue = r * 255 / (22 - 1); i++; } @@ -214,76 +200,91 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) #endif dib->palette = CreatePalette(pal); - } - } return dib; } void -ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]) -{ +ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]) { /* Paste image data into a bitmap */ /* FIXME: check size! */ int y; for (y = 0; y < im->ysize; y++) { - dib->pack(dib->bits + dib->linesize*(dib->ysize-(xy[1]+y)-1) + - xy[0]*dib->pixelsize, im->image[y], im->xsize); + dib->pack( + dib->bits + dib->linesize * (dib->ysize - (xy[1] + y) - 1) + + xy[0] * dib->pixelsize, + im->image[y], + im->xsize); } - } void -ImagingExposeDIB(ImagingDIB dib, void *dc) -{ +ImagingExposeDIB(ImagingDIB dib, void *dc) { /* Copy bitmap to display */ if (dib->palette != 0) { - SelectPalette((HDC) dc, dib->palette, FALSE); + SelectPalette((HDC)dc, dib->palette, FALSE); } - BitBlt((HDC) dc, 0, 0, dib->xsize, dib->ysize, dib->dc, 0, 0, SRCCOPY); + BitBlt((HDC)dc, 0, 0, dib->xsize, dib->ysize, dib->dc, 0, 0, SRCCOPY); } void -ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]) -{ +ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]) { /* Copy bitmap to printer/display */ - if (GetDeviceCaps((HDC) dc, RASTERCAPS) & RC_STRETCHDIB) { + if (GetDeviceCaps((HDC)dc, RASTERCAPS) & RC_STRETCHDIB) { /* stretchdib (printers) */ - StretchDIBits((HDC) dc, dst[0], dst[1], dst[2]-dst[0], dst[3]-dst[1], - src[0], src[1], src[2]-src[0], src[3]-src[1], dib->bits, - dib->info, DIB_RGB_COLORS, SRCCOPY); + StretchDIBits( + (HDC)dc, + dst[0], + dst[1], + dst[2] - dst[0], + dst[3] - dst[1], + src[0], + src[1], + src[2] - src[0], + src[3] - src[1], + dib->bits, + dib->info, + DIB_RGB_COLORS, + SRCCOPY); } else { /* stretchblt (displays) */ if (dib->palette != 0) { - SelectPalette((HDC) dc, dib->palette, FALSE); + SelectPalette((HDC)dc, dib->palette, FALSE); } - StretchBlt((HDC) dc, dst[0], dst[1], dst[2]-dst[0], dst[3]-dst[1], - dib->dc, src[0], src[1], src[2]-src[0], src[3]-src[1], - SRCCOPY); + StretchBlt( + (HDC)dc, + dst[0], + dst[1], + dst[2] - dst[0], + dst[3] - dst[1], + dib->dc, + src[0], + src[1], + src[2] - src[0], + src[3] - src[1], + SRCCOPY); } } int -ImagingQueryPaletteDIB(ImagingDIB dib, void *dc) -{ +ImagingQueryPaletteDIB(ImagingDIB dib, void *dc) { /* Install bitmap palette */ int n; if (dib->palette != 0) { - /* Realize associated palette */ - HPALETTE now = SelectPalette((HDC) dc, dib->palette, FALSE); - n = RealizePalette((HDC) dc); + HPALETTE now = SelectPalette((HDC)dc, dib->palette, FALSE); + n = RealizePalette((HDC)dc); /* Restore palette */ - SelectPalette((HDC) dc, now, FALSE); + SelectPalette((HDC)dc, now, FALSE); } else { n = 0; @@ -293,8 +294,7 @@ ImagingQueryPaletteDIB(ImagingDIB dib, void *dc) } void -ImagingDeleteDIB(ImagingDIB dib) -{ +ImagingDeleteDIB(ImagingDIB dib) { /* Clean up */ if (dib->palette) { diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 339e1cd35..8471ffb17 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -37,17 +37,17 @@ #include #include -#define CEIL(v) (int) ceil(v) -#define FLOOR(v) ((v) >= 0.0 ? (int) (v) : (int) floor(v)) +#define CEIL(v) (int)ceil(v) +#define FLOOR(v) ((v) >= 0.0 ? (int)(v) : (int)floor(v)) -#define INK8(ink) (*(UINT8*)ink) +#define INK8(ink) (*(UINT8 *)ink) /* * Rounds around zero (up=away from zero, down=towards zero) * This guarantees that ROUND_UP|DOWN(f) == -ROUND_UP|DOWN(-f) */ -#define ROUND_UP(f) ((int) ((f) >= 0.0 ? floor((f) + 0.5F) : -floor(fabs(f) + 0.5F))) -#define ROUND_DOWN(f) ((int) ((f) >= 0.0 ? ceil((f) - 0.5F) : -ceil(fabs(f) - 0.5F))) +#define ROUND_UP(f) ((int)((f) >= 0.0 ? floor((f) + 0.5F) : -floor(fabs(f) + 0.5F))) +#define ROUND_DOWN(f) ((int)((f) >= 0.0 ? ceil((f)-0.5F) : -ceil(fabs(f) - 0.5F))) /* -------------------------------------------------------------------- */ /* Primitives */ @@ -65,34 +65,31 @@ typedef struct { typedef void (*hline_handler)(Imaging, int, int, int, int); static inline void -point8(Imaging im, int x, int y, int ink) -{ +point8(Imaging im, int x, int y, int ink) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { if (strncmp(im->mode, "I;16", 4) == 0) { - im->image8[y][x*2] = (UINT8) ink; - im->image8[y][x*2+1] = (UINT8) ink; + im->image8[y][x * 2] = (UINT8)ink; + im->image8[y][x * 2 + 1] = (UINT8)ink; } else { - im->image8[y][x] = (UINT8) ink; + im->image8[y][x] = (UINT8)ink; } } } static inline void -point32(Imaging im, int x, int y, int ink) -{ +point32(Imaging im, int x, int y, int ink) { if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { im->image32[y][x] = ink; } } static inline void -point32rgba(Imaging im, int x, int y, int ink) -{ +point32rgba(Imaging im, int x, int y, int ink) { unsigned int tmp1; if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { - UINT8* out = (UINT8*) im->image[y]+x*4; - UINT8* in = (UINT8*) &ink; + UINT8 *out = (UINT8 *)im->image[y] + x * 4; + UINT8 *in = (UINT8 *)&ink; out[0] = BLEND(in[3], out[0], in[0], tmp1); out[1] = BLEND(in[3], out[1], in[1], tmp1); out[2] = BLEND(in[3], out[2], in[2], tmp1); @@ -100,8 +97,7 @@ point32rgba(Imaging im, int x, int y, int ink) } static inline void -hline8(Imaging im, int x0, int y0, int x1, int ink) -{ +hline8(Imaging im, int x0, int y0, int x1, int ink) { int tmp, pixelwidth; if (y0 >= 0 && y0 < im->ysize) { @@ -116,21 +112,22 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) if (x1 < 0) { return; } else if (x1 >= im->xsize) { - x1 = im->xsize-1; + x1 = im->xsize - 1; } if (x0 <= x1) { pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; - memset(im->image8[y0] + x0 * pixelwidth, (UINT8) ink, - (x1 - x0 + 1) * pixelwidth); + memset( + im->image8[y0] + x0 * pixelwidth, + (UINT8)ink, + (x1 - x0 + 1) * pixelwidth); } } } static inline void -hline32(Imaging im, int x0, int y0, int x1, int ink) -{ +hline32(Imaging im, int x0, int y0, int x1, int ink) { int tmp; - INT32* p; + INT32 *p; if (y0 >= 0 && y0 < im->ysize) { if (x0 > x1) { @@ -144,7 +141,7 @@ hline32(Imaging im, int x0, int y0, int x1, int ink) if (x1 < 0) { return; } else if (x1 >= im->xsize) { - x1 = im->xsize-1; + x1 = im->xsize - 1; } p = im->image32[y0]; while (x0 <= x1) { @@ -154,8 +151,7 @@ hline32(Imaging im, int x0, int y0, int x1, int ink) } static inline void -hline32rgba(Imaging im, int x0, int y0, int x1, int ink) -{ +hline32rgba(Imaging im, int x0, int y0, int x1, int ink) { int tmp; unsigned int tmp1; @@ -171,36 +167,36 @@ hline32rgba(Imaging im, int x0, int y0, int x1, int ink) if (x1 < 0) { return; } else if (x1 >= im->xsize) { - x1 = im->xsize-1; + x1 = im->xsize - 1; } if (x0 <= x1) { - UINT8* out = (UINT8*) im->image[y0]+x0*4; - UINT8* in = (UINT8*) &ink; + UINT8 *out = (UINT8 *)im->image[y0] + x0 * 4; + UINT8 *in = (UINT8 *)&ink; while (x0 <= x1) { out[0] = BLEND(in[3], out[0], in[0], tmp1); out[1] = BLEND(in[3], out[1], in[1], tmp1); out[2] = BLEND(in[3], out[2], in[2], tmp1); - x0++; out += 4; + x0++; + out += 4; } } } } static inline void -line8(Imaging im, int x0, int y0, int x1, int y1, int ink) -{ +line8(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ - dx = x1-x0; + dx = x1 - x0; if (dx < 0) { dx = -dx, xs = -1; } else { xs = 1; } - dy = y1-y0; + dy = y1 - y0; if (dy < 0) { dy = -dy, ys = -1; } else { @@ -210,7 +206,6 @@ line8(Imaging im, int x0, int y0, int x1, int y1, int ink) n = (dx > dy) ? dx : dy; if (dx == 0) { - /* vertical */ for (i = 0; i < dy; i++) { point8(im, x0, y0, ink); @@ -218,7 +213,6 @@ line8(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dy == 0) { - /* horizontal */ for (i = 0; i < dx; i++) { point8(im, x0, y0, ink); @@ -226,7 +220,6 @@ line8(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dx > dy) { - /* bresenham, horizontal slope */ n = dx; dy += dy; @@ -244,7 +237,6 @@ line8(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else { - /* bresenham, vertical slope */ n = dy; dx += dx; @@ -260,25 +252,23 @@ line8(Imaging im, int x0, int y0, int x1, int y1, int ink) e += dx; y0 += ys; } - } } static inline void -line32(Imaging im, int x0, int y0, int x1, int y1, int ink) -{ +line32(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ - dx = x1-x0; + dx = x1 - x0; if (dx < 0) { dx = -dx, xs = -1; } else { xs = 1; } - dy = y1-y0; + dy = y1 - y0; if (dy < 0) { dy = -dy, ys = -1; } else { @@ -288,7 +278,6 @@ line32(Imaging im, int x0, int y0, int x1, int y1, int ink) n = (dx > dy) ? dx : dy; if (dx == 0) { - /* vertical */ for (i = 0; i < dy; i++) { point32(im, x0, y0, ink); @@ -296,7 +285,6 @@ line32(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dy == 0) { - /* horizontal */ for (i = 0; i < dx; i++) { point32(im, x0, y0, ink); @@ -304,7 +292,6 @@ line32(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dx > dy) { - /* bresenham, horizontal slope */ n = dx; dy += dy; @@ -322,7 +309,6 @@ line32(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else { - /* bresenham, vertical slope */ n = dy; dx += dx; @@ -338,25 +324,23 @@ line32(Imaging im, int x0, int y0, int x1, int y1, int ink) e += dx; y0 += ys; } - } } static inline void -line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) -{ +line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) { int i, n, e; int dx, dy; int xs, ys; /* normalize coordinates */ - dx = x1-x0; + dx = x1 - x0; if (dx < 0) { dx = -dx, xs = -1; } else { xs = 1; } - dy = y1-y0; + dy = y1 - y0; if (dy < 0) { dy = -dy, ys = -1; } else { @@ -366,7 +350,6 @@ line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) n = (dx > dy) ? dx : dy; if (dx == 0) { - /* vertical */ for (i = 0; i < dy; i++) { point32rgba(im, x0, y0, ink); @@ -374,7 +357,6 @@ line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dy == 0) { - /* horizontal */ for (i = 0; i < dx; i++) { point32rgba(im, x0, y0, ink); @@ -382,7 +364,6 @@ line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else if (dx > dy) { - /* bresenham, horizontal slope */ n = dx; dy += dy; @@ -400,7 +381,6 @@ line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) } } else { - /* bresenham, vertical slope */ n = dy; dx += dx; @@ -416,14 +396,12 @@ line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) e += dx; y0 += ys; } - } } static int -x_cmp(const void *x0, const void *x1) -{ - float diff = *((float*)x0) - *((float*)x1); +x_cmp(const void *x0, const void *x1) { + float diff = *((float *)x0) - *((float *)x1); if (diff < 0) { return -1; } else if (diff > 0) { @@ -433,10 +411,9 @@ x_cmp(const void *x0, const void *x1) } } - static void -draw_horizontal_lines(Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline) -{ +draw_horizontal_lines( + Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline) { int i; for (i = 0; i < n; i++) { if (e[i].ymin == y && e[i].ymin == e[i].ymax) { @@ -458,7 +435,7 @@ draw_horizontal_lines(Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hl } (*hline)(im, xmin, e[i].ymin, xmax, ink); - *x_pos = xmax+1; + *x_pos = xmax + 1; } } } @@ -467,12 +444,9 @@ draw_horizontal_lines(Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hl * Filled polygon draw function using scan line algorithm. */ static inline int -polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, - hline_handler hline) -{ - - Edge** edge_table; - float* xx; +polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline) { + Edge **edge_table; + float *xx; int edge_count = 0; int ymin = im->ysize - 1; int ymax = 0; @@ -484,7 +458,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, /* Initialize the edge table and find polygon boundaries */ /* malloc check ok, using calloc */ - edge_table = calloc(n, sizeof(Edge*)); + edge_table = calloc(n, sizeof(Edge *)); if (!edge_table) { return -1; } @@ -519,7 +493,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, int j = 0; int x_pos = 0; for (i = 0; i < edge_count; i++) { - Edge* current = edge_table[i]; + Edge *current = edge_table[i]; if (ymin >= current->ymin && ymin <= current->ymax) { xx[j++] = (ymin - current->y0) * current->dx + current->x0; } @@ -542,7 +516,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, continue; } - int x_start = ROUND_UP(xx[i-1]); + int x_start = ROUND_UP(xx[i - 1]); if (x_pos > x_start) { // Line would be partway through x_pos, so increase the starting point x_start = x_pos; @@ -552,7 +526,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, } } (*hline)(im, x_start, ymin, x_end, ink); - x_pos = x_end+1; + x_pos = x_end + 1; } draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline); } @@ -563,26 +537,22 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, } static inline int -polygon8(Imaging im, int n, Edge *e, int ink, int eofill) -{ +polygon8(Imaging im, int n, Edge *e, int ink, int eofill) { return polygon_generic(im, n, e, ink, eofill, hline8); } static inline int -polygon32(Imaging im, int n, Edge *e, int ink, int eofill) -{ +polygon32(Imaging im, int n, Edge *e, int ink, int eofill) { return polygon_generic(im, n, e, ink, eofill, hline32); } static inline int -polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) -{ +polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) { return polygon_generic(im, n, e, ink, eofill, hline32rgba); } static inline void -add_edge(Edge *e, int x0, int y0, int x1, int y1) -{ +add_edge(Edge *e, int x0, int y0, int x1, int y1) { /* printf("edge %d %d %d %d\n", x0, y0, x1, y1); */ if (x0 <= x1) { @@ -601,7 +571,7 @@ add_edge(Edge *e, int x0, int y0, int x1, int y1) e->d = 0; e->dx = 0.0; } else { - e->dx = ((float)(x1-x0)) / (y1-y0); + e->dx = ((float)(x1 - x0)) / (y1 - y0); if (y0 == e->ymin) { e->d = 1; } else { @@ -620,27 +590,26 @@ typedef struct { int (*polygon)(Imaging im, int n, Edge *e, int ink, int eofill); } DRAW; -DRAW draw8 = { point8, hline8, line8, polygon8 }; -DRAW draw32 = { point32, hline32, line32, polygon32 }; -DRAW draw32rgba = { point32rgba, hline32rgba, line32rgba, polygon32rgba }; +DRAW draw8 = {point8, hline8, line8, polygon8}; +DRAW draw32 = {point32, hline32, line32, polygon32}; +DRAW draw32rgba = {point32rgba, hline32rgba, line32rgba, polygon32rgba}; /* -------------------------------------------------------------------- */ /* Interface */ /* -------------------------------------------------------------------- */ -#define DRAWINIT()\ - if (im->image8) {\ - draw = &draw8;\ - ink = INK8(ink_);\ - } else {\ - draw = (op) ? &draw32rgba : &draw32; \ - memcpy(&ink, ink_, sizeof(ink)); \ +#define DRAWINIT() \ + if (im->image8) { \ + draw = &draw8; \ + ink = INK8(ink_); \ + } else { \ + draw = (op) ? &draw32rgba : &draw32; \ + memcpy(&ink, ink_, sizeof(ink)); \ } int -ImagingDrawPoint(Imaging im, int x0, int y0, const void* ink_, int op) -{ - DRAW* draw; +ImagingDrawPoint(Imaging im, int x0, int y0, const void *ink_, int op) { + DRAW *draw; INT32 ink; DRAWINIT(); @@ -651,10 +620,8 @@ ImagingDrawPoint(Imaging im, int x0, int y0, const void* ink_, int op) } int -ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, - int op) -{ - DRAW* draw; +ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink_, int op) { + DRAW *draw; INT32 ink; DRAWINIT(); @@ -665,10 +632,9 @@ ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, } int -ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, - const void* ink_, int width, int op) -{ - DRAW* draw; +ImagingDrawWideLine( + Imaging im, int x0, int y0, int x1, int y1, const void *ink_, int width, int op) { + DRAW *draw; INT32 ink; int dx, dy; double big_hypotenuse, small_hypotenuse, ratio_max, ratio_min; @@ -677,8 +643,8 @@ ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, DRAWINIT(); - dx = x1-x0; - dy = y1-y0; + dx = x1 - x0; + dy = y1 - y0; if (dx == 0 && dy == 0) { draw->point(im, x0, y0, ink); return 0; @@ -698,13 +664,12 @@ ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, {x0 - dxmin, y0 + dymax}, {x1 - dxmin, y1 + dymax}, {x1 + dxmax, y1 - dymin}, - {x0 + dxmax, y0 - dymin} - }; + {x0 + dxmax, y0 - dymin}}; - add_edge(e+0, vertices[0][0], vertices[0][1], vertices[1][0], vertices[1][1]); - add_edge(e+1, vertices[1][0], vertices[1][1], vertices[2][0], vertices[2][1]); - add_edge(e+2, vertices[2][0], vertices[2][1], vertices[3][0], vertices[3][1]); - add_edge(e+3, vertices[3][0], vertices[3][1], vertices[0][0], vertices[0][1]); + add_edge(e + 0, vertices[0][0], vertices[0][1], vertices[1][0], vertices[1][1]); + add_edge(e + 1, vertices[1][0], vertices[1][1], vertices[2][0], vertices[2][1]); + add_edge(e + 2, vertices[2][0], vertices[2][1], vertices[3][0], vertices[3][1]); + add_edge(e + 3, vertices[3][0], vertices[3][1], vertices[0][0], vertices[0][1]); draw->polygon(im, 4, e, ink, 0); } @@ -712,13 +677,20 @@ ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, } int -ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, - const void* ink_, int fill, int width, int op) -{ +ImagingDrawRectangle( + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink_, + int fill, + int width, + int op) { int i; int y; int tmp; - DRAW* draw; + DRAW *draw; INT32 ink; DRAWINIT(); @@ -728,7 +700,6 @@ ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, } if (fill) { - if (y0 < 0) { y0 = 0; } else if (y0 >= im->ysize) { @@ -751,10 +722,10 @@ ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, width = 1; } for (i = 0; i < width; i++) { - draw->hline(im, x0, y0+i, x1, ink); - draw->hline(im, x0, y1-i, x1, ink); - draw->line(im, x1-i, y0, x1-i, y1, ink); - draw->line(im, x0+i, y1, x0+i, y0, ink); + draw->hline(im, x0, y0 + i, x1, ink); + draw->hline(im, x0, y1 - i, x1, ink); + draw->line(im, x1 - i, y0, x1 - i, y1, ink); + draw->line(im, x0 + i, y1, x0 + i, y0, ink); } } @@ -762,11 +733,9 @@ ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, } int -ImagingDrawPolygon(Imaging im, int count, int* xy, const void* ink_, - int fill, int op) -{ +ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, int op) { int i, n; - DRAW* draw; + DRAW *draw; INT32 ink; if (count <= 0) { @@ -776,44 +745,37 @@ ImagingDrawPolygon(Imaging im, int count, int* xy, const void* ink_, DRAWINIT(); if (fill) { - /* Build edge list */ /* malloc check ok, using calloc */ - Edge* e = calloc(count, sizeof(Edge)); + Edge *e = calloc(count, sizeof(Edge)); if (!e) { - (void) ImagingError_MemoryError(); + (void)ImagingError_MemoryError(); return -1; } - for (i = n = 0; i < count-1; i++) { - add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3]); + for (i = n = 0; i < count - 1; i++) { + add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3]); } - if (xy[i+i] != xy[0] || xy[i+i+1] != xy[1]) { - add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[0], xy[1]); + if (xy[i + i] != xy[0] || xy[i + i + 1] != xy[1]) { + add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[0], xy[1]); } draw->polygon(im, n, e, ink, 0); free(e); } else { - /* Outline */ - for (i = 0; i < count-1; i++) { - draw->line(im, xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3], ink); + for (i = 0; i < count - 1; i++) { + draw->line(im, xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3], ink); } - draw->line(im, xy[i+i], xy[i+i+1], xy[0], xy[1], ink); - + draw->line(im, xy[i + i], xy[i + i + 1], xy[0], xy[1], ink); } return 0; } int -ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink, - int op) -{ +ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void *ink, int op) { return ImagingFill2( - im, ink, bitmap, - x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize - ); + im, ink, bitmap, x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize); } /* -------------------------------------------------------------------- */ @@ -830,7 +792,8 @@ typedef struct { int8_t finished; } quarter_state; -void quarter_init(quarter_state* s, int32_t a, int32_t b) { +void +quarter_init(quarter_state *s, int32_t a, int32_t b) { if (a < 0 || b < 0) { s->finished = 1; } else { @@ -849,11 +812,13 @@ void quarter_init(quarter_state* s, int32_t a, int32_t b) { // deviation of the point from ellipse curve, basically a substitution // of the point into the ellipse equation -int64_t quarter_delta(quarter_state* s, int64_t x, int64_t y) { +int64_t +quarter_delta(quarter_state *s, int64_t x, int64_t y) { return llabs(s->a2 * y * y + s->b2 * x * x - s->a2b2); } -int8_t quarter_next(quarter_state* s, int32_t* ret_x, int32_t* ret_y) { +int8_t +quarter_next(quarter_state *s, int32_t *ret_x, int32_t *ret_y) { if (s->finished) { return -1; } @@ -903,7 +868,8 @@ typedef struct { int8_t leftmost; } ellipse_state; -void ellipse_init(ellipse_state* s, int32_t a, int32_t b, int32_t w) { +void +ellipse_init(ellipse_state *s, int32_t a, int32_t b, int32_t w) { s->bufcnt = 0; s->leftmost = a % 2; quarter_init(&s->st_o, a, b); @@ -916,7 +882,8 @@ void ellipse_init(ellipse_state* s, int32_t a, int32_t b, int32_t w) { } } -int8_t ellipse_next(ellipse_state* s, int32_t* ret_x0, int32_t* ret_y, int32_t* ret_x1) { +int8_t +ellipse_next(ellipse_state *s, int32_t *ret_x0, int32_t *ret_y, int32_t *ret_x1) { if (s->bufcnt == 0) { if (s->finished) { return -1; @@ -974,470 +941,503 @@ int8_t ellipse_next(ellipse_state* s, int32_t* ret_x0, int32_t* ret_y, int32_t* // of resulting disjoint clipped segments organized into a sorted linked list // of their end points. typedef enum { - CT_AND, // intersection - CT_OR, // union - CT_CLIP // half-plane clipping + CT_AND, // intersection + CT_OR, // union + CT_CLIP // half-plane clipping } clip_type; typedef struct clip_node { - clip_type type; - double a, b, c; // half-plane coeffs, only used in clipping nodes - struct clip_node* l; // child pointers, are only non-NULL in combining nodes - struct clip_node* r; + clip_type type; + double a, b, c; // half-plane coeffs, only used in clipping nodes + struct clip_node *l; // child pointers, are only non-NULL in combining nodes + struct clip_node *r; } clip_node; // Linked list for the ends of the clipped horizontal segments. // Since the segment is always horizontal, we don't need to store Y coordinate. typedef struct event_list { - int32_t x; - int8_t type; // used internally, 1 for the left end (smaller X), -1 for the - // right end; pointless in output since the output segments - // are disjoint, therefore the types would always come in pairs - // and interchange (1 -1 1 -1 ...) - struct event_list* next; + int32_t x; + int8_t type; // used internally, 1 for the left end (smaller X), -1 for the + // right end; pointless in output since the output segments + // are disjoint, therefore the types would always come in pairs + // and interchange (1 -1 1 -1 ...) + struct event_list *next; } event_list; // Mirrors all the clipping nodes of the tree relative to the y = x line. -void clip_tree_transpose(clip_node* root) { - if (root != NULL) { - if (root->type == CT_CLIP) { - double t = root->a; - root->a = root->b; - root->b = t; +void +clip_tree_transpose(clip_node *root) { + if (root != NULL) { + if (root->type == CT_CLIP) { + double t = root->a; + root->a = root->b; + root->b = t; + } + clip_tree_transpose(root->l); + clip_tree_transpose(root->r); } - clip_tree_transpose(root->l); - clip_tree_transpose(root->r); - } } // Outputs a sequence of open-close events (types -1 and 1) for // non-intersecting segments sorted by X coordinate. // Combining nodes (AND, OR) may also accept sequences for intersecting // segments, i.e. something like correct bracket sequences. -int clip_tree_do_clip(clip_node* root, int32_t x0, int32_t y, int32_t x1, event_list** ret) { - if (root == NULL) { - event_list* start = malloc(sizeof(event_list)); - if (!start) { - ImagingError_MemoryError(); - return -1; +int +clip_tree_do_clip( + clip_node *root, int32_t x0, int32_t y, int32_t x1, event_list **ret) { + if (root == NULL) { + event_list *start = malloc(sizeof(event_list)); + if (!start) { + ImagingError_MemoryError(); + return -1; + } + event_list *end = malloc(sizeof(event_list)); + if (!end) { + free(start); + ImagingError_MemoryError(); + return -1; + } + start->x = x0; + start->type = 1; + start->next = end; + end->x = x1; + end->type = -1; + end->next = NULL; + *ret = start; + return 0; } - event_list* end = malloc(sizeof(event_list)); - if (!end) { - free(start); - ImagingError_MemoryError(); - return -1; + if (root->type == CT_CLIP) { + double eps = 1e-9; + double A = root->a; + double B = root->b; + double C = root->c; + if (fabs(A) < eps) { + if (B * y + C < -eps) { + x0 = 1; + x1 = 0; + } + } else { + // X of intersection + double ix = -(B * y + C) / A; + if (A * x0 + B * y + C < eps) { + x0 = lround(fmax(x0, ix)); + } + if (A * x1 + B * y + C < eps) { + x1 = lround(fmin(x1, ix)); + } + } + if (x0 <= x1) { + event_list *start = malloc(sizeof(event_list)); + if (!start) { + ImagingError_MemoryError(); + return -1; + } + event_list *end = malloc(sizeof(event_list)); + if (!end) { + free(start); + ImagingError_MemoryError(); + return -1; + } + start->x = x0; + start->type = 1; + start->next = end; + end->x = x1; + end->type = -1; + end->next = NULL; + *ret = start; + } else { + *ret = NULL; + } + return 0; } - start->x = x0; - start->type = 1; - start->next = end; - end->x = x1; - end->type = -1; - end->next = NULL; - *ret = start; - return 0; - } - if (root->type == CT_CLIP) { - double eps = 1e-9; - double A = root->a; - double B = root->b; - double C = root->c; - if (fabs(A) < eps) { - if (B * y + C < -eps) { - x0 = 1; - x1 = 0; - } - } else { - // X of intersection - double ix = - (B * y + C) / A; - if (A * x0 + B * y + C < eps) { - x0 = lround(fmax(x0, ix)); - } - if (A * x1 + B * y + C < eps) { - x1 = lround(fmin(x1, ix)); - } - } - if (x0 <= x1) { - event_list* start = malloc(sizeof(event_list)); - if (!start) { - ImagingError_MemoryError(); - return -1; - } - event_list* end = malloc(sizeof(event_list)); - if (!end) { - free(start); - ImagingError_MemoryError(); - return -1; - } - start->x = x0; - start->type = 1; - start->next = end; - end->x = x1; - end->type = -1; - end->next = NULL; - *ret = start; - } else { - *ret = NULL; - } - return 0; - } - if (root->type == CT_OR || root->type == CT_AND) { - event_list* l1; - event_list* l2; - if (clip_tree_do_clip(root->l, x0, y, x1, &l1) < 0) { - return -1; - } - if (clip_tree_do_clip(root->r, x0, y, x1, &l2) < 0) { - while (l1) { - l2 = l1->next; - free(l1); - l1 = l2; - } - return -1; + if (root->type == CT_OR || root->type == CT_AND) { + event_list *l1; + event_list *l2; + if (clip_tree_do_clip(root->l, x0, y, x1, &l1) < 0) { + return -1; + } + if (clip_tree_do_clip(root->r, x0, y, x1, &l2) < 0) { + while (l1) { + l2 = l1->next; + free(l1); + l1 = l2; + } + return -1; + } + *ret = NULL; + event_list *tail = NULL; + int32_t k1 = 0; + int32_t k2 = 0; + while (l1 != NULL || l2 != NULL) { + event_list *t; + if (l2 == NULL || + (l1 != NULL && + (l1->x < l2->x || (l1->x == l2->x && l1->type > l2->type)))) { + t = l1; + k1 += t->type; + assert(k1 >= 0); + l1 = l1->next; + } else { + t = l2; + k2 += t->type; + assert(k2 >= 0); + l2 = l2->next; + } + t->next = NULL; + if ((root->type == CT_OR && + ((t->type == 1 && (tail == NULL || tail->type == -1)) || + (t->type == -1 && k1 == 0 && k2 == 0))) || + (root->type == CT_AND && + ((t->type == 1 && (tail == NULL || tail->type == -1) && k1 > 0 && + k2 > 0) || + (t->type == -1 && tail != NULL && tail->type == 1 && + (k1 == 0 || k2 == 0))))) { + if (tail == NULL) { + *ret = t; + } else { + tail->next = t; + } + tail = t; + } else { + free(t); + } + } + return 0; } *ret = NULL; - event_list* tail = NULL; - int32_t k1 = 0; - int32_t k2 = 0; - while (l1 != NULL || l2 != NULL) { - event_list* t; - if (l2 == NULL || (l1 != NULL && (l1->x < l2->x || (l1->x == l2->x && l1->type > l2->type)))) { - t = l1; - k1 += t->type; - assert(k1 >= 0); - l1 = l1->next; - } else { - t = l2; - k2 += t->type; - assert(k2 >= 0); - l2 = l2->next; - } - t->next = NULL; - if ((root->type == CT_OR && ( - (t->type == 1 && (tail == NULL || tail->type == -1)) || - (t->type == -1 && k1 == 0 && k2 == 0) - )) || - (root->type == CT_AND && ( - (t->type == 1 && (tail == NULL || tail->type == -1) && k1 > 0 && k2 > 0) || - (t->type == -1 && tail != NULL && tail->type == 1 && (k1 == 0 || k2 == 0)) - ))) { - if (tail == NULL) { - *ret = t; - } else { - tail->next = t; - } - tail = t; - } else { - free(t); - } - } return 0; - } - *ret = NULL; - return 0; } // One more layer of processing on top of the regular ellipse. // Uses the clipping tree. // Used for producing ellipse derivatives such as arc, chord, pie, etc. typedef struct { - ellipse_state st; - clip_node* root; - clip_node nodes[7]; - int32_t node_count; - event_list* head; - int32_t y; + ellipse_state st; + clip_node *root; + clip_node nodes[7]; + int32_t node_count; + event_list *head; + int32_t y; } clip_ellipse_state; -typedef void (*clip_ellipse_init)(clip_ellipse_state*, int32_t, int32_t, int32_t, float, float); +typedef void (*clip_ellipse_init)( + clip_ellipse_state *, int32_t, int32_t, int32_t, float, float); -void debug_clip_tree(clip_node* root, int space) { - if (root == NULL) { - return; - } - if (root->type == CT_CLIP) { - int t = space; - while (t--) { - fputc(' ', stderr); +void +debug_clip_tree(clip_node *root, int space) { + if (root == NULL) { + return; } - fprintf(stderr, "clip %+fx%+fy%+f > 0\n", root->a, root->b, root->c); - } else { - debug_clip_tree(root->l, space + 2); - int t = space; - while (t--) { - fputc(' ', stderr); + if (root->type == CT_CLIP) { + int t = space; + while (t--) { + fputc(' ', stderr); + } + fprintf(stderr, "clip %+fx%+fy%+f > 0\n", root->a, root->b, root->c); + } else { + debug_clip_tree(root->l, space + 2); + int t = space; + while (t--) { + fputc(' ', stderr); + } + fprintf(stderr, "%s\n", root->type == CT_AND ? "and" : "or"); + debug_clip_tree(root->r, space + 2); + } + if (space == 0) { + fputc('\n', stderr); } - fprintf(stderr, "%s\n", root->type == CT_AND ? "and" : "or"); - debug_clip_tree(root->r, space + 2); - } - if (space == 0) { - fputc('\n', stderr); - } } // Resulting angles will satisfy 0 <= al < 360, al <= ar <= al + 360 -void normalize_angles(float* al, float* ar) { - if (*ar - *al >= 360) { - *al = 0; - *ar = 360; - } else { - *al = fmod(*al < 0 ? 360 - (fmod(-*al, 360)) : *al, 360); - *ar = *al + fmod(*ar < *al ? 360 - fmod(*al - *ar, 360) : *ar - *al, 360); - } +void +normalize_angles(float *al, float *ar) { + if (*ar - *al >= 360) { + *al = 0; + *ar = 360; + } else { + *al = fmod(*al < 0 ? 360 - (fmod(-*al, 360)) : *al, 360); + *ar = *al + fmod(*ar < *al ? 360 - fmod(*al - *ar, 360) : *ar - *al, 360); + } } // An arc with caps orthogonal to the ellipse curve. -void arc_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { - if (a < b) { - // transpose the coordinate system - arc_init(s, b, a, w, 90 - ar, 90 - al); - ellipse_init(&s->st, a, b, w); - clip_tree_transpose(s->root); - } else { - // a >= b, based on "wide" ellipse +void +arc_init(clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar) { + if (a < b) { + // transpose the coordinate system + arc_init(s, b, a, w, 90 - ar, 90 - al); + ellipse_init(&s->st, a, b, w); + clip_tree_transpose(s->root); + } else { + // a >= b, based on "wide" ellipse + ellipse_init(&s->st, a, b, w); + + s->head = NULL; + s->node_count = 0; + normalize_angles(&al, &ar); + + // building clipping tree, a lot of different cases + if (ar == al + 360) { + s->root = NULL; + } else { + clip_node *lc = s->nodes + s->node_count++; + clip_node *rc = s->nodes + s->node_count++; + lc->l = lc->r = rc->l = rc->r = NULL; + lc->type = rc->type = CT_CLIP; + lc->a = -a * sin(al * M_PI / 180.0); + lc->b = b * cos(al * M_PI / 180.0); + lc->c = (a * a - b * b) * sin(al * M_PI / 90.0) / 2.0; + rc->a = a * sin(ar * M_PI / 180.0); + rc->b = -b * cos(ar * M_PI / 180.0); + rc->c = (b * b - a * a) * sin(ar * M_PI / 90.0) / 2.0; + if (fmod(al, 180) == 0 || fmod(ar, 180) == 0) { + s->root = s->nodes + s->node_count++; + s->root->l = lc; + s->root->r = rc; + s->root->type = ar - al < 180 ? CT_AND : CT_OR; + } else if (((int)(al / 180) + (int)(ar / 180)) % 2 == 1) { + s->root = s->nodes + s->node_count++; + s->root->l = s->nodes + s->node_count++; + s->root->l->l = s->nodes + s->node_count++; + s->root->l->r = lc; + s->root->r = s->nodes + s->node_count++; + s->root->r->l = s->nodes + s->node_count++; + s->root->r->r = rc; + s->root->type = CT_OR; + s->root->l->type = CT_AND; + s->root->r->type = CT_AND; + s->root->l->l->type = CT_CLIP; + s->root->r->l->type = CT_CLIP; + s->root->l->l->l = s->root->l->l->r = NULL; + s->root->r->l->l = s->root->r->l->r = NULL; + s->root->l->l->a = s->root->l->l->c = 0; + s->root->r->l->a = s->root->r->l->c = 0; + s->root->l->l->b = (int)(al / 180) % 2 == 0 ? 1 : -1; + s->root->r->l->b = (int)(ar / 180) % 2 == 0 ? 1 : -1; + } else { + s->root = s->nodes + s->node_count++; + s->root->l = s->nodes + s->node_count++; + s->root->r = s->nodes + s->node_count++; + s->root->type = s->root->l->type = ar - al < 180 ? CT_AND : CT_OR; + s->root->l->l = lc; + s->root->l->r = rc; + s->root->r->type = CT_CLIP; + s->root->r->l = s->root->r->r = NULL; + s->root->r->a = s->root->r->c = 0; + s->root->r->b = ar < 180 || ar > 540 ? 1 : -1; + } + } + } +} + +// A chord line. +void +chord_line_init( + clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar) { + ellipse_init(&s->st, a, b, a + b + 1); + + s->head = NULL; + s->node_count = 0; + + // line equation for chord + double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); + double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); + s->root = s->nodes + s->node_count++; + s->root->l = s->nodes + s->node_count++; + s->root->r = s->nodes + s->node_count++; + s->root->type = CT_AND; + s->root->l->type = s->root->r->type = CT_CLIP; + s->root->l->l = s->root->l->r = s->root->r->l = s->root->r->r = NULL; + s->root->l->a = yr - yl; + s->root->l->b = xl - xr; + s->root->l->c = -(s->root->l->a * xl + s->root->l->b * yl); + s->root->r->a = -s->root->l->a; + s->root->r->b = -s->root->l->b; + s->root->r->c = + 2 * w * sqrt(pow(s->root->l->a, 2.0) + pow(s->root->l->b, 2.0)) - s->root->l->c; +} + +// Pie side. +void +pie_side_init( + clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float _) { + ellipse_init(&s->st, a, b, a + b + 1); + + s->head = NULL; + s->node_count = 0; + + double xl = a * cos(al * M_PI / 180.0); + double yl = b * sin(al * M_PI / 180.0); + double a1 = -yl; + double b1 = xl; + double c1 = w * sqrt(a1 * a1 + b1 * b1); + + s->root = s->nodes + s->node_count++; + s->root->type = CT_AND; + s->root->l = s->nodes + s->node_count++; + s->root->l->type = CT_AND; + + clip_node *cnode; + cnode = s->nodes + s->node_count++; + cnode->l = cnode->r = NULL; + cnode->type = CT_CLIP; + cnode->a = a1; + cnode->b = b1; + cnode->c = c1; + s->root->l->l = cnode; + cnode = s->nodes + s->node_count++; + cnode->l = cnode->r = NULL; + cnode->type = CT_CLIP; + cnode->a = -a1; + cnode->b = -b1; + cnode->c = c1; + s->root->l->r = cnode; + cnode = s->nodes + s->node_count++; + cnode->l = cnode->r = NULL; + cnode->type = CT_CLIP; + cnode->a = b1; + cnode->b = -a1; + cnode->c = 0; + s->root->r = cnode; +} + +// A chord. +void +chord_init(clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar) { ellipse_init(&s->st, a, b, w); s->head = NULL; s->node_count = 0; - normalize_angles(&al, &ar); - // building clipping tree, a lot of different cases - if (ar == al + 360) { - s->root = NULL; - } else { - clip_node* lc = s->nodes + s->node_count++; - clip_node* rc = s->nodes + s->node_count++; - lc->l = lc->r = rc->l = rc->r = NULL; - lc->type = rc->type = CT_CLIP; - lc->a = -a * sin(al * M_PI / 180.0); - lc->b = b * cos(al * M_PI / 180.0); - lc->c = (a * a - b * b) * sin(al * M_PI / 90.0) / 2.0; - rc->a = a * sin(ar * M_PI / 180.0); - rc->b = -b * cos(ar * M_PI / 180.0); - rc->c = (b * b - a * a) * sin(ar * M_PI / 90.0) / 2.0; - if (fmod(al, 180) == 0 || fmod(ar, 180) == 0) { - s->root = s->nodes + s->node_count++; - s->root->l = lc; - s->root->r = rc; - s->root->type = ar - al < 180 ? CT_AND : CT_OR; - } else if (((int)(al / 180) + (int)(ar / 180)) % 2 == 1) { - s->root = s->nodes + s->node_count++; - s->root->l = s->nodes + s->node_count++; - s->root->l->l = s->nodes + s->node_count++; - s->root->l->r = lc; - s->root->r = s->nodes + s->node_count++; - s->root->r->l = s->nodes + s->node_count++; - s->root->r->r = rc; - s->root->type = CT_OR; - s->root->l->type = CT_AND; - s->root->r->type = CT_AND; - s->root->l->l->type = CT_CLIP; - s->root->r->l->type = CT_CLIP; - s->root->l->l->l = s->root->l->l->r = NULL; - s->root->r->l->l = s->root->r->l->r = NULL; - s->root->l->l->a = s->root->l->l->c = 0; - s->root->r->l->a = s->root->r->l->c = 0; - s->root->l->l->b = (int)(al / 180) % 2 == 0 ? 1 : -1; - s->root->r->l->b = (int)(ar / 180) % 2 == 0 ? 1 : -1; - } else { - s->root = s->nodes + s->node_count++; - s->root->l = s->nodes + s->node_count++; - s->root->r = s->nodes + s->node_count++; - s->root->type = s->root->l->type = ar - al < 180 ? CT_AND : CT_OR; - s->root->l->l = lc; - s->root->l->r = rc; - s->root->r->type = CT_CLIP; - s->root->r->l = s->root->r->r = NULL; - s->root->r->a = s->root->r->c = 0; - s->root->r->b = ar < 180 || ar > 540 ? 1 : -1; - } - } - } -} - -// A chord line. -void chord_line_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { - ellipse_init(&s->st, a, b, a + b + 1); - - s->head = NULL; - s->node_count = 0; - - // line equation for chord - double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); - double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); - s->root = s->nodes + s->node_count++; - s->root->l = s->nodes + s->node_count++; - s->root->r = s->nodes + s->node_count++; - s->root->type = CT_AND; - s->root->l->type = s->root->r->type = CT_CLIP; - s->root->l->l = s->root->l->r = s->root->r->l = s->root->r->r = NULL; - s->root->l->a = yr - yl; - s->root->l->b = xl - xr; - s->root->l->c = -(s->root->l->a * xl + s->root->l->b * yl); - s->root->r->a = -s->root->l->a; - s->root->r->b = -s->root->l->b; - s->root->r->c = 2 * w * sqrt(pow(s->root->l->a, 2.0) + pow(s->root->l->b, 2.0)) - s->root->l->c; -} - -// Pie side. -void pie_side_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float _) { - ellipse_init(&s->st, a, b, a + b + 1); - - s->head = NULL; - s->node_count = 0; - - double xl = a * cos(al * M_PI / 180.0); - double yl = b * sin(al * M_PI / 180.0); - double a1 = -yl; - double b1 = xl; - double c1 = w * sqrt(a1 * a1 + b1 * b1); - - s->root = s->nodes + s->node_count++; - s->root->type = CT_AND; - s->root->l = s->nodes + s->node_count++; - s->root->l->type = CT_AND; - - clip_node* cnode; - cnode = s->nodes + s->node_count++; - cnode->l = cnode->r = NULL; - cnode->type = CT_CLIP; - cnode->a = a1; - cnode->b = b1; - cnode->c = c1; - s->root->l->l = cnode; - cnode = s->nodes + s->node_count++; - cnode->l = cnode->r = NULL; - cnode->type = CT_CLIP; - cnode->a = -a1; - cnode->b = -b1; - cnode->c = c1; - s->root->l->r = cnode; - cnode = s->nodes + s->node_count++; - cnode->l = cnode->r = NULL; - cnode->type = CT_CLIP; - cnode->a = b1; - cnode->b = -a1; - cnode->c = 0; - s->root->r = cnode; -} - -// A chord. -void chord_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { - ellipse_init(&s->st, a, b, w); - - s->head = NULL; - s->node_count = 0; - - // line equation for chord - double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); - double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); - s->root = s->nodes + s->node_count++; - s->root->l = s->root->r = NULL; - s->root->type = CT_CLIP; - s->root->a = yr - yl; - s->root->b = xl - xr; - s->root->c = -(s->root->a * xl + s->root->b * yl); + // line equation for chord + double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); + double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); + s->root = s->nodes + s->node_count++; + s->root->l = s->root->r = NULL; + s->root->type = CT_CLIP; + s->root->a = yr - yl; + s->root->b = xl - xr; + s->root->c = -(s->root->a * xl + s->root->b * yl); } // A pie. Can also be used to draw an arc with ugly sharp caps. -void pie_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { - ellipse_init(&s->st, a, b, w); +void +pie_init(clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar) { + ellipse_init(&s->st, a, b, w); - s->head = NULL; - s->node_count = 0; + s->head = NULL; + s->node_count = 0; - // line equations for pie sides - double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); - double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); + // line equations for pie sides + double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); + double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); - clip_node* lc = s->nodes + s->node_count++; - clip_node* rc = s->nodes + s->node_count++; - lc->l = lc->r = rc->l = rc->r = NULL; - lc->type = rc->type = CT_CLIP; - lc->a = -yl; - lc->b = xl; - lc->c = 0; - rc->a = yr; - rc->b = -xr; - rc->c = 0; + clip_node *lc = s->nodes + s->node_count++; + clip_node *rc = s->nodes + s->node_count++; + lc->l = lc->r = rc->l = rc->r = NULL; + lc->type = rc->type = CT_CLIP; + lc->a = -yl; + lc->b = xl; + lc->c = 0; + rc->a = yr; + rc->b = -xr; + rc->c = 0; - s->root = s->nodes + s->node_count++; - s->root->l = lc; - s->root->r = rc; - s->root->type = ar - al < 180 ? CT_AND : CT_OR; + s->root = s->nodes + s->node_count++; + s->root->l = lc; + s->root->r = rc; + s->root->type = ar - al < 180 ? CT_AND : CT_OR; } -void clip_ellipse_free(clip_ellipse_state* s) { - while (s->head != NULL) { - event_list* t = s->head; - s->head = s->head->next; - free(t); - } -} - -int8_t clip_ellipse_next(clip_ellipse_state* s, int32_t* ret_x0, int32_t* ret_y, int32_t* ret_x1) { - int32_t x0, y, x1; - while (s->head == NULL && ellipse_next(&s->st, &x0, &y, &x1) >= 0) { - if (clip_tree_do_clip(s->root, x0, y, x1, &s->head) < 0) { - return -2; +void +clip_ellipse_free(clip_ellipse_state *s) { + while (s->head != NULL) { + event_list *t = s->head; + s->head = s->head->next; + free(t); } - s->y = y; - } - if (s->head != NULL) { - *ret_y = s->y; - event_list* t = s->head; - s->head = s->head->next; - *ret_x0 = t->x; - free(t); - t = s->head; - assert(t != NULL); - s->head = s->head->next; - *ret_x1 = t->x; - free(t); - return 0; - } - return -1; +} + +int8_t +clip_ellipse_next( + clip_ellipse_state *s, int32_t *ret_x0, int32_t *ret_y, int32_t *ret_x1) { + int32_t x0, y, x1; + while (s->head == NULL && ellipse_next(&s->st, &x0, &y, &x1) >= 0) { + if (clip_tree_do_clip(s->root, x0, y, x1, &s->head) < 0) { + return -2; + } + s->y = y; + } + if (s->head != NULL) { + *ret_y = s->y; + event_list *t = s->head; + s->head = s->head->next; + *ret_x0 = t->x; + free(t); + t = s->head; + assert(t != NULL); + s->head = s->head->next; + *ret_x1 = t->x; + free(t); + return 0; + } + return -1; } static int -ellipseNew(Imaging im, int x0, int y0, int x1, int y1, - const void* ink_, int fill, - int width, int op) -{ - DRAW* draw; +ellipseNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink_, + int fill, + int width, + int op) { + DRAW *draw; INT32 ink; DRAWINIT(); int a = x1 - x0; int b = y1 - y0; if (a < 0 || b < 0) { - return 0; + return 0; } if (fill) { - width = a + b; + width = a + b; } ellipse_state st; ellipse_init(&st, a, b, width); int32_t X0, Y, X1; while (ellipse_next(&st, &X0, &Y, &X1) != -1) { - draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); + draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); } return 0; } static int -clipEllipseNew(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, - const void* ink_, int width, int op, clip_ellipse_init init) -{ - DRAW* draw; +clipEllipseNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink_, + int width, + int op, + clip_ellipse_init init) { + DRAW *draw; INT32 ink; DRAWINIT(); int a = x1 - x0; int b = y1 - y0; if (a < 0 || b < 0) { - return 0; + return 0; } clip_ellipse_state st; @@ -1446,124 +1446,187 @@ clipEllipseNew(Imaging im, int x0, int y0, int x1, int y1, int32_t X0, Y, X1; int next_code; while ((next_code = clip_ellipse_next(&st, &X0, &Y, &X1)) >= 0) { - draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); + draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); } clip_ellipse_free(&st); return next_code == -1 ? 0 : -1; } static int -arcNew(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, - const void* ink_, int width, int op) -{ - return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, arc_init); +arcNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink_, + int width, + int op) { + return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, arc_init); } static int -chordNew(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, - const void* ink_, int width, int op) -{ - return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_init); +chordNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink_, + int width, + int op) { + return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_init); } static int -chordLineNew(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, - const void* ink_, int width, int op) -{ - return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_line_init); +chordLineNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink_, + int width, + int op) { + return clipEllipseNew( + im, x0, y0, x1, y1, start, end, ink_, width, op, chord_line_init); } static int -pieNew(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, - const void* ink_, int width, int op) -{ - return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, pie_init); +pieNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink_, + int width, + int op) { + return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, pie_init); } static int -pieSideNew(Imaging im, int x0, int y0, int x1, int y1, - float start, - const void* ink_, int width, int op) -{ - return clipEllipseNew(im, x0, y0, x1, y1, start, 0, ink_, width, op, pie_side_init); +pieSideNew( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + const void *ink_, + int width, + int op) { + return clipEllipseNew(im, x0, y0, x1, y1, start, 0, ink_, width, op, pie_side_init); } int -ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int fill, int width, int op) -{ +ImagingDrawEllipse( + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink, + int fill, + int width, + int op) { return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op); } int -ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int width, int op) -{ +ImagingDrawArc( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int width, + int op) { normalize_angles(&start, &end); if (start + 360 == end) { - return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, 0, width, op); + return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, 0, width, op); } if (start == end) { - return 0; + return 0; } return arcNew(im, x0, y0, x1, y1, start, end, ink, width, op); } - int -ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, - int width, int op) -{ +ImagingDrawChord( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int fill, + int width, + int op) { normalize_angles(&start, &end); if (start + 360 == end) { - return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, fill, width, op); + return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, fill, width, op); } if (start == end) { - return 0; + return 0; } if (fill) { - return chordNew(im, x0, y0, x1, y1, start, end, ink, x1 - x0 + y1 - y0 + 1, op); + return chordNew(im, x0, y0, x1, y1, start, end, ink, x1 - x0 + y1 - y0 + 1, op); } else { - if (chordLineNew(im, x0, y0, x1, y1, start, end, ink, width, op)) { - return -1; - } - return chordNew(im, x0, y0, x1, y1, start, end, ink, width, op); + if (chordLineNew(im, x0, y0, x1, y1, start, end, ink, width, op)) { + return -1; + } + return chordNew(im, x0, y0, x1, y1, start, end, ink, width, op); } } - int -ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, - int width, int op) -{ +ImagingDrawPieslice( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int fill, + int width, + int op) { normalize_angles(&start, &end); if (start + 360 == end) { - return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op); + return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op); } if (start == end) { - return 0; + return 0; } if (fill) { - return pieNew(im, x0, y0, x1, y1, start, end, ink, x1 + y1 - x0 - y0, op); + return pieNew(im, x0, y0, x1, y1, start, end, ink, x1 + y1 - x0 - y0, op); } else { - if (pieSideNew(im, x0, y0, x1, y1, start, ink, width, op)) { - return -1; - } - if (pieSideNew(im, x0, y0, x1, y1, end, ink, width, op)) { - return -1; - } - int xc = lround((x0 + x1 - width) / 2.0), yc = lround((y0 + y1 - width) / 2.0); - ellipseNew(im, xc, yc, xc + width - 1, yc + width - 1, ink, 1, 0, op); - return pieNew(im, x0, y0, x1, y1, start, end, ink, width, op); + if (pieSideNew(im, x0, y0, x1, y1, start, ink, width, op)) { + return -1; + } + if (pieSideNew(im, x0, y0, x1, y1, end, ink, width, op)) { + return -1; + } + int xc = lround((x0 + x1 - width) / 2.0), yc = lround((y0 + y1 - width) / 2.0); + ellipseNew(im, xc, yc, xc + width - 1, yc + width - 1, ink, 1, 0, op); + return pieNew(im, x0, y0, x1, y1, start, end, ink, width, op); } } - /* -------------------------------------------------------------------- */ /* experimental level 2 ("arrow") graphics stuff. this implements @@ -1572,7 +1635,6 @@ ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, itself */ struct ImagingOutlineInstance { - float x0, y0; float x, y; @@ -1581,18 +1643,15 @@ struct ImagingOutlineInstance { Edge *edges; int size; - }; - ImagingOutline -ImagingOutlineNew(void) -{ +ImagingOutlineNew(void) { ImagingOutline outline; outline = calloc(1, sizeof(struct ImagingOutlineInstance)); if (!outline) { - return (ImagingOutline) ImagingError_MemoryError(); + return (ImagingOutline)ImagingError_MemoryError(); } outline->edges = NULL; @@ -1604,8 +1663,7 @@ ImagingOutlineNew(void) } void -ImagingOutlineDelete(ImagingOutline outline) -{ +ImagingOutlineDelete(ImagingOutline outline) { if (!outline) { return; } @@ -1617,11 +1675,9 @@ ImagingOutlineDelete(ImagingOutline outline) free(outline); } - -static Edge* -allocate(ImagingOutline outline, int extra) -{ - Edge* e; +static Edge * +allocate(ImagingOutline outline, int extra) { + Edge *e; if (outline->count + extra > outline->size) { /* expand outline buffer */ @@ -1650,8 +1706,7 @@ allocate(ImagingOutline outline, int extra) } int -ImagingOutlineMove(ImagingOutline outline, float x0, float y0) -{ +ImagingOutlineMove(ImagingOutline outline, float x0, float y0) { outline->x = outline->x0 = x0; outline->y = outline->y0 = y0; @@ -1659,16 +1714,15 @@ ImagingOutlineMove(ImagingOutline outline, float x0, float y0) } int -ImagingOutlineLine(ImagingOutline outline, float x1, float y1) -{ - Edge* e; +ImagingOutlineLine(ImagingOutline outline, float x1, float y1) { + Edge *e; e = allocate(outline, 1); if (!e) { return -1; /* out of memory */ } - add_edge(e, (int) outline->x, (int) outline->y, (int) x1, (int) y1); + add_edge(e, (int)outline->x, (int)outline->y, (int)x1, (int)y1); outline->x = x1; outline->y = y1; @@ -1677,10 +1731,15 @@ ImagingOutlineLine(ImagingOutline outline, float x1, float y1) } int -ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, - float x2, float y2, float x3, float y3) -{ - Edge* e; +ImagingOutlineCurve( + ImagingOutline outline, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3) { + Edge *e; int i; float xo, yo; @@ -1697,22 +1756,20 @@ ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, /* flatten the bezier segment */ for (i = 1; i <= STEPS; i++) { - - float t = ((float) i) / STEPS; - float t2 = t*t; - float t3 = t2*t; + float t = ((float)i) / STEPS; + float t2 = t * t; + float t3 = t2 * t; float u = 1.0F - t; - float u2 = u*u; - float u3 = u2*u; + float u2 = u * u; + float u3 = u2 * u; - float x = outline->x*u3 + 3*(x1*t*u2 + x2*t2*u) + x3*t3 + 0.5; - float y = outline->y*u3 + 3*(y1*t*u2 + y2*t2*u) + y3*t3 + 0.5; + float x = outline->x * u3 + 3 * (x1 * t * u2 + x2 * t2 * u) + x3 * t3 + 0.5; + float y = outline->y * u3 + 3 * (y1 * t * u2 + y2 * t2 * u) + y3 * t3 + 0.5; - add_edge(e++, xo, yo, (int) x, (int) y); + add_edge(e++, xo, yo, (int)x, (int)y); xo = x, yo = y; - } outline->x = xo; @@ -1722,8 +1779,7 @@ ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, } int -ImagingOutlineClose(ImagingOutline outline) -{ +ImagingOutlineClose(ImagingOutline outline) { if (outline->x == outline->x0 && outline->y == outline->y0) { return 0; } @@ -1731,16 +1787,19 @@ ImagingOutlineClose(ImagingOutline outline) } int -ImagingOutlineTransform(ImagingOutline outline, double a[6]) -{ +ImagingOutlineTransform(ImagingOutline outline, double a[6]) { Edge *eIn; Edge *eOut; int i, n; int x0, y0, x1, y1; int X0, Y0, X1, Y1; - double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; - double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; + double a0 = a[0]; + double a1 = a[1]; + double a2 = a[2]; + double a3 = a[3]; + double a4 = a[4]; + double a5 = a[5]; eIn = outline->edges; n = outline->count; @@ -1758,7 +1817,6 @@ ImagingOutlineTransform(ImagingOutline outline, double a[6]) } for (i = 0; i < n; i++) { - x0 = eIn->x0; y0 = eIn->y0; @@ -1778,16 +1836,15 @@ ImagingOutlineTransform(ImagingOutline outline, double a[6]) upgrade your compiler (make sure you have the right service pack) */ - X0 = (int) (a0*x0 + a1*y0 + a2); - Y0 = (int) (a3*x0 + a4*y0 + a5); - X1 = (int) (a0*x1 + a1*y1 + a2); - Y1 = (int) (a3*x1 + a4*y1 + a5); + X0 = (int)(a0 * x0 + a1 * y0 + a2); + Y0 = (int)(a3 * x0 + a4 * y0 + a5); + X1 = (int)(a0 * x1 + a1 * y1 + a2); + Y1 = (int)(a3 * x1 + a4 * y1 + a5); add_edge(eOut, X0, Y0, X1, Y1); eIn++; eOut++; - } free(eIn); @@ -1796,10 +1853,9 @@ ImagingOutlineTransform(ImagingOutline outline, double a[6]) } int -ImagingDrawOutline(Imaging im, ImagingOutline outline, const void* ink_, - int fill, int op) -{ - DRAW* draw; +ImagingDrawOutline( + Imaging im, ImagingOutline outline, const void *ink_, int fill, int op) { + DRAW *draw; INT32 ink; DRAWINIT(); diff --git a/src/libImaging/Effects.c b/src/libImaging/Effects.c index e0f1d0339..93e7af0bc 100644 --- a/src/libImaging/Effects.c +++ b/src/libImaging/Effects.c @@ -15,14 +15,12 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include Imaging -ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) -{ +ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) { /* Generate a Mandelbrot set covering the given extent */ Imaging im; @@ -32,10 +30,10 @@ ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) double dr, di; /* Check arguments */ - width = extent[2] - extent[0]; + width = extent[2] - extent[0]; height = extent[3] - extent[1]; if (width < 0.0 || height < 0.0 || quality < 2) { - return (Imaging) ImagingError_ValueError(NULL); + return (Imaging)ImagingError_ValueError(NULL); } im = ImagingNewDirty("L", xsize, ysize); @@ -43,24 +41,24 @@ ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) return NULL; } - dr = width/(xsize-1); - di = height/(ysize-1); + dr = width / (xsize - 1); + di = height / (ysize - 1); radius = 100.0; for (y = 0; y < ysize; y++) { - UINT8* buf = im->image8[y]; + UINT8 *buf = im->image8[y]; for (x = 0; x < xsize; x++) { x1 = y1 = xi2 = yi2 = 0.0; - cr = x*dr + extent[0]; - ci = y*di + extent[1]; + cr = x * dr + extent[0]; + ci = y * di + extent[1]; for (k = 1;; k++) { - y1 = 2*x1*y1 + ci; + y1 = 2 * x1 * y1 + ci; x1 = xi2 - yi2 + cr; - xi2 = x1*x1; - yi2 = y1*y1; + xi2 = x1 * x1; + yi2 = y1 * y1; if ((xi2 + yi2) > radius) { - buf[x] = k*255/quality; + buf[x] = k * 255 / quality; break; } if (k > quality) { @@ -74,8 +72,7 @@ ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) } Imaging -ImagingEffectNoise(int xsize, int ysize, float sigma) -{ +ImagingEffectNoise(int xsize, int ysize, float sigma) { /* Generate Gaussian noise centered around 128 */ Imaging imOut; @@ -92,7 +89,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) nextok = 0; for (y = 0; y < imOut->ysize; y++) { - UINT8* out = imOut->image8[y]; + UINT8 *out = imOut->image8[y]; for (x = 0; x < imOut->xsize; x++) { if (nextok) { this = next; @@ -101,11 +98,11 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) /* after numerical recipes */ double v1, v2, radius, factor; do { - v1 = rand()*(2.0/RAND_MAX) - 1.0; - v2 = rand()*(2.0/RAND_MAX) - 1.0; - radius= v1*v1 + v2*v2; + v1 = rand() * (2.0 / RAND_MAX) - 1.0; + v2 = rand() * (2.0 / RAND_MAX) - 1.0; + radius = v1 * v1 + v2 * v2; } while (radius >= 1.0); - factor = sqrt(-2.0*log(radius)/radius); + factor = sqrt(-2.0 * log(radius) / radius); this = factor * v1; next = factor * v2; } @@ -117,8 +114,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) } Imaging -ImagingEffectSpread(Imaging imIn, int distance) -{ +ImagingEffectSpread(Imaging imIn, int distance) { /* Randomly spread pixels in an image */ Imaging imOut; @@ -130,26 +126,26 @@ ImagingEffectSpread(Imaging imIn, int distance) return NULL; } -#define SPREAD(type, image)\ - if (distance == 0) {\ - for (y = 0; y < imOut->ysize; y++) {\ - for (x = 0; x < imOut->xsize; x++) {\ - imOut->image[y][x] = imIn->image[y][x];\ - }\ - }\ - } else {\ - for (y = 0; y < imOut->ysize; y++) {\ - for (x = 0; x < imOut->xsize; x++) {\ - int xx = x + (rand() % distance) - distance/2;\ - int yy = y + (rand() % distance) - distance/2;\ - if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) {\ - imOut->image[yy][xx] = imIn->image[y][x];\ - imOut->image[y][x] = imIn->image[yy][xx];\ - } else {\ - imOut->image[y][x] = imIn->image[y][x];\ - }\ - }\ - }\ +#define SPREAD(type, image) \ + if (distance == 0) { \ + for (y = 0; y < imOut->ysize; y++) { \ + for (x = 0; x < imOut->xsize; x++) { \ + imOut->image[y][x] = imIn->image[y][x]; \ + } \ + } \ + } else { \ + for (y = 0; y < imOut->ysize; y++) { \ + for (x = 0; x < imOut->xsize; x++) { \ + int xx = x + (rand() % distance) - distance / 2; \ + int yy = y + (rand() % distance) - distance / 2; \ + if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) { \ + imOut->image[yy][xx] = imIn->image[y][x]; \ + imOut->image[y][x] = imIn->image[yy][xx]; \ + } else { \ + imOut->image[y][x] = imIn->image[y][x]; \ + } \ + } \ + } \ } if (imIn->image8) { diff --git a/src/libImaging/EpsEncode.c b/src/libImaging/EpsEncode.c index ac8a4059c..3f2cb33b2 100644 --- a/src/libImaging/EpsEncode.c +++ b/src/libImaging/EpsEncode.c @@ -17,28 +17,24 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - int -ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - enum { HEXBYTE=1, NEWLINE }; +ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + enum { HEXBYTE = 1, NEWLINE }; const char *hex = "0123456789abcdef"; - UINT8* ptr = buf; - UINT8* in, i; + UINT8 *ptr = buf; + UINT8 *in, i; if (!state->state) { state->state = HEXBYTE; state->xsize *= im->pixelsize; /* Hack! */ } - in = (UINT8*) im->image[state->y]; + in = (UINT8 *)im->image[state->y]; for (;;) { - if (state->state == NEWLINE) { if (bytes < 1) { break; @@ -53,8 +49,8 @@ ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } i = in[state->x++]; - *ptr++ = hex[(i>>4)&15]; - *ptr++ = hex[i&15]; + *ptr++ = hex[(i >> 4) & 15]; + *ptr++ = hex[i & 15]; bytes -= 2; /* Skip junk bytes */ @@ -62,7 +58,7 @@ ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) state->x++; } - if (++state->count >= 79/2) { + if (++state->count >= 79 / 2) { state->state = NEWLINE; state->count = 0; } @@ -73,11 +69,9 @@ ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) state->errcode = IMAGING_CODEC_END; break; } - in = (UINT8*) im->image[state->y]; + in = (UINT8 *)im->image[state->y]; } - } return ptr - buf; - } diff --git a/src/libImaging/Except.c b/src/libImaging/Except.c index 3903b5bb8..f42ff9aec 100644 --- a/src/libImaging/Except.c +++ b/src/libImaging/Except.c @@ -19,41 +19,34 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - /* exception state */ void * -ImagingError_OSError(void) -{ +ImagingError_OSError(void) { fprintf(stderr, "*** exception: file access error\n"); return NULL; } void * -ImagingError_MemoryError(void) -{ +ImagingError_MemoryError(void) { fprintf(stderr, "*** exception: out of memory\n"); return NULL; } void * -ImagingError_ModeError(void) -{ +ImagingError_ModeError(void) { return ImagingError_ValueError("bad image mode"); } void * -ImagingError_Mismatch(void) -{ +ImagingError_Mismatch(void) { return ImagingError_ValueError("images don't match"); } void * -ImagingError_ValueError(const char *message) -{ +ImagingError_ValueError(const char *message) { if (!message) { message = "exception: bad argument to function"; } @@ -62,21 +55,18 @@ ImagingError_ValueError(const char *message) } void -ImagingError_Clear(void) -{ +ImagingError_Clear(void) { /* nop */; } /* thread state */ void -ImagingSectionEnter(ImagingSectionCookie* cookie) -{ +ImagingSectionEnter(ImagingSectionCookie *cookie) { /* pass */ } void -ImagingSectionLeave(ImagingSectionCookie* cookie) -{ +ImagingSectionLeave(ImagingSectionCookie *cookie) { /* pass */ } diff --git a/src/libImaging/File.c b/src/libImaging/File.c index 14688d661..76d0abccc 100644 --- a/src/libImaging/File.c +++ b/src/libImaging/File.c @@ -15,19 +15,15 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include - int -ImagingSaveRaw(Imaging im, FILE* fp) -{ +ImagingSaveRaw(Imaging im, FILE *fp) { int x, y, i; if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { - /* @PIL227: FIXME: for mode "1", map != 0 to 255 */ /* PGM "L" */ @@ -36,33 +32,29 @@ ImagingSaveRaw(Imaging im, FILE* fp) } } else { - /* PPM "RGB" or other internal format */ for (y = 0; y < im->ysize; y++) { for (x = i = 0; x < im->xsize; x++, i += im->pixelsize) { - fwrite(im->image[y]+i, 1, im->bands, fp); + fwrite(im->image[y] + i, 1, im->bands, fp); } } - } return 1; } - int -ImagingSavePPM(Imaging im, const char* outfile) -{ - FILE* fp; +ImagingSavePPM(Imaging im, const char *outfile) { + FILE *fp; if (!im) { - (void) ImagingError_ValueError(NULL); + (void)ImagingError_ValueError(NULL); return 0; } fp = fopen(outfile, "wb"); if (!fp) { - (void) ImagingError_OSError(); + (void)ImagingError_OSError(); return 0; } @@ -74,7 +66,7 @@ ImagingSavePPM(Imaging im, const char* outfile) fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize); } else { fclose(fp); - (void) ImagingError_ModeError(); + (void)ImagingError_ModeError(); return 0; } @@ -84,4 +76,3 @@ ImagingSavePPM(Imaging im, const char* outfile) return 1; } - diff --git a/src/libImaging/Fill.c b/src/libImaging/Fill.c index da143b4f9..e4e4b4344 100644 --- a/src/libImaging/Fill.c +++ b/src/libImaging/Fill.c @@ -15,14 +15,12 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include "math.h" Imaging -ImagingFill(Imaging im, const void* colour) -{ +ImagingFill(Imaging im, const void *colour) { int x, y; ImagingSectionCookie cookie; @@ -53,7 +51,7 @@ ImagingFill(Imaging im, const void* colour) } } } else { - unsigned char cc = (unsigned char) *(UINT8*) colour; + unsigned char cc = (unsigned char)*(UINT8 *)colour; for (y = 0; y < im->ysize; y++) { memset(im->image[y], cc, im->linesize); } @@ -65,13 +63,12 @@ ImagingFill(Imaging im, const void* colour) } Imaging -ImagingFillLinearGradient(const char *mode) -{ +ImagingFillLinearGradient(const char *mode) { Imaging im; int y; if (strlen(mode) != 1) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } im = ImagingNewDirty(mode, 256, 256); @@ -80,21 +77,20 @@ ImagingFillLinearGradient(const char *mode) } for (y = 0; y < 256; y++) { - memset(im->image8[y], (unsigned char) y, 256); + memset(im->image8[y], (unsigned char)y, 256); } return im; } Imaging -ImagingFillRadialGradient(const char *mode) -{ +ImagingFillRadialGradient(const char *mode) { Imaging im; int x, y; int d; if (strlen(mode) != 1) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } im = ImagingNewDirty(mode, 256, 256); @@ -104,7 +100,8 @@ ImagingFillRadialGradient(const char *mode) for (y = 0; y < 256; y++) { for (x = 0; x < 256; x++) { - d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0); + d = (int)sqrt( + (double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0); if (d >= 255) { im->image8[y][x] = 255; } else { diff --git a/src/libImaging/Filter.c b/src/libImaging/Filter.c index 0897ddbfe..fab3b4948 100644 --- a/src/libImaging/Filter.c +++ b/src/libImaging/Filter.c @@ -26,59 +26,59 @@ #include "Imaging.h" - -static inline UINT8 clip8(float in) -{ +static inline UINT8 +clip8(float in) { if (in <= 0.0) { return 0; } if (in >= 255.0) { return 255; } - return (UINT8) in; + return (UINT8)in; } Imaging -ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) -{ +ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) { Imaging imOut; int x, y; ImagingSectionCookie cookie; if (xmargin < 0 && ymargin < 0) { - return (Imaging) ImagingError_ValueError("bad kernel size"); + return (Imaging)ImagingError_ValueError("bad kernel size"); } imOut = ImagingNewDirty( - imIn->mode, imIn->xsize+2*xmargin, imIn->ysize+2*ymargin); + imIn->mode, imIn->xsize + 2 * xmargin, imIn->ysize + 2 * ymargin); if (!imOut) { return NULL; } -#define EXPAND_LINE(type, image, yin, yout) {\ - for (x = 0; x < xmargin; x++) {\ - imOut->image[yout][x] = imIn->image[yin][0];\ - }\ - for (x = 0; x < imIn->xsize; x++) {\ - imOut->image[yout][x+xmargin] = imIn->image[yin][x];\ - }\ - for (x = 0; x < xmargin; x++) {\ - imOut->image[yout][xmargin+imIn->xsize+x] =\ - imIn->image[yin][imIn->xsize-1];\ - }\ -} +#define EXPAND_LINE(type, image, yin, yout) \ + { \ + for (x = 0; x < xmargin; x++) { \ + imOut->image[yout][x] = imIn->image[yin][0]; \ + } \ + for (x = 0; x < imIn->xsize; x++) { \ + imOut->image[yout][x + xmargin] = imIn->image[yin][x]; \ + } \ + for (x = 0; x < xmargin; x++) { \ + imOut->image[yout][xmargin + imIn->xsize + x] = \ + imIn->image[yin][imIn->xsize - 1]; \ + } \ + } -#define EXPAND(type, image) {\ - for (y = 0; y < ymargin; y++) {\ - EXPAND_LINE(type, image, 0, y);\ - }\ - for (y = 0; y < imIn->ysize; y++) {\ - EXPAND_LINE(type, image, y, y+ymargin);\ - }\ - for (y = 0; y < ymargin; y++) {\ - EXPAND_LINE(type, image, imIn->ysize-1, ymargin+imIn->ysize+y);\ - }\ -} +#define EXPAND(type, image) \ + { \ + for (y = 0; y < ymargin; y++) { \ + EXPAND_LINE(type, image, 0, y); \ + } \ + for (y = 0; y < imIn->ysize; y++) { \ + EXPAND_LINE(type, image, y, y + ymargin); \ + } \ + for (y = 0; y < ymargin; y++) { \ + EXPAND_LINE(type, image, imIn->ysize - 1, ymargin + imIn->ysize + y); \ + } \ + } ImagingSectionEnter(&cookie); if (imIn->image8) { @@ -93,15 +93,11 @@ ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) return imOut; } - void -ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, - float offset) -{ -#define KERNEL1x3(in0, x, kernel, d) ( \ - _i2f((UINT8) in0[x-d]) * (kernel)[0] + \ - _i2f((UINT8) in0[x]) * (kernel)[1] + \ - _i2f((UINT8) in0[x+d]) * (kernel)[2]) +ImagingFilter3x3(Imaging imOut, Imaging im, const float *kernel, float offset) { +#define KERNEL1x3(in0, x, kernel, d) \ + (_i2f((UINT8)in0[x - d]) * (kernel)[0] + _i2f((UINT8)in0[x]) * (kernel)[1] + \ + _i2f((UINT8)in0[x + d]) * (kernel)[2]) int x = 0, y = 0; @@ -109,86 +105,84 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, if (im->bands == 1) { // Add one time for rounding offset += 0.5; - for (y = 1; y < im->ysize-1; y++) { - UINT8* in_1 = (UINT8*) im->image[y-1]; - UINT8* in0 = (UINT8*) im->image[y]; - UINT8* in1 = (UINT8*) im->image[y+1]; - UINT8* out = (UINT8*) imOut->image[y]; + for (y = 1; y < im->ysize - 1; y++) { + UINT8 *in_1 = (UINT8 *)im->image[y - 1]; + UINT8 *in0 = (UINT8 *)im->image[y]; + UINT8 *in1 = (UINT8 *)im->image[y + 1]; + UINT8 *out = (UINT8 *)imOut->image[y]; out[0] = in0[0]; - for (x = 1; x < im->xsize-1; x++) { + for (x = 1; x < im->xsize - 1; x++) { float ss = offset; ss += KERNEL1x3(in1, x, &kernel[0], 1); ss += KERNEL1x3(in0, x, &kernel[3], 1); ss += KERNEL1x3(in_1, x, &kernel[6], 1); out[x] = clip8(ss); - } + } out[x] = in0[x]; } } else { // Add one time for rounding offset += 0.5; - for (y = 1; y < im->ysize-1; y++) { - UINT8* in_1 = (UINT8*) im->image[y-1]; - UINT8* in0 = (UINT8*) im->image[y]; - UINT8* in1 = (UINT8*) im->image[y+1]; - UINT8* out = (UINT8*) imOut->image[y]; + for (y = 1; y < im->ysize - 1; y++) { + UINT8 *in_1 = (UINT8 *)im->image[y - 1]; + UINT8 *in0 = (UINT8 *)im->image[y]; + UINT8 *in1 = (UINT8 *)im->image[y + 1]; + UINT8 *out = (UINT8 *)imOut->image[y]; memcpy(out, in0, sizeof(UINT32)); if (im->bands == 2) { - for (x = 1; x < im->xsize-1; x++) { + for (x = 1; x < im->xsize - 1; x++) { float ss0 = offset; float ss3 = offset; UINT32 v; - ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); - ss3 += KERNEL1x3(in1, x*4+3, &kernel[0], 4); - ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); - ss3 += KERNEL1x3(in0, x*4+3, &kernel[3], 4); - ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); - ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); + ss0 += KERNEL1x3(in1, x * 4 + 0, &kernel[0], 4); + ss3 += KERNEL1x3(in1, x * 4 + 3, &kernel[0], 4); + ss0 += KERNEL1x3(in0, x * 4 + 0, &kernel[3], 4); + ss3 += KERNEL1x3(in0, x * 4 + 3, &kernel[3], 4); + ss0 += KERNEL1x3(in_1, x * 4 + 0, &kernel[6], 4); + ss3 += KERNEL1x3(in_1, x * 4 + 3, &kernel[6], 4); v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } else if (im->bands == 3) { - for (x = 1; x < im->xsize-1; x++) { + for (x = 1; x < im->xsize - 1; x++) { float ss0 = offset; float ss1 = offset; float ss2 = offset; UINT32 v; - ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); - ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); - ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); - ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); - ss1 += KERNEL1x3(in0, x*4+1, &kernel[3], 4); - ss2 += KERNEL1x3(in0, x*4+2, &kernel[3], 4); - ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); - ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); - ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); - v = MAKE_UINT32( - clip8(ss0), clip8(ss1), clip8(ss2), 0); + ss0 += KERNEL1x3(in1, x * 4 + 0, &kernel[0], 4); + ss1 += KERNEL1x3(in1, x * 4 + 1, &kernel[0], 4); + ss2 += KERNEL1x3(in1, x * 4 + 2, &kernel[0], 4); + ss0 += KERNEL1x3(in0, x * 4 + 0, &kernel[3], 4); + ss1 += KERNEL1x3(in0, x * 4 + 1, &kernel[3], 4); + ss2 += KERNEL1x3(in0, x * 4 + 2, &kernel[3], 4); + ss0 += KERNEL1x3(in_1, x * 4 + 0, &kernel[6], 4); + ss1 += KERNEL1x3(in_1, x * 4 + 1, &kernel[6], 4); + ss2 += KERNEL1x3(in_1, x * 4 + 2, &kernel[6], 4); + v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } else if (im->bands == 4) { - for (x = 1; x < im->xsize-1; x++) { + for (x = 1; x < im->xsize - 1; x++) { float ss0 = offset; float ss1 = offset; float ss2 = offset; float ss3 = offset; UINT32 v; - ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); - ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); - ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); - ss3 += KERNEL1x3(in1, x*4+3, &kernel[0], 4); - ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); - ss1 += KERNEL1x3(in0, x*4+1, &kernel[3], 4); - ss2 += KERNEL1x3(in0, x*4+2, &kernel[3], 4); - ss3 += KERNEL1x3(in0, x*4+3, &kernel[3], 4); - ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); - ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); - ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); - ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); - v = MAKE_UINT32( - clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); + ss0 += KERNEL1x3(in1, x * 4 + 0, &kernel[0], 4); + ss1 += KERNEL1x3(in1, x * 4 + 1, &kernel[0], 4); + ss2 += KERNEL1x3(in1, x * 4 + 2, &kernel[0], 4); + ss3 += KERNEL1x3(in1, x * 4 + 3, &kernel[0], 4); + ss0 += KERNEL1x3(in0, x * 4 + 0, &kernel[3], 4); + ss1 += KERNEL1x3(in0, x * 4 + 1, &kernel[3], 4); + ss2 += KERNEL1x3(in0, x * 4 + 2, &kernel[3], 4); + ss3 += KERNEL1x3(in0, x * 4 + 3, &kernel[3], 4); + ss0 += KERNEL1x3(in_1, x * 4 + 0, &kernel[6], 4); + ss1 += KERNEL1x3(in_1, x * 4 + 1, &kernel[6], 4); + ss2 += KERNEL1x3(in_1, x * 4 + 2, &kernel[6], 4); + ss3 += KERNEL1x3(in_1, x * 4 + 3, &kernel[6], 4); + v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } @@ -198,17 +192,13 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, memcpy(imOut->image[y], im->image[y], im->linesize); } - void -ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, - float offset) -{ -#define KERNEL1x5(in0, x, kernel, d) ( \ - _i2f((UINT8) in0[x-d-d]) * (kernel)[0] + \ - _i2f((UINT8) in0[x-d]) * (kernel)[1] + \ - _i2f((UINT8) in0[x]) * (kernel)[2] + \ - _i2f((UINT8) in0[x+d]) * (kernel)[3] + \ - _i2f((UINT8) in0[x+d+d]) * (kernel)[4]) +ImagingFilter5x5(Imaging imOut, Imaging im, const float *kernel, float offset) { +#define KERNEL1x5(in0, x, kernel, d) \ + (_i2f((UINT8)in0[x - d - d]) * (kernel)[0] + \ + _i2f((UINT8)in0[x - d]) * (kernel)[1] + _i2f((UINT8)in0[x]) * (kernel)[2] + \ + _i2f((UINT8)in0[x + d]) * (kernel)[3] + \ + _i2f((UINT8)in0[x + d + d]) * (kernel)[4]) int x = 0, y = 0; @@ -217,17 +207,17 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, if (im->bands == 1) { // Add one time for rounding offset += 0.5; - for (y = 2; y < im->ysize-2; y++) { - UINT8* in_2 = (UINT8*) im->image[y-2]; - UINT8* in_1 = (UINT8*) im->image[y-1]; - UINT8* in0 = (UINT8*) im->image[y]; - UINT8* in1 = (UINT8*) im->image[y+1]; - UINT8* in2 = (UINT8*) im->image[y+2]; - UINT8* out = (UINT8*) imOut->image[y]; + for (y = 2; y < im->ysize - 2; y++) { + UINT8 *in_2 = (UINT8 *)im->image[y - 2]; + UINT8 *in_1 = (UINT8 *)im->image[y - 1]; + UINT8 *in0 = (UINT8 *)im->image[y]; + UINT8 *in1 = (UINT8 *)im->image[y + 1]; + UINT8 *in2 = (UINT8 *)im->image[y + 2]; + UINT8 *out = (UINT8 *)imOut->image[y]; out[0] = in0[0]; out[1] = in0[1]; - for (x = 2; x < im->xsize-2; x++) { + for (x = 2; x < im->xsize - 2; x++) { float ss = offset; ss += KERNEL1x5(in2, x, &kernel[0], 1); ss += KERNEL1x5(in1, x, &kernel[5], 1); @@ -236,112 +226,109 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, ss += KERNEL1x5(in_2, x, &kernel[20], 1); out[x] = clip8(ss); } - out[x+0] = in0[x+0]; - out[x+1] = in0[x+1]; + out[x + 0] = in0[x + 0]; + out[x + 1] = in0[x + 1]; } } else { // Add one time for rounding offset += 0.5; - for (y = 2; y < im->ysize-2; y++) { - UINT8* in_2 = (UINT8*) im->image[y-2]; - UINT8* in_1 = (UINT8*) im->image[y-1]; - UINT8* in0 = (UINT8*) im->image[y]; - UINT8* in1 = (UINT8*) im->image[y+1]; - UINT8* in2 = (UINT8*) im->image[y+2]; - UINT8* out = (UINT8*) imOut->image[y]; + for (y = 2; y < im->ysize - 2; y++) { + UINT8 *in_2 = (UINT8 *)im->image[y - 2]; + UINT8 *in_1 = (UINT8 *)im->image[y - 1]; + UINT8 *in0 = (UINT8 *)im->image[y]; + UINT8 *in1 = (UINT8 *)im->image[y + 1]; + UINT8 *in2 = (UINT8 *)im->image[y + 2]; + UINT8 *out = (UINT8 *)imOut->image[y]; memcpy(out, in0, sizeof(UINT32) * 2); if (im->bands == 2) { - for (x = 2; x < im->xsize-2; x++) { + for (x = 2; x < im->xsize - 2; x++) { float ss0 = offset; float ss3 = offset; UINT32 v; - ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); - ss3 += KERNEL1x5(in2, x*4+3, &kernel[0], 4); - ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); - ss3 += KERNEL1x5(in1, x*4+3, &kernel[5], 4); - ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); - ss3 += KERNEL1x5(in0, x*4+3, &kernel[10], 4); - ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); - ss3 += KERNEL1x5(in_1, x*4+3, &kernel[15], 4); - ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); - ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); + ss0 += KERNEL1x5(in2, x * 4 + 0, &kernel[0], 4); + ss3 += KERNEL1x5(in2, x * 4 + 3, &kernel[0], 4); + ss0 += KERNEL1x5(in1, x * 4 + 0, &kernel[5], 4); + ss3 += KERNEL1x5(in1, x * 4 + 3, &kernel[5], 4); + ss0 += KERNEL1x5(in0, x * 4 + 0, &kernel[10], 4); + ss3 += KERNEL1x5(in0, x * 4 + 3, &kernel[10], 4); + ss0 += KERNEL1x5(in_1, x * 4 + 0, &kernel[15], 4); + ss3 += KERNEL1x5(in_1, x * 4 + 3, &kernel[15], 4); + ss0 += KERNEL1x5(in_2, x * 4 + 0, &kernel[20], 4); + ss3 += KERNEL1x5(in_2, x * 4 + 3, &kernel[20], 4); v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } else if (im->bands == 3) { - for (x = 2; x < im->xsize-2; x++) { + for (x = 2; x < im->xsize - 2; x++) { float ss0 = offset; float ss1 = offset; float ss2 = offset; UINT32 v; - ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); - ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); - ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); - ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); - ss1 += KERNEL1x5(in1, x*4+1, &kernel[5], 4); - ss2 += KERNEL1x5(in1, x*4+2, &kernel[5], 4); - ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); - ss1 += KERNEL1x5(in0, x*4+1, &kernel[10], 4); - ss2 += KERNEL1x5(in0, x*4+2, &kernel[10], 4); - ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); - ss1 += KERNEL1x5(in_1, x*4+1, &kernel[15], 4); - ss2 += KERNEL1x5(in_1, x*4+2, &kernel[15], 4); - ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); - ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); - ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); - v = MAKE_UINT32( - clip8(ss0), clip8(ss1), clip8(ss2), 0); + ss0 += KERNEL1x5(in2, x * 4 + 0, &kernel[0], 4); + ss1 += KERNEL1x5(in2, x * 4 + 1, &kernel[0], 4); + ss2 += KERNEL1x5(in2, x * 4 + 2, &kernel[0], 4); + ss0 += KERNEL1x5(in1, x * 4 + 0, &kernel[5], 4); + ss1 += KERNEL1x5(in1, x * 4 + 1, &kernel[5], 4); + ss2 += KERNEL1x5(in1, x * 4 + 2, &kernel[5], 4); + ss0 += KERNEL1x5(in0, x * 4 + 0, &kernel[10], 4); + ss1 += KERNEL1x5(in0, x * 4 + 1, &kernel[10], 4); + ss2 += KERNEL1x5(in0, x * 4 + 2, &kernel[10], 4); + ss0 += KERNEL1x5(in_1, x * 4 + 0, &kernel[15], 4); + ss1 += KERNEL1x5(in_1, x * 4 + 1, &kernel[15], 4); + ss2 += KERNEL1x5(in_1, x * 4 + 2, &kernel[15], 4); + ss0 += KERNEL1x5(in_2, x * 4 + 0, &kernel[20], 4); + ss1 += KERNEL1x5(in_2, x * 4 + 1, &kernel[20], 4); + ss2 += KERNEL1x5(in_2, x * 4 + 2, &kernel[20], 4); + v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } else if (im->bands == 4) { - for (x = 2; x < im->xsize-2; x++) { + for (x = 2; x < im->xsize - 2; x++) { float ss0 = offset; float ss1 = offset; float ss2 = offset; float ss3 = offset; UINT32 v; - ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); - ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); - ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); - ss3 += KERNEL1x5(in2, x*4+3, &kernel[0], 4); - ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); - ss1 += KERNEL1x5(in1, x*4+1, &kernel[5], 4); - ss2 += KERNEL1x5(in1, x*4+2, &kernel[5], 4); - ss3 += KERNEL1x5(in1, x*4+3, &kernel[5], 4); - ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); - ss1 += KERNEL1x5(in0, x*4+1, &kernel[10], 4); - ss2 += KERNEL1x5(in0, x*4+2, &kernel[10], 4); - ss3 += KERNEL1x5(in0, x*4+3, &kernel[10], 4); - ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); - ss1 += KERNEL1x5(in_1, x*4+1, &kernel[15], 4); - ss2 += KERNEL1x5(in_1, x*4+2, &kernel[15], 4); - ss3 += KERNEL1x5(in_1, x*4+3, &kernel[15], 4); - ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); - ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); - ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); - ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); - v = MAKE_UINT32( - clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); + ss0 += KERNEL1x5(in2, x * 4 + 0, &kernel[0], 4); + ss1 += KERNEL1x5(in2, x * 4 + 1, &kernel[0], 4); + ss2 += KERNEL1x5(in2, x * 4 + 2, &kernel[0], 4); + ss3 += KERNEL1x5(in2, x * 4 + 3, &kernel[0], 4); + ss0 += KERNEL1x5(in1, x * 4 + 0, &kernel[5], 4); + ss1 += KERNEL1x5(in1, x * 4 + 1, &kernel[5], 4); + ss2 += KERNEL1x5(in1, x * 4 + 2, &kernel[5], 4); + ss3 += KERNEL1x5(in1, x * 4 + 3, &kernel[5], 4); + ss0 += KERNEL1x5(in0, x * 4 + 0, &kernel[10], 4); + ss1 += KERNEL1x5(in0, x * 4 + 1, &kernel[10], 4); + ss2 += KERNEL1x5(in0, x * 4 + 2, &kernel[10], 4); + ss3 += KERNEL1x5(in0, x * 4 + 3, &kernel[10], 4); + ss0 += KERNEL1x5(in_1, x * 4 + 0, &kernel[15], 4); + ss1 += KERNEL1x5(in_1, x * 4 + 1, &kernel[15], 4); + ss2 += KERNEL1x5(in_1, x * 4 + 2, &kernel[15], 4); + ss3 += KERNEL1x5(in_1, x * 4 + 3, &kernel[15], 4); + ss0 += KERNEL1x5(in_2, x * 4 + 0, &kernel[20], 4); + ss1 += KERNEL1x5(in_2, x * 4 + 1, &kernel[20], 4); + ss2 += KERNEL1x5(in_2, x * 4 + 2, &kernel[20], 4); + ss3 += KERNEL1x5(in_2, x * 4 + 3, &kernel[20], 4); + v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); memcpy(out + x * sizeof(v), &v, sizeof(v)); } } - memcpy(out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2); + memcpy( + out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2); } } memcpy(imOut->image[y], im->image[y], im->linesize); - memcpy(imOut->image[y+1], im->image[y+1], im->linesize); + memcpy(imOut->image[y + 1], im->image[y + 1], im->linesize); } Imaging -ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, - FLOAT32 offset) -{ +ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32 *kernel, FLOAT32 offset) { Imaging imOut; ImagingSectionCookie cookie; - if ( ! im || im->type != IMAGING_TYPE_UINT8) { - return (Imaging) ImagingError_ModeError(); + if (!im || im->type != IMAGING_TYPE_UINT8) { + return (Imaging)ImagingError_ModeError(); } if (im->xsize < xsize || im->ysize < ysize) { @@ -349,7 +336,7 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, } if ((xsize != 3 && xsize != 5) || xsize != ysize) { - return (Imaging) ImagingError_ValueError("bad kernel size"); + return (Imaging)ImagingError_ValueError("bad kernel size"); } imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); @@ -368,4 +355,3 @@ ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, ImagingSectionLeave(&cookie); return imOut; } - diff --git a/src/libImaging/FliDecode.c b/src/libImaging/FliDecode.c index 84508013d..e9000fc99 100644 --- a/src/libImaging/FliDecode.c +++ b/src/libImaging/FliDecode.c @@ -14,26 +14,21 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" +#define I16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define I16(ptr)\ - ((ptr)[0] + ((ptr)[1] << 8)) +#define I32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define I32(ptr)\ - ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) - -#define ERR_IF_DATA_OOB(offset) \ - if ((data + (offset)) > ptr + bytes) {\ - state->errcode = IMAGING_CODEC_OVERRUN; \ - return -1; \ - } +#define ERR_IF_DATA_OOB(offset) \ + if ((data + (offset)) > ptr + bytes) { \ + state->errcode = IMAGING_CODEC_OVERRUN; \ + return -1; \ + } int -ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - UINT8* ptr; +ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + UINT8 *ptr; int framesize; int c, chunks, advance; int l, lines; @@ -62,36 +57,39 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt state->errcode = IMAGING_CODEC_OVERRUN; return -1; } - if (I16(ptr+4) != 0xF1FA) { + if (I16(ptr + 4) != 0xF1FA) { state->errcode = IMAGING_CODEC_UNKNOWN; return -1; } - chunks = I16(ptr+6); + chunks = I16(ptr + 6); ptr += 16; bytes -= 16; /* Process subchunks */ for (c = 0; c < chunks; c++) { - UINT8* data; + UINT8 *data; if (bytes < 10) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } data = ptr + 6; - switch (I16(ptr+4)) { - case 4: case 11: + switch (I16(ptr + 4)) { + case 4: + case 11: /* FLI COLOR chunk */ break; /* ignored; handled by Python code */ case 7: /* FLI SS2 chunk (word delta) */ /* OOB ok, we've got 4 bytes min on entry */ - lines = I16(data); data += 2; + lines = I16(data); + data += 2; for (l = y = 0; l < lines && y < state->ysize; l++, y++) { - UINT8* local_buf = (UINT8*) im->image[y]; + UINT8 *local_buf = (UINT8 *)im->image[y]; int p, packets; ERR_IF_DATA_OOB(2) - packets = I16(data); data += 2; + packets = I16(data); + data += 2; while (packets & 0x8000) { /* flag word */ if (packets & 0x4000) { @@ -100,20 +98,21 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt state->errcode = IMAGING_CODEC_OVERRUN; return -1; } - local_buf = (UINT8*) im->image[y]; + local_buf = (UINT8 *)im->image[y]; } else { /* store last byte (used if line width is odd) */ - local_buf[state->xsize-1] = (UINT8) packets; + local_buf[state->xsize - 1] = (UINT8)packets; } ERR_IF_DATA_OOB(2) - packets = I16(data); data += 2; + packets = I16(data); + data += 2; } for (p = x = 0; p < packets; p++) { ERR_IF_DATA_OOB(2) x += data[0]; /* pixel skip */ if (data[1] >= 128) { ERR_IF_DATA_OOB(4) - i = 256-data[1]; /* run */ + i = 256 - data[1]; /* run */ if (x + i + i > state->xsize) { break; } @@ -123,11 +122,11 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt } data += 2 + 2; } else { - i = 2 * (int) data[1]; /* chunk */ + i = 2 * (int)data[1]; /* chunk */ if (x + i > state->xsize) { break; } - ERR_IF_DATA_OOB(2+i) + ERR_IF_DATA_OOB(2 + i) memcpy(local_buf + x, data + 2, i); data += 2 + i; x += i; @@ -146,16 +145,18 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt case 12: /* FLI LC chunk (byte delta) */ /* OOB Check ok, we have 4 bytes min here */ - y = I16(data); ymax = y + I16(data+2); data += 4; + y = I16(data); + ymax = y + I16(data + 2); + data += 4; for (; y < ymax && y < state->ysize; y++) { - UINT8* out = (UINT8*) im->image[y]; - ERR_IF_DATA_OOB(1) + UINT8 *out = (UINT8 *)im->image[y]; + ERR_IF_DATA_OOB(1) int p, packets = *data++; for (p = x = 0; p < packets; p++, x += i) { ERR_IF_DATA_OOB(2) x += data[0]; /* skip pixels */ if (data[1] & 0x80) { - i = 256-data[1]; /* run */ + i = 256 - data[1]; /* run */ if (x + i > state->xsize) { break; } @@ -167,7 +168,7 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt if (x + i > state->xsize) { break; } - ERR_IF_DATA_OOB(2+i) + ERR_IF_DATA_OOB(2 + i) memcpy(out + x, data + 2, i); data += i + 2; } @@ -192,7 +193,7 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* FLI BRUN chunk */ /* OOB, ok, we've got 4 bytes min on entry */ for (y = 0; y < state->ysize; y++) { - UINT8* out = (UINT8*) im->image[y]; + UINT8 *out = (UINT8 *)im->image[y]; data += 1; /* ignore packetcount byte */ for (x = 0; x < state->xsize; x += i) { ERR_IF_DATA_OOB(2) @@ -201,7 +202,7 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt if (x + i > state->xsize) { break; /* safety first */ } - ERR_IF_DATA_OOB(i+1) + ERR_IF_DATA_OOB(i + 1) memcpy(out + x, data + 1, i); data += i + 1; } else { @@ -222,12 +223,12 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt break; case 16: /* COPY chunk */ - if (state->xsize > bytes/state->ysize) { + if (state->xsize > bytes / state->ysize) { /* not enough data for frame */ return ptr - buf; /* bytes consumed */ } for (y = 0; y < state->ysize; y++) { - UINT8* local_buf = (UINT8*) im->image[y]; + UINT8 *local_buf = (UINT8 *)im->image[y]; memcpy(local_buf, data, state->xsize); data += state->xsize; } diff --git a/src/libImaging/Geometry.c b/src/libImaging/Geometry.c index 06d0cf24d..0c5915792 100644 --- a/src/libImaging/Geometry.c +++ b/src/libImaging/Geometry.c @@ -15,28 +15,27 @@ /* Transpose operations */ Imaging -ImagingFlipLeftRight(Imaging imOut, Imaging imIn) -{ +ImagingFlipLeftRight(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define FLIP_LEFT_RIGHT(INT, image) \ - for (y = 0; y < imIn->ysize; y++) { \ - INT* in = (INT *)imIn->image[y]; \ - INT* out = (INT *)imOut->image[y]; \ - xr = imIn->xsize-1; \ +#define FLIP_LEFT_RIGHT(INT, image) \ + for (y = 0; y < imIn->ysize; y++) { \ + INT *in = (INT *)imIn->image[y]; \ + INT *out = (INT *)imOut->image[y]; \ + xr = imIn->xsize - 1; \ for (x = 0; x < imIn->xsize; x++, xr--) { \ - out[xr] = in[x]; \ - } \ + out[xr] = in[x]; \ + } \ } ImagingSectionEnter(&cookie); @@ -58,18 +57,16 @@ ImagingFlipLeftRight(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingFlipTopBottom(Imaging imOut, Imaging imIn) -{ +ImagingFlipTopBottom(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int y, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); @@ -86,43 +83,45 @@ ImagingFlipTopBottom(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingRotate90(Imaging imOut, Imaging imIn) -{ +ImagingRotate90(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, xr, xxsize, yysize; int xxx, yyy, xxxsize, yyysize; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define ROTATE_90(INT, image) \ - for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ - for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ +#define ROTATE_90(INT, image) \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ - for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ - for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ - yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ - xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ - for (yyy = yy; yyy < yyysize; yyy++) { \ - INT* in = (INT *)imIn->image[yyy]; \ - xr = imIn->xsize - 1 - xx; \ - for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ - INT* out = (INT *)imOut->image[xr]; \ - out[yyy] = in[xxx]; \ - } \ - } \ - } \ - } \ - } \ + for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ + for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ + yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize \ + ? yy + ROTATE_SMALL_CHUNK \ + : imIn->ysize; \ + xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize \ + ? xx + ROTATE_SMALL_CHUNK \ + : imIn->xsize; \ + for (yyy = yy; yyy < yyysize; yyy++) { \ + INT *in = (INT *)imIn->image[yyy]; \ + xr = imIn->xsize - 1 - xx; \ + for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ + INT *out = (INT *)imOut->image[xr]; \ + out[yyy] = in[xxx]; \ + } \ + } \ + } \ + } \ + } \ } ImagingSectionEnter(&cookie); @@ -144,42 +143,44 @@ ImagingRotate90(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingTranspose(Imaging imOut, Imaging imIn) -{ +ImagingTranspose(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, xxsize, yysize; int xxx, yyy, xxxsize, yyysize; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define TRANSPOSE(INT, image) \ - for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ - for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ +#define TRANSPOSE(INT, image) \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ - for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ - for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ - yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ - xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ - for (yyy = yy; yyy < yyysize; yyy++) { \ - INT* in = (INT *)imIn->image[yyy]; \ - for (xxx = xx; xxx < xxxsize; xxx++) { \ - INT* out = (INT *)imOut->image[xxx]; \ - out[yyy] = in[xxx]; \ - } \ - } \ - } \ - } \ - } \ + for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ + for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ + yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize \ + ? yy + ROTATE_SMALL_CHUNK \ + : imIn->ysize; \ + xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize \ + ? xx + ROTATE_SMALL_CHUNK \ + : imIn->xsize; \ + for (yyy = yy; yyy < yyysize; yyy++) { \ + INT *in = (INT *)imIn->image[yyy]; \ + for (xxx = xx; xxx < xxxsize; xxx++) { \ + INT *out = (INT *)imOut->image[xxx]; \ + out[yyy] = in[xxx]; \ + } \ + } \ + } \ + } \ + } \ } ImagingSectionEnter(&cookie); @@ -201,44 +202,46 @@ ImagingTranspose(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingTransverse(Imaging imOut, Imaging imIn) -{ +ImagingTransverse(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xr, yr, xx, yy, xxsize, yysize; int xxx, yyy, xxxsize, yyysize; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define TRANSVERSE(INT, image) \ - for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ - for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ +#define TRANSVERSE(INT, image) \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ - for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ - for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ - yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ - xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ - yr = imIn->ysize - 1 - yy; \ - for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ - INT* in = (INT *)imIn->image[yyy]; \ - xr = imIn->xsize - 1 - xx; \ - for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ - INT* out = (INT *)imOut->image[xr]; \ - out[yr] = in[xxx]; \ - } \ - } \ - } \ - } \ - } \ + for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ + for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ + yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize \ + ? yy + ROTATE_SMALL_CHUNK \ + : imIn->ysize; \ + xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize \ + ? xx + ROTATE_SMALL_CHUNK \ + : imIn->xsize; \ + yr = imIn->ysize - 1 - yy; \ + for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ + INT *in = (INT *)imIn->image[yyy]; \ + xr = imIn->xsize - 1 - xx; \ + for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ + INT *out = (INT *)imOut->image[xr]; \ + out[yr] = in[xxx]; \ + } \ + } \ + } \ + } \ + } \ } ImagingSectionEnter(&cookie); @@ -260,35 +263,33 @@ ImagingTransverse(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingRotate180(Imaging imOut, Imaging imIn) -{ +ImagingRotate180(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xr, yr; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define ROTATE_180(INT, image) \ - for (y = 0; y < imIn->ysize; y++, yr--) { \ - INT* in = (INT *)imIn->image[y]; \ - INT* out = (INT *)imOut->image[yr]; \ - xr = imIn->xsize-1; \ +#define ROTATE_180(INT, image) \ + for (y = 0; y < imIn->ysize; y++, yr--) { \ + INT *in = (INT *)imIn->image[y]; \ + INT *out = (INT *)imOut->image[yr]; \ + xr = imIn->xsize - 1; \ for (x = 0; x < imIn->xsize; x++, xr--) { \ - out[xr] = in[x]; \ - } \ + out[xr] = in[x]; \ + } \ } ImagingSectionEnter(&cookie); - yr = imIn->ysize-1; + yr = imIn->ysize - 1; if (imIn->image8) { if (strncmp(imIn->mode, "I;16", 4) == 0) { ROTATE_180(UINT16, image8) @@ -306,43 +307,45 @@ ImagingRotate180(Imaging imOut, Imaging imIn) return imOut; } - Imaging -ImagingRotate270(Imaging imOut, Imaging imIn) -{ +ImagingRotate270(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; int x, y, xx, yy, yr, xxsize, yysize; int xxx, yyy, xxxsize, yyysize; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { - return (Imaging) ImagingError_Mismatch(); + return (Imaging)ImagingError_Mismatch(); } ImagingCopyPalette(imOut, imIn); -#define ROTATE_270(INT, image) \ - for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ - for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ +#define ROTATE_270(INT, image) \ + for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ + for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ - for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ - for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ - yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ - xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ - yr = imIn->ysize - 1 - yy; \ - for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ - INT* in = (INT *)imIn->image[yyy]; \ - for (xxx = xx; xxx < xxxsize; xxx++) { \ - INT* out = (INT *)imOut->image[xxx]; \ - out[yr] = in[xxx]; \ - } \ - } \ - } \ - } \ - } \ + for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ + for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ + yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize \ + ? yy + ROTATE_SMALL_CHUNK \ + : imIn->ysize; \ + xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize \ + ? xx + ROTATE_SMALL_CHUNK \ + : imIn->xsize; \ + yr = imIn->ysize - 1 - yy; \ + for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ + INT *in = (INT *)imIn->image[yyy]; \ + for (xxx = xx; xxx < xxxsize; xxx++) { \ + INT *out = (INT *)imOut->image[xxx]; \ + out[yr] = in[xxx]; \ + } \ + } \ + } \ + } \ + } \ } ImagingSectionEnter(&cookie); @@ -364,63 +367,74 @@ ImagingRotate270(Imaging imOut, Imaging imIn) return imOut; } - /* -------------------------------------------------------------------- */ /* Transforms */ /* transform primitives (ImagingTransformMap) */ static int -affine_transform(double* xout, double* yout, int x, int y, void* data) -{ +affine_transform(double *xout, double *yout, int x, int y, void *data) { /* full moon tonight. your compiler will generate bogus code for simple expressions, unless you reorganize the code, or install Service Pack 3 */ - double* a = (double*) data; - double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; - double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; + double *a = (double *)data; + double a0 = a[0]; + double a1 = a[1]; + double a2 = a[2]; + double a3 = a[3]; + double a4 = a[4]; + double a5 = a[5]; double xin = x + 0.5; double yin = y + 0.5; - xout[0] = a0*xin + a1*yin + a2; - yout[0] = a3*xin + a4*yin + a5; + xout[0] = a0 * xin + a1 * yin + a2; + yout[0] = a3 * xin + a4 * yin + a5; return 1; } static int -perspective_transform(double* xout, double* yout, int x, int y, void* data) -{ - double* a = (double*) data; - double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; - double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; - double a6 = a[6]; double a7 = a[7]; +perspective_transform(double *xout, double *yout, int x, int y, void *data) { + double *a = (double *)data; + double a0 = a[0]; + double a1 = a[1]; + double a2 = a[2]; + double a3 = a[3]; + double a4 = a[4]; + double a5 = a[5]; + double a6 = a[6]; + double a7 = a[7]; double xin = x + 0.5; double yin = y + 0.5; - xout[0] = (a0*xin + a1*yin + a2) / (a6*xin + a7*yin + 1); - yout[0] = (a3*xin + a4*yin + a5) / (a6*xin + a7*yin + 1); + xout[0] = (a0 * xin + a1 * yin + a2) / (a6 * xin + a7 * yin + 1); + yout[0] = (a3 * xin + a4 * yin + a5) / (a6 * xin + a7 * yin + 1); return 1; } static int -quad_transform(double* xout, double* yout, int x, int y, void* data) -{ +quad_transform(double *xout, double *yout, int x, int y, void *data) { /* quad warp: map quadrilateral to rectangle */ - double* a = (double*) data; - double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; - double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; + double *a = (double *)data; + double a0 = a[0]; + double a1 = a[1]; + double a2 = a[2]; + double a3 = a[3]; + double a4 = a[4]; + double a5 = a[5]; + double a6 = a[6]; + double a7 = a[7]; double xin = x + 0.5; double yin = y + 0.5; - xout[0] = a0 + a1*xin + a2*yin + a3*xin*yin; - yout[0] = a4 + a5*xin + a6*yin + a7*xin*yin; + xout[0] = a0 + a1 * xin + a2 * yin + a3 * xin * yin; + yout[0] = a4 + a5 * xin + a6 * yin + a7 * xin * yin; return 1; } @@ -428,20 +442,18 @@ quad_transform(double* xout, double* yout, int x, int y, void* data) /* transform filters (ImagingTransformFilter) */ static int -nearest_filter8(void* out, Imaging im, double xin, double yin) -{ +nearest_filter8(void *out, Imaging im, double xin, double yin) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { return 0; } - ((UINT8*)out)[0] = im->image8[y][x]; + ((UINT8 *)out)[0] = im->image8[y][x]; return 1; } static int -nearest_filter16(void* out, Imaging im, double xin, double yin) -{ +nearest_filter16(void *out, Imaging im, double xin, double yin) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { @@ -452,8 +464,7 @@ nearest_filter16(void* out, Imaging im, double xin, double yin) } static int -nearest_filter32(void* out, Imaging im, double xin, double yin) -{ +nearest_filter32(void *out, Imaging im, double xin, double yin) { int x = COORD(xin); int y = COORD(yin); if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { @@ -463,54 +474,52 @@ nearest_filter32(void* out, Imaging im, double xin, double yin) return 1; } -#define XCLIP(im, x) ( ((x) < 0) ? 0 : ((x) < im->xsize) ? (x) : im->xsize-1 ) -#define YCLIP(im, y) ( ((y) < 0) ? 0 : ((y) < im->ysize) ? (y) : im->ysize-1 ) +#define XCLIP(im, x) (((x) < 0) ? 0 : ((x) < im->xsize) ? (x) : im->xsize - 1) +#define YCLIP(im, y) (((y) < 0) ? 0 : ((y) < im->ysize) ? (y) : im->ysize - 1) -#define BILINEAR(v, a, b, d)\ - (v = (a) + ( (b) - (a) ) * (d)) +#define BILINEAR(v, a, b, d) (v = (a) + ((b) - (a)) * (d)) -#define BILINEAR_HEAD(type)\ - int x, y;\ - int x0, x1;\ - double v1, v2;\ - double dx, dy;\ - type* in;\ - if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ - return 0;\ - }\ - xin -= 0.5;\ - yin -= 0.5;\ - x = FLOOR(xin);\ - y = FLOOR(yin);\ - dx = xin - x;\ +#define BILINEAR_HEAD(type) \ + int x, y; \ + int x0, x1; \ + double v1, v2; \ + double dx, dy; \ + type *in; \ + if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) { \ + return 0; \ + } \ + xin -= 0.5; \ + yin -= 0.5; \ + x = FLOOR(xin); \ + y = FLOOR(yin); \ + dx = xin - x; \ dy = yin - y; -#define BILINEAR_BODY(type, image, step, offset) {\ - in = (type*) ((image)[YCLIP(im, y)] + offset);\ - x0 = XCLIP(im, x+0)*step;\ - x1 = XCLIP(im, x+1)*step;\ - BILINEAR(v1, in[x0], in[x1], dx);\ - if (y+1 >= 0 && y+1 < im->ysize) {\ - in = (type*) ((image)[y+1] + offset);\ - BILINEAR(v2, in[x0], in[x1], dx);\ - } else {\ - v2 = v1;\ - }\ - BILINEAR(v1, v1, v2, dy);\ -} +#define BILINEAR_BODY(type, image, step, offset) \ + { \ + in = (type *)((image)[YCLIP(im, y)] + offset); \ + x0 = XCLIP(im, x + 0) * step; \ + x1 = XCLIP(im, x + 1) * step; \ + BILINEAR(v1, in[x0], in[x1], dx); \ + if (y + 1 >= 0 && y + 1 < im->ysize) { \ + in = (type *)((image)[y + 1] + offset); \ + BILINEAR(v2, in[x0], in[x1], dx); \ + } else { \ + v2 = v1; \ + } \ + BILINEAR(v1, v1, v2, dy); \ + } static int -bilinear_filter8(void* out, Imaging im, double xin, double yin) -{ +bilinear_filter8(void *out, Imaging im, double xin, double yin) { BILINEAR_HEAD(UINT8); BILINEAR_BODY(UINT8, im->image8, 1, 0); - ((UINT8*)out)[0] = (UINT8) v1; + ((UINT8 *)out)[0] = (UINT8)v1; return 1; } static int -bilinear_filter32I(void* out, Imaging im, double xin, double yin) -{ +bilinear_filter32I(void *out, Imaging im, double xin, double yin) { INT32 k; BILINEAR_HEAD(INT32); BILINEAR_BODY(INT32, im->image32, 1, 0); @@ -520,8 +529,7 @@ bilinear_filter32I(void* out, Imaging im, double xin, double yin) } static int -bilinear_filter32F(void* out, Imaging im, double xin, double yin) -{ +bilinear_filter32F(void *out, Imaging im, double xin, double yin) { FLOAT32 k; BILINEAR_HEAD(FLOAT32); BILINEAR_BODY(FLOAT32, im->image32, 1, 0); @@ -531,26 +539,24 @@ bilinear_filter32F(void* out, Imaging im, double xin, double yin) } static int -bilinear_filter32LA(void* out, Imaging im, double xin, double yin) -{ +bilinear_filter32LA(void *out, Imaging im, double xin, double yin) { BILINEAR_HEAD(UINT8); BILINEAR_BODY(UINT8, im->image, 4, 0); - ((UINT8*)out)[0] = (UINT8) v1; - ((UINT8*)out)[1] = (UINT8) v1; - ((UINT8*)out)[2] = (UINT8) v1; + ((UINT8 *)out)[0] = (UINT8)v1; + ((UINT8 *)out)[1] = (UINT8)v1; + ((UINT8 *)out)[2] = (UINT8)v1; BILINEAR_BODY(UINT8, im->image, 4, 3); - ((UINT8*)out)[3] = (UINT8) v1; + ((UINT8 *)out)[3] = (UINT8)v1; return 1; } static int -bilinear_filter32RGB(void* out, Imaging im, double xin, double yin) -{ +bilinear_filter32RGB(void *out, Imaging im, double xin, double yin) { int b; BILINEAR_HEAD(UINT8); for (b = 0; b < im->bands; b++) { BILINEAR_BODY(UINT8, im->image, 4, b); - ((UINT8*)out)[b] = (UINT8) v1; + ((UINT8 *)out)[b] = (UINT8)v1; } return 1; } @@ -559,79 +565,79 @@ bilinear_filter32RGB(void* out, Imaging im, double xin, double yin) #undef BILINEAR_HEAD #undef BILINEAR_BODY -#define BICUBIC(v, v1, v2, v3, v4, d) {\ - double p1 = v2;\ - double p2 = -v1 + v3;\ - double p3 = 2*(v1 - v2) + v3 - v4;\ - double p4 = -v1 + v2 - v3 + v4;\ - v = p1 + (d)*(p2 + (d)*(p3 + (d)*p4));\ -} +#define BICUBIC(v, v1, v2, v3, v4, d) \ + { \ + double p1 = v2; \ + double p2 = -v1 + v3; \ + double p3 = 2 * (v1 - v2) + v3 - v4; \ + double p4 = -v1 + v2 - v3 + v4; \ + v = p1 + (d) * (p2 + (d) * (p3 + (d)*p4)); \ + } -#define BICUBIC_HEAD(type)\ - int x = FLOOR(xin);\ - int y = FLOOR(yin);\ - int x0, x1, x2, x3;\ - double v1, v2, v3, v4;\ - double dx, dy;\ - type* in;\ - if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ - return 0;\ - }\ - xin -= 0.5;\ - yin -= 0.5;\ - x = FLOOR(xin);\ - y = FLOOR(yin);\ - dx = xin - x;\ - dy = yin - y;\ - x--; y--; - -#define BICUBIC_BODY(type, image, step, offset) {\ - in = (type*) ((image)[YCLIP(im, y)] + offset);\ - x0 = XCLIP(im, x+0)*step;\ - x1 = XCLIP(im, x+1)*step;\ - x2 = XCLIP(im, x+2)*step;\ - x3 = XCLIP(im, x+3)*step;\ - BICUBIC(v1, in[x0], in[x1], in[x2], in[x3], dx);\ - if (y+1 >= 0 && y+1 < im->ysize) {\ - in = (type*) ((image)[y+1] + offset);\ - BICUBIC(v2, in[x0], in[x1], in[x2], in[x3], dx);\ - } else {\ - v2 = v1;\ - }\ - if (y+2 >= 0 && y+2 < im->ysize) {\ - in = (type*) ((image)[y+2] + offset);\ - BICUBIC(v3, in[x0], in[x1], in[x2], in[x3], dx);\ - } else {\ - v3 = v2;\ - }\ - if (y+3 >= 0 && y+3 < im->ysize) {\ - in = (type*) ((image)[y+3] + offset);\ - BICUBIC(v4, in[x0], in[x1], in[x2], in[x3], dx);\ - } else {\ - v4 = v3;\ - }\ - BICUBIC(v1, v1, v2, v3, v4, dy);\ -} +#define BICUBIC_HEAD(type) \ + int x = FLOOR(xin); \ + int y = FLOOR(yin); \ + int x0, x1, x2, x3; \ + double v1, v2, v3, v4; \ + double dx, dy; \ + type *in; \ + if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) { \ + return 0; \ + } \ + xin -= 0.5; \ + yin -= 0.5; \ + x = FLOOR(xin); \ + y = FLOOR(yin); \ + dx = xin - x; \ + dy = yin - y; \ + x--; \ + y--; +#define BICUBIC_BODY(type, image, step, offset) \ + { \ + in = (type *)((image)[YCLIP(im, y)] + offset); \ + x0 = XCLIP(im, x + 0) * step; \ + x1 = XCLIP(im, x + 1) * step; \ + x2 = XCLIP(im, x + 2) * step; \ + x3 = XCLIP(im, x + 3) * step; \ + BICUBIC(v1, in[x0], in[x1], in[x2], in[x3], dx); \ + if (y + 1 >= 0 && y + 1 < im->ysize) { \ + in = (type *)((image)[y + 1] + offset); \ + BICUBIC(v2, in[x0], in[x1], in[x2], in[x3], dx); \ + } else { \ + v2 = v1; \ + } \ + if (y + 2 >= 0 && y + 2 < im->ysize) { \ + in = (type *)((image)[y + 2] + offset); \ + BICUBIC(v3, in[x0], in[x1], in[x2], in[x3], dx); \ + } else { \ + v3 = v2; \ + } \ + if (y + 3 >= 0 && y + 3 < im->ysize) { \ + in = (type *)((image)[y + 3] + offset); \ + BICUBIC(v4, in[x0], in[x1], in[x2], in[x3], dx); \ + } else { \ + v4 = v3; \ + } \ + BICUBIC(v1, v1, v2, v3, v4, dy); \ + } static int -bicubic_filter8(void* out, Imaging im, double xin, double yin) -{ +bicubic_filter8(void *out, Imaging im, double xin, double yin) { BICUBIC_HEAD(UINT8); BICUBIC_BODY(UINT8, im->image8, 1, 0); if (v1 <= 0.0) { - ((UINT8*)out)[0] = 0; + ((UINT8 *)out)[0] = 0; } else if (v1 >= 255.0) { - ((UINT8*)out)[0] = 255; + ((UINT8 *)out)[0] = 255; } else { - ((UINT8*)out)[0] = (UINT8) v1; + ((UINT8 *)out)[0] = (UINT8)v1; } return 1; } static int -bicubic_filter32I(void* out, Imaging im, double xin, double yin) -{ +bicubic_filter32I(void *out, Imaging im, double xin, double yin) { INT32 k; BICUBIC_HEAD(INT32); BICUBIC_BODY(INT32, im->image32, 1, 0); @@ -641,8 +647,7 @@ bicubic_filter32I(void* out, Imaging im, double xin, double yin) } static int -bicubic_filter32F(void* out, Imaging im, double xin, double yin) -{ +bicubic_filter32F(void *out, Imaging im, double xin, double yin) { FLOAT32 k; BICUBIC_HEAD(FLOAT32); BICUBIC_BODY(FLOAT32, im->image32, 1, 0); @@ -652,47 +657,45 @@ bicubic_filter32F(void* out, Imaging im, double xin, double yin) } static int -bicubic_filter32LA(void* out, Imaging im, double xin, double yin) -{ +bicubic_filter32LA(void *out, Imaging im, double xin, double yin) { BICUBIC_HEAD(UINT8); BICUBIC_BODY(UINT8, im->image, 4, 0); if (v1 <= 0.0) { - ((UINT8*)out)[0] = 0; - ((UINT8*)out)[1] = 0; - ((UINT8*)out)[2] = 0; + ((UINT8 *)out)[0] = 0; + ((UINT8 *)out)[1] = 0; + ((UINT8 *)out)[2] = 0; } else if (v1 >= 255.0) { - ((UINT8*)out)[0] = 255; - ((UINT8*)out)[1] = 255; - ((UINT8*)out)[2] = 255; + ((UINT8 *)out)[0] = 255; + ((UINT8 *)out)[1] = 255; + ((UINT8 *)out)[2] = 255; } else { - ((UINT8*)out)[0] = (UINT8) v1; - ((UINT8*)out)[1] = (UINT8) v1; - ((UINT8*)out)[2] = (UINT8) v1; + ((UINT8 *)out)[0] = (UINT8)v1; + ((UINT8 *)out)[1] = (UINT8)v1; + ((UINT8 *)out)[2] = (UINT8)v1; } BICUBIC_BODY(UINT8, im->image, 4, 3); if (v1 <= 0.0) { - ((UINT8*)out)[3] = 0; + ((UINT8 *)out)[3] = 0; } else if (v1 >= 255.0) { - ((UINT8*)out)[3] = 255; + ((UINT8 *)out)[3] = 255; } else { - ((UINT8*)out)[3] = (UINT8) v1; + ((UINT8 *)out)[3] = (UINT8)v1; } return 1; } static int -bicubic_filter32RGB(void* out, Imaging im, double xin, double yin) -{ +bicubic_filter32RGB(void *out, Imaging im, double xin, double yin) { int b; BICUBIC_HEAD(UINT8); for (b = 0; b < im->bands; b++) { BICUBIC_BODY(UINT8, im->image, 4, b); if (v1 <= 0.0) { - ((UINT8*)out)[b] = 0; + ((UINT8 *)out)[b] = 0; } else if (v1 >= 255.0) { - ((UINT8*)out)[b] = 255; + ((UINT8 *)out)[b] = 255; } else { - ((UINT8*)out)[b] = (UINT8) v1; + ((UINT8 *)out)[b] = (UINT8)v1; } } return 1; @@ -703,64 +706,63 @@ bicubic_filter32RGB(void* out, Imaging im, double xin, double yin) #undef BICUBIC_BODY static ImagingTransformFilter -getfilter(Imaging im, int filterid) -{ +getfilter(Imaging im, int filterid) { switch (filterid) { - case IMAGING_TRANSFORM_NEAREST: - if (im->image8) { - switch (im->type) { - case IMAGING_TYPE_UINT8: - return nearest_filter8; - case IMAGING_TYPE_SPECIAL: - switch (im->pixelsize) { - case 1: - return nearest_filter8; - case 2: - return nearest_filter16; - case 4: - return nearest_filter32; + case IMAGING_TRANSFORM_NEAREST: + if (im->image8) { + switch (im->type) { + case IMAGING_TYPE_UINT8: + return nearest_filter8; + case IMAGING_TYPE_SPECIAL: + switch (im->pixelsize) { + case 1: + return nearest_filter8; + case 2: + return nearest_filter16; + case 4: + return nearest_filter32; + } + } + } else { + return nearest_filter32; + } + break; + case IMAGING_TRANSFORM_BILINEAR: + if (im->image8) { + return bilinear_filter8; + } else if (im->image32) { + switch (im->type) { + case IMAGING_TYPE_UINT8: + if (im->bands == 2) { + return bilinear_filter32LA; + } else { + return bilinear_filter32RGB; + } + case IMAGING_TYPE_INT32: + return bilinear_filter32I; + case IMAGING_TYPE_FLOAT32: + return bilinear_filter32F; } } - } else { - return nearest_filter32; - } - break; - case IMAGING_TRANSFORM_BILINEAR: - if (im->image8) { - return bilinear_filter8; - } else if (im->image32) { - switch (im->type) { - case IMAGING_TYPE_UINT8: - if (im->bands == 2) { - return bilinear_filter32LA; - } else { - return bilinear_filter32RGB; + break; + case IMAGING_TRANSFORM_BICUBIC: + if (im->image8) { + return bicubic_filter8; + } else if (im->image32) { + switch (im->type) { + case IMAGING_TYPE_UINT8: + if (im->bands == 2) { + return bicubic_filter32LA; + } else { + return bicubic_filter32RGB; + } + case IMAGING_TYPE_INT32: + return bicubic_filter32I; + case IMAGING_TYPE_FLOAT32: + return bicubic_filter32F; } - case IMAGING_TYPE_INT32: - return bilinear_filter32I; - case IMAGING_TYPE_FLOAT32: - return bilinear_filter32F; } - } - break; - case IMAGING_TRANSFORM_BICUBIC: - if (im->image8) { - return bicubic_filter8; - } else if (im->image32) { - switch (im->type) { - case IMAGING_TYPE_UINT8: - if (im->bands == 2) { - return bicubic_filter32LA; - } else { - return bicubic_filter32RGB; - } - case IMAGING_TYPE_INT32: - return bicubic_filter32I; - case IMAGING_TYPE_FLOAT32: - return bicubic_filter32F; - } - } - break; + break; } /* no such filter */ return NULL; @@ -770,10 +772,16 @@ getfilter(Imaging im, int filterid) Imaging ImagingGenericTransform( - Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, - ImagingTransformMap transform, void* transform_data, - int filterid, int fill) -{ + Imaging imOut, + Imaging imIn, + int x0, + int y0, + int x1, + int y1, + ImagingTransformMap transform, + void *transform_data, + int filterid, + int fill) { /* slow generic transformation. use ImagingTransformAffine or ImagingScaleAffine where possible. */ @@ -784,11 +792,11 @@ ImagingGenericTransform( ImagingTransformFilter filter = getfilter(imIn, filterid); if (!filter) { - return (Imaging) ImagingError_ValueError("bad filter number"); + return (Imaging)ImagingError_ValueError("bad filter number"); } if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } ImagingCopyPalette(imOut, imIn); @@ -809,10 +817,10 @@ ImagingGenericTransform( } for (y = y0; y < y1; y++) { - out = imOut->image[y] + x0*imOut->pixelsize; + out = imOut->image[y] + x0 * imOut->pixelsize; for (x = x0; x < x1; x++) { - if ( ! transform(&xx, &yy, x-x0, y-y0, transform_data) || - ! filter(out, imIn, xx, yy)) { + if (!transform(&xx, &yy, x - x0, y - y0, transform_data) || + !filter(out, imIn, xx, yy)) { if (fill) { memset(out, 0, imOut->pixelsize); } @@ -827,10 +835,15 @@ ImagingGenericTransform( } static Imaging -ImagingScaleAffine(Imaging imOut, Imaging imIn, - int x0, int y0, int x1, int y1, - double a[6], int fill) -{ +ImagingScaleAffine( + Imaging imOut, + Imaging imIn, + int x0, + int y0, + int x1, + int y1, + double a[6], + int fill) { /* scale, nearest neighbour resampling */ ImagingSectionCookie cookie; @@ -841,7 +854,7 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, int *xintab; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } ImagingCopyPalette(imOut, imIn); @@ -860,10 +873,10 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, } /* malloc check ok, uses calloc for overflow */ - xintab = (int*) calloc(imOut->xsize, sizeof(int)); + xintab = (int *)calloc(imOut->xsize, sizeof(int)); if (!xintab) { ImagingDelete(imOut); - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } xo = a[2] + a[0] * 0.5; @@ -875,8 +888,8 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, /* Pretabulate horizontal pixel positions */ for (x = x0; x < x1; x++) { xin = COORD(xo); - if (xin >= 0 && xin < (int) imIn->xsize) { - xmax = x+1; + if (xin >= 0 && xin < (int)imIn->xsize) { + xmax = x + 1; if (x < xmin) { xmin = x; } @@ -885,21 +898,21 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, xo += a[0]; } -#define AFFINE_SCALE(pixel, image)\ - for (y = y0; y < y1; y++) {\ - int yi = COORD(yo);\ - pixel *in, *out;\ - out = imOut->image[y];\ - if (fill && x1 > x0) {\ - memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ - }\ - if (yi >= 0 && yi < imIn->ysize) {\ - in = imIn->image[yi];\ - for (x = xmin; x < xmax; x++) {\ - out[x] = in[xintab[x]];\ - }\ - }\ - yo += a[4];\ +#define AFFINE_SCALE(pixel, image) \ + for (y = y0; y < y1; y++) { \ + int yi = COORD(yo); \ + pixel *in, *out; \ + out = imOut->image[y]; \ + if (fill && x1 > x0) { \ + memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \ + } \ + if (yi >= 0 && yi < imIn->ysize) { \ + in = imIn->image[yi]; \ + for (x = xmin; x < xmax; x++) { \ + out[x] = in[xintab[x]]; \ + } \ + } \ + yo += a[4]; \ } ImagingSectionEnter(&cookie); @@ -920,17 +933,23 @@ ImagingScaleAffine(Imaging imOut, Imaging imIn, } static inline int -check_fixed(double a[6], int x, int y) -{ - return (fabs(x*a[0] + y*a[1] + a[2]) < 32768.0 && - fabs(x*a[3] + y*a[4] + a[5]) < 32768.0); +check_fixed(double a[6], int x, int y) { + return ( + fabs(x * a[0] + y * a[1] + a[2]) < 32768.0 && + fabs(x * a[3] + y * a[4] + a[5]) < 32768.0); } static inline Imaging -affine_fixed(Imaging imOut, Imaging imIn, - int x0, int y0, int x1, int y1, - double a[6], int filterid, int fill) -{ +affine_fixed( + Imaging imOut, + Imaging imIn, + int x0, + int y0, + int x1, + int y1, + double a[6], + int filterid, + int fill) { /* affine transform, nearest neighbour resampling, fixed point arithmetics */ @@ -943,41 +962,43 @@ affine_fixed(Imaging imOut, Imaging imIn, ImagingCopyPalette(imOut, imIn); - xsize = (int) imIn->xsize; - ysize = (int) imIn->ysize; + xsize = (int)imIn->xsize; + ysize = (int)imIn->ysize; /* use 16.16 fixed point arithmetics */ #define FIX(v) FLOOR((v)*65536.0 + 0.5) - a0 = FIX(a[0]); a1 = FIX(a[1]); - a3 = FIX(a[3]); a4 = FIX(a[4]); + a0 = FIX(a[0]); + a1 = FIX(a[1]); + a3 = FIX(a[3]); + a4 = FIX(a[4]); a2 = FIX(a[2] + a[0] * 0.5 + a[1] * 0.5); a5 = FIX(a[5] + a[3] * 0.5 + a[4] * 0.5); #undef FIX -#define AFFINE_TRANSFORM_FIXED(pixel, image)\ - for (y = y0; y < y1; y++) {\ - pixel *out;\ - xx = a2;\ - yy = a5;\ - out = imOut->image[y];\ - if (fill && x1 > x0) {\ - memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ - }\ - for (x = x0; x < x1; x++, out++) {\ - xin = xx >> 16;\ - if (xin >= 0 && xin < xsize) {\ - yin = yy >> 16;\ - if (yin >= 0 && yin < ysize) {\ - *out = imIn->image[yin][xin];\ - }\ - }\ - xx += a0;\ - yy += a3;\ - }\ - a2 += a1;\ - a5 += a4;\ +#define AFFINE_TRANSFORM_FIXED(pixel, image) \ + for (y = y0; y < y1; y++) { \ + pixel *out; \ + xx = a2; \ + yy = a5; \ + out = imOut->image[y]; \ + if (fill && x1 > x0) { \ + memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \ + } \ + for (x = x0; x < x1; x++, out++) { \ + xin = xx >> 16; \ + if (xin >= 0 && xin < xsize) { \ + yin = yy >> 16; \ + if (yin >= 0 && yin < ysize) { \ + *out = imIn->image[yin][xin]; \ + } \ + } \ + xx += a0; \ + yy += a3; \ + } \ + a2 += a1; \ + a5 += a4; \ } ImagingSectionEnter(&cookie); @@ -996,10 +1017,16 @@ affine_fixed(Imaging imOut, Imaging imIn, } Imaging -ImagingTransformAffine(Imaging imOut, Imaging imIn, - int x0, int y0, int x1, int y1, - double a[6], int filterid, int fill) -{ +ImagingTransformAffine( + Imaging imOut, + Imaging imIn, + int x0, + int y0, + int x1, + int y1, + double a[6], + int filterid, + int fill) { /* affine transform, nearest neighbour resampling, floating point arithmetics*/ @@ -1012,10 +1039,7 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) { return ImagingGenericTransform( - imOut, imIn, - x0, y0, x1, y1, - affine_transform, a, - filterid, fill); + imOut, imIn, x0, y0, x1, y1, affine_transform, a, filterid, fill); } if (a[1] == 0 && a[3] == 0) { @@ -1024,7 +1048,7 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, } if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (x0 < 0) { @@ -1043,8 +1067,8 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, /* translate all four corners to check if they are within the range that can be represented by the fixed point arithmetics */ - if (check_fixed(a, 0, 0) && check_fixed(a, x1-x0, y1-y0) && - check_fixed(a, 0, y1-y0) && check_fixed(a, x1-x0, 0)) { + if (check_fixed(a, 0, 0) && check_fixed(a, x1 - x0, y1 - y0) && + check_fixed(a, 0, y1 - y0) && check_fixed(a, x1 - x0, 0)) { return affine_fixed(imOut, imIn, x0, y0, x1, y1, a, filterid, fill); } @@ -1054,34 +1078,34 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, ImagingCopyPalette(imOut, imIn); - xsize = (int) imIn->xsize; - ysize = (int) imIn->ysize; + xsize = (int)imIn->xsize; + ysize = (int)imIn->ysize; xo = a[2] + a[1] * 0.5 + a[0] * 0.5; yo = a[5] + a[4] * 0.5 + a[3] * 0.5; -#define AFFINE_TRANSFORM(pixel, image)\ - for (y = y0; y < y1; y++) {\ - pixel *out;\ - xx = xo;\ - yy = yo;\ - out = imOut->image[y];\ - if (fill && x1 > x0) {\ - memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ - }\ - for (x = x0; x < x1; x++, out++) {\ - xin = COORD(xx);\ - if (xin >= 0 && xin < xsize) {\ - yin = COORD(yy);\ - if (yin >= 0 && yin < ysize) {\ - *out = imIn->image[yin][xin];\ - }\ - }\ - xx += a[0];\ - yy += a[3];\ - }\ - xo += a[1];\ - yo += a[4];\ +#define AFFINE_TRANSFORM(pixel, image) \ + for (y = y0; y < y1; y++) { \ + pixel *out; \ + xx = xo; \ + yy = yo; \ + out = imOut->image[y]; \ + if (fill && x1 > x0) { \ + memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \ + } \ + for (x = x0; x < x1; x++, out++) { \ + xin = COORD(xx); \ + if (xin >= 0 && xin < xsize) { \ + yin = COORD(yy); \ + if (yin >= 0 && yin < ysize) { \ + *out = imIn->image[yin][xin]; \ + } \ + } \ + xx += a[0]; \ + yy += a[3]; \ + } \ + xo += a[1]; \ + yo += a[4]; \ } ImagingSectionEnter(&cookie); @@ -1100,29 +1124,34 @@ ImagingTransformAffine(Imaging imOut, Imaging imIn, } Imaging -ImagingTransform(Imaging imOut, Imaging imIn, int method, - int x0, int y0, int x1, int y1, - double a[8], int filterid, int fill) -{ +ImagingTransform( + Imaging imOut, + Imaging imIn, + int method, + int x0, + int y0, + int x1, + int y1, + double a[8], + int filterid, + int fill) { ImagingTransformMap transform; - switch(method) { - case IMAGING_TRANSFORM_AFFINE: - return ImagingTransformAffine( - imOut, imIn, x0, y0, x1, y1, a, filterid, fill); - break; - case IMAGING_TRANSFORM_PERSPECTIVE: - transform = perspective_transform; - break; - case IMAGING_TRANSFORM_QUAD: - transform = quad_transform; - break; - default: - return (Imaging) ImagingError_ValueError("bad transform method"); + switch (method) { + case IMAGING_TRANSFORM_AFFINE: + return ImagingTransformAffine( + imOut, imIn, x0, y0, x1, y1, a, filterid, fill); + break; + case IMAGING_TRANSFORM_PERSPECTIVE: + transform = perspective_transform; + break; + case IMAGING_TRANSFORM_QUAD: + transform = quad_transform; + break; + default: + return (Imaging)ImagingError_ValueError("bad transform method"); } return ImagingGenericTransform( - imOut, imIn, - x0, y0, x1, y1, - transform, a, filterid, fill); + imOut, imIn, x0, y0, x1, y1, transform, a, filterid, fill); } diff --git a/src/libImaging/GetBBox.c b/src/libImaging/GetBBox.c index 8db78c2e2..e73153600 100644 --- a/src/libImaging/GetBBox.c +++ b/src/libImaging/GetBBox.c @@ -16,13 +16,10 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" - int -ImagingGetBBox(Imaging im, int bbox[4]) -{ +ImagingGetBBox(Imaging im, int bbox[4]) { /* Get the bounding box for any non-zero data in the image.*/ int x, y; @@ -33,26 +30,26 @@ ImagingGetBBox(Imaging im, int bbox[4]) bbox[1] = -1; bbox[2] = bbox[3] = 0; -#define GETBBOX(image, mask)\ - for (y = 0; y < im->ysize; y++) {\ - has_data = 0;\ - for (x = 0; x < im->xsize; x++) {\ - if (im->image[y][x] & mask) {\ - has_data = 1;\ - if (x < bbox[0]) {\ - bbox[0] = x;\ - }\ - if (x >= bbox[2]) {\ - bbox[2] = x+1;\ - }\ - }\ - }\ - if (has_data) {\ - if (bbox[1] < 0) {\ - bbox[1] = y;\ - }\ - bbox[3] = y+1;\ - }\ +#define GETBBOX(image, mask) \ + for (y = 0; y < im->ysize; y++) { \ + has_data = 0; \ + for (x = 0; x < im->xsize; x++) { \ + if (im->image[y][x] & mask) { \ + has_data = 1; \ + if (x < bbox[0]) { \ + bbox[0] = x; \ + } \ + if (x >= bbox[2]) { \ + bbox[2] = x + 1; \ + } \ + } \ + } \ + if (has_data) { \ + if (bbox[1] < 0) { \ + bbox[1] = y; \ + } \ + bbox[3] = y + 1; \ + } \ } if (im->image8) { @@ -60,16 +57,15 @@ ImagingGetBBox(Imaging im, int bbox[4]) } else { INT32 mask = 0xffffffff; if (im->bands == 3) { - ((UINT8*) &mask)[3] = 0; - } else if (strcmp(im->mode, "RGBa") == 0 || - strcmp(im->mode, "RGBA") == 0 || - strcmp(im->mode, "La") == 0 || - strcmp(im->mode, "LA") == 0 || - strcmp(im->mode, "PA") == 0) { + ((UINT8 *)&mask)[3] = 0; + } else if ( + strcmp(im->mode, "RGBa") == 0 || strcmp(im->mode, "RGBA") == 0 || + strcmp(im->mode, "La") == 0 || strcmp(im->mode, "LA") == 0 || + strcmp(im->mode, "PA") == 0) { #ifdef WORDS_BIGENDIAN - mask = 0x000000ff; + mask = 0x000000ff; #else - mask = 0xff000000; + mask = 0xff000000; #endif } GETBBOX(image32, mask); @@ -83,10 +79,8 @@ ImagingGetBBox(Imaging im, int bbox[4]) return 1; /* ok */ } - int -ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj) -{ +ImagingGetProjection(Imaging im, UINT8 *xproj, UINT8 *yproj) { /* Get projection arrays for non-zero data in the image.*/ int x, y; @@ -96,26 +90,26 @@ ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj) memset(xproj, 0, im->xsize); memset(yproj, 0, im->ysize); - #define GETPROJ(image, mask)\ - for (y = 0; y < im->ysize; y++) {\ - has_data = 0;\ - for (x = 0; x < im->xsize; x++) {\ - if (im->image[y][x] & mask) {\ - has_data = 1;\ - xproj[x] = 1;\ - }\ - }\ - if (has_data) {\ - yproj[y] = 1;\ - }\ - } +#define GETPROJ(image, mask) \ + for (y = 0; y < im->ysize; y++) { \ + has_data = 0; \ + for (x = 0; x < im->xsize; x++) { \ + if (im->image[y][x] & mask) { \ + has_data = 1; \ + xproj[x] = 1; \ + } \ + } \ + if (has_data) { \ + yproj[y] = 1; \ + } \ + } if (im->image8) { GETPROJ(image8, 0xff); } else { INT32 mask = 0xffffffff; if (im->bands == 3) { - ((UINT8*) &mask)[3] = 0; + ((UINT8 *)&mask)[3] = 0; } GETPROJ(image32, mask); } @@ -123,16 +117,14 @@ ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj) return 1; /* ok */ } - int -ImagingGetExtrema(Imaging im, void *extrema) -{ +ImagingGetExtrema(Imaging im, void *extrema) { int x, y; INT32 imin, imax; FLOAT32 fmin, fmax; if (im->bands != 1) { - (void) ImagingError_ModeError(); + (void)ImagingError_ModeError(); return -1; /* mismatch */ } @@ -141,111 +133,109 @@ ImagingGetExtrema(Imaging im, void *extrema) } switch (im->type) { - case IMAGING_TYPE_UINT8: - imin = imax = im->image8[0][0]; - for (y = 0; y < im->ysize; y++) { - UINT8* in = im->image8[y]; - for (x = 0; x < im->xsize; x++) { - if (imin > in[x]) { - imin = in[x]; - } else if (imax < in[x]) { - imax = in[x]; + case IMAGING_TYPE_UINT8: + imin = imax = im->image8[0][0]; + for (y = 0; y < im->ysize; y++) { + UINT8 *in = im->image8[y]; + for (x = 0; x < im->xsize; x++) { + if (imin > in[x]) { + imin = in[x]; + } else if (imax < in[x]) { + imax = in[x]; + } } } - } - ((UINT8*) extrema)[0] = (UINT8) imin; - ((UINT8*) extrema)[1] = (UINT8) imax; - break; - case IMAGING_TYPE_INT32: - imin = imax = im->image32[0][0]; - for (y = 0; y < im->ysize; y++) { - INT32* in = im->image32[y]; - for (x = 0; x < im->xsize; x++) { - if (imin > in[x]) { - imin = in[x]; - } else if (imax < in[x]) { - imax = in[x]; + ((UINT8 *)extrema)[0] = (UINT8)imin; + ((UINT8 *)extrema)[1] = (UINT8)imax; + break; + case IMAGING_TYPE_INT32: + imin = imax = im->image32[0][0]; + for (y = 0; y < im->ysize; y++) { + INT32 *in = im->image32[y]; + for (x = 0; x < im->xsize; x++) { + if (imin > in[x]) { + imin = in[x]; + } else if (imax < in[x]) { + imax = in[x]; + } } } - } - memcpy(extrema, &imin, sizeof(imin)); - memcpy(((char*)extrema) + sizeof(imin), &imax, sizeof(imax)); - break; - case IMAGING_TYPE_FLOAT32: - fmin = fmax = ((FLOAT32*) im->image32[0])[0]; - for (y = 0; y < im->ysize; y++) { - FLOAT32* in = (FLOAT32*) im->image32[y]; - for (x = 0; x < im->xsize; x++) { - if (fmin > in[x]) { - fmin = in[x]; - } else if (fmax < in[x]) { - fmax = in[x]; + memcpy(extrema, &imin, sizeof(imin)); + memcpy(((char *)extrema) + sizeof(imin), &imax, sizeof(imax)); + break; + case IMAGING_TYPE_FLOAT32: + fmin = fmax = ((FLOAT32 *)im->image32[0])[0]; + for (y = 0; y < im->ysize; y++) { + FLOAT32 *in = (FLOAT32 *)im->image32[y]; + for (x = 0; x < im->xsize; x++) { + if (fmin > in[x]) { + fmin = in[x]; + } else if (fmax < in[x]) { + fmax = in[x]; + } } } - } - memcpy(extrema, &fmin, sizeof(fmin)); - memcpy(((char*)extrema) + sizeof(fmin), &fmax, sizeof(fmax)); - break; - case IMAGING_TYPE_SPECIAL: - if (strcmp(im->mode, "I;16") == 0) { - UINT16 v; - UINT8* pixel = *im->image8; + memcpy(extrema, &fmin, sizeof(fmin)); + memcpy(((char *)extrema) + sizeof(fmin), &fmax, sizeof(fmax)); + break; + case IMAGING_TYPE_SPECIAL: + if (strcmp(im->mode, "I;16") == 0) { + UINT16 v; + UINT8 *pixel = *im->image8; #ifdef WORDS_BIGENDIAN - v = pixel[0] + (pixel[1] << 8); + v = pixel[0] + (pixel[1] << 8); #else - memcpy(&v, pixel, sizeof(v)); + memcpy(&v, pixel, sizeof(v)); #endif - imin = imax = v; - for (y = 0; y < im->ysize; y++) { - for (x = 0; x < im->xsize; x++) { - pixel = (UINT8*)im->image[y] + x * sizeof(v); + imin = imax = v; + for (y = 0; y < im->ysize; y++) { + for (x = 0; x < im->xsize; x++) { + pixel = (UINT8 *)im->image[y] + x * sizeof(v); #ifdef WORDS_BIGENDIAN - v = pixel[0] + (pixel[1] << 8); + v = pixel[0] + (pixel[1] << 8); #else - memcpy(&v, pixel, sizeof(v)); + memcpy(&v, pixel, sizeof(v)); #endif - if (imin > v) { - imin = v; - } else if (imax < v) { - imax = v; - } - } - } - v = (UINT16) imin; - memcpy(extrema, &v, sizeof(v)); - v = (UINT16) imax; - memcpy(((char*)extrema) + sizeof(v), &v, sizeof(v)); - break; - } - /* FALL THROUGH */ - default: - (void) ImagingError_ModeError(); - return -1; + if (imin > v) { + imin = v; + } else if (imax < v) { + imax = v; + } + } + } + v = (UINT16)imin; + memcpy(extrema, &v, sizeof(v)); + v = (UINT16)imax; + memcpy(((char *)extrema) + sizeof(v), &v, sizeof(v)); + break; + } + /* FALL THROUGH */ + default: + (void)ImagingError_ModeError(); + return -1; } return 1; /* ok */ } - /* static ImagingColorItem* getcolors8(Imaging im, int maxcolors, int* size);*/ -static ImagingColorItem* getcolors32(Imaging im, int maxcolors, int* size); +static ImagingColorItem * +getcolors32(Imaging im, int maxcolors, int *size); -ImagingColorItem* -ImagingGetColors(Imaging im, int maxcolors, int* size) -{ +ImagingColorItem * +ImagingGetColors(Imaging im, int maxcolors, int *size) { /* FIXME: add support for 8-bit images */ return getcolors32(im, maxcolors, size); } -static ImagingColorItem* -getcolors32(Imaging im, int maxcolors, int* size) -{ +static ImagingColorItem * +getcolors32(Imaging im, int maxcolors, int *size) { unsigned int h; unsigned int i, incr; int colors; INT32 pixel_mask; int x, y; - ImagingColorItem* table; - ImagingColorItem* v; + ImagingColorItem *table; + ImagingColorItem *v; unsigned int code_size; unsigned int code_poly; @@ -256,19 +246,19 @@ getcolors32(Imaging im, int maxcolors, int* size) Python's Unicode property database (written by yours truly) /F */ static int SIZES[] = { - 4,3, 8,3, 16,3, 32,5, 64,3, 128,3, 256,29, 512,17, 1024,9, 2048,5, - 4096,83, 8192,27, 16384,43, 32768,3, 65536,45, 131072,9, 262144,39, - 524288,39, 1048576,9, 2097152,5, 4194304,3, 8388608,33, 16777216,27, - 33554432,9, 67108864,71, 134217728,39, 268435456,9, 536870912,5, - 1073741824,83, 0 - }; + 4, 3, 8, 3, 16, 3, 32, 5, 64, 3, + 128, 3, 256, 29, 512, 17, 1024, 9, 2048, 5, + 4096, 83, 8192, 27, 16384, 43, 32768, 3, 65536, 45, + 131072, 9, 262144, 39, 524288, 39, 1048576, 9, 2097152, 5, + 4194304, 3, 8388608, 33, 16777216, 27, 33554432, 9, 67108864, 71, + 134217728, 39, 268435456, 9, 536870912, 5, 1073741824, 83, 0}; code_size = code_poly = code_mask = 0; for (i = 0; SIZES[i]; i += 2) { if (SIZES[i] > maxcolors) { code_size = SIZES[i]; - code_poly = SIZES[i+1]; + code_poly = SIZES[i + 1]; code_mask = code_size - 1; break; } @@ -292,13 +282,13 @@ getcolors32(Imaging im, int maxcolors, int* size) pixel_mask = 0xffffffff; if (im->bands == 3) { - ((UINT8*) &pixel_mask)[3] = 0; + ((UINT8 *)&pixel_mask)[3] = 0; } colors = 0; for (y = 0; y < im->ysize; y++) { - INT32* p = im->image32[y]; + INT32 *p = im->image32[y]; for (x = 0; x < im->xsize; x++) { INT32 pixel = p[x] & pixel_mask; h = (pixel); /* null hashing */ @@ -309,7 +299,8 @@ getcolors32(Imaging im, int maxcolors, int* size) if (colors++ == maxcolors) { goto overflow; } - v->x = x; v->y = y; + v->x = x; + v->y = y; v->pixel = pixel; v->count = 1; continue; @@ -329,7 +320,8 @@ getcolors32(Imaging im, int maxcolors, int* size) if (colors++ == maxcolors) { goto overflow; } - v->x = x; v->y = y; + v->x = x; + v->y = y; v->pixel = pixel; v->count = 1; break; @@ -348,7 +340,7 @@ getcolors32(Imaging im, int maxcolors, int* size) overflow: /* pack the table */ - for (x = y = 0; x < (int) code_size; x++) + for (x = y = 0; x < (int)code_size; x++) if (table[x].count) { if (x != y) { table[y] = table[x]; diff --git a/src/libImaging/Gif.h b/src/libImaging/Gif.h index bb118396c..a85ce2b6e 100644 --- a/src/libImaging/Gif.h +++ b/src/libImaging/Gif.h @@ -7,17 +7,14 @@ * Copyright (c) Fredrik Lundh 1995-96. */ - /* Max size for a LZW code word. */ -#define GIFBITS 12 - -#define GIFTABLE (1< @@ -29,48 +28,44 @@ #include "Gif.h" - -#define NEWLINE(state, context) {\ - state->x = 0;\ - state->y += context->step;\ - while (state->y >= state->ysize)\ - switch (context->interlace) {\ - case 1:\ - context->repeat = state->y = 4;\ - context->interlace = 2;\ - break;\ - case 2:\ - context->step = 4;\ - context->repeat = state->y = 2;\ - context->interlace = 3;\ - break;\ - case 3:\ - context->step = 2;\ - context->repeat = state->y = 1;\ - context->interlace = 0;\ - break;\ - default:\ - return -1;\ - }\ - if (state->y < state->ysize) {\ - out = im->image8[state->y + state->yoff] + state->xoff;\ - }\ -} - +#define NEWLINE(state, context) \ + { \ + state->x = 0; \ + state->y += context->step; \ + while (state->y >= state->ysize) switch (context->interlace) { \ + case 1: \ + context->repeat = state->y = 4; \ + context->interlace = 2; \ + break; \ + case 2: \ + context->step = 4; \ + context->repeat = state->y = 2; \ + context->interlace = 3; \ + break; \ + case 3: \ + context->step = 2; \ + context->repeat = state->y = 1; \ + context->interlace = 0; \ + break; \ + default: \ + return -1; \ + } \ + if (state->y < state->ysize) { \ + out = im->image8[state->y + state->yoff] + state->xoff; \ + } \ + } int -ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t bytes) -{ - UINT8* p; - UINT8* out; +ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes) { + UINT8 *p; + UINT8 *out; int c, i; int thiscode; - GIFDECODERSTATE *context = (GIFDECODERSTATE*) state->context; + GIFDECODERSTATE *context = (GIFDECODERSTATE *)state->context; UINT8 *ptr = buffer; if (!state->state) { - /* Initialise state */ if (context->bits < 0 || context->bits > 12) { state->errcode = IMAGING_CODEC_CONFIG; @@ -97,9 +92,7 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t out = im->image8[state->y + state->yoff] + state->xoff + state->x; for (;;) { - if (state->state == 1) { - /* First free entry in table */ context->next = context->clear + 2; @@ -115,7 +108,6 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t } if (context->bufferindex < GIFBUFFER) { - /* Return whole buffer in one chunk */ i = GIFBUFFER - context->bufferindex; p = &context->buffer[context->bufferindex]; @@ -123,24 +115,21 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t context->bufferindex = GIFBUFFER; } else { - /* Get current symbol */ while (context->bitcount < context->codesize) { - if (context->blocksize > 0) { - /* Read next byte */ - c = *ptr++; bytes--; + c = *ptr++; + bytes--; context->blocksize--; /* New bits are shifted in from from the left. */ - context->bitbuffer |= (INT32) c << context->bitcount; + context->bitbuffer |= (INT32)c << context->bitcount; context->bitcount += 8; } else { - /* New GIF block */ /* We don't start decoding unless we have a full block */ @@ -148,19 +137,19 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t return ptr - buffer; } c = *ptr; - if (bytes < c+1) { + if (bytes < c + 1) { return ptr - buffer; } context->blocksize = c; - ptr++; bytes--; - + ptr++; + bytes--; } } /* Extract current symbol from bit buffer. */ - c = (int) context->bitbuffer & context->codemask; + c = (int)context->bitbuffer & context->codemask; /* Adjust buffer */ context->bitbuffer >>= context->codesize; @@ -185,7 +174,6 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t p = &context->lastdata; if (state->state == 2) { - /* First valid symbol after clear; use as is */ if (c > context->clear) { state->errcode = IMAGING_CODEC_BROKEN; @@ -196,7 +184,6 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t state->state = 3; } else { - thiscode = c; if (c > context->next) { @@ -205,7 +192,6 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t } if (c == context->next) { - /* c == next is allowed. not sure why. */ if (context->bufferindex <= 0) { @@ -213,15 +199,12 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t return -1; } - context->buffer[--context->bufferindex] = - context->lastdata; + context->buffer[--context->bufferindex] = context->lastdata; c = context->lastcode; - } while (c >= context->clear) { - /* Copy data string to buffer (beginning from right) */ if (context->bufferindex <= 0 || c >= GIFTABLE) { @@ -229,8 +212,7 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t return -1; } - context->buffer[--context->bufferindex] = - context->data[c]; + context->buffer[--context->bufferindex] = context->data[c]; c = context->link[c]; } @@ -238,26 +220,22 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t context->lastdata = c; if (context->next < GIFTABLE) { - /* We'll only add this symbol if we have room for it (take advise, Netscape!) */ context->data[context->next] = c; context->link[context->next] = context->lastcode; if (context->next == context->codemask && - context->codesize < GIFBITS) { - + context->codesize < GIFBITS) { /* Expand code size */ context->codesize++; context->codemask = (1 << context->codesize) - 1; } context->next++; - } context->lastcode = thiscode; - } } @@ -273,7 +251,7 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t /* FIXME: should we handle the transparency index in here??? */ if (i == 1) { - if (state->x < state->xsize-1) { + if (state->x < state->xsize - 1) { /* Single pixel, not at the end of the line. */ *out++ = p[0]; state->x++; @@ -282,7 +260,7 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t } else if (state->x + i <= state->xsize) { /* This string fits into current line. */ memcpy(out, p, i); - out += i; + out += i; state->x += i; if (state->x == state->xsize) { NEWLINE(state, context); diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index a0fef9933..14fd07cdd 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -35,12 +35,11 @@ enum { INIT, ENCODE, ENCODE_EOF, FLUSH, EXIT }; necessary. */ static inline int -emit(GIFENCODERSTATE *context, int byte) -{ +emit(GIFENCODERSTATE *context, int byte) { /* write a byte to the output buffer */ if (!context->block || context->block->size == 255) { - GIFENCODERBLOCK* block; + GIFENCODERBLOCK *block; /* no room in the current block (or no current block); allocate a new one */ @@ -74,7 +73,6 @@ emit(GIFENCODERSTATE *context, int byte) block->next = NULL; context->block = block; - } /* write new byte to block */ @@ -86,68 +84,68 @@ emit(GIFENCODERSTATE *context, int byte) /* write a code word to the current block. this is a macro to make sure it's inlined on all platforms */ -#define EMIT(code) {\ - context->bitbuffer |= ((INT32) (code)) << context->bitcount;\ - context->bitcount += 9;\ - while (context->bitcount >= 8) {\ - if (!emit(context, (UINT8) context->bitbuffer)) {\ - state->errcode = IMAGING_CODEC_MEMORY;\ - return 0;\ - }\ - context->bitbuffer >>= 8;\ - context->bitcount -= 8;\ - }\ -} +#define EMIT(code) \ + { \ + context->bitbuffer |= ((INT32)(code)) << context->bitcount; \ + context->bitcount += 9; \ + while (context->bitcount >= 8) { \ + if (!emit(context, (UINT8)context->bitbuffer)) { \ + state->errcode = IMAGING_CODEC_MEMORY; \ + return 0; \ + } \ + context->bitbuffer >>= 8; \ + context->bitcount -= 8; \ + } \ + } /* write a run. we use a combination of literals and combinations of literals. this can give quite decent compression for images with long stretches of identical pixels. but remember: if you want really good compression, use another file format. */ -#define EMIT_RUN(label) {\ -label:\ - while (context->count > 0) {\ - int run = 2;\ - EMIT(context->last);\ - context->count--;\ - if (state->count++ == LAST_CODE) {\ - EMIT(CLEAR_CODE);\ - state->count = FIRST_CODE;\ - goto label;\ - }\ - while (context->count >= run) {\ - EMIT(state->count - 1);\ - context->count -= run;\ - run++;\ - if (state->count++ == LAST_CODE) {\ - EMIT(CLEAR_CODE);\ - state->count = FIRST_CODE;\ - goto label;\ - }\ - }\ - if (context->count > 1) {\ - EMIT(state->count - 1 - (run - context->count));\ - context->count = 0;\ - if (state->count++ == LAST_CODE) {\ - EMIT(CLEAR_CODE);\ - state->count = FIRST_CODE;\ - }\ - break;\ - }\ - }\ -} +#define EMIT_RUN(label) \ + { \ + label: \ + while (context->count > 0) { \ + int run = 2; \ + EMIT(context->last); \ + context->count--; \ + if (state->count++ == LAST_CODE) { \ + EMIT(CLEAR_CODE); \ + state->count = FIRST_CODE; \ + goto label; \ + } \ + while (context->count >= run) { \ + EMIT(state->count - 1); \ + context->count -= run; \ + run++; \ + if (state->count++ == LAST_CODE) { \ + EMIT(CLEAR_CODE); \ + state->count = FIRST_CODE; \ + goto label; \ + } \ + } \ + if (context->count > 1) { \ + EMIT(state->count - 1 - (run - context->count)); \ + context->count = 0; \ + if (state->count++ == LAST_CODE) { \ + EMIT(CLEAR_CODE); \ + state->count = FIRST_CODE; \ + } \ + break; \ + } \ + } \ + } int -ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - UINT8* ptr; +ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + UINT8 *ptr; int this; - GIFENCODERBLOCK* block; - GIFENCODERSTATE *context = (GIFENCODERSTATE*) state->context; + GIFENCODERBLOCK *block; + GIFENCODERSTATE *context = (GIFENCODERSTATE *)state->context; if (!state->state) { - /* place a clear code in the output buffer */ context->bitbuffer = CLEAR_CODE; context->bitcount = 9; @@ -167,22 +165,17 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) if (state->xsize <= 0 || state->ysize <= 0) { state->state = ENCODE_EOF; } - } ptr = buf; - for (;;) - - switch (state->state) { - + for (;;) switch (state->state) { case INIT: case ENCODE: /* identify and store a run of pixels */ if (state->x == 0 || state->x >= state->xsize) { - if (!context->interlace && state->y >= state->ysize) { state->state = ENCODE_EOF; break; @@ -196,9 +189,9 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* get another line of data */ state->shuffle( state->buffer, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->xsize - ); + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); state->x = 0; @@ -231,7 +224,6 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* just make sure we don't loop forever */ context->interlace = 0; } - } /* Potential special case for xsize==1 */ if (state->x < state->xsize) { @@ -250,7 +242,6 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } break; - case ENCODE_EOF: /* write the final run */ @@ -261,7 +252,7 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* empty the bit buffer */ while (context->bitcount > 0) { - if (!emit(context, (UINT8) context->bitbuffer)) { + if (!emit(context, (UINT8)context->bitbuffer)) { state->errcode = IMAGING_CODEC_MEMORY; return 0; } @@ -271,7 +262,7 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* flush the last block, and exit */ if (context->block) { - GIFENCODERBLOCK* block; + GIFENCODERBLOCK *block; block = context->flush; while (block && block->next) { block = block->next; @@ -291,45 +282,41 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) case EXIT: case FLUSH: - while (context->flush) { - - /* get a block from the flush queue */ - block = context->flush; - - if (block->size > 0) { - - /* make sure it fits into the output buffer */ - if (bytes < block->size+1) { - return ptr - buf; - } - - ptr[0] = block->size; - memcpy(ptr+1, block->data, block->size); - - ptr += block->size+1; - bytes -= block->size+1; + while (context->flush) { + /* get a block from the flush queue */ + block = context->flush; + if (block->size > 0) { + /* make sure it fits into the output buffer */ + if (bytes < block->size + 1) { + return ptr - buf; } - context->flush = block->next; - - if (context->free) { - free(context->free); - } - context->free = block; + ptr[0] = block->size; + memcpy(ptr + 1, block->data, block->size); + ptr += block->size + 1; + bytes -= block->size + 1; } - if (state->state == EXIT) { - /* this was the last block! */ - if (context->free) { - free(context->free); - } - state->errcode = IMAGING_CODEC_END; - return ptr - buf; - } + context->flush = block->next; - state->state = ENCODE; - break; - } + if (context->free) { + free(context->free); + } + context->free = block; + } + + if (state->state == EXIT) { + /* this was the last block! */ + if (context->free) { + free(context->free); + } + state->errcode = IMAGING_CODEC_END; + return ptr - buf; + } + + state->state = ENCODE; + break; + } } diff --git a/src/libImaging/HexDecode.c b/src/libImaging/HexDecode.c index 1def8766f..bd16cdbe1 100644 --- a/src/libImaging/HexDecode.c +++ b/src/libImaging/HexDecode.c @@ -13,23 +13,22 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" -#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ - (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ - (v >= 'A' && v <= 'F') ? v - 'A' + 10 : -1) +#define HEX(v) \ + ((v >= '0' && v <= '9') ? v - '0' \ + : (v >= 'a' && v <= 'f') ? v - 'a' + 10 \ + : (v >= 'A' && v <= 'F') ? v - 'A' + 10 \ + : -1) int -ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - UINT8* ptr; +ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + UINT8 *ptr; int a, b; ptr = buf; for (;;) { - if (bytes < 2) { return ptr - buf; } @@ -38,22 +37,19 @@ ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt b = HEX(ptr[1]); if (a < 0 || b < 0) { - ptr++; bytes--; } else { - ptr += 2; bytes -= 2; - state->buffer[state->x] = (a<<4) + b; + state->buffer[state->x] = (a << 4) + b; if (++state->x >= state->bytes) { - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y], state->buffer, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y], state->buffer, state->xsize); state->x = 0; @@ -62,7 +58,6 @@ ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt return -1; } } - } } } diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 512e57a98..c5a547a64 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -16,10 +16,8 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - /* HISTOGRAM */ /* -------------------------------------------------------------------- * Take a histogram of an image. Returns a histogram object containing @@ -27,8 +25,7 @@ */ void -ImagingHistogramDelete(ImagingHistogram h) -{ +ImagingHistogramDelete(ImagingHistogram h) { if (h) { if (h->histogram) { free(h->histogram); @@ -38,31 +35,29 @@ ImagingHistogramDelete(ImagingHistogram h) } ImagingHistogram -ImagingHistogramNew(Imaging im) -{ +ImagingHistogramNew(Imaging im) { ImagingHistogram h; /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); if (!h) { - return (ImagingHistogram) ImagingError_MemoryError(); + return (ImagingHistogram)ImagingError_MemoryError(); } - strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH-1); - h->mode[IMAGING_MODE_LENGTH-1] = 0; + strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH - 1); + h->mode[IMAGING_MODE_LENGTH - 1] = 0; h->bands = im->bands; h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); if (!h->histogram) { free(h); - return (ImagingHistogram) ImagingError_MemoryError(); + return (ImagingHistogram)ImagingError_MemoryError(); } return h; } ImagingHistogram -ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) -{ +ImagingGetHistogram(Imaging im, Imaging imMask, void *minmax) { ImagingSectionCookie cookie; int x, y, i; ImagingHistogram h; @@ -107,13 +102,13 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) } ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { - UINT8* in = (UINT8*) im->image32[y]; + UINT8 *in = (UINT8 *)im->image32[y]; for (x = 0; x < im->xsize; x++) { if (imMask->image8[y][x] != 0) { h->histogram[(*in++)]++; - h->histogram[(*in++)+256]++; - h->histogram[(*in++)+512]++; - h->histogram[(*in++)+768]++; + h->histogram[(*in++) + 256]++; + h->histogram[(*in++) + 512]++; + h->histogram[(*in++) + 768]++; } else { in += 4; } @@ -136,12 +131,12 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) case IMAGING_TYPE_UINT8: ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { - UINT8* in = (UINT8*) im->image[y]; + UINT8 *in = (UINT8 *)im->image[y]; for (x = 0; x < im->xsize; x++) { h->histogram[(*in++)]++; - h->histogram[(*in++)+256]++; - h->histogram[(*in++)+512]++; - h->histogram[(*in++)+768]++; + h->histogram[(*in++) + 256]++; + h->histogram[(*in++) + 512]++; + h->histogram[(*in++) + 768]++; } } ImagingSectionLeave(&cookie); @@ -155,16 +150,16 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) break; } memcpy(&imin, minmax, sizeof(imin)); - memcpy(&imax, ((char*)minmax) + sizeof(imin), sizeof(imax)); + memcpy(&imax, ((char *)minmax) + sizeof(imin), sizeof(imax)); if (imin >= imax) { break; } ImagingSectionEnter(&cookie); scale = 255.0F / (imax - imin); for (y = 0; y < im->ysize; y++) { - INT32* in = im->image32[y]; + INT32 *in = im->image32[y]; for (x = 0; x < im->xsize; x++) { - i = (int) (((*in++)-imin)*scale); + i = (int)(((*in++) - imin) * scale); if (i >= 0 && i < 256) { h->histogram[i]++; } @@ -181,16 +176,16 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) break; } memcpy(&fmin, minmax, sizeof(fmin)); - memcpy(&fmax, ((char*)minmax) + sizeof(fmin), sizeof(fmax)); + memcpy(&fmax, ((char *)minmax) + sizeof(fmin), sizeof(fmax)); if (fmin >= fmax) { break; } ImagingSectionEnter(&cookie); scale = 255.0F / (fmax - fmin); for (y = 0; y < im->ysize; y++) { - FLOAT32* in = (FLOAT32*) im->image32[y]; + FLOAT32 *in = (FLOAT32 *)im->image32[y]; for (x = 0; x < im->xsize; x++) { - i = (int) (((*in++)-fmin)*scale); + i = (int)(((*in++) - fmin) * scale); if (i >= 0 && i < 256) { h->histogram[i]++; } diff --git a/src/libImaging/ImDib.h b/src/libImaging/ImDib.h index e5a2cc0f6..91ff3f322 100644 --- a/src/libImaging/ImDib.h +++ b/src/libImaging/ImDib.h @@ -35,20 +35,27 @@ struct ImagingDIBInstance { ImagingShuffler unpack; }; -typedef struct ImagingDIBInstance* ImagingDIB; +typedef struct ImagingDIBInstance *ImagingDIB; -extern char* ImagingGetModeDIB(int size_out[2]); +extern char * +ImagingGetModeDIB(int size_out[2]); -extern ImagingDIB ImagingNewDIB(const char *mode, int xsize, int ysize); +extern ImagingDIB +ImagingNewDIB(const char *mode, int xsize, int ysize); -extern void ImagingDeleteDIB(ImagingDIB im); +extern void +ImagingDeleteDIB(ImagingDIB im); -extern void ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]); -extern void ImagingExposeDIB(ImagingDIB dib, void *dc); +extern void +ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]); +extern void +ImagingExposeDIB(ImagingDIB dib, void *dc); -extern int ImagingQueryPaletteDIB(ImagingDIB dib, void *dc); +extern int +ImagingQueryPaletteDIB(ImagingDIB dib, void *dc); -extern void ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]); +extern void +ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]); #if defined(__cplusplus) } diff --git a/src/libImaging/ImPlatform.h b/src/libImaging/ImPlatform.h index 576ceaa58..9a2060edf 100644 --- a/src/libImaging/ImPlatform.h +++ b/src/libImaging/ImPlatform.h @@ -10,7 +10,8 @@ #include "Python.h" /* Workaround issue #2479 */ -#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) && !defined(PYPY_VERSION) +#if PY_VERSION_HEX < 0x03070000 && defined(PySlice_GetIndicesEx) && \ + !defined(PYPY_VERSION) #undef PySlice_GetIndicesEx #endif @@ -62,7 +63,7 @@ #define INT64 long #endif -#define INT8 signed char +#define INT8 signed char #define UINT8 unsigned char #define UINT16 unsigned INT16 @@ -76,11 +77,9 @@ #define FLOAT64 double #ifdef _MSC_VER -typedef signed __int64 int64_t; +typedef signed __int64 int64_t; #endif #ifdef __GNUC__ - #define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index d7dbe0325..ae323f390 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -10,20 +10,16 @@ * See the README file for information on usage and redistribution. */ - #include "ImPlatform.h" - #if defined(__cplusplus) extern "C" { #endif - #ifndef M_PI -#define M_PI 3.1415926535897932384626433832795 +#define M_PI 3.1415926535897932384626433832795 #endif - /* -------------------------------------------------------------------- */ /* @@ -57,12 +53,12 @@ extern "C" { /* Handles */ -typedef struct ImagingMemoryInstance* Imaging; +typedef struct ImagingMemoryInstance *Imaging; -typedef struct ImagingAccessInstance* ImagingAccess; -typedef struct ImagingHistogramInstance* ImagingHistogram; -typedef struct ImagingOutlineInstance* ImagingOutline; -typedef struct ImagingPaletteInstance* ImagingPalette; +typedef struct ImagingAccessInstance *ImagingAccess; +typedef struct ImagingHistogramInstance *ImagingHistogram; +typedef struct ImagingOutlineInstance *ImagingOutline; +typedef struct ImagingPaletteInstance *ImagingPalette; /* handle magics (used with PyCObject). */ #define IMAGING_MAGIC "PIL Imaging" @@ -73,7 +69,8 @@ typedef struct ImagingPaletteInstance* ImagingPalette; #define IMAGING_TYPE_FLOAT32 2 #define IMAGING_TYPE_SPECIAL 3 /* check mode for details */ -#define IMAGING_MODE_LENGTH 6+1 /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */ +#define IMAGING_MODE_LENGTH \ + 6 + 1 /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */ typedef struct { char *ptr; @@ -81,158 +78,178 @@ typedef struct { } ImagingMemoryBlock; struct ImagingMemoryInstance { - /* Format */ - char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", "YCbCr", "BGR;xy") */ - int type; /* Data type (IMAGING_TYPE_*) */ - int depth; /* Depth (ignored in this version) */ - int bands; /* Number of bands (1, 2, 3, or 4) */ - int xsize; /* Image dimension. */ + char mode[IMAGING_MODE_LENGTH]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK", + "YCbCr", "BGR;xy") */ + int type; /* Data type (IMAGING_TYPE_*) */ + int depth; /* Depth (ignored in this version) */ + int bands; /* Number of bands (1, 2, 3, or 4) */ + int xsize; /* Image dimension. */ int ysize; /* Colour palette (for "P" images only) */ ImagingPalette palette; /* Data pointers */ - UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */ - INT32 **image32; /* Set for 32-bit images (pixelsize=4). */ + UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */ + INT32 **image32; /* Set for 32-bit images (pixelsize=4). */ /* Internals */ - char **image; /* Actual raster data. */ - char *block; /* Set if data is allocated in a single block. */ - ImagingMemoryBlock *blocks; /* Memory blocks for pixel storage */ + char **image; /* Actual raster data. */ + char *block; /* Set if data is allocated in a single block. */ + ImagingMemoryBlock *blocks; /* Memory blocks for pixel storage */ - int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */ - int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ + int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */ + int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ /* Virtual methods */ void (*destroy)(Imaging im); }; +#define IMAGING_PIXEL_1(im, x, y) ((im)->image8[(y)][(x)]) +#define IMAGING_PIXEL_L(im, x, y) ((im)->image8[(y)][(x)]) +#define IMAGING_PIXEL_LA(im, x, y) ((im)->image[(y)][(x)*4]) +#define IMAGING_PIXEL_P(im, x, y) ((im)->image8[(y)][(x)]) +#define IMAGING_PIXEL_PA(im, x, y) ((im)->image[(y)][(x)*4]) +#define IMAGING_PIXEL_I(im, x, y) ((im)->image32[(y)][(x)]) +#define IMAGING_PIXEL_F(im, x, y) (((FLOAT32 *)(im)->image32[y])[x]) +#define IMAGING_PIXEL_RGB(im, x, y) ((im)->image[(y)][(x)*4]) +#define IMAGING_PIXEL_RGBA(im, x, y) ((im)->image[(y)][(x)*4]) +#define IMAGING_PIXEL_CMYK(im, x, y) ((im)->image[(y)][(x)*4]) +#define IMAGING_PIXEL_YCbCr(im, x, y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_1(im,x,y) ((im)->image8[(y)][(x)]) -#define IMAGING_PIXEL_L(im,x,y) ((im)->image8[(y)][(x)]) -#define IMAGING_PIXEL_LA(im,x,y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_P(im,x,y) ((im)->image8[(y)][(x)]) -#define IMAGING_PIXEL_PA(im,x,y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_I(im,x,y) ((im)->image32[(y)][(x)]) -#define IMAGING_PIXEL_F(im,x,y) (((FLOAT32*)(im)->image32[y])[x]) -#define IMAGING_PIXEL_RGB(im,x,y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_RGBA(im,x,y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_CMYK(im,x,y) ((im)->image[(y)][(x)*4]) -#define IMAGING_PIXEL_YCbCr(im,x,y) ((im)->image[(y)][(x)*4]) - -#define IMAGING_PIXEL_UINT8(im,x,y) ((im)->image8[(y)][(x)]) -#define IMAGING_PIXEL_INT32(im,x,y) ((im)->image32[(y)][(x)]) -#define IMAGING_PIXEL_FLOAT32(im,x,y) (((FLOAT32*)(im)->image32[y])[x]) +#define IMAGING_PIXEL_UINT8(im, x, y) ((im)->image8[(y)][(x)]) +#define IMAGING_PIXEL_INT32(im, x, y) ((im)->image32[(y)][(x)]) +#define IMAGING_PIXEL_FLOAT32(im, x, y) (((FLOAT32 *)(im)->image32[y])[x]) struct ImagingAccessInstance { - const char* mode; - void* (*line)(Imaging im, int x, int y); - void (*get_pixel)(Imaging im, int x, int y, void* pixel); - void (*put_pixel)(Imaging im, int x, int y, const void* pixel); + const char *mode; + void *(*line)(Imaging im, int x, int y); + void (*get_pixel)(Imaging im, int x, int y, void *pixel); + void (*put_pixel)(Imaging im, int x, int y, const void *pixel); }; struct ImagingHistogramInstance { - /* Format */ - char mode[IMAGING_MODE_LENGTH]; /* Band names (of corresponding source image) */ - int bands; /* Number of bands (1, 3, or 4) */ + char mode[IMAGING_MODE_LENGTH]; /* Band names (of corresponding source image) */ + int bands; /* Number of bands (1, 3, or 4) */ /* Data */ - long *histogram; /* Histogram (bands*256 longs) */ - + long *histogram; /* Histogram (bands*256 longs) */ }; - struct ImagingPaletteInstance { - /* Format */ - char mode[IMAGING_MODE_LENGTH]; /* Band names */ + char mode[IMAGING_MODE_LENGTH]; /* Band names */ /* Data */ - UINT8 palette[1024];/* Palette data (same format as image data) */ - - INT16* cache; /* Palette cache (used for predefined palettes) */ - int keep_cache; /* This palette will be reused; keep cache */ + UINT8 palette[1024]; /* Palette data (same format as image data) */ + INT16 *cache; /* Palette cache (used for predefined palettes) */ + int keep_cache; /* This palette will be reused; keep cache */ }; typedef struct ImagingMemoryArena { - int alignment; /* Alignment in memory of each line of an image */ - int block_size; /* Preferred block size, bytes */ - int blocks_max; /* Maximum number of cached blocks */ - int blocks_cached; /* Current number of blocks not associated with images */ + int alignment; /* Alignment in memory of each line of an image */ + int block_size; /* Preferred block size, bytes */ + int blocks_max; /* Maximum number of cached blocks */ + int blocks_cached; /* Current number of blocks not associated with images */ ImagingMemoryBlock *blocks_pool; - int stats_new_count; /* Number of new allocated images */ - int stats_allocated_blocks; /* Number of allocated blocks */ - int stats_reused_blocks; /* Number of blocks which were retrieved from a pool */ - int stats_reallocated_blocks; /* Number of blocks which were actually reallocated after retrieving */ - int stats_freed_blocks; /* Number of freed blocks */ -} *ImagingMemoryArena; - + int stats_new_count; /* Number of new allocated images */ + int stats_allocated_blocks; /* Number of allocated blocks */ + int stats_reused_blocks; /* Number of blocks which were retrieved from a pool */ + int stats_reallocated_blocks; /* Number of blocks which were actually reallocated + after retrieving */ + int stats_freed_blocks; /* Number of freed blocks */ +} * ImagingMemoryArena; /* Objects */ /* ------- */ extern struct ImagingMemoryArena ImagingDefaultArena; -extern int ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max); -extern void ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size); +extern int +ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max); +extern void +ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size); -extern Imaging ImagingNew(const char* mode, int xsize, int ysize); -extern Imaging ImagingNewDirty(const char* mode, int xsize, int ysize); -extern Imaging ImagingNew2Dirty(const char* mode, Imaging imOut, Imaging imIn); -extern void ImagingDelete(Imaging im); +extern Imaging +ImagingNew(const char *mode, int xsize, int ysize); +extern Imaging +ImagingNewDirty(const char *mode, int xsize, int ysize); +extern Imaging +ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn); +extern void +ImagingDelete(Imaging im); -extern Imaging ImagingNewBlock(const char* mode, int xsize, int ysize); +extern Imaging +ImagingNewBlock(const char *mode, int xsize, int ysize); -extern Imaging ImagingNewPrologue(const char *mode, - int xsize, int ysize); -extern Imaging ImagingNewPrologueSubtype(const char *mode, - int xsize, int ysize, - int structure_size); +extern Imaging +ImagingNewPrologue(const char *mode, int xsize, int ysize); +extern Imaging +ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int structure_size); -extern void ImagingCopyPalette(Imaging destination, Imaging source); +extern void +ImagingCopyPalette(Imaging destination, Imaging source); -extern void ImagingHistogramDelete(ImagingHistogram histogram); +extern void +ImagingHistogramDelete(ImagingHistogram histogram); -extern void ImagingAccessInit(void); -extern ImagingAccess ImagingAccessNew(Imaging im); -extern void _ImagingAccessDelete(Imaging im, ImagingAccess access); +extern void +ImagingAccessInit(void); +extern ImagingAccess +ImagingAccessNew(Imaging im); +extern void +_ImagingAccessDelete(Imaging im, ImagingAccess access); #define ImagingAccessDelete(im, access) /* nop, for now */ -extern ImagingPalette ImagingPaletteNew(const char *mode); -extern ImagingPalette ImagingPaletteNewBrowser(void); -extern ImagingPalette ImagingPaletteDuplicate(ImagingPalette palette); -extern void ImagingPaletteDelete(ImagingPalette palette); +extern ImagingPalette +ImagingPaletteNew(const char *mode); +extern ImagingPalette +ImagingPaletteNewBrowser(void); +extern ImagingPalette +ImagingPaletteDuplicate(ImagingPalette palette); +extern void +ImagingPaletteDelete(ImagingPalette palette); -extern int ImagingPaletteCachePrepare(ImagingPalette palette); -extern void ImagingPaletteCacheUpdate(ImagingPalette palette, - int r, int g, int b); -extern void ImagingPaletteCacheDelete(ImagingPalette palette); +extern int +ImagingPaletteCachePrepare(ImagingPalette palette); +extern void +ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b); +extern void +ImagingPaletteCacheDelete(ImagingPalette palette); -#define ImagingPaletteCache(p, r, g, b)\ - p->cache[(r>>2) + (g>>2)*64 + (b>>2)*64*64] +#define ImagingPaletteCache(p, r, g, b) \ + p->cache[(r >> 2) + (g >> 2) * 64 + (b >> 2) * 64 * 64] -extern Imaging ImagingQuantize(Imaging im, int colours, int mode, int kmeans); +extern Imaging +ImagingQuantize(Imaging im, int colours, int mode, int kmeans); /* Threading */ /* --------- */ -typedef void* ImagingSectionCookie; +typedef void *ImagingSectionCookie; -extern void ImagingSectionEnter(ImagingSectionCookie* cookie); -extern void ImagingSectionLeave(ImagingSectionCookie* cookie); +extern void +ImagingSectionEnter(ImagingSectionCookie *cookie); +extern void +ImagingSectionLeave(ImagingSectionCookie *cookie); /* Exceptions */ /* ---------- */ -extern void* ImagingError_OSError(void); -extern void* ImagingError_MemoryError(void); -extern void* ImagingError_ModeError(void); /* maps to ValueError by default */ -extern void* ImagingError_Mismatch(void); /* maps to ValueError by default */ -extern void* ImagingError_ValueError(const char* message); -extern void ImagingError_Clear(void); +extern void * +ImagingError_OSError(void); +extern void * +ImagingError_MemoryError(void); +extern void * +ImagingError_ModeError(void); /* maps to ValueError by default */ +extern void * +ImagingError_Mismatch(void); /* maps to ValueError by default */ +extern void * +ImagingError_ValueError(const char *message); +extern void +ImagingError_Clear(void); /* Transform callbacks */ /* ------------------- */ @@ -242,7 +259,6 @@ extern void ImagingError_Clear(void); #define IMAGING_TRANSFORM_PERSPECTIVE 2 #define IMAGING_TRANSFORM_QUAD 3 - /* standard filters */ #define IMAGING_TRANSFORM_NEAREST 0 #define IMAGING_TRANSFORM_BOX 4 @@ -251,249 +267,391 @@ extern void ImagingError_Clear(void); #define IMAGING_TRANSFORM_BICUBIC 3 #define IMAGING_TRANSFORM_LANCZOS 1 -typedef int (*ImagingTransformMap)(double* X, double* Y, - int x, int y, void* data); -typedef int (*ImagingTransformFilter)(void* out, Imaging im, - double x, double y); +typedef int (*ImagingTransformMap)(double *X, double *Y, int x, int y, void *data); +typedef int (*ImagingTransformFilter)(void *out, Imaging im, double x, double y); /* Image Manipulation Methods */ /* -------------------------- */ -extern Imaging ImagingAlphaComposite(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha); -extern Imaging ImagingCopy(Imaging im); -extern Imaging ImagingConvert(Imaging im, const char* mode, ImagingPalette palette, int dither); -extern Imaging ImagingConvertInPlace(Imaging im, const char* mode); -extern Imaging ImagingConvertMatrix(Imaging im, const char *mode, float m[]); -extern Imaging ImagingConvertTransparent(Imaging im, const char *mode, int r, int g, int b); -extern Imaging ImagingCrop(Imaging im, int x0, int y0, int x1, int y1); -extern Imaging ImagingExpand(Imaging im, int x, int y, int mode); -extern Imaging ImagingFill(Imaging im, const void* ink); -extern int ImagingFill2( - Imaging into, const void* ink, Imaging mask, - int x0, int y0, int x1, int y1); -extern Imaging ImagingFillBand(Imaging im, int band, int color); -extern Imaging ImagingFillLinearGradient(const char* mode); -extern Imaging ImagingFillRadialGradient(const char* mode); -extern Imaging ImagingFilter( - Imaging im, int xsize, int ysize, const FLOAT32* kernel, - FLOAT32 offset); -extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn); -extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn); -extern Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, - int passes); -extern Imaging ImagingGetBand(Imaging im, int band); -extern Imaging ImagingMerge(const char* mode, Imaging bands[4]); -extern int ImagingSplit(Imaging im, Imaging bands[4]); -extern int ImagingGetBBox(Imaging im, int bbox[4]); -typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem; -extern ImagingColorItem* ImagingGetColors(Imaging im, int maxcolors, - int *colors); -extern int ImagingGetExtrema(Imaging im, void *extrema); -extern int ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj); -extern ImagingHistogram ImagingGetHistogram( - Imaging im, Imaging mask, void *extrema); -extern Imaging ImagingModeFilter(Imaging im, int size); -extern Imaging ImagingNegative(Imaging im); -extern Imaging ImagingOffset(Imaging im, int xoffset, int yoffset); -extern int ImagingPaste( - Imaging into, Imaging im, Imaging mask, - int x0, int y0, int x1, int y1); -extern Imaging ImagingPoint( - Imaging im, const char* tablemode, const void* table); -extern Imaging ImagingPointTransform( - Imaging imIn, double scale, double offset); -extern Imaging ImagingPutBand(Imaging im, Imaging imIn, int band); -extern Imaging ImagingRankFilter(Imaging im, int size, int rank); -extern Imaging ImagingRotate90(Imaging imOut, Imaging imIn); -extern Imaging ImagingRotate180(Imaging imOut, Imaging imIn); -extern Imaging ImagingRotate270(Imaging imOut, Imaging imIn); -extern Imaging ImagingTranspose(Imaging imOut, Imaging imIn); -extern Imaging ImagingTransverse(Imaging imOut, Imaging imIn); -extern Imaging ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]); -extern Imaging ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]); -extern Imaging ImagingTransform( - Imaging imOut, Imaging imIn, int method, int x0, int y0, int x1, int y1, - double *a, int filter, int fill); -extern Imaging ImagingUnsharpMask( - Imaging imOut, Imaging im, float radius, int percent, int threshold); -extern Imaging ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n); -extern Imaging ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, - int table_channels, int size1D, int size2D, int size3D, INT16* table); +extern Imaging +ImagingAlphaComposite(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha); +extern Imaging +ImagingCopy(Imaging im); +extern Imaging +ImagingConvert(Imaging im, const char *mode, ImagingPalette palette, int dither); +extern Imaging +ImagingConvertInPlace(Imaging im, const char *mode); +extern Imaging +ImagingConvertMatrix(Imaging im, const char *mode, float m[]); +extern Imaging +ImagingConvertTransparent(Imaging im, const char *mode, int r, int g, int b); +extern Imaging +ImagingCrop(Imaging im, int x0, int y0, int x1, int y1); +extern Imaging +ImagingExpand(Imaging im, int x, int y, int mode); +extern Imaging +ImagingFill(Imaging im, const void *ink); +extern int +ImagingFill2( + Imaging into, const void *ink, Imaging mask, int x0, int y0, int x1, int y1); +extern Imaging +ImagingFillBand(Imaging im, int band, int color); +extern Imaging +ImagingFillLinearGradient(const char *mode); +extern Imaging +ImagingFillRadialGradient(const char *mode); +extern Imaging +ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32 *kernel, FLOAT32 offset); +extern Imaging +ImagingFlipLeftRight(Imaging imOut, Imaging imIn); +extern Imaging +ImagingFlipTopBottom(Imaging imOut, Imaging imIn); +extern Imaging +ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes); +extern Imaging +ImagingGetBand(Imaging im, int band); +extern Imaging +ImagingMerge(const char *mode, Imaging bands[4]); +extern int +ImagingSplit(Imaging im, Imaging bands[4]); +extern int +ImagingGetBBox(Imaging im, int bbox[4]); +typedef struct { + int x, y; + INT32 count; + INT32 pixel; +} ImagingColorItem; +extern ImagingColorItem * +ImagingGetColors(Imaging im, int maxcolors, int *colors); +extern int +ImagingGetExtrema(Imaging im, void *extrema); +extern int +ImagingGetProjection(Imaging im, UINT8 *xproj, UINT8 *yproj); +extern ImagingHistogram +ImagingGetHistogram(Imaging im, Imaging mask, void *extrema); +extern Imaging +ImagingModeFilter(Imaging im, int size); +extern Imaging +ImagingNegative(Imaging im); +extern Imaging +ImagingOffset(Imaging im, int xoffset, int yoffset); +extern int +ImagingPaste(Imaging into, Imaging im, Imaging mask, int x0, int y0, int x1, int y1); +extern Imaging +ImagingPoint(Imaging im, const char *tablemode, const void *table); +extern Imaging +ImagingPointTransform(Imaging imIn, double scale, double offset); +extern Imaging +ImagingPutBand(Imaging im, Imaging imIn, int band); +extern Imaging +ImagingRankFilter(Imaging im, int size, int rank); +extern Imaging +ImagingRotate90(Imaging imOut, Imaging imIn); +extern Imaging +ImagingRotate180(Imaging imOut, Imaging imIn); +extern Imaging +ImagingRotate270(Imaging imOut, Imaging imIn); +extern Imaging +ImagingTranspose(Imaging imOut, Imaging imIn); +extern Imaging +ImagingTransverse(Imaging imOut, Imaging imIn); +extern Imaging +ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]); +extern Imaging +ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]); +extern Imaging +ImagingTransform( + Imaging imOut, + Imaging imIn, + int method, + int x0, + int y0, + int x1, + int y1, + double *a, + int filter, + int fill); +extern Imaging +ImagingUnsharpMask(Imaging imOut, Imaging im, float radius, int percent, int threshold); +extern Imaging +ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n); +extern Imaging +ImagingColorLUT3D_linear( + Imaging imOut, + Imaging imIn, + int table_channels, + int size1D, + int size2D, + int size3D, + INT16 *table); -extern Imaging ImagingCopy2(Imaging imOut, Imaging imIn); -extern Imaging ImagingConvert2(Imaging imOut, Imaging imIn); +extern Imaging +ImagingCopy2(Imaging imOut, Imaging imIn); +extern Imaging +ImagingConvert2(Imaging imOut, Imaging imIn); /* Channel operations */ /* any mode, except "F" */ -extern Imaging ImagingChopLighter(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopDarker(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopDifference(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopMultiply(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopScreen(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopAdd( - Imaging imIn1, Imaging imIn2, float scale, int offset); -extern Imaging ImagingChopSubtract( - Imaging imIn1, Imaging imIn2, float scale, int offset); -extern Imaging ImagingChopAddModulo(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopSoftLight(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopHardLight(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingOverlay(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopLighter(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopDarker(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopDifference(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopMultiply(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopScreen(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset); +extern Imaging +ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset); +extern Imaging +ImagingChopAddModulo(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopSoftLight(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopHardLight(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingOverlay(Imaging imIn1, Imaging imIn2); /* "1" images only */ -extern Imaging ImagingChopAnd(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopOr(Imaging imIn1, Imaging imIn2); -extern Imaging ImagingChopXor(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopAnd(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopOr(Imaging imIn1, Imaging imIn2); +extern Imaging +ImagingChopXor(Imaging imIn1, Imaging imIn2); /* Graphics */ -extern int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int width, - int op); -extern int ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, - const void* ink, int op); -extern int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, - int width, int op); -extern int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int fill, int width, int op); -extern int ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int op); -extern int ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int width, int op); -extern int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, - int width, int op); -extern int ImagingDrawPoint(Imaging im, int x, int y, const void* ink, int op); -extern int ImagingDrawPolygon(Imaging im, int points, int *xy, - const void* ink, int fill, int op); -extern int ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int fill, int width, int op); +extern int +ImagingDrawArc( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int width, + int op); +extern int +ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void *ink, int op); +extern int +ImagingDrawChord( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int fill, + int width, + int op); +extern int +ImagingDrawEllipse( + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink, + int fill, + int width, + int op); +extern int +ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink, int op); +extern int +ImagingDrawWideLine( + Imaging im, int x0, int y0, int x1, int y1, const void *ink, int width, int op); +extern int +ImagingDrawPieslice( + Imaging im, + int x0, + int y0, + int x1, + int y1, + float start, + float end, + const void *ink, + int fill, + int width, + int op); +extern int +ImagingDrawPoint(Imaging im, int x, int y, const void *ink, int op); +extern int +ImagingDrawPolygon(Imaging im, int points, int *xy, const void *ink, int fill, int op); +extern int +ImagingDrawRectangle( + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink, + int fill, + int width, + int op); /* Level 2 graphics (WORK IN PROGRESS) */ -extern ImagingOutline ImagingOutlineNew(void); -extern void ImagingOutlineDelete(ImagingOutline outline); +extern ImagingOutline +ImagingOutlineNew(void); +extern void +ImagingOutlineDelete(ImagingOutline outline); -extern int ImagingDrawOutline(Imaging im, ImagingOutline outline, - const void* ink, int fill, int op); +extern int +ImagingDrawOutline( + Imaging im, ImagingOutline outline, const void *ink, int fill, int op); -extern int ImagingOutlineMove(ImagingOutline outline, float x, float y); -extern int ImagingOutlineLine(ImagingOutline outline, float x, float y); -extern int ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, - float x2, float y2, float x3, float y3); -extern int ImagingOutlineTransform(ImagingOutline outline, double a[6]); +extern int +ImagingOutlineMove(ImagingOutline outline, float x, float y); +extern int +ImagingOutlineLine(ImagingOutline outline, float x, float y); +extern int +ImagingOutlineCurve( + ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3); +extern int +ImagingOutlineTransform(ImagingOutline outline, double a[6]); -extern int ImagingOutlineClose(ImagingOutline outline); +extern int +ImagingOutlineClose(ImagingOutline outline); /* Special effects */ -extern Imaging ImagingEffectSpread(Imaging imIn, int distance); -extern Imaging ImagingEffectNoise(int xsize, int ysize, float sigma); -extern Imaging ImagingEffectMandelbrot(int xsize, int ysize, - double extent[4], int quality); - +extern Imaging +ImagingEffectSpread(Imaging imIn, int distance); +extern Imaging +ImagingEffectNoise(int xsize, int ysize, float sigma); +extern Imaging +ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality); /* File I/O */ /* -------- */ /* Built-in drivers */ -extern Imaging ImagingOpenPPM(const char* filename); -extern int ImagingSavePPM(Imaging im, const char* filename); +extern Imaging +ImagingOpenPPM(const char *filename); +extern int +ImagingSavePPM(Imaging im, const char *filename); /* Codecs */ typedef struct ImagingCodecStateInstance *ImagingCodecState; -typedef int (*ImagingCodec)(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); +typedef int (*ImagingCodec)( + Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); -extern int ImagingBcnDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingBitDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingEpsEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingFliDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingGifDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingGifEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingHexDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -#ifdef HAVE_LIBJPEG -extern int ImagingJpegDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingJpegDecodeCleanup(ImagingCodecState state); -extern int ImagingJpegUseJCSExtensions(void); +extern int +ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +#ifdef HAVE_LIBJPEG +extern int +ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingJpegDecodeCleanup(ImagingCodecState state); +extern int +ImagingJpegUseJCSExtensions(void); -extern int ImagingJpegEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); +extern int +ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); #endif #ifdef HAVE_OPENJPEG -extern int ImagingJpeg2KDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingJpeg2KDecodeCleanup(ImagingCodecState state); -extern int ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingJpeg2KEncodeCleanup(ImagingCodecState state); +extern int +ImagingJpeg2KDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingJpeg2KDecodeCleanup(ImagingCodecState state); +extern int +ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingJpeg2KEncodeCleanup(ImagingCodecState state); #endif -#ifdef HAVE_LIBTIFF -extern int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); +#ifdef HAVE_LIBTIFF +extern int +ImagingLibTiffDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); #endif -#ifdef HAVE_LIBMPEG -extern int ImagingMpegDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); +#ifdef HAVE_LIBMPEG +extern int +ImagingMpegDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); #endif -extern int ImagingMspDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingPackbitsDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingPcdDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingPcxDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingPcxEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingRawDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingRawEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingSgiRleDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingSunRleDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingTgaRleDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingTgaRleEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingXbmDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingXbmEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -#ifdef HAVE_LIBZ -extern int ImagingZipDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, Py_ssize_t bytes); -extern int ImagingZipDecodeCleanup(ImagingCodecState state); -extern int ImagingZipEncode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); -extern int ImagingZipEncodeCleanup(ImagingCodecState state); +extern int +ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingPackbitsDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingSgiRleDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingSunRleDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingTgaRleDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +#ifdef HAVE_LIBZ +extern int +ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes); +extern int +ImagingZipDecodeCleanup(ImagingCodecState state); +extern int +ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes); +extern int +ImagingZipEncodeCleanup(ImagingCodecState state); #endif -typedef void (*ImagingShuffler)(UINT8* out, const UINT8* in, int pixels); +typedef void (*ImagingShuffler)(UINT8 *out, const UINT8 *in, int pixels); /* Public shufflers */ -extern void ImagingPackBGR(UINT8* out, const UINT8* in, int pixels); -extern void ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels); -extern void ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels); +extern void +ImagingPackBGR(UINT8 *out, const UINT8 *in, int pixels); +extern void +ImagingUnpackYCC(UINT8 *out, const UINT8 *in, int pixels); +extern void +ImagingUnpackYCCA(UINT8 *out, const UINT8 *in, int pixels); -extern void ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels); -extern void ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels); +extern void +ImagingConvertRGB2YCbCr(UINT8 *out, const UINT8 *in, int pixels); +extern void +ImagingConvertYCbCr2RGB(UINT8 *out, const UINT8 *in, int pixels); -extern ImagingShuffler ImagingFindUnpacker(const char* mode, - const char* rawmode, int* bits_out); -extern ImagingShuffler ImagingFindPacker(const char* mode, - const char* rawmode, int* bits_out); +extern ImagingShuffler +ImagingFindUnpacker(const char *mode, const char *rawmode, int *bits_out); +extern ImagingShuffler +ImagingFindPacker(const char *mode, const char *rawmode, int *bits_out); struct ImagingCodecStateInstance { int count; @@ -509,30 +667,27 @@ struct ImagingCodecStateInstance { PyObject *fd; }; - - /* Codec read/write python fd */ -extern Py_ssize_t _imaging_read_pyFd(PyObject *fd, char* dest, Py_ssize_t bytes); -extern Py_ssize_t _imaging_write_pyFd(PyObject *fd, char* src, Py_ssize_t bytes); -extern int _imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence); -extern Py_ssize_t _imaging_tell_pyFd(PyObject *fd); - - +extern Py_ssize_t +_imaging_read_pyFd(PyObject *fd, char *dest, Py_ssize_t bytes); +extern Py_ssize_t +_imaging_write_pyFd(PyObject *fd, char *src, Py_ssize_t bytes); +extern int +_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence); +extern Py_ssize_t +_imaging_tell_pyFd(PyObject *fd); /* Errcodes */ -#define IMAGING_CODEC_END 1 -#define IMAGING_CODEC_OVERRUN -1 -#define IMAGING_CODEC_BROKEN -2 -#define IMAGING_CODEC_UNKNOWN -3 -#define IMAGING_CODEC_CONFIG -8 -#define IMAGING_CODEC_MEMORY -9 - - +#define IMAGING_CODEC_END 1 +#define IMAGING_CODEC_OVERRUN -1 +#define IMAGING_CODEC_BROKEN -2 +#define IMAGING_CODEC_UNKNOWN -3 +#define IMAGING_CODEC_CONFIG -8 +#define IMAGING_CODEC_MEMORY -9 #include "ImagingUtils.h" extern UINT8 *clip8_lookups; - #if defined(__cplusplus) } #endif diff --git a/src/libImaging/ImagingUtils.h b/src/libImaging/ImagingUtils.h index 21c2688d8..ad6f280ac 100644 --- a/src/libImaging/ImagingUtils.h +++ b/src/libImaging/ImagingUtils.h @@ -1,47 +1,42 @@ #ifdef WORDS_BIGENDIAN - #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u3) | ((UINT32)(u2)<<8) | ((UINT32)(u1)<<16) | ((UINT32)(u0)<<24)) - #define MASK_UINT32_CHANNEL_0 0xff000000 - #define MASK_UINT32_CHANNEL_1 0x00ff0000 - #define MASK_UINT32_CHANNEL_2 0x0000ff00 - #define MASK_UINT32_CHANNEL_3 0x000000ff +#define MAKE_UINT32(u0, u1, u2, u3) \ + ((UINT32)(u3) | ((UINT32)(u2) << 8) | ((UINT32)(u1) << 16) | ((UINT32)(u0) << 24)) +#define MASK_UINT32_CHANNEL_0 0xff000000 +#define MASK_UINT32_CHANNEL_1 0x00ff0000 +#define MASK_UINT32_CHANNEL_2 0x0000ff00 +#define MASK_UINT32_CHANNEL_3 0x000000ff #else - #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u0) | ((UINT32)(u1)<<8) | ((UINT32)(u2)<<16) | ((UINT32)(u3)<<24)) - #define MASK_UINT32_CHANNEL_0 0x000000ff - #define MASK_UINT32_CHANNEL_1 0x0000ff00 - #define MASK_UINT32_CHANNEL_2 0x00ff0000 - #define MASK_UINT32_CHANNEL_3 0xff000000 +#define MAKE_UINT32(u0, u1, u2, u3) \ + ((UINT32)(u0) | ((UINT32)(u1) << 8) | ((UINT32)(u2) << 16) | ((UINT32)(u3) << 24)) +#define MASK_UINT32_CHANNEL_0 0x000000ff +#define MASK_UINT32_CHANNEL_1 0x0000ff00 +#define MASK_UINT32_CHANNEL_2 0x00ff0000 +#define MASK_UINT32_CHANNEL_3 0xff000000 #endif - -#define SHIFTFORDIV255(a)\ - ((((a) >> 8) + a) >> 8) +#define SHIFTFORDIV255(a) ((((a) >> 8) + a) >> 8) /* like (a * b + 127) / 255), but much faster on most platforms */ -#define MULDIV255(a, b, tmp)\ - (tmp = (a) * (b) + 128, SHIFTFORDIV255(tmp)) +#define MULDIV255(a, b, tmp) (tmp = (a) * (b) + 128, SHIFTFORDIV255(tmp)) -#define DIV255(a, tmp)\ - (tmp = (a) + 128, SHIFTFORDIV255(tmp)) +#define DIV255(a, tmp) (tmp = (a) + 128, SHIFTFORDIV255(tmp)) -#define BLEND(mask, in1, in2, tmp1)\ - DIV255(in1 * (255 - mask) + in2 * mask, tmp1) - -#define PREBLEND(mask, in1, in2, tmp1)\ - (MULDIV255(in1, (255 - mask), tmp1) + in2) +#define BLEND(mask, in1, in2, tmp1) DIV255(in1 *(255 - mask) + in2 * mask, tmp1) +#define PREBLEND(mask, in1, in2, tmp1) (MULDIV255(in1, (255 - mask), tmp1) + in2) #define CLIP8(v) ((v) <= 0 ? 0 : (v) < 256 ? (v) : 255) /* This is to work around a bug in GCC prior 4.9 in 64 bit mode. GCC generates code with partial dependency which is 3 times slower. See: http://stackoverflow.com/a/26588074/253146 */ -#if defined(__x86_64__) && defined(__SSE__) && ! defined(__NO_INLINE__) && \ - ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) +#if defined(__x86_64__) && defined(__SSE__) && !defined(__NO_INLINE__) && \ + !defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) static float __attribute__((always_inline)) inline _i2f(int v) { float x; - __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=x"(x) : "r"(v) ); + __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=x"(x) : "r"(v)); return x; } #else -static float inline _i2f(int v) { return (float) v; } +static float inline _i2f(int v) { return (float)v; } #endif diff --git a/src/libImaging/Jpeg.h b/src/libImaging/Jpeg.h index 280b6d638..a876d3bb6 100644 --- a/src/libImaging/Jpeg.h +++ b/src/libImaging/Jpeg.h @@ -12,13 +12,11 @@ #include - typedef struct { - struct jpeg_error_mgr pub; /* "public" fields */ - jmp_buf setjmp_buffer; /* for return to caller */ + struct jpeg_error_mgr pub; /* "public" fields */ + jmp_buf setjmp_buffer; /* for return to caller */ } JPEGERROR; - /* -------------------------------------------------------------------- */ /* Decoder */ @@ -28,15 +26,14 @@ typedef struct { } JPEGSOURCE; typedef struct { - /* CONFIGURATION */ /* Jpeg file mode (empty if not known) */ - char jpegmode[8+1]; + char jpegmode[8 + 1]; /* Converter output mode (input to the shuffler). If empty, convert conversions are disabled */ - char rawmode[8+1]; + char rawmode[8 + 1]; /* If set, trade quality for speed */ int draft; @@ -54,7 +51,6 @@ typedef struct { } JPEGSTATE; - /* -------------------------------------------------------------------- */ /* Encoder */ @@ -64,7 +60,6 @@ typedef struct { } JPEGDESTINATION; typedef struct { - /* CONFIGURATION */ /* Quality (0-100, -1 means default) */ @@ -89,7 +84,7 @@ typedef struct { int subsampling; /* Converter input mode (input to the shuffler) */ - char rawmode[8+1]; + char rawmode[8 + 1]; /* Custom quantization tables () */ unsigned int *qtables; @@ -98,7 +93,8 @@ typedef struct { int qtablesLen; /* Extra data (to be injected after header) */ - char* extra; int extra_size; + char *extra; + int extra_size; /* PRIVATE CONTEXT (set by encoder) */ @@ -110,7 +106,7 @@ typedef struct { int extra_offset; - size_t rawExifLen; /* EXIF data length */ - char* rawExif; /* EXIF buffer pointer */ + size_t rawExifLen; /* EXIF data length */ + char *rawExif; /* EXIF buffer pointer */ } JPEGENCODERSTATE; diff --git a/src/libImaging/Jpeg2K.h b/src/libImaging/Jpeg2K.h index 7645b9326..f749ecfb2 100644 --- a/src/libImaging/Jpeg2K.h +++ b/src/libImaging/Jpeg2K.h @@ -24,7 +24,7 @@ typedef struct { int fd; /* File pointer, when opened */ - FILE * pfile; + FILE *pfile; /* Length of data, if available; otherwise, -1 */ off_t length; @@ -33,13 +33,13 @@ typedef struct { OPJ_CODEC_FORMAT format; /* Set to divide image resolution by 2**reduce. */ - int reduce; + int reduce; /* Set to limit the number of quality layers to decode (0 = all layers) */ - int layers; + int layers; /* PRIVATE CONTEXT (set by decoder) */ - const char *error_msg; + const char *error_msg; } JPEG2KDECODESTATE; @@ -51,36 +51,36 @@ typedef struct { /* CONFIGURATION */ /* File descriptor, if available; otherwise, -1 */ - int fd; + int fd; /* File pointer, when opened */ - FILE * pfile; + FILE *pfile; /* Specify the desired format */ OPJ_CODEC_FORMAT format; /* Image offset */ - int offset_x, offset_y; + int offset_x, offset_y; /* Tile information */ - int tile_offset_x, tile_offset_y; - int tile_size_x, tile_size_y; + int tile_offset_x, tile_offset_y; + int tile_size_x, tile_size_y; /* Quality layers (a sequence of numbers giving *either* rates or dB) */ - int quality_is_in_db; - PyObject *quality_layers; + int quality_is_in_db; + PyObject *quality_layers; /* Number of resolutions (DWT decompositions + 1 */ - int num_resolutions; + int num_resolutions; /* Code block size */ - int cblk_width, cblk_height; + int cblk_width, cblk_height; /* Precinct size */ - int precinct_width, precinct_height; + int precinct_width, precinct_height; /* Compression style */ - int irreversible; + int irreversible; /* Progression order (LRCP/RLCP/RPCL/PCRL/CPRL) */ OPJ_PROG_ORDER progression; @@ -89,8 +89,7 @@ typedef struct { OPJ_CINEMA_MODE cinema_mode; /* PRIVATE CONTEXT (set by decoder) */ - const char *error_msg; - + const char *error_msg; } JPEG2KENCODESTATE; diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index 8cce5454f..a2a7354db 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -23,7 +23,7 @@ typedef struct { OPJ_UINT32 tile_index; OPJ_UINT32 data_size; - OPJ_INT32 x0, y0, x1, y1; + OPJ_INT32 x0, y0, x1, y1; OPJ_UINT32 nb_comps; } JPEG2KTILEINFO; @@ -32,9 +32,8 @@ typedef struct { /* -------------------------------------------------------------------- */ static void -j2k_error(const char *msg, void *client_data) -{ - JPEG2KDECODESTATE *state = (JPEG2KDECODESTATE *) client_data; +j2k_error(const char *msg, void *client_data) { + JPEG2KDECODESTATE *state = (JPEG2KDECODESTATE *)client_data; free((void *)state->error_msg); state->error_msg = strdup(msg); } @@ -44,8 +43,7 @@ j2k_error(const char *msg, void *client_data) /* -------------------------------------------------------------------- */ static OPJ_SIZE_T -j2k_read(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) -{ +j2k_read(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) { ImagingCodecState state = (ImagingCodecState)p_user_data; size_t len = _imaging_read_pyFd(state->fd, p_buffer, p_nb_bytes); @@ -54,8 +52,7 @@ j2k_read(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) } static OPJ_OFF_T -j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) -{ +j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) { off_t pos; ImagingCodecState state = (ImagingCodecState)p_user_data; @@ -69,21 +66,18 @@ j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) /* Unpackers */ /* -------------------------------------------------------------------- */ -typedef void (*j2k_unpacker_t)(opj_image_t *in, - const JPEG2KTILEINFO *tileInfo, - const UINT8 *data, - Imaging im); +typedef void (*j2k_unpacker_t)( + opj_image_t *in, const JPEG2KTILEINFO *tileInfo, const UINT8 *data, Imaging im); struct j2k_decode_unpacker { - const char *mode; - OPJ_COLOR_SPACE color_space; - unsigned components; - j2k_unpacker_t unpacker; + const char *mode; + OPJ_COLOR_SPACE color_space; + unsigned components; + j2k_unpacker_t unpacker; }; -static inline -unsigned j2ku_shift(unsigned x, int n) -{ +static inline unsigned +j2ku_shift(unsigned x, int n) { if (n < 0) { return x >> -n; } else { @@ -92,9 +86,11 @@ unsigned j2ku_shift(unsigned x, int n) } static void -j2ku_gray_l(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_gray_l( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -115,41 +111,42 @@ j2ku_gray_l(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, /* csiz*h*w + offset = tileinfo.datasize */ switch (csiz) { - case 1: - for (y = 0; y < h; ++y) { - const UINT8 *data = &tiledata[y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + case 1: + for (y = 0; y < h; ++y) { + const UINT8 *data = &tiledata[y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; - case 2: - for (y = 0; y < h; ++y) { - const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + break; + case 2: + for (y = 0; y < h; ++y) { + const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; - case 4: - for (y = 0; y < h; ++y) { - const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + break; + case 4: + for (y = 0; y < h; ++y) { + const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; + break; } } - static void -j2ku_gray_i(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_gray_i( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -169,41 +166,42 @@ j2ku_gray_i(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } switch (csiz) { - case 1: - for (y = 0; y < h; ++y) { - const UINT8 *data = &tiledata[y * w]; - UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + case 1: + for (y = 0; y < h; ++y) { + const UINT8 *data = &tiledata[y * w]; + UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; - case 2: - for (y = 0; y < h; ++y) { - const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; - UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + break; + case 2: + for (y = 0; y < h; ++y) { + const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; + UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; - case 4: - for (y = 0; y < h; ++y) { - const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; - UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - *row++ = j2ku_shift(offset + *data++, shift); + break; + case 4: + for (y = 0; y < h; ++y) { + const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; + UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + *row++ = j2ku_shift(offset + *data++, shift); + } } - } - break; + break; } } - static void -j2ku_gray_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_gray_rgb( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -223,49 +221,51 @@ j2ku_gray_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } switch (csiz) { - case 1: - for (y = 0; y < h; ++y) { - const UINT8 *data = &tiledata[y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - UINT8 byte = j2ku_shift(offset + *data++, shift); - row[0] = row[1] = row[2] = byte; - row[3] = 0xff; - row += 4; + case 1: + for (y = 0; y < h; ++y) { + const UINT8 *data = &tiledata[y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + UINT8 byte = j2ku_shift(offset + *data++, shift); + row[0] = row[1] = row[2] = byte; + row[3] = 0xff; + row += 4; + } } - } - break; - case 2: - for (y = 0; y < h; ++y) { - const UINT16 *data = (UINT16 *)&tiledata[2 * y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - UINT8 byte = j2ku_shift(offset + *data++, shift); - row[0] = row[1] = row[2] = byte; - row[3] = 0xff; - row += 4; + break; + case 2: + for (y = 0; y < h; ++y) { + const UINT16 *data = (UINT16 *)&tiledata[2 * y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + UINT8 byte = j2ku_shift(offset + *data++, shift); + row[0] = row[1] = row[2] = byte; + row[3] = 0xff; + row += 4; + } } - } - break; - case 4: - for (y = 0; y < h; ++y) { - const UINT32 *data = (UINT32 *)&tiledata[4 * y * w]; - UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; - for (x = 0; x < w; ++x) { - UINT8 byte = j2ku_shift(offset + *data++, shift); - row[0] = row[1] = row[2] = byte; - row[3] = 0xff; - row += 4; + break; + case 4: + for (y = 0; y < h; ++y) { + const UINT32 *data = (UINT32 *)&tiledata[4 * y * w]; + UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; + for (x = 0; x < w; ++x) { + UINT8 byte = j2ku_shift(offset + *data++, shift); + row[0] = row[1] = row[2] = byte; + row[3] = 0xff; + row += 4; + } } - } - break; + break; } } static void -j2ku_graya_la(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_graya_la( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -304,15 +304,31 @@ j2ku_graya_la(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0, aword = 0, byte; switch (csiz) { - case 1: word = *data++; break; - case 2: word = *(const UINT16 *)data; data += 2; break; - case 4: word = *(const UINT32 *)data; data += 4; break; + case 1: + word = *data++; + break; + case 2: + word = *(const UINT16 *)data; + data += 2; + break; + case 4: + word = *(const UINT32 *)data; + data += 4; + break; } switch (acsiz) { - case 1: aword = *adata++; break; - case 2: aword = *(const UINT16 *)adata; adata += 2; break; - case 4: aword = *(const UINT32 *)adata; adata += 4; break; + case 1: + aword = *adata++; + break; + case 2: + aword = *(const UINT16 *)adata; + adata += 2; + break; + case 4: + aword = *(const UINT32 *)adata; + adata += 4; + break; } byte = j2ku_shift(offset + word, shift); @@ -324,9 +340,11 @@ j2ku_graya_la(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static void -j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_srgb_rgb( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -365,9 +383,17 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: + word = *data[n]++; + break; + case 2: + word = *(const UINT16 *)data[n]; + data[n] += 2; + break; + case 4: + word = *(const UINT32 *)data[n]; + data[n] += 4; + break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -379,9 +405,11 @@ j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static void -j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_sycc_rgb( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -421,9 +449,17 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: + word = *data[n]++; + break; + case 2: + word = *(const UINT16 *)data[n]; + data[n] += 2; + break; + case 4: + word = *(const UINT32 *)data[n]; + data[n] += 4; + break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -437,9 +473,11 @@ j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static void -j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_srgba_rgba( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -478,9 +516,17 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: + word = *data[n]++; + break; + case 2: + word = *(const UINT16 *)data[n]; + data[n] += 2; + break; + case 4: + word = *(const UINT32 *)data[n]; + data[n] += 4; + break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -491,9 +537,11 @@ j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static void -j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, - const UINT8 *tiledata, Imaging im) -{ +j2ku_sycca_rgba( + opj_image_t *in, + const JPEG2KTILEINFO *tileinfo, + const UINT8 *tiledata, + Imaging im) { unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; unsigned w = tileinfo->x1 - tileinfo->x0; unsigned h = tileinfo->y1 - tileinfo->y0; @@ -533,9 +581,17 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, UINT32 word = 0; switch (csiz[n]) { - case 1: word = *data[n]++; break; - case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; - case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; + case 1: + word = *data[n]++; + break; + case 2: + word = *(const UINT16 *)data[n]; + data[n] += 2; + break; + case 4: + word = *(const UINT32 *)data[n]; + data[n] += 4; + break; } row[n] = j2ku_shift(offsets[n] + word, shifts[n]); @@ -548,22 +604,22 @@ j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, } static const struct j2k_decode_unpacker j2k_unpackers[] = { - { "L", OPJ_CLRSPC_GRAY, 1, j2ku_gray_l }, - { "I;16", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, - { "I;16B", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, - { "LA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, - { "RGB", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, - { "RGB", OPJ_CLRSPC_GRAY, 2, j2ku_gray_rgb }, - { "RGB", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, - { "RGB", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, - { "RGB", OPJ_CLRSPC_SRGB, 4, j2ku_srgb_rgb }, - { "RGB", OPJ_CLRSPC_SYCC, 4, j2ku_sycc_rgb }, - { "RGBA", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, - { "RGBA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, - { "RGBA", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, - { "RGBA", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, - { "RGBA", OPJ_CLRSPC_SRGB, 4, j2ku_srgba_rgba }, - { "RGBA", OPJ_CLRSPC_SYCC, 4, j2ku_sycca_rgba }, + {"L", OPJ_CLRSPC_GRAY, 1, j2ku_gray_l}, + {"I;16", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i}, + {"I;16B", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i}, + {"LA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la}, + {"RGB", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb}, + {"RGB", OPJ_CLRSPC_GRAY, 2, j2ku_gray_rgb}, + {"RGB", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb}, + {"RGB", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb}, + {"RGB", OPJ_CLRSPC_SRGB, 4, j2ku_srgb_rgb}, + {"RGB", OPJ_CLRSPC_SYCC, 4, j2ku_sycc_rgb}, + {"RGBA", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb}, + {"RGBA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la}, + {"RGBA", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb}, + {"RGBA", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb}, + {"RGBA", OPJ_CLRSPC_SRGB, 4, j2ku_srgba_rgba}, + {"RGBA", OPJ_CLRSPC_SYCC, 4, j2ku_sycca_rgba}, }; /* -------------------------------------------------------------------- */ @@ -578,9 +634,8 @@ enum { }; static int -j2k_decode_entry(Imaging im, ImagingCodecState state) -{ - JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *) state->context; +j2k_decode_entry(Imaging im, ImagingCodecState state) { + JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *)state->context; opj_stream_t *stream = NULL; opj_image_t *image = NULL; opj_codec_t *codec = NULL; @@ -591,7 +646,6 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) unsigned n, tile_height, tile_width; int components; - stream = opj_stream_create(BUFFER_SIZE, OPJ_TRUE); if (!stream) { @@ -645,8 +699,8 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) } /* Check that this image is something we can handle */ - if (image->numcomps < 1 || image->numcomps > 4 - || image->color_space == OPJ_CLRSPC_UNKNOWN) { + if (image->numcomps < 1 || image->numcomps > 4 || + image->color_space == OPJ_CLRSPC_UNKNOWN) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -686,15 +740,21 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) if (color_space == OPJ_CLRSPC_UNSPECIFIED) { switch (image->numcomps) { - case 1: case 2: color_space = OPJ_CLRSPC_GRAY; break; - case 3: case 4: color_space = OPJ_CLRSPC_SRGB; break; + case 1: + case 2: + color_space = OPJ_CLRSPC_GRAY; + break; + case 3: + case 4: + color_space = OPJ_CLRSPC_SRGB; + break; } } - for (n = 0; n < sizeof(j2k_unpackers) / sizeof (j2k_unpackers[0]); ++n) { - if (color_space == j2k_unpackers[n].color_space - && image->numcomps == j2k_unpackers[n].components - && strcmp (im->mode, j2k_unpackers[n].mode) == 0) { + for (n = 0; n < sizeof(j2k_unpackers) / sizeof(j2k_unpackers[0]); ++n) { + if (color_space == j2k_unpackers[n].color_space && + image->numcomps == j2k_unpackers[n].components && + strcmp(im->mode, j2k_unpackers[n].mode) == 0) { unpack = j2k_unpackers[n].unpacker; break; } @@ -713,14 +773,17 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) OPJ_BOOL should_continue; unsigned correction = (1 << params.cp_reduce) - 1; - if (!opj_read_tile_header(codec, - stream, - &tile_info.tile_index, - &tile_info.data_size, - &tile_info.x0, &tile_info.y0, - &tile_info.x1, &tile_info.y1, - &tile_info.nb_comps, - &should_continue)) { + if (!opj_read_tile_header( + codec, + stream, + &tile_info.tile_index, + &tile_info.data_size, + &tile_info.x0, + &tile_info.y0, + &tile_info.x1, + &tile_info.y1, + &tile_info.nb_comps, + &should_continue)) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -740,14 +803,12 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) /* Check the tile bounds; if the tile is outside the image area, or if it has a negative width or height (i.e. the coordinates are swapped), bail. */ - if (tile_info.x0 >= tile_info.x1 - || tile_info.y0 >= tile_info.y1 - || tile_info.x0 < 0 - || tile_info.y0 < 0 - || (OPJ_UINT32)tile_info.x0 < image->x0 - || (OPJ_UINT32)tile_info.y0 < image->y0 - || (OPJ_INT32)(tile_info.x1 - image->x0) > im->xsize - || (OPJ_INT32)(tile_info.y1 - image->y0) > im->ysize) { + if (tile_info.x0 >= tile_info.x1 || tile_info.y0 >= tile_info.y1 || + tile_info.x0 < 0 || tile_info.y0 < 0 || + (OPJ_UINT32)tile_info.x0 < image->x0 || + (OPJ_UINT32)tile_info.y0 < image->y0 || + (OPJ_INT32)(tile_info.x1 - image->x0) > im->xsize || + (OPJ_INT32)(tile_info.y1 - image->y0) > im->ysize) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -760,10 +821,10 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) tile_width = tile_info.x1 - tile_info.x0; tile_height = tile_info.y1 - tile_info.y0; components = tile_info.nb_comps == 3 ? 4 : tile_info.nb_comps; - if (( tile_width > UINT_MAX / components ) || - ( tile_height > UINT_MAX / components ) || - ( tile_width > UINT_MAX / (tile_height * components )) || - ( tile_height > UINT_MAX / (tile_width * components ))) { + if ((tile_width > UINT_MAX / components) || + (tile_height > UINT_MAX / components) || + (tile_width > UINT_MAX / (tile_height * components)) || + (tile_height > UINT_MAX / (tile_width * components))) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -777,7 +838,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) if (buffer_size < tile_info.data_size) { /* malloc check ok, overflow and tile size sanity check above */ - UINT8 *new = realloc (state->buffer, tile_info.data_size); + UINT8 *new = realloc(state->buffer, tile_info.data_size); if (!new) { state->errcode = IMAGING_CODEC_MEMORY; state->state = J2K_STATE_FAILED; @@ -787,12 +848,12 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) buffer_size = tile_info.data_size; } - - if (!opj_decode_tile_data(codec, - tile_info.tile_index, - (OPJ_BYTE *)state->buffer, - tile_info.data_size, - stream)) { + if (!opj_decode_tile_data( + codec, + tile_info.tile_index, + (OPJ_BYTE *)state->buffer, + tile_info.data_size, + stream)) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -811,12 +872,12 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) state->errcode = IMAGING_CODEC_END; if (context->pfile) { - if(fclose(context->pfile)){ + if (fclose(context->pfile)) { context->pfile = NULL; } } - quick_exit: +quick_exit: if (codec) { opj_destroy_codec(codec); } @@ -831,10 +892,8 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) } int -ImagingJpeg2KDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - - if (bytes){ +ImagingJpeg2KDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + if (bytes) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; return -1; @@ -867,7 +926,7 @@ ImagingJpeg2KDecodeCleanup(ImagingCodecState state) { JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *)state->context; if (context->error_msg) { - free ((void *)context->error_msg); + free((void *)context->error_msg); } context->error_msg = NULL; @@ -876,8 +935,7 @@ ImagingJpeg2KDecodeCleanup(ImagingCodecState state) { } const char * -ImagingJpeg2KVersion(void) -{ +ImagingJpeg2KVersion(void) { return opj_version(); } diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 5b18e472c..5829cf37f 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -19,26 +19,24 @@ #include "Jpeg2K.h" -#define CINEMA_24_CS_LENGTH 1302083 -#define CINEMA_48_CS_LENGTH 651041 +#define CINEMA_24_CS_LENGTH 1302083 +#define CINEMA_48_CS_LENGTH 651041 #define COMP_24_CS_MAX_LENGTH 1041666 -#define COMP_48_CS_MAX_LENGTH 520833 +#define COMP_48_CS_MAX_LENGTH 520833 /* -------------------------------------------------------------------- */ /* Error handler */ /* -------------------------------------------------------------------- */ static void -j2k_error(const char *msg, void *client_data) -{ - JPEG2KENCODESTATE *state = (JPEG2KENCODESTATE *) client_data; +j2k_error(const char *msg, void *client_data) { + JPEG2KENCODESTATE *state = (JPEG2KENCODESTATE *)client_data; free((void *)state->error_msg); state->error_msg = strdup(msg); } static void -j2k_warn(const char *msg, void *client_data) -{ +j2k_warn(const char *msg, void *client_data) { // Null handler } @@ -47,8 +45,7 @@ j2k_warn(const char *msg, void *client_data) /* -------------------------------------------------------------------- */ static OPJ_SIZE_T -j2k_write(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) -{ +j2k_write(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) { ImagingCodecState state = (ImagingCodecState)p_user_data; unsigned int result; @@ -57,16 +54,14 @@ j2k_write(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) return result ? result : (OPJ_SIZE_T)-1; } - static OPJ_OFF_T -j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) -{ +j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) { ImagingCodecState state = (ImagingCodecState)p_user_data; char *buffer; int result; /* Explicitly write zeros */ - buffer = calloc(p_nb_bytes,1); + buffer = calloc(p_nb_bytes, 1); if (!buffer) { return (OPJ_OFF_T)-1; } @@ -79,8 +74,7 @@ j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) } static OPJ_BOOL -j2k_seek(OPJ_OFF_T p_nb_bytes, void *p_user_data) -{ +j2k_seek(OPJ_OFF_T p_nb_bytes, void *p_user_data) { ImagingCodecState state = (ImagingCodecState)p_user_data; off_t pos = 0; @@ -94,16 +88,13 @@ j2k_seek(OPJ_OFF_T p_nb_bytes, void *p_user_data) /* Encoder */ /* -------------------------------------------------------------------- */ -typedef void (*j2k_pack_tile_t)(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, - unsigned w, unsigned h); +typedef void (*j2k_pack_tile_t)( + Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h); static void -j2k_pack_l(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, unsigned w, unsigned h) -{ +j2k_pack_l(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) { UINT8 *ptr = buf; - unsigned x,y; + unsigned x, y; for (y = 0; y < h; ++y) { UINT8 *data = (UINT8 *)(im->image[y + y0] + x0); for (x = 0; x < w; ++x) { @@ -113,11 +104,9 @@ j2k_pack_l(Imaging im, UINT8 *buf, } static void -j2k_pack_i16(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, unsigned w, unsigned h) -{ +j2k_pack_i16(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) { UINT8 *ptr = buf; - unsigned x,y; + unsigned x, y; for (y = 0; y < h; ++y) { UINT8 *data = (UINT8 *)(im->image[y + y0] + x0); for (x = 0; x < w; ++x) { @@ -127,14 +116,11 @@ j2k_pack_i16(Imaging im, UINT8 *buf, } } - static void -j2k_pack_la(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, unsigned w, unsigned h) -{ +j2k_pack_la(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) { UINT8 *ptr = buf; UINT8 *ptra = buf + w * h; - unsigned x,y; + unsigned x, y; for (y = 0; y < h; ++y) { UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); for (x = 0; x < w; ++x) { @@ -146,13 +132,11 @@ j2k_pack_la(Imaging im, UINT8 *buf, } static void -j2k_pack_rgb(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, unsigned w, unsigned h) -{ +j2k_pack_rgb(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) { UINT8 *pr = buf; UINT8 *pg = pr + w * h; UINT8 *pb = pg + w * h; - unsigned x,y; + unsigned x, y; for (y = 0; y < h; ++y) { UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); for (x = 0; x < w; ++x) { @@ -165,14 +149,13 @@ j2k_pack_rgb(Imaging im, UINT8 *buf, } static void -j2k_pack_rgba(Imaging im, UINT8 *buf, - unsigned x0, unsigned y0, unsigned w, unsigned h) -{ +j2k_pack_rgba( + Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) { UINT8 *pr = buf; UINT8 *pg = pr + w * h; UINT8 *pb = pg + w * h; UINT8 *pa = pb + w * h; - unsigned x,y; + unsigned x, y; for (y = 0; y < h; ++y) { UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); for (x = 0; x < w; ++x) { @@ -192,8 +175,7 @@ enum { }; static void -j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) -{ +j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) { float rate; int n; @@ -215,8 +197,9 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) params->irreversible = 1; if (params->cp_cinema == OPJ_CINEMA4K_24) { - float max_rate = ((float)(components * im->xsize * im->ysize * 8) - / (CINEMA_24_CS_LENGTH * 8)); + float max_rate = + ((float)(components * im->xsize * im->ysize * 8) / + (CINEMA_24_CS_LENGTH * 8)); params->POC[0].tile = 1; params->POC[0].resno0 = 0; @@ -239,8 +222,9 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) if (params->tcp_rates[0] == 0) { params->tcp_rates[n] = max_rate; } else { - rate = ((float)(components * im->xsize * im->ysize * 8) - / (params->tcp_rates[n] * 8)); + rate = + ((float)(components * im->xsize * im->ysize * 8) / + (params->tcp_rates[n] * 8)); if (rate > CINEMA_24_CS_LENGTH) { params->tcp_rates[n] = max_rate; } @@ -249,16 +233,18 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) params->max_comp_size = COMP_24_CS_MAX_LENGTH; } else { - float max_rate = ((float)(components * im->xsize * im->ysize * 8) - / (CINEMA_48_CS_LENGTH * 8)); + float max_rate = + ((float)(components * im->xsize * im->ysize * 8) / + (CINEMA_48_CS_LENGTH * 8)); for (n = 0; n < params->tcp_numlayers; ++n) { rate = 0; if (params->tcp_rates[0] == 0) { params->tcp_rates[n] = max_rate; } else { - rate = ((float)(components * im->xsize * im->ysize * 8) - / (params->tcp_rates[n] * 8)); + rate = + ((float)(components * im->xsize * im->ysize * 8) / + (params->tcp_rates[n] * 8)); if (rate > CINEMA_48_CS_LENGTH) { params->tcp_rates[n] = max_rate; } @@ -270,8 +256,7 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) } static int -j2k_encode_entry(Imaging im, ImagingCodecState state) -{ +j2k_encode_entry(Imaging im, ImagingCodecState state) { JPEG2KENCODESTATE *context = (JPEG2KENCODESTATE *)state->context; opj_stream_t *stream = NULL; opj_image_t *image = NULL; @@ -312,35 +297,35 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) #endif /* Setup an opj_image */ - if (strcmp (im->mode, "L") == 0) { + if (strcmp(im->mode, "L") == 0) { components = 1; color_space = OPJ_CLRSPC_GRAY; pack = j2k_pack_l; - } else if (strcmp (im->mode, "I;16") == 0){ + } else if (strcmp(im->mode, "I;16") == 0) { components = 1; color_space = OPJ_CLRSPC_GRAY; pack = j2k_pack_i16; prec = 16; bpp = 12; - } else if (strcmp (im->mode, "I;16B") == 0){ + } else if (strcmp(im->mode, "I;16B") == 0) { components = 1; color_space = OPJ_CLRSPC_GRAY; pack = j2k_pack_i16; prec = 16; bpp = 12; - } else if (strcmp (im->mode, "LA") == 0) { + } else if (strcmp(im->mode, "LA") == 0) { components = 2; color_space = OPJ_CLRSPC_GRAY; pack = j2k_pack_la; - } else if (strcmp (im->mode, "RGB") == 0) { + } else if (strcmp(im->mode, "RGB") == 0) { components = 3; color_space = OPJ_CLRSPC_SRGB; pack = j2k_pack_rgb; - } else if (strcmp (im->mode, "YCbCr") == 0) { + } else if (strcmp(im->mode, "YCbCr") == 0) { components = 3; color_space = OPJ_CLRSPC_SYCC; pack = j2k_pack_rgb; - } else if (strcmp (im->mode, "RGBA") == 0) { + } else if (strcmp(im->mode, "RGBA") == 0) { components = 4; color_space = OPJ_CLRSPC_SRGB; pack = j2k_pack_rgba; @@ -400,8 +385,9 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) float *pq; if (len > 0) { - if ((unsigned)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { - len = sizeof(params.tcp_rates)/sizeof(params.tcp_rates[0]); + if ((unsigned)len > + sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { + len = sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0]); } params.tcp_numlayers = (int)len; @@ -431,16 +417,16 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) params.numresolution = context->num_resolutions; } - if (context->cblk_width >= 4 && context->cblk_width <= 1024 - && context->cblk_height >= 4 && context->cblk_height <= 1024 - && context->cblk_width * context->cblk_height <= 4096) { + if (context->cblk_width >= 4 && context->cblk_width <= 1024 && + context->cblk_height >= 4 && context->cblk_height <= 1024 && + context->cblk_width * context->cblk_height <= 4096) { params.cblockw_init = context->cblk_width; params.cblockh_init = context->cblk_height; } - if (context->precinct_width >= 4 && context->precinct_height >= 4 - && context->precinct_width >= context->cblk_width - && context->precinct_height > context->cblk_height) { + if (context->precinct_width >= 4 && context->precinct_height >= 4 && + context->precinct_width >= context->cblk_width && + context->precinct_height > context->cblk_height) { params.prcw_init[0] = context->precinct_width; params.prch_init[0] = context->precinct_height; params.res_spec = 1; @@ -454,22 +440,22 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) params.cp_cinema = context->cinema_mode; switch (params.cp_cinema) { - case OPJ_OFF: - params.cp_rsiz = OPJ_STD_RSIZ; - break; - case OPJ_CINEMA2K_24: - case OPJ_CINEMA2K_48: - params.cp_rsiz = OPJ_CINEMA2K; - if (params.numresolution > 6) { - params.numresolution = 6; - } - break; - case OPJ_CINEMA4K_24: - params.cp_rsiz = OPJ_CINEMA4K; - if (params.numresolution > 7) { - params.numresolution = 7; - } - break; + case OPJ_OFF: + params.cp_rsiz = OPJ_STD_RSIZ; + break; + case OPJ_CINEMA2K_24: + case OPJ_CINEMA2K_48: + params.cp_rsiz = OPJ_CINEMA2K; + if (params.numresolution > 6) { + params.numresolution = 6; + } + break; + case OPJ_CINEMA4K_24: + params.cp_rsiz = OPJ_CINEMA4K; + if (params.numresolution > 7) { + params.numresolution = 7; + } + break; } if (context->cinema_mode != OPJ_OFF) { @@ -504,24 +490,24 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) } /* Write each tile */ - tiles_x = (im->xsize + (params.image_offset_x0 - params.cp_tx0) - + tile_width - 1) / tile_width; - tiles_y = (im->ysize + (params.image_offset_y0 - params.cp_ty0) - + tile_height - 1) / tile_height; + tiles_x = (im->xsize + (params.image_offset_x0 - params.cp_tx0) + tile_width - 1) / + tile_width; + tiles_y = (im->ysize + (params.image_offset_y0 - params.cp_ty0) + tile_height - 1) / + tile_height; /* check for integer overflow for the malloc line, checking any expression that may multiply either tile_width or tile_height */ _overflow_scale_factor = components * prec; - if (( tile_width > UINT_MAX / _overflow_scale_factor ) || - ( tile_height > UINT_MAX / _overflow_scale_factor ) || - ( tile_width > UINT_MAX / (tile_height * _overflow_scale_factor )) || - ( tile_height > UINT_MAX / (tile_width * _overflow_scale_factor ))) { + if ((tile_width > UINT_MAX / _overflow_scale_factor) || + (tile_height > UINT_MAX / _overflow_scale_factor) || + (tile_width > UINT_MAX / (tile_height * _overflow_scale_factor)) || + (tile_height > UINT_MAX / (tile_width * _overflow_scale_factor))) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; } /* malloc check ok, checked for overflow above */ - state->buffer = malloc (tile_width * tile_height * components * prec / 8); + state->buffer = malloc(tile_width * tile_height * components * prec / 8); if (!state->buffer) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; @@ -564,8 +550,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) data_size = pixw * pixh * components * prec / 8; - if (!opj_write_tile(codec, tile_ndx++, state->buffer, - data_size, stream)) { + if (!opj_write_tile(codec, tile_ndx++, state->buffer, data_size, stream)) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; @@ -583,7 +568,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) state->state = J2K_STATE_DONE; ret = -1; - quick_exit: +quick_exit: if (codec) { opj_destroy_codec(codec); } @@ -598,14 +583,12 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) } int -ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) -{ +ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { if (state->state == J2K_STATE_FAILED) { return -1; } if (state->state == J2K_STATE_START) { - state->state = J2K_STATE_ENCODING; return j2k_encode_entry(im, state); @@ -628,12 +611,11 @@ ImagingJpeg2KEncodeCleanup(ImagingCodecState state) { } if (context->error_msg) { - free ((void *)context->error_msg); + free((void *)context->error_msg); } context->error_msg = NULL; - return -1; } diff --git a/src/libImaging/JpegDecode.c b/src/libImaging/JpegDecode.c index fb6112044..55d10a81a 100644 --- a/src/libImaging/JpegDecode.c +++ b/src/libImaging/JpegDecode.c @@ -21,10 +21,9 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" -#ifdef HAVE_LIBJPEG +#ifdef HAVE_LIBJPEG #undef HAVE_PROTOTYPES #undef HAVE_STDLIB_H @@ -37,7 +36,6 @@ #include "Jpeg.h" - #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) @@ -50,20 +48,19 @@ char *libjpeg_turbo_version = NULL; #endif int -ImagingJpegUseJCSExtensions() -{ +ImagingJpegUseJCSExtensions() { int use_jcs_extensions = 0; - #ifdef JCS_EXTENSIONS - #if defined(LIBJPEG_TURBO_VERSION_NUMBER) - #if LIBJPEG_TURBO_VERSION_NUMBER >= 1002010 - use_jcs_extensions = 1; - #endif - #else - if (libjpeg_turbo_version) { - use_jcs_extensions = strcmp(libjpeg_turbo_version, "1.2.1") >= 0; - } - #endif - #endif +#ifdef JCS_EXTENSIONS +#if defined(LIBJPEG_TURBO_VERSION_NUMBER) +#if LIBJPEG_TURBO_VERSION_NUMBER >= 1002010 + use_jcs_extensions = 1; +#endif +#else + if (libjpeg_turbo_version) { + use_jcs_extensions = strcmp(libjpeg_turbo_version, "1.2.1") >= 0; + } +#endif +#endif return use_jcs_extensions; } @@ -72,24 +69,19 @@ ImagingJpegUseJCSExtensions() /* -------------------------------------------------------------------- */ METHODDEF(void) -stub(j_decompress_ptr cinfo) -{ - /* empty */ -} +stub(j_decompress_ptr cinfo) { /* empty */ } METHODDEF(boolean) -fill_input_buffer(j_decompress_ptr cinfo) -{ +fill_input_buffer(j_decompress_ptr cinfo) { /* Suspension */ return FALSE; } METHODDEF(void) -skip_input_data(j_decompress_ptr cinfo, long num_bytes) -{ - JPEGSOURCE* source = (JPEGSOURCE*) cinfo->src; +skip_input_data(j_decompress_ptr cinfo, long num_bytes) { + JPEGSOURCE *source = (JPEGSOURCE *)cinfo->src; - if (num_bytes > (long) source->pub.bytes_in_buffer) { + if (num_bytes > (long)source->pub.bytes_in_buffer) { /* We need to skip more data than we have in the buffer. This will force the JPEG library to suspend decoding. */ source->skip = num_bytes - source->pub.bytes_in_buffer; @@ -103,50 +95,42 @@ skip_input_data(j_decompress_ptr cinfo, long num_bytes) } } - GLOBAL(void) -jpeg_buffer_src(j_decompress_ptr cinfo, JPEGSOURCE* source) -{ - cinfo->src = (void*) source; +jpeg_buffer_src(j_decompress_ptr cinfo, JPEGSOURCE *source) { + cinfo->src = (void *)source; - /* Prepare for suspending reader */ - source->pub.init_source = stub; - source->pub.fill_input_buffer = fill_input_buffer; - source->pub.skip_input_data = skip_input_data; - source->pub.resync_to_restart = jpeg_resync_to_restart; - source->pub.term_source = stub; - source->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + /* Prepare for suspending reader */ + source->pub.init_source = stub; + source->pub.fill_input_buffer = fill_input_buffer; + source->pub.skip_input_data = skip_input_data; + source->pub.resync_to_restart = jpeg_resync_to_restart; + source->pub.term_source = stub; + source->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ - source->skip = 0; + source->skip = 0; } - /* -------------------------------------------------------------------- */ /* Error handler */ /* -------------------------------------------------------------------- */ METHODDEF(void) -error(j_common_ptr cinfo) -{ - JPEGERROR* error; - error = (JPEGERROR*) cinfo->err; - longjmp(error->setjmp_buffer, 1); +error(j_common_ptr cinfo) { + JPEGERROR *error; + error = (JPEGERROR *)cinfo->err; + longjmp(error->setjmp_buffer, 1); } METHODDEF(void) -output(j_common_ptr cinfo) -{ - /* nothing */ -} +output(j_common_ptr cinfo) { /* nothing */ } /* -------------------------------------------------------------------- */ /* Decoder */ /* -------------------------------------------------------------------- */ int -ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - JPEGSTATE* context = (JPEGSTATE*) state->context; +ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + JPEGSTATE *context = (JPEGSTATE *)state->context; int ok; if (setjmp(context->error.setjmp_buffer)) { @@ -157,7 +141,6 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t by } if (!state->state) { - /* Setup decompression context */ context->cinfo.err = jpeg_std_error(&context->error.pub); context->error.pub.error_exit = error; @@ -167,7 +150,6 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t by /* Ready to decode */ state->state = 1; - } /* Load the source buffer */ @@ -182,137 +164,137 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t by } switch (state->state) { + case 1: - case 1: + /* Read JPEG header, until we find an image body. */ + do { + /* Note that we cannot return unless we have decoded + as much data as possible. */ + ok = jpeg_read_header(&context->cinfo, FALSE); - /* Read JPEG header, until we find an image body. */ - do { + } while (ok == JPEG_HEADER_TABLES_ONLY); - /* Note that we cannot return unless we have decoded - as much data as possible. */ - ok = jpeg_read_header(&context->cinfo, FALSE); + if (ok == JPEG_SUSPENDED) { + break; + } - } while (ok == JPEG_HEADER_TABLES_ONLY); + /* Decoder settings */ - if (ok == JPEG_SUSPENDED) { - break; - } + /* jpegmode indicates whats in the file; if not set, we'll + trust the decoder */ + if (strcmp(context->jpegmode, "L") == 0) { + context->cinfo.jpeg_color_space = JCS_GRAYSCALE; + } else if (strcmp(context->jpegmode, "RGB") == 0) { + context->cinfo.jpeg_color_space = JCS_RGB; + } else if (strcmp(context->jpegmode, "CMYK") == 0) { + context->cinfo.jpeg_color_space = JCS_CMYK; + } else if (strcmp(context->jpegmode, "YCbCr") == 0) { + context->cinfo.jpeg_color_space = JCS_YCbCr; + } else if (strcmp(context->jpegmode, "YCbCrK") == 0) { + context->cinfo.jpeg_color_space = JCS_YCCK; + } - /* Decoder settings */ - - /* jpegmode indicates whats in the file; if not set, we'll - trust the decoder */ - if (strcmp(context->jpegmode, "L") == 0) { - context->cinfo.jpeg_color_space = JCS_GRAYSCALE; - } else if (strcmp(context->jpegmode, "RGB") == 0) { - context->cinfo.jpeg_color_space = JCS_RGB; - } else if (strcmp(context->jpegmode, "CMYK") == 0) { - context->cinfo.jpeg_color_space = JCS_CMYK; - } else if (strcmp(context->jpegmode, "YCbCr") == 0) { - context->cinfo.jpeg_color_space = JCS_YCbCr; - } else if (strcmp(context->jpegmode, "YCbCrK") == 0) { - context->cinfo.jpeg_color_space = JCS_YCCK; - } - - /* rawmode indicates what we want from the decoder. if not - set, conversions are disabled */ - if (strcmp(context->rawmode, "L") == 0) { - context->cinfo.out_color_space = JCS_GRAYSCALE; - } else if (strcmp(context->rawmode, "RGB") == 0) { - context->cinfo.out_color_space = JCS_RGB; - } - #ifdef JCS_EXTENSIONS - else if (strcmp(context->rawmode, "RGBX") == 0) { + /* rawmode indicates what we want from the decoder. if not + set, conversions are disabled */ + if (strcmp(context->rawmode, "L") == 0) { + context->cinfo.out_color_space = JCS_GRAYSCALE; + } else if (strcmp(context->rawmode, "RGB") == 0) { + context->cinfo.out_color_space = JCS_RGB; + } +#ifdef JCS_EXTENSIONS + else if (strcmp(context->rawmode, "RGBX") == 0) { context->cinfo.out_color_space = JCS_EXT_RGBX; - } - #endif - else if (strcmp(context->rawmode, "CMYK") == 0 || - strcmp(context->rawmode, "CMYK;I") == 0) { - context->cinfo.out_color_space = JCS_CMYK; - } else if (strcmp(context->rawmode, "YCbCr") == 0) { - context->cinfo.out_color_space = JCS_YCbCr; - } else if (strcmp(context->rawmode, "YCbCrK") == 0) { - context->cinfo.out_color_space = JCS_YCCK; - } else { - /* Disable decoder conversions */ - context->cinfo.jpeg_color_space = JCS_UNKNOWN; - context->cinfo.out_color_space = JCS_UNKNOWN; - } + } +#endif + else if ( + strcmp(context->rawmode, "CMYK") == 0 || + strcmp(context->rawmode, "CMYK;I") == 0) { + context->cinfo.out_color_space = JCS_CMYK; + } else if (strcmp(context->rawmode, "YCbCr") == 0) { + context->cinfo.out_color_space = JCS_YCbCr; + } else if (strcmp(context->rawmode, "YCbCrK") == 0) { + context->cinfo.out_color_space = JCS_YCCK; + } else { + /* Disable decoder conversions */ + context->cinfo.jpeg_color_space = JCS_UNKNOWN; + context->cinfo.out_color_space = JCS_UNKNOWN; + } - if (context->scale > 1) { - context->cinfo.scale_num = 1; - context->cinfo.scale_denom = context->scale; - } - if (context->draft) { - context->cinfo.do_fancy_upsampling = FALSE; - context->cinfo.dct_method = JDCT_FASTEST; - } + if (context->scale > 1) { + context->cinfo.scale_num = 1; + context->cinfo.scale_denom = context->scale; + } + if (context->draft) { + context->cinfo.do_fancy_upsampling = FALSE; + context->cinfo.dct_method = JDCT_FASTEST; + } - state->state++; - /* fall through */ + state->state++; + /* fall through */ - case 2: + case 2: - /* Set things up for decompression (this processes the entire - file if necessary to return data line by line) */ - if (!jpeg_start_decompress(&context->cinfo)) { - break; - } + /* Set things up for decompression (this processes the entire + file if necessary to return data line by line) */ + if (!jpeg_start_decompress(&context->cinfo)) { + break; + } - state->state++; - /* fall through */ + state->state++; + /* fall through */ - case 3: + case 3: - /* Decompress a single line of data */ - ok = 1; - while (state->y < state->ysize) { - ok = jpeg_read_scanlines(&context->cinfo, &state->buffer, 1); + /* Decompress a single line of data */ + ok = 1; + while (state->y < state->ysize) { + ok = jpeg_read_scanlines(&context->cinfo, &state->buffer, 1); + if (ok != 1) { + break; + } + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); + state->y++; + } if (ok != 1) { break; } - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); - state->y++; - } - if (ok != 1) { - break; - } - state->state++; - /* fall through */ + state->state++; + /* fall through */ - case 4: + case 4: - /* Finish decompression */ - if (!jpeg_finish_decompress(&context->cinfo)) { - /* FIXME: add strictness mode test */ - if (state->y < state->ysize) { - break; + /* Finish decompression */ + if (!jpeg_finish_decompress(&context->cinfo)) { + /* FIXME: add strictness mode test */ + if (state->y < state->ysize) { + break; + } } - } - - /* Clean up */ - jpeg_destroy_decompress(&context->cinfo); - /* if (jerr.pub.num_warnings) return BROKEN; */ - return -1; + /* Clean up */ + jpeg_destroy_decompress(&context->cinfo); + /* if (jerr.pub.num_warnings) return BROKEN; */ + return -1; } /* Return number of bytes consumed */ return context->source.pub.next_input_byte - buf; - } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ -int ImagingJpegDecodeCleanup(ImagingCodecState state){ +int +ImagingJpegDecodeCleanup(ImagingCodecState state) { /* called to free the decompression engine when the decode terminates due to a corrupt or truncated image */ - JPEGSTATE* context = (JPEGSTATE*) state->context; + JPEGSTATE *context = (JPEGSTATE *)state->context; /* Clean up */ jpeg_destroy_decompress(&context->cinfo); @@ -320,4 +302,3 @@ int ImagingJpegDecodeCleanup(ImagingCodecState state){ } #endif - diff --git a/src/libImaging/JpegEncode.c b/src/libImaging/JpegEncode.c index ab730d92d..a44debcaf 100644 --- a/src/libImaging/JpegEncode.c +++ b/src/libImaging/JpegEncode.c @@ -19,10 +19,9 @@ * See the README file for details on usage and redistribution. */ - #include "Imaging.h" -#ifdef HAVE_LIBJPEG +#ifdef HAVE_LIBJPEG #undef HAVE_PROTOTYPES #undef HAVE_STDLIB_H @@ -40,51 +39,42 @@ /* -------------------------------------------------------------------- */ METHODDEF(void) -stub(j_compress_ptr cinfo) -{ - /* empty */ -} +stub(j_compress_ptr cinfo) { /* empty */ } METHODDEF(boolean) -empty_output_buffer (j_compress_ptr cinfo) -{ +empty_output_buffer(j_compress_ptr cinfo) { /* Suspension */ return FALSE; } GLOBAL(void) -jpeg_buffer_dest(j_compress_ptr cinfo, JPEGDESTINATION* destination) -{ - cinfo->dest = (void*) destination; +jpeg_buffer_dest(j_compress_ptr cinfo, JPEGDESTINATION *destination) { + cinfo->dest = (void *)destination; destination->pub.init_destination = stub; destination->pub.empty_output_buffer = empty_output_buffer; destination->pub.term_destination = stub; } - /* -------------------------------------------------------------------- */ /* Error handler */ /* -------------------------------------------------------------------- */ METHODDEF(void) -error(j_common_ptr cinfo) -{ - JPEGERROR* error; - error = (JPEGERROR*) cinfo->err; - (*cinfo->err->output_message) (cinfo); +error(j_common_ptr cinfo) { + JPEGERROR *error; + error = (JPEGERROR *)cinfo->err; + (*cinfo->err->output_message)(cinfo); longjmp(error->setjmp_buffer, 1); } - /* -------------------------------------------------------------------- */ /* Encoder */ /* -------------------------------------------------------------------- */ int -ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - JPEGENCODERSTATE* context = (JPEGENCODERSTATE*) state->context; +ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + JPEGENCODERSTATE *context = (JPEGENCODERSTATE *)state->context; int ok; if (setjmp(context->error.setjmp_buffer)) { @@ -95,7 +85,6 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } if (!state->state) { - /* Setup compression context (very similar to the decoder) */ context->cinfo.err = jpeg_std_error(&context->error.pub); context->error.pub.error_exit = error; @@ -106,7 +95,6 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* Ready to encode */ state->state = 1; - } /* Load the destination buffer */ @@ -114,7 +102,6 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->destination.pub.free_in_buffer = bytes; switch (state->state) { - case 1: context->cinfo.image_width = state->xsize; @@ -136,11 +123,11 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) case 32: context->cinfo.input_components = 4; context->cinfo.in_color_space = JCS_CMYK; - #ifdef JCS_EXTENSIONS +#ifdef JCS_EXTENSIONS if (strcmp(context->rawmode, "RGBX") == 0) { context->cinfo.in_color_space = JCS_EXT_RGBX; } - #endif +#endif break; default: state->errcode = IMAGING_CODEC_CONFIG; @@ -159,15 +146,20 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) quality = context->quality; } for (i = 0; i < context->qtablesLen; i++) { - jpeg_add_quant_table(&context->cinfo, i, &context->qtables[i * DCTSIZE2], - quality, FALSE); + jpeg_add_quant_table( + &context->cinfo, + i, + &context->qtables[i * DCTSIZE2], + quality, + FALSE); context->cinfo.comp_info[i].quant_tbl_no = i; last_q = i; } if (context->qtablesLen == 1) { - // jpeg_set_defaults created two qtables internally, but we only wanted one. - jpeg_add_quant_table(&context->cinfo, 1, &context->qtables[0], - quality, FALSE); + // jpeg_set_defaults created two qtables internally, but we only + // wanted one. + jpeg_add_quant_table( + &context->cinfo, 1, &context->qtables[0], quality, FALSE); } for (i = last_q; i < context->cinfo.num_components; i++) { context->cinfo.comp_info[i].quant_tbl_no = last_q; @@ -177,9 +169,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } /* Set subsampling options */ - switch (context->subsampling) - { - case 0: /* 1x1 1x1 1x1 (4:4:4) : None */ + switch (context->subsampling) { + case 0: /* 1x1 1x1 1x1 (4:4:4) : None */ { context->cinfo.comp_info[0].h_samp_factor = 1; context->cinfo.comp_info[0].v_samp_factor = 1; @@ -189,7 +180,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->cinfo.comp_info[2].v_samp_factor = 1; break; } - case 1: /* 2x1, 1x1, 1x1 (4:2:2) : Medium */ + case 1: /* 2x1, 1x1, 1x1 (4:2:2) : Medium */ { context->cinfo.comp_info[0].h_samp_factor = 2; context->cinfo.comp_info[0].v_samp_factor = 1; @@ -199,7 +190,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->cinfo.comp_info[2].v_samp_factor = 1; break; } - case 2: /* 2x2, 1x1, 1x1 (4:2:0) : High */ + case 2: /* 2x2, 1x1, 1x1 (4:2:0) : High */ { context->cinfo.comp_info[0].h_samp_factor = 2; context->cinfo.comp_info[0].v_samp_factor = 2; @@ -209,23 +200,22 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->cinfo.comp_info[2].v_samp_factor = 1; break; } - default: - { + default: { /* Use the lib's default */ break; } - } - if (context->progressive) { - jpeg_simple_progression(&context->cinfo); - } - context->cinfo.smoothing_factor = context->smooth; - context->cinfo.optimize_coding = (boolean) context->optimize; - if (context->xdpi > 0 && context->ydpi > 0) { - context->cinfo.write_JFIF_header = TRUE; - context->cinfo.density_unit = 1; /* dots per inch */ - context->cinfo.X_density = context->xdpi; - context->cinfo.Y_density = context->ydpi; - } + } + if (context->progressive) { + jpeg_simple_progression(&context->cinfo); + } + context->cinfo.smoothing_factor = context->smooth; + context->cinfo.optimize_coding = (boolean)context->optimize; + if (context->xdpi > 0 && context->ydpi > 0) { + context->cinfo.write_JFIF_header = TRUE; + context->cinfo.density_unit = 1; /* dots per inch */ + context->cinfo.X_density = context->xdpi; + context->cinfo.Y_density = context->ydpi; + } switch (context->streamtype) { case 1: /* tables only -- not yet implemented */ @@ -248,13 +238,16 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) case 2: // check for exif len + 'APP1' header bytes - if (context->rawExifLen + 5 > context->destination.pub.free_in_buffer){ + if (context->rawExifLen + 5 > context->destination.pub.free_in_buffer) { break; } - //add exif header - if (context->rawExifLen > 0){ - jpeg_write_marker(&context->cinfo, JPEG_APP0+1, - (unsigned char*)context->rawExif, context->rawExifLen); + // add exif header + if (context->rawExifLen > 0) { + jpeg_write_marker( + &context->cinfo, + JPEG_APP0 + 1, + (unsigned char *)context->rawExif, + context->rawExifLen); } state->state++; @@ -267,8 +260,10 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) if (n > context->destination.pub.free_in_buffer) { n = context->destination.pub.free_in_buffer; } - memcpy(context->destination.pub.next_output_byte, - context->extra + context->extra_offset, n); + memcpy( + context->destination.pub.next_output_byte, + context->extra + context->extra_offset, + n); context->destination.pub.next_output_byte += n; context->destination.pub.free_in_buffer -= n; context->extra_offset += n; @@ -282,15 +277,17 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } case 4: - if (1024 > context->destination.pub.free_in_buffer){ + if (1024 > context->destination.pub.free_in_buffer) { break; } ok = 1; while (state->y < state->ysize) { - state->shuffle(state->buffer, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->xsize); + state->shuffle( + state->buffer, + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); ok = jpeg_write_scanlines(&context->cinfo, &state->buffer, 1); if (ok != 1) { break; @@ -330,17 +327,14 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* if (jerr.pub.num_warnings) return BROKEN; */ state->errcode = IMAGING_CODEC_END; break; - } /* Return number of bytes in output buffer */ return context->destination.pub.next_output_byte - buf; - } -const char* -ImagingJpegVersion(void) -{ +const char * +ImagingJpegVersion(void) { static char version[20]; sprintf(version, "%d.%d", JPEG_LIB_VERSION / 10, JPEG_LIB_VERSION % 10); return version; diff --git a/src/libImaging/Matrix.c b/src/libImaging/Matrix.c index e02b7b312..137ed242a 100644 --- a/src/libImaging/Matrix.c +++ b/src/libImaging/Matrix.c @@ -13,65 +13,60 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - -#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8) v) - +#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8)v) Imaging -ImagingConvertMatrix(Imaging im, const char *mode, float m[]) -{ +ImagingConvertMatrix(Imaging im, const char *mode, float m[]) { Imaging imOut; int x, y; /* Assume there's enough data in the buffer */ if (!im) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (strcmp(mode, "L") == 0 && im->bands == 3) { - imOut = ImagingNewDirty("L", im->xsize, im->ysize); if (!imOut) { return NULL; } for (y = 0; y < im->ysize; y++) { - UINT8* in = (UINT8*) im->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in = (UINT8 *)im->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < im->xsize; x++) { - float v = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; + float v = m[0] * in[0] + m[1] * in[1] + m[2] * in[2] + m[3] + 0.5; out[x] = CLIPF(v); in += 4; } } } else if (strlen(mode) == 3 && im->bands == 3) { - imOut = ImagingNewDirty(mode, im->xsize, im->ysize); if (!imOut) { return NULL; } for (y = 0; y < im->ysize; y++) { - UINT8* in = (UINT8*) im->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in = (UINT8 *)im->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < im->xsize; x++) { - float v0 = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; - float v1 = m[4]*in[0] + m[5]*in[1] + m[6]*in[2] + m[7] + 0.5; - float v2 = m[8]*in[0] + m[9]*in[1] + m[10]*in[2] + m[11] + 0.5; + float v0 = m[0] * in[0] + m[1] * in[1] + m[2] * in[2] + m[3] + 0.5; + float v1 = m[4] * in[0] + m[5] * in[1] + m[6] * in[2] + m[7] + 0.5; + float v2 = m[8] * in[0] + m[9] * in[1] + m[10] * in[2] + m[11] + 0.5; out[0] = CLIPF(v0); out[1] = CLIPF(v1); out[2] = CLIPF(v2); - in += 4; out += 4; + in += 4; + out += 4; } } } else { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } return imOut; diff --git a/src/libImaging/ModeFilter.c b/src/libImaging/ModeFilter.c index b1cf7442c..757cbc3fb 100644 --- a/src/libImaging/ModeFilter.c +++ b/src/libImaging/ModeFilter.c @@ -16,8 +16,7 @@ #include "Imaging.h" Imaging -ImagingModeFilter(Imaging im, int size) -{ +ImagingModeFilter(Imaging im, int size) { Imaging imOut; int x, y, i; int xx, yy; @@ -26,7 +25,7 @@ ImagingModeFilter(Imaging im, int size) int histogram[256]; if (!im || im->bands != 1 || im->type != IMAGING_TYPE_UINT8) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); @@ -37,9 +36,8 @@ ImagingModeFilter(Imaging im, int size) size = size / 2; for (y = 0; y < imOut->ysize; y++) { - UINT8* out = &IMAGING_PIXEL_L(imOut, 0, y); + UINT8 *out = &IMAGING_PIXEL_L(imOut, 0, y); for (x = 0; x < imOut->xsize; x++) { - /* calculate histogram over current area */ /* FIXME: brute force! to improve, update the histogram @@ -50,7 +48,7 @@ ImagingModeFilter(Imaging im, int size) memset(histogram, 0, sizeof(histogram)); for (yy = y - size; yy <= y + size; yy++) { if (yy >= 0 && yy < imOut->ysize) { - UINT8* in = &IMAGING_PIXEL_L(im, 0, yy); + UINT8 *in = &IMAGING_PIXEL_L(im, 0, yy); for (xx = x - size; xx <= x + size; xx++) { if (xx >= 0 && xx < imOut->xsize) { histogram[in[xx]]++; @@ -65,7 +63,7 @@ ImagingModeFilter(Imaging im, int size) for (i = 1; i < 256; i++) { if (histogram[i] > maxcount) { maxcount = histogram[i]; - maxpixel = (UINT8) i; + maxpixel = (UINT8)i; } } @@ -74,9 +72,7 @@ ImagingModeFilter(Imaging im, int size) } else { out[x] = IMAGING_PIXEL_L(im, x, y); } - } - } ImagingCopyPalette(imOut, im); diff --git a/src/libImaging/Negative.c b/src/libImaging/Negative.c index 09c946bbe..70b96c397 100644 --- a/src/libImaging/Negative.c +++ b/src/libImaging/Negative.c @@ -16,18 +16,15 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - Imaging -ImagingNegative(Imaging im) -{ +ImagingNegative(Imaging im) { Imaging imOut; int x, y; if (!im) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); @@ -43,4 +40,3 @@ ImagingNegative(Imaging im) return imOut; } - diff --git a/src/libImaging/Offset.c b/src/libImaging/Offset.c index 29f038153..91ee91083 100644 --- a/src/libImaging/Offset.c +++ b/src/libImaging/Offset.c @@ -14,18 +14,15 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - Imaging -ImagingOffset(Imaging im, int xoffset, int yoffset) -{ +ImagingOffset(Imaging im, int xoffset, int yoffset) { int x, y; Imaging imOut; if (!im) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); @@ -48,13 +45,13 @@ ImagingOffset(Imaging im, int xoffset, int yoffset) yoffset += im->ysize; } -#define OFFSET(image)\ - for (y = 0; y < im->ysize; y++) {\ - for (x = 0; x < im->xsize; x++) {\ - int yi = (y + yoffset) % im->ysize;\ - int xi = (x + xoffset) % im->xsize;\ - imOut->image[y][x] = im->image[yi][xi];\ - }\ +#define OFFSET(image) \ + for (y = 0; y < im->ysize; y++) { \ + for (x = 0; x < im->xsize; x++) { \ + int yi = (y + yoffset) % im->ysize; \ + int xi = (x + xoffset) % im->xsize; \ + imOut->image[y][x] = im->image[yi][xi]; \ + } \ } if (im->image8) { diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index 0be7ad8c9..2fdee919f 100644 --- a/src/libImaging/Pack.c +++ b/src/libImaging/Pack.c @@ -1,4 +1,4 @@ - /* +/* * The Python Imaging Library. * $Id$ * @@ -25,7 +25,6 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #define R 0 @@ -41,20 +40,28 @@ /* byte swapping macros */ -#define C16N\ - (out[0]=tmp[0], out[1]=tmp[1]); -#define C16S\ - (out[1]=tmp[0], out[0]=tmp[1]); -#define C32N\ - (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3]); -#define C32S\ - (out[3]=tmp[0], out[2]=tmp[1], out[1]=tmp[2], out[0]=tmp[3]); -#define C64N\ - (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3],\ - out[4]=tmp[4], out[5]=tmp[5], out[6]=tmp[6], out[7]=tmp[7]); -#define C64S\ - (out[7]=tmp[0], out[6]=tmp[1], out[5]=tmp[2], out[4]=tmp[3],\ - out[3]=tmp[4], out[2]=tmp[5], out[1]=tmp[6], out[0]=tmp[7]); +#define C16N (out[0] = tmp[0], out[1] = tmp[1]); +#define C16S (out[1] = tmp[0], out[0] = tmp[1]); +#define C32N (out[0] = tmp[0], out[1] = tmp[1], out[2] = tmp[2], out[3] = tmp[3]); +#define C32S (out[3] = tmp[0], out[2] = tmp[1], out[1] = tmp[2], out[0] = tmp[3]); +#define C64N \ + (out[0] = tmp[0], \ + out[1] = tmp[1], \ + out[2] = tmp[2], \ + out[3] = tmp[3], \ + out[4] = tmp[4], \ + out[5] = tmp[5], \ + out[6] = tmp[6], \ + out[7] = tmp[7]); +#define C64S \ + (out[7] = tmp[0], \ + out[6] = tmp[1], \ + out[5] = tmp[2], \ + out[4] = tmp[3], \ + out[3] = tmp[4], \ + out[2] = tmp[5], \ + out[1] = tmp[6], \ + out[0] = tmp[7]); #ifdef WORDS_BIGENDIAN #define C16B C16N @@ -72,13 +79,12 @@ #define C64L C64N #endif - static void -pack1(UINT8* out, const UINT8* in, int pixels) -{ +pack1(UINT8 *out, const UINT8 *in, int pixels) { int i, m, b; /* bilevel (black is 0) */ - b = 0; m = 128; + b = 0; + m = 128; for (i = 0; i < pixels; i++) { if (in[i] != 0) { b |= m; @@ -86,7 +92,8 @@ pack1(UINT8* out, const UINT8* in, int pixels) m >>= 1; if (m == 0) { *out++ = b; - b = 0; m = 128; + b = 0; + m = 128; } } if (m != 128) { @@ -95,11 +102,11 @@ pack1(UINT8* out, const UINT8* in, int pixels) } static void -pack1I(UINT8* out, const UINT8* in, int pixels) -{ +pack1I(UINT8 *out, const UINT8 *in, int pixels) { int i, m, b; /* bilevel (black is 1) */ - b = 0; m = 128; + b = 0; + m = 128; for (i = 0; i < pixels; i++) { if (in[i] == 0) { b |= m; @@ -107,7 +114,8 @@ pack1I(UINT8* out, const UINT8* in, int pixels) m >>= 1; if (m == 0) { *out++ = b; - b = 0; m = 128; + b = 0; + m = 128; } } if (m != 128) { @@ -116,19 +124,20 @@ pack1I(UINT8* out, const UINT8* in, int pixels) } static void -pack1R(UINT8* out, const UINT8* in, int pixels) -{ +pack1R(UINT8 *out, const UINT8 *in, int pixels) { int i, m, b; /* bilevel, lsb first (black is 0) */ - b = 0; m = 1; + b = 0; + m = 1; for (i = 0; i < pixels; i++) { if (in[i] != 0) { b |= m; } m <<= 1; - if (m == 256){ + if (m == 256) { *out++ = b; - b = 0; m = 1; + b = 0; + m = 1; } } if (m != 1) { @@ -137,19 +146,20 @@ pack1R(UINT8* out, const UINT8* in, int pixels) } static void -pack1IR(UINT8* out, const UINT8* in, int pixels) -{ +pack1IR(UINT8 *out, const UINT8 *in, int pixels) { int i, m, b; /* bilevel, lsb first (black is 1) */ - b = 0; m = 1; + b = 0; + m = 1; for (i = 0; i < pixels; i++) { if (in[i] == 0) { b |= m; } m <<= 1; - if (m == 256){ + if (m == 256) { *out++ = b; - b = 0; m = 1; + b = 0; + m = 1; } } if (m != 1) { @@ -158,8 +168,7 @@ pack1IR(UINT8* out, const UINT8* in, int pixels) } static void -pack1L(UINT8* out, const UINT8* in, int pixels) -{ +pack1L(UINT8 *out, const UINT8 *in, int pixels) { int i; /* bilevel, stored as bytes */ for (i = 0; i < pixels; i++) { @@ -168,12 +177,11 @@ pack1L(UINT8* out, const UINT8* in, int pixels) } static void -packP4(UINT8* out, const UINT8* in, int pixels) -{ +packP4(UINT8 *out, const UINT8 *in, int pixels) { while (pixels >= 2) { - *out++ = (in[0] << 4) | - (in[1] & 15); - in += 2; pixels -= 2; + *out++ = (in[0] << 4) | (in[1] & 15); + in += 2; + pixels -= 2; } if (pixels) { @@ -182,34 +190,27 @@ packP4(UINT8* out, const UINT8* in, int pixels) } static void -packP2(UINT8* out, const UINT8* in, int pixels) -{ +packP2(UINT8 *out, const UINT8 *in, int pixels) { while (pixels >= 4) { - *out++ = (in[0] << 6) | - ((in[1] & 3) << 4) | - ((in[2] & 3) << 2) | - (in[3] & 3); - in += 4; pixels -= 4; + *out++ = (in[0] << 6) | ((in[1] & 3) << 4) | ((in[2] & 3) << 2) | (in[3] & 3); + in += 4; + pixels -= 4; } switch (pixels) { - case 3: - out[0] = (in[0] << 6) | - ((in[1] & 3) << 4) | - ((in[2] & 3) << 2); - break; - case 2: - out[0] = (in[0] << 6) | - ((in[1] & 3) << 4); - break; - case 1: - out[0] = (in[0] << 6); + case 3: + out[0] = (in[0] << 6) | ((in[1] & 3) << 4) | ((in[2] & 3) << 2); + break; + case 2: + out[0] = (in[0] << 6) | ((in[1] & 3) << 4); + break; + case 1: + out[0] = (in[0] << 6); } } static void -packL16(UINT8* out, const UINT8* in, int pixels) -{ +packL16(UINT8 *out, const UINT8 *in, int pixels) { int i; /* L -> L;16, e.g: \xff77 -> \x00\xff\x00\x77 */ for (i = 0; i < pixels; i++) { @@ -220,8 +221,7 @@ packL16(UINT8* out, const UINT8* in, int pixels) } static void -packL16B(UINT8* out, const UINT8* in, int pixels) -{ +packL16B(UINT8 *out, const UINT8 *in, int pixels) { int i; /* L -> L;16B, e.g: \xff77 -> \xff\x00\x77\x00 */ for (i = 0; i < pixels; i++) { @@ -231,34 +231,31 @@ packL16B(UINT8* out, const UINT8* in, int pixels) } } - static void -packLA(UINT8* out, const UINT8* in, int pixels) -{ +packLA(UINT8 *out, const UINT8 *in, int pixels) { int i; /* LA, pixel interleaved */ for (i = 0; i < pixels; i++) { out[0] = in[R]; out[1] = in[A]; - out += 2; in += 4; + out += 2; + in += 4; } } static void -packLAL(UINT8* out, const UINT8* in, int pixels) -{ +packLAL(UINT8 *out, const UINT8 *in, int pixels) { int i; /* LA, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; - out[i+pixels] = in[A]; + out[i + pixels] = in[A]; in += 4; } } void -ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackRGB(UINT8 *out, const UINT8 *in, int pixels) { int i = 0; /* RGB triplets */ #ifdef __sparc @@ -267,25 +264,25 @@ ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) out[0] = in[R]; out[1] = in[G]; out[2] = in[B]; - out += 3; in += 4; + out += 3; + in += 4; } #else - for (; i < pixels-1; i++) { + for (; i < pixels - 1; i++) { memcpy(out, in + i * 4, 4); out += 3; } for (; i < pixels; i++) { - out[0] = in[i*4+R]; - out[1] = in[i*4+G]; - out[2] = in[i*4+B]; + out[0] = in[i * 4 + R]; + out[1] = in[i * 4 + G]; + out[2] = in[i * 4 + B]; out += 3; } #endif } void -ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackXRGB(UINT8 *out, const UINT8 *in, int pixels) { int i; /* XRGB, triplets with left padding */ for (i = 0; i < pixels; i++) { @@ -293,26 +290,26 @@ ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) out[1] = in[R]; out[2] = in[G]; out[3] = in[B]; - out += 4; in += 4; + out += 4; + in += 4; } } void -ImagingPackBGR(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackBGR(UINT8 *out, const UINT8 *in, int pixels) { int i; /* RGB, reversed bytes */ for (i = 0; i < pixels; i++) { out[0] = in[B]; out[1] = in[G]; out[2] = in[R]; - out += 3; in += 4; + out += 3; + in += 4; } } void -ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackBGRX(UINT8 *out, const UINT8 *in, int pixels) { int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { @@ -320,13 +317,13 @@ ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) out[1] = in[G]; out[2] = in[R]; out[3] = 0; - out += 4; in += 4; + out += 4; + in += 4; } } void -ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackXBGR(UINT8 *out, const UINT8 *in, int pixels) { int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { @@ -334,13 +331,13 @@ ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) out[1] = in[B]; out[2] = in[G]; out[3] = in[R]; - out += 4; in += 4; + out += 4; + in += 4; } } void -ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackBGRA(UINT8 *out, const UINT8 *in, int pixels) { int i; /* BGRX, reversed bytes with right padding */ for (i = 0; i < pixels; i++) { @@ -348,13 +345,13 @@ ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) out[1] = in[G]; out[2] = in[R]; out[3] = in[A]; - out += 4; in += 4; + out += 4; + in += 4; } } void -ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackABGR(UINT8 *out, const UINT8 *in, int pixels) { int i; /* XBGR, reversed bytes with left padding */ for (i = 0; i < pixels; i++) { @@ -362,13 +359,13 @@ ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) out[1] = in[B]; out[2] = in[G]; out[3] = in[R]; - out += 4; in += 4; + out += 4; + in += 4; } } void -ImagingPackBGRa(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackBGRa(UINT8 *out, const UINT8 *in, int pixels) { int i; /* BGRa, reversed bytes with premultiplied alpha */ for (i = 0; i < pixels; i++) { @@ -377,43 +374,41 @@ ImagingPackBGRa(UINT8* out, const UINT8* in, int pixels) out[0] = MULDIV255(in[B], alpha, tmp); out[1] = MULDIV255(in[G], alpha, tmp); out[2] = MULDIV255(in[R], alpha, tmp); - out += 4; in += 4; + out += 4; + in += 4; } } static void -packRGBL(UINT8* out, const UINT8* in, int pixels) -{ +packRGBL(UINT8 *out, const UINT8 *in, int pixels) { int i; /* RGB, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; - out[i+pixels] = in[G]; - out[i+pixels+pixels] = in[B]; + out[i + pixels] = in[G]; + out[i + pixels + pixels] = in[B]; in += 4; } } static void -packRGBXL(UINT8* out, const UINT8* in, int pixels) -{ +packRGBXL(UINT8 *out, const UINT8 *in, int pixels) { int i; /* RGBX, line interleaved */ for (i = 0; i < pixels; i++) { out[i] = in[R]; - out[i+pixels] = in[G]; - out[i+pixels+pixels] = in[B]; - out[i+pixels+pixels+pixels] = in[X]; + out[i + pixels] = in[G]; + out[i + pixels + pixels] = in[B]; + out[i + pixels + pixels + pixels] = in[X]; in += 4; } } static void -packI16B(UINT8* out, const UINT8* in_, int pixels) -{ +packI16B(UINT8 *out, const UINT8 *in_, int pixels) { int i; UINT16 tmp_; - UINT8* tmp = (UINT8*) &tmp_; + UINT8 *tmp = (UINT8 *)&tmp_; for (i = 0; i < pixels; i++) { INT32 in; memcpy(&in, in_, sizeof(in)); @@ -425,96 +420,91 @@ packI16B(UINT8* out, const UINT8* in_, int pixels) tmp_ = in; } C16B; - out += 2; in_ += sizeof(in); + out += 2; + in_ += sizeof(in); } } static void -packI16N_I16B(UINT8* out, const UINT8* in, int pixels){ +packI16N_I16B(UINT8 *out, const UINT8 *in, int pixels) { int i; - UINT8* tmp = (UINT8*) in; + UINT8 *tmp = (UINT8 *)in; for (i = 0; i < pixels; i++) { C16B; - out += 2; tmp += 2; + out += 2; + tmp += 2; } - } static void -packI16N_I16(UINT8* out, const UINT8* in, int pixels){ +packI16N_I16(UINT8 *out, const UINT8 *in, int pixels) { int i; - UINT8* tmp = (UINT8*) in; + UINT8 *tmp = (UINT8 *)in; for (i = 0; i < pixels; i++) { C16L; - out += 2; tmp += 2; + out += 2; + tmp += 2; } } - static void -packI32S(UINT8* out, const UINT8* in, int pixels) -{ +packI32S(UINT8 *out, const UINT8 *in, int pixels) { int i; - UINT8* tmp = (UINT8*) in; + UINT8 *tmp = (UINT8 *)in; for (i = 0; i < pixels; i++) { C32L; - out += 4; tmp += 4; + out += 4; + tmp += 4; } } void -ImagingPackLAB(UINT8* out, const UINT8* in, int pixels) -{ +ImagingPackLAB(UINT8 *out, const UINT8 *in, int pixels) { int i; /* LAB triplets */ for (i = 0; i < pixels; i++) { out[0] = in[0]; out[1] = in[1] ^ 128; /* signed in outside world */ out[2] = in[2] ^ 128; - out += 3; in += 4; + out += 3; + in += 4; } } static void -copy1(UINT8* out, const UINT8* in, int pixels) -{ +copy1(UINT8 *out, const UINT8 *in, int pixels) { /* L, P */ memcpy(out, in, pixels); } static void -copy2(UINT8* out, const UINT8* in, int pixels) -{ +copy2(UINT8 *out, const UINT8 *in, int pixels) { /* I;16, etc */ - memcpy(out, in, pixels*2); + memcpy(out, in, pixels * 2); } static void -copy3(UINT8* out, const UINT8* in, int pixels) -{ +copy3(UINT8 *out, const UINT8 *in, int pixels) { /* BGR;24, etc */ - memcpy(out, in, pixels*3); + memcpy(out, in, pixels * 3); } static void -copy4(UINT8* out, const UINT8* in, int pixels) -{ +copy4(UINT8 *out, const UINT8 *in, int pixels) { /* RGBA, CMYK quadruples */ - memcpy(out, in, 4*pixels); + memcpy(out, in, 4 * pixels); } static void -copy4I(UINT8* out, const UINT8* in, int pixels) -{ +copy4I(UINT8 *out, const UINT8 *in, int pixels) { /* RGBA, CMYK quadruples, inverted */ int i; - for (i = 0; i < pixels*4; i++) { + for (i = 0; i < pixels * 4; i++) { out[i] = ~in[i]; } } static void -band0(UINT8* out, const UINT8* in, int pixels) -{ +band0(UINT8 *out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) { out[i] = in[0]; @@ -522,8 +512,7 @@ band0(UINT8* out, const UINT8* in, int pixels) } static void -band1(UINT8* out, const UINT8* in, int pixels) -{ +band1(UINT8 *out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) { out[i] = in[1]; @@ -531,8 +520,7 @@ band1(UINT8* out, const UINT8* in, int pixels) } static void -band2(UINT8* out, const UINT8* in, int pixels) -{ +band2(UINT8 *out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) { out[i] = in[2]; @@ -540,8 +528,7 @@ band2(UINT8* out, const UINT8* in, int pixels) } static void -band3(UINT8* out, const UINT8* in, int pixels) -{ +band3(UINT8 *out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++, in += 4) { out[i] = in[3]; @@ -549,143 +536,141 @@ band3(UINT8* out, const UINT8* in, int pixels) } static struct { - const char* mode; - const char* rawmode; + const char *mode; + const char *rawmode; int bits; ImagingShuffler pack; } packers[] = { /* bilevel */ - {"1", "1", 1, pack1}, - {"1", "1;I", 1, pack1I}, - {"1", "1;R", 1, pack1R}, - {"1", "1;IR", 1, pack1IR}, - {"1", "L", 8, pack1L}, + {"1", "1", 1, pack1}, + {"1", "1;I", 1, pack1I}, + {"1", "1;R", 1, pack1R}, + {"1", "1;IR", 1, pack1IR}, + {"1", "L", 8, pack1L}, /* greyscale */ - {"L", "L", 8, copy1}, - {"L", "L;16", 16, packL16}, - {"L", "L;16B", 16, packL16B}, + {"L", "L", 8, copy1}, + {"L", "L;16", 16, packL16}, + {"L", "L;16B", 16, packL16B}, /* greyscale w. alpha */ - {"LA", "LA", 16, packLA}, - {"LA", "LA;L", 16, packLAL}, + {"LA", "LA", 16, packLA}, + {"LA", "LA;L", 16, packLAL}, /* greyscale w. alpha premultiplied */ - {"La", "La", 16, packLA}, + {"La", "La", 16, packLA}, /* palette */ - {"P", "P;1", 1, pack1}, - {"P", "P;2", 2, packP2}, - {"P", "P;4", 4, packP4}, - {"P", "P", 8, copy1}, + {"P", "P;1", 1, pack1}, + {"P", "P;2", 2, packP2}, + {"P", "P;4", 4, packP4}, + {"P", "P", 8, copy1}, /* palette w. alpha */ - {"PA", "PA", 16, packLA}, - {"PA", "PA;L", 16, packLAL}, + {"PA", "PA", 16, packLA}, + {"PA", "PA;L", 16, packLAL}, /* true colour */ - {"RGB", "RGB", 24, ImagingPackRGB}, - {"RGB", "RGBX", 32, copy4}, - {"RGB", "XRGB", 32, ImagingPackXRGB}, - {"RGB", "BGR", 24, ImagingPackBGR}, - {"RGB", "BGRX", 32, ImagingPackBGRX}, - {"RGB", "XBGR", 32, ImagingPackXBGR}, - {"RGB", "RGB;L", 24, packRGBL}, - {"RGB", "R", 8, band0}, - {"RGB", "G", 8, band1}, - {"RGB", "B", 8, band2}, + {"RGB", "RGB", 24, ImagingPackRGB}, + {"RGB", "RGBX", 32, copy4}, + {"RGB", "XRGB", 32, ImagingPackXRGB}, + {"RGB", "BGR", 24, ImagingPackBGR}, + {"RGB", "BGRX", 32, ImagingPackBGRX}, + {"RGB", "XBGR", 32, ImagingPackXBGR}, + {"RGB", "RGB;L", 24, packRGBL}, + {"RGB", "R", 8, band0}, + {"RGB", "G", 8, band1}, + {"RGB", "B", 8, band2}, /* true colour w. alpha */ - {"RGBA", "RGBA", 32, copy4}, - {"RGBA", "RGBA;L", 32, packRGBXL}, - {"RGBA", "RGB", 24, ImagingPackRGB}, - {"RGBA", "BGR", 24, ImagingPackBGR}, - {"RGBA", "BGRA", 32, ImagingPackBGRA}, - {"RGBA", "ABGR", 32, ImagingPackABGR}, - {"RGBA", "BGRa", 32, ImagingPackBGRa}, - {"RGBA", "R", 8, band0}, - {"RGBA", "G", 8, band1}, - {"RGBA", "B", 8, band2}, - {"RGBA", "A", 8, band3}, + {"RGBA", "RGBA", 32, copy4}, + {"RGBA", "RGBA;L", 32, packRGBXL}, + {"RGBA", "RGB", 24, ImagingPackRGB}, + {"RGBA", "BGR", 24, ImagingPackBGR}, + {"RGBA", "BGRA", 32, ImagingPackBGRA}, + {"RGBA", "ABGR", 32, ImagingPackABGR}, + {"RGBA", "BGRa", 32, ImagingPackBGRa}, + {"RGBA", "R", 8, band0}, + {"RGBA", "G", 8, band1}, + {"RGBA", "B", 8, band2}, + {"RGBA", "A", 8, band3}, /* true colour w. alpha premultiplied */ - {"RGBa", "RGBa", 32, copy4}, - {"RGBa", "BGRa", 32, ImagingPackBGRA}, - {"RGBa", "aBGR", 32, ImagingPackABGR}, + {"RGBa", "RGBa", 32, copy4}, + {"RGBa", "BGRa", 32, ImagingPackBGRA}, + {"RGBa", "aBGR", 32, ImagingPackABGR}, /* true colour w. padding */ - {"RGBX", "RGBX", 32, copy4}, - {"RGBX", "RGBX;L", 32, packRGBXL}, - {"RGBX", "RGB", 24, ImagingPackRGB}, - {"RGBX", "BGR", 24, ImagingPackBGR}, - {"RGBX", "BGRX", 32, ImagingPackBGRX}, - {"RGBX", "XBGR", 32, ImagingPackXBGR}, - {"RGBX", "R", 8, band0}, - {"RGBX", "G", 8, band1}, - {"RGBX", "B", 8, band2}, - {"RGBX", "X", 8, band3}, + {"RGBX", "RGBX", 32, copy4}, + {"RGBX", "RGBX;L", 32, packRGBXL}, + {"RGBX", "RGB", 24, ImagingPackRGB}, + {"RGBX", "BGR", 24, ImagingPackBGR}, + {"RGBX", "BGRX", 32, ImagingPackBGRX}, + {"RGBX", "XBGR", 32, ImagingPackXBGR}, + {"RGBX", "R", 8, band0}, + {"RGBX", "G", 8, band1}, + {"RGBX", "B", 8, band2}, + {"RGBX", "X", 8, band3}, /* colour separation */ - {"CMYK", "CMYK", 32, copy4}, - {"CMYK", "CMYK;I", 32, copy4I}, - {"CMYK", "CMYK;L", 32, packRGBXL}, - {"CMYK", "C", 8, band0}, - {"CMYK", "M", 8, band1}, - {"CMYK", "Y", 8, band2}, - {"CMYK", "K", 8, band3}, + {"CMYK", "CMYK", 32, copy4}, + {"CMYK", "CMYK;I", 32, copy4I}, + {"CMYK", "CMYK;L", 32, packRGBXL}, + {"CMYK", "C", 8, band0}, + {"CMYK", "M", 8, band1}, + {"CMYK", "Y", 8, band2}, + {"CMYK", "K", 8, band3}, /* video (YCbCr) */ - {"YCbCr", "YCbCr", 24, ImagingPackRGB}, - {"YCbCr", "YCbCr;L", 24, packRGBL}, - {"YCbCr", "YCbCrX", 32, copy4}, - {"YCbCr", "YCbCrK", 32, copy4}, - {"YCbCr", "Y", 8, band0}, - {"YCbCr", "Cb", 8, band1}, - {"YCbCr", "Cr", 8, band2}, + {"YCbCr", "YCbCr", 24, ImagingPackRGB}, + {"YCbCr", "YCbCr;L", 24, packRGBL}, + {"YCbCr", "YCbCrX", 32, copy4}, + {"YCbCr", "YCbCrK", 32, copy4}, + {"YCbCr", "Y", 8, band0}, + {"YCbCr", "Cb", 8, band1}, + {"YCbCr", "Cr", 8, band2}, /* LAB Color */ - {"LAB", "LAB", 24, ImagingPackLAB}, - {"LAB", "L", 8, band0}, - {"LAB", "A", 8, band1}, - {"LAB", "B", 8, band2}, + {"LAB", "LAB", 24, ImagingPackLAB}, + {"LAB", "L", 8, band0}, + {"LAB", "A", 8, band1}, + {"LAB", "B", 8, band2}, /* HSV */ - {"HSV", "HSV", 24, ImagingPackRGB}, - {"HSV", "H", 8, band0}, - {"HSV", "S", 8, band1}, - {"HSV", "V", 8, band2}, + {"HSV", "HSV", 24, ImagingPackRGB}, + {"HSV", "H", 8, band0}, + {"HSV", "S", 8, band1}, + {"HSV", "V", 8, band2}, /* integer */ - {"I", "I", 32, copy4}, - {"I", "I;16B", 16, packI16B}, - {"I", "I;32S", 32, packI32S}, - {"I", "I;32NS", 32, copy4}, + {"I", "I", 32, copy4}, + {"I", "I;16B", 16, packI16B}, + {"I", "I;32S", 32, packI32S}, + {"I", "I;32NS", 32, copy4}, /* floating point */ - {"F", "F", 32, copy4}, - {"F", "F;32F", 32, packI32S}, - {"F", "F;32NF", 32, copy4}, + {"F", "F", 32, copy4}, + {"F", "F;32F", 32, packI32S}, + {"F", "F;32NF", 32, copy4}, /* storage modes */ - {"I;16", "I;16", 16, copy2}, - {"I;16", "I;16B", 16, packI16N_I16B}, - {"I;16B", "I;16B", 16, copy2}, - {"I;16L", "I;16L", 16, copy2}, - {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. - {"I;16L", "I;16N", 16, packI16N_I16}, - {"I;16B", "I;16N", 16, packI16N_I16B}, - {"BGR;15", "BGR;15", 16, copy2}, - {"BGR;16", "BGR;16", 16, copy2}, - {"BGR;24", "BGR;24", 24, copy3}, + {"I;16", "I;16", 16, copy2}, + {"I;16", "I;16B", 16, packI16N_I16B}, + {"I;16B", "I;16B", 16, copy2}, + {"I;16L", "I;16L", 16, copy2}, + {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. + {"I;16L", "I;16N", 16, packI16N_I16}, + {"I;16B", "I;16N", 16, packI16N_I16B}, + {"BGR;15", "BGR;15", 16, copy2}, + {"BGR;16", "BGR;16", 16, copy2}, + {"BGR;24", "BGR;24", 24, copy3}, {NULL} /* sentinel */ }; - ImagingShuffler -ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out) -{ +ImagingFindPacker(const char *mode, const char *rawmode, int *bits_out) { int i; /* find a suitable pixel packer */ diff --git a/src/libImaging/PackDecode.c b/src/libImaging/PackDecode.c index 34671828a..7dd432b91 100644 --- a/src/libImaging/PackDecode.c +++ b/src/libImaging/PackDecode.c @@ -13,30 +13,27 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" int -ImagingPackbitsDecode(Imaging im, ImagingCodecState state, - UINT8* buf, Py_ssize_t bytes) -{ +ImagingPackbitsDecode( + Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { UINT8 n; - UINT8* ptr; + UINT8 *ptr; int i; ptr = buf; for (;;) { - if (bytes < 1) { return ptr - buf; } if (ptr[0] & 0x80) { - if (ptr[0] == 0x80) { /* Nop */ - ptr++; bytes--; + ptr++; + bytes--; continue; } @@ -53,12 +50,12 @@ ImagingPackbitsDecode(Imaging im, ImagingCodecState state, state->buffer[state->x++] = ptr[1]; } - ptr += 2; bytes -= 2; + ptr += 2; + bytes -= 2; } else { - /* Literal */ - n = ptr[0]+2; + n = ptr[0] + 2; if (bytes < n) { return ptr - buf; @@ -72,16 +69,17 @@ ImagingPackbitsDecode(Imaging im, ImagingCodecState state, state->buffer[state->x++] = ptr[i]; } - ptr += n; bytes -= n; - + ptr += n; + bytes -= n; } if (state->x >= state->bytes) { - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); state->x = 0; @@ -90,6 +88,5 @@ ImagingPackbitsDecode(Imaging im, ImagingCodecState state, return -1; } } - } } diff --git a/src/libImaging/Palette.c b/src/libImaging/Palette.c index ac548f50c..43bea61e3 100644 --- a/src/libImaging/Palette.c +++ b/src/libImaging/Palette.c @@ -16,46 +16,41 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include - ImagingPalette -ImagingPaletteNew(const char* mode) -{ +ImagingPaletteNew(const char *mode) { /* Create a palette object */ int i; ImagingPalette palette; if (strcmp(mode, "RGB") && strcmp(mode, "RGBA")) { - return (ImagingPalette) ImagingError_ModeError(); + return (ImagingPalette)ImagingError_ModeError(); } palette = calloc(1, sizeof(struct ImagingPaletteInstance)); if (!palette) { - return (ImagingPalette) ImagingError_MemoryError(); + return (ImagingPalette)ImagingError_MemoryError(); } - strncpy(palette->mode, mode, IMAGING_MODE_LENGTH-1); - palette->mode[IMAGING_MODE_LENGTH-1] = 0; + strncpy(palette->mode, mode, IMAGING_MODE_LENGTH - 1); + palette->mode[IMAGING_MODE_LENGTH - 1] = 0; /* Initialize to ramp */ for (i = 0; i < 256; i++) { - palette->palette[i*4+0] = - palette->palette[i*4+1] = - palette->palette[i*4+2] = (UINT8) i; - palette->palette[i*4+3] = 255; /* opaque */ + palette->palette[i * 4 + 0] = palette->palette[i * 4 + 1] = + palette->palette[i * 4 + 2] = (UINT8)i; + palette->palette[i * 4 + 3] = 255; /* opaque */ } return palette; } ImagingPalette -ImagingPaletteNewBrowser(void) -{ +ImagingPaletteNewBrowser(void) { /* Create a standard "browser" palette object */ int i, r, g, b; @@ -70,9 +65,8 @@ ImagingPaletteNewBrowser(void) /* FIXME: Add 10-level windows palette here? */ for (i = 0; i < 10; i++) { - palette->palette[i*4+0] = - palette->palette[i*4+1] = - palette->palette[i*4+2] = 0; + palette->palette[i * 4 + 0] = palette->palette[i * 4 + 1] = + palette->palette[i * 4 + 2] = 0; } /* Simple 6x6x6 colour cube */ @@ -80,9 +74,9 @@ ImagingPaletteNewBrowser(void) for (b = 0; b < 256; b += 51) { for (g = 0; g < 256; g += 51) { for (r = 0; r < 256; r += 51) { - palette->palette[i*4+0] = r; - palette->palette[i*4+1] = g; - palette->palette[i*4+2] = b; + palette->palette[i * 4 + 0] = r; + palette->palette[i * 4 + 1] = g; + palette->palette[i * 4 + 2] = b; i++; } } @@ -92,17 +86,15 @@ ImagingPaletteNewBrowser(void) /* FIXME: add 30-level greyscale wedge here? */ for (; i < 256; i++) { - palette->palette[i*4+0] = - palette->palette[i*4+1] = - palette->palette[i*4+2] = 0; + palette->palette[i * 4 + 0] = palette->palette[i * 4 + 1] = + palette->palette[i * 4 + 2] = 0; } return palette; } ImagingPalette -ImagingPaletteDuplicate(ImagingPalette palette) -{ +ImagingPaletteDuplicate(ImagingPalette palette) { /* Duplicate palette descriptor */ ImagingPalette new_palette; @@ -113,7 +105,7 @@ ImagingPaletteDuplicate(ImagingPalette palette) /* malloc check ok, small constant allocation */ new_palette = malloc(sizeof(struct ImagingPaletteInstance)); if (!new_palette) { - return (ImagingPalette) ImagingError_MemoryError(); + return (ImagingPalette)ImagingError_MemoryError(); } memcpy(new_palette, palette, sizeof(struct ImagingPaletteInstance)); @@ -125,8 +117,7 @@ ImagingPaletteDuplicate(ImagingPalette palette) } void -ImagingPaletteDelete(ImagingPalette palette) -{ +ImagingPaletteDelete(ImagingPalette palette) { /* Destroy palette object */ if (palette) { @@ -137,7 +128,6 @@ ImagingPaletteDelete(ImagingPalette palette) } } - /* -------------------------------------------------------------------- */ /* Colour mapping */ /* -------------------------------------------------------------------- */ @@ -155,27 +145,26 @@ ImagingPaletteDelete(ImagingPalette palette) #define DIST(a, b, s) (a - b) * (a - b) * s /* Colour weights (no scaling, for now) */ -#define RSCALE 1 -#define GSCALE 1 -#define BSCALE 1 +#define RSCALE 1 +#define GSCALE 1 +#define BSCALE 1 /* Calculated scaled distances */ -#define RDIST(a, b) DIST(a, b, RSCALE*RSCALE) -#define GDIST(a, b) DIST(a, b, GSCALE*GSCALE) -#define BDIST(a, b) DIST(a, b, BSCALE*BSCALE) +#define RDIST(a, b) DIST(a, b, RSCALE *RSCALE) +#define GDIST(a, b) DIST(a, b, GSCALE *GSCALE) +#define BDIST(a, b) DIST(a, b, BSCALE *BSCALE) /* Incremental steps */ -#define RSTEP (4 * RSCALE) -#define GSTEP (4 * GSCALE) -#define BSTEP (4 * BSCALE) +#define RSTEP (4 * RSCALE) +#define GSTEP (4 * GSCALE) +#define BSTEP (4 * BSCALE) -#define BOX 8 +#define BOX 8 -#define BOXVOLUME BOX*BOX*BOX +#define BOXVOLUME BOX *BOX *BOX void -ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) -{ +ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) { int i, j; unsigned int dmin[256], dmax; int r0, g0, b0; @@ -187,32 +176,37 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) /* Get box boundaries for the given (r,g,b)-triplet. Each box covers eight cache slots (32 colour values, that is). */ - r0 = r & 0xe0; r1 = r0 + 0x1f; rc = (r0 + r1) / 2; - g0 = g & 0xe0; g1 = g0 + 0x1f; gc = (g0 + g1) / 2; - b0 = b & 0xe0; b1 = b0 + 0x1f; bc = (b0 + b1) / 2; + r0 = r & 0xe0; + r1 = r0 + 0x1f; + rc = (r0 + r1) / 2; + g0 = g & 0xe0; + g1 = g0 + 0x1f; + gc = (g0 + g1) / 2; + b0 = b & 0xe0; + b1 = b0 + 0x1f; + bc = (b0 + b1) / 2; /* Step 1 -- Select relevant palette entries (after Heckbert) */ /* For each palette entry, calculate the min and max distances to * any position in the box given by the colour we're looking for. */ - dmax = (unsigned int) ~0; + dmax = (unsigned int)~0; for (i = 0; i < 256; i++) { - int r, g, b; unsigned int tmin, tmax; /* Find min and max distances to any point in the box */ - r = palette->palette[i*4+0]; + r = palette->palette[i * 4 + 0]; tmin = (r < r0) ? RDIST(r, r1) : (r > r1) ? RDIST(r, r0) : 0; tmax = (r <= rc) ? RDIST(r, r1) : RDIST(r, r0); - g = palette->palette[i*4+1]; + g = palette->palette[i * 4 + 1]; tmin += (g < g0) ? GDIST(g, g1) : (g > g1) ? GDIST(g, g0) : 0; tmax += (g <= gc) ? GDIST(g, g1) : GDIST(g, g0); - b = palette->palette[i*4+2]; + b = palette->palette[i * 4 + 2]; tmin += (b < b0) ? BDIST(b, b1) : (b > b1) ? BDIST(b, b0) : 0; tmax += (b <= bc) ? BDIST(b, b1) : BDIST(b, b0); @@ -220,7 +214,6 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) if (tmax < dmax) { dmax = tmax; /* keep the smallest max distance only */ } - } /* Step 2 -- Incrementally update cache slot (after Thomas) */ @@ -230,22 +223,20 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) * distance is less than or equal the smallest max distance */ for (i = 0; i < BOXVOLUME; i++) { - d[i] = (unsigned int) ~0; + d[i] = (unsigned int)~0; } for (i = 0; i < 256; i++) { - if (dmin[i] <= dmax) { - int rd, gd, bd; int ri, gi, bi; int rx, gx, bx; - ri = (r0 - palette->palette[i*4+0]) * RSCALE; - gi = (g0 - palette->palette[i*4+1]) * GSCALE; - bi = (b0 - palette->palette[i*4+2]) * BSCALE; + ri = (r0 - palette->palette[i * 4 + 0]) * RSCALE; + gi = (g0 - palette->palette[i * 4 + 1]) * GSCALE; + bi = (b0 - palette->palette[i * 4 + 2]) * BSCALE; - rd = ri*ri + gi*gi + bi*bi; + rd = ri * ri + gi * gi + bi * bi; ri = ri * (2 * RSTEP) + RSTEP * RSTEP; gi = gi * (2 * GSTEP) + GSTEP * GSTEP; @@ -253,13 +244,15 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) rx = ri; for (r = j = 0; r < BOX; r++) { - gd = rd; gx = gi; + gd = rd; + gx = gi; for (g = 0; g < BOX; g++) { - bd = gd; bx = bi; + bd = gd; + bx = bi; for (b = 0; b < BOX; b++) { - if ((unsigned int) bd < d[j]) { + if ((unsigned int)bd < d[j]) { d[j] = bd; - c[j] = (UINT8) i; + c[j] = (UINT8)i; } bd += bx; bx += 2 * BSTEP * BSTEP; @@ -280,33 +273,30 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) * cache slot in the box. Update the cache. */ j = 0; - for (r = r0; r < r1; r+=4) { - for (g = g0; g < g1; g+=4) { - for (b = b0; b < b1; b+=4) { + for (r = r0; r < r1; r += 4) { + for (g = g0; g < g1; g += 4) { + for (b = b0; b < b1; b += 4) { ImagingPaletteCache(palette, r, g, b) = c[j++]; } } } } - int -ImagingPaletteCachePrepare(ImagingPalette palette) -{ +ImagingPaletteCachePrepare(ImagingPalette palette) { /* Add a colour cache to a palette */ int i; - int entries = 64*64*64; + int entries = 64 * 64 * 64; if (palette->cache == NULL) { - /* The cache is 512k. It might be a good idea to break it up into a pointer array (e.g. an 8-bit image?) */ /* malloc check ok, small constant allocation */ - palette->cache = (INT16*) malloc(entries * sizeof(INT16)); + palette->cache = (INT16 *)malloc(entries * sizeof(INT16)); if (!palette->cache) { - (void) ImagingError_MemoryError(); + (void)ImagingError_MemoryError(); return -1; } @@ -314,16 +304,13 @@ ImagingPaletteCachePrepare(ImagingPalette palette) for (i = 0; i < entries; i++) { palette->cache[i] = 0x100; } - } return 0; } - void -ImagingPaletteCacheDelete(ImagingPalette palette) -{ +ImagingPaletteCacheDelete(ImagingPalette palette) { /* Release the colour cache, if any */ if (palette && palette->cache) { diff --git a/src/libImaging/Paste.c b/src/libImaging/Paste.c index b89534423..03b17f571 100644 --- a/src/libImaging/Paste.c +++ b/src/libImaging/Paste.c @@ -23,11 +23,17 @@ #include "Imaging.h" - static inline void -paste(Imaging imOut, Imaging imIn, int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +paste( + Imaging imOut, + Imaging imIn, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* paste opaque region */ int y; @@ -38,25 +44,31 @@ paste(Imaging imOut, Imaging imIn, int dx, int dy, int sx, int sy, xsize *= pixelsize; for (y = 0; y < ysize; y++) { - memcpy(imOut->image[y+dy]+dx, imIn->image[y+sy]+sx, xsize); + memcpy(imOut->image[y + dy] + dx, imIn->image[y + sy] + sx, xsize); } } static inline void -paste_mask_1(Imaging imOut, Imaging imIn, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +paste_mask_1( + Imaging imOut, + Imaging imIn, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* paste with mode "1" mask */ int x, y; if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* in = imIn->image8[y+sy]+sx; - UINT8* mask = imMask->image8[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *in = imIn->image8[y + sy] + sx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { if (*mask++) { *out = *in; @@ -66,11 +78,10 @@ paste_mask_1(Imaging imOut, Imaging imIn, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - INT32* out = imOut->image32[y+dy]+dx; - INT32* in = imIn->image32[y+sy]+sx; - UINT8* mask = imMask->image8[y+sy]+sx; + INT32 *out = imOut->image32[y + dy] + dx; + INT32 *in = imIn->image32[y + sy] + sx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { if (*mask++) { *out = *in; @@ -82,21 +93,27 @@ paste_mask_1(Imaging imOut, Imaging imIn, Imaging imMask, } static inline void -paste_mask_L(Imaging imOut, Imaging imIn, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +paste_mask_L( + Imaging imOut, + Imaging imIn, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* paste with mode "L" matte */ int x, y; unsigned int tmp1; if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* in = imIn->image8[y+sy]+sx; - UINT8* mask = imMask->image8[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *in = imIn->image8[y + sy] + sx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, *in, tmp1); out++, in++, mask++; @@ -104,39 +121,46 @@ paste_mask_L(Imaging imOut, Imaging imIn, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); - UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); - UINT8* mask = (UINT8*) (imMask->image8[y+sy] + sx); + UINT8 *out = (UINT8 *)(imOut->image32[y + dy] + dx); + UINT8 *in = (UINT8 *)(imIn->image32[y + sy] + sx); + UINT8 *mask = (UINT8 *)(imMask->image8[y + sy] + sx); for (x = 0; x < xsize; x++) { UINT8 a = mask[0]; out[0] = BLEND(a, out[0], in[0], tmp1); out[1] = BLEND(a, out[1], in[1], tmp1); out[2] = BLEND(a, out[2], in[2], tmp1); out[3] = BLEND(a, out[3], in[3], tmp1); - out += 4; in += 4; mask ++; + out += 4; + in += 4; + mask++; } } } } static inline void -paste_mask_RGBA(Imaging imOut, Imaging imIn, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +paste_mask_RGBA( + Imaging imOut, + Imaging imIn, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* paste with mode "RGBA" matte */ int x, y; unsigned int tmp1; if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* in = imIn->image8[y+sy]+sx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *in = imIn->image8[y + sy] + sx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx * 4 + 3; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, *in, tmp1); out++, in++, mask += 4; @@ -144,40 +168,46 @@ paste_mask_RGBA(Imaging imOut, Imaging imIn, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); - UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); - UINT8* mask = (UINT8*) (imMask->image32[y+sy] + sx); + UINT8 *out = (UINT8 *)(imOut->image32[y + dy] + dx); + UINT8 *in = (UINT8 *)(imIn->image32[y + sy] + sx); + UINT8 *mask = (UINT8 *)(imMask->image32[y + sy] + sx); for (x = 0; x < xsize; x++) { UINT8 a = mask[3]; out[0] = BLEND(a, out[0], in[0], tmp1); out[1] = BLEND(a, out[1], in[1], tmp1); out[2] = BLEND(a, out[2], in[2], tmp1); out[3] = BLEND(a, out[3], in[3], tmp1); - out += 4; in += 4; mask += 4; + out += 4; + in += 4; + mask += 4; } } } } - static inline void -paste_mask_RGBa(Imaging imOut, Imaging imIn, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +paste_mask_RGBa( + Imaging imOut, + Imaging imIn, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* paste with mode "RGBa" matte */ int x, y; unsigned int tmp1; if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* in = imIn->image8[y+sy]+sx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *in = imIn->image8[y + sy] + sx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx * 4 + 3; for (x = 0; x < xsize; x++) { *out = PREBLEND(*mask, *out, *in, tmp1); out++, in++, mask += 4; @@ -185,34 +215,34 @@ paste_mask_RGBa(Imaging imOut, Imaging imIn, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); - UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); - UINT8* mask = (UINT8*) (imMask->image32[y+sy] + sx); + UINT8 *out = (UINT8 *)(imOut->image32[y + dy] + dx); + UINT8 *in = (UINT8 *)(imIn->image32[y + sy] + sx); + UINT8 *mask = (UINT8 *)(imMask->image32[y + sy] + sx); for (x = 0; x < xsize; x++) { UINT8 a = mask[3]; out[0] = PREBLEND(a, out[0], in[0], tmp1); out[1] = PREBLEND(a, out[1], in[1], tmp1); out[2] = PREBLEND(a, out[2], in[2], tmp1); out[3] = PREBLEND(a, out[3], in[3], tmp1); - out += 4; in += 4; mask += 4; + out += 4; + in += 4; + mask += 4; } } } } int -ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, - int dx0, int dy0, int dx1, int dy1) -{ +ImagingPaste( + Imaging imOut, Imaging imIn, Imaging imMask, int dx0, int dy0, int dx1, int dy1) { int xsize, ysize; int pixelsize; int sx0, sy0; ImagingSectionCookie cookie; if (!imOut || !imIn) { - (void) ImagingError_ModeError(); + (void)ImagingError_ModeError(); return -1; } @@ -221,14 +251,13 @@ ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, xsize = dx1 - dx0; ysize = dy1 - dy0; - if (xsize != imIn->xsize || ysize != imIn->ysize || - pixelsize != imIn->pixelsize) { - (void) ImagingError_Mismatch(); + if (xsize != imIn->xsize || ysize != imIn->ysize || pixelsize != imIn->pixelsize) { + (void)ImagingError_Mismatch(); return -1; } if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { - (void) ImagingError_Mismatch(); + (void)ImagingError_Mismatch(); return -1; } @@ -258,30 +287,28 @@ ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, } else if (strcmp(imMask->mode, "1") == 0) { ImagingSectionEnter(&cookie); - paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "L") == 0) { ImagingSectionEnter(&cookie); - paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBA") == 0) { ImagingSectionEnter(&cookie); - paste_mask_RGBA(imOut, imIn, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + paste_mask_RGBA( + imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBa") == 0) { ImagingSectionEnter(&cookie); - paste_mask_RGBa(imOut, imIn, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + paste_mask_RGBa( + imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else { - (void) ImagingError_ValueError("bad transparency mask"); + (void)ImagingError_ValueError("bad transparency mask"); return -1; } @@ -289,9 +316,14 @@ ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, } static inline void -fill(Imaging imOut, const void* ink_, int dx, int dy, - int xsize, int ysize, int pixelsize) -{ +fill( + Imaging imOut, + const void *ink_, + int dx, + int dy, + int xsize, + int ysize, + int pixelsize) { /* fill opaque region */ int x, y; @@ -302,30 +334,34 @@ fill(Imaging imOut, const void* ink_, int dx, int dy, memcpy(&ink8, ink_, sizeof(ink8)); if (imOut->image8 || ink32 == 0L) { - dx *= pixelsize; xsize *= pixelsize; for (y = 0; y < ysize; y++) { - memset(imOut->image[y+dy]+dx, ink8, xsize); + memset(imOut->image[y + dy] + dx, ink8, xsize); } } else { - for (y = 0; y < ysize; y++) { - INT32* out = imOut->image32[y+dy]+dx; + INT32 *out = imOut->image32[y + dy] + dx; for (x = 0; x < xsize; x++) { out[x] = ink32; } } - } } static inline void -fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +fill_mask_1( + Imaging imOut, + const void *ink_, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* fill with mode "1" mask */ int x, y; @@ -336,10 +372,9 @@ fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, memcpy(&ink8, ink_, sizeof(ink8)); if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* mask = imMask->image8[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { if (*mask++) { *out = ink8; @@ -349,10 +384,9 @@ fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - INT32* out = imOut->image32[y+dy]+dx; - UINT8* mask = imMask->image8[y+sy]+sx; + INT32 *out = imOut->image32[y + dy] + dx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { if (*mask++) { *out = ink32; @@ -364,20 +398,26 @@ fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, } static inline void -fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +fill_mask_L( + Imaging imOut, + const UINT8 *ink, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* fill with mode "L" matte */ int x, y, i; unsigned int tmp1; if (imOut->image8) { - for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* mask = imMask->image8[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *mask = imMask->image8[y + sy] + sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, ink[0], tmp1); out++, mask++; @@ -385,21 +425,20 @@ fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask, } } else { - for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; + UINT8 *out = (UINT8 *)imOut->image[y + dy] + dx * pixelsize; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { UINT8 channel_mask = *mask; - if (( - strcmp(imOut->mode, "RGBa") == 0 || - strcmp(imOut->mode, "RGBA") == 0 || - strcmp(imOut->mode, "La") == 0 || - strcmp(imOut->mode, "LA") == 0 || - strcmp(imOut->mode, "PA") == 0 - ) && i != 3) { - channel_mask = 255 - (255 - channel_mask) * (1 - (255 - out[3]) / 255); + if ((strcmp(imOut->mode, "RGBa") == 0 || + strcmp(imOut->mode, "RGBA") == 0 || + strcmp(imOut->mode, "La") == 0 || + strcmp(imOut->mode, "LA") == 0 || + strcmp(imOut->mode, "PA") == 0) && + i != 3) { + channel_mask = + 255 - (255 - channel_mask) * (1 - (255 - out[3]) / 255); } out[i] = BLEND(channel_mask, out[i], ink[i], tmp1); } @@ -411,21 +450,27 @@ fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask, } static inline void -fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +fill_mask_RGBA( + Imaging imOut, + const UINT8 *ink, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* fill with mode "RGBA" matte */ int x, y, i; unsigned int tmp1; if (imOut->image8) { - - sx = sx*4+3; + sx = sx * 4 + 3; for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx; for (x = 0; x < xsize; x++) { *out = BLEND(*mask, *out, ink[0], tmp1); out++, mask += 4; @@ -433,12 +478,11 @@ fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask, } } else { - dx *= pixelsize; - sx = sx*4 + 3; + sx = sx * 4 + 3; for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) imOut->image[y+dy]+dx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; + UINT8 *out = (UINT8 *)imOut->image[y + dy] + dx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = BLEND(*mask, *out, ink[i], tmp1); @@ -451,21 +495,27 @@ fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask, } static inline void -fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask, - int dx, int dy, int sx, int sy, - int xsize, int ysize, int pixelsize) -{ +fill_mask_RGBa( + Imaging imOut, + const UINT8 *ink, + Imaging imMask, + int dx, + int dy, + int sx, + int sy, + int xsize, + int ysize, + int pixelsize) { /* fill with mode "RGBa" matte */ int x, y, i; unsigned int tmp1; if (imOut->image8) { - - sx = sx*4 + 3; + sx = sx * 4 + 3; for (y = 0; y < ysize; y++) { - UINT8* out = imOut->image8[y+dy]+dx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; + UINT8 *out = imOut->image8[y + dy] + dx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx; for (x = 0; x < xsize; x++) { *out = PREBLEND(*mask, *out, ink[0], tmp1); out++, mask += 4; @@ -473,12 +523,11 @@ fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask, } } else { - dx *= pixelsize; - sx = sx*4 + 3; + sx = sx * 4 + 3; for (y = 0; y < ysize; y++) { - UINT8* out = (UINT8*) imOut->image[y+dy]+dx; - UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; + UINT8 *out = (UINT8 *)imOut->image[y + dy] + dx; + UINT8 *mask = (UINT8 *)imMask->image[y + sy] + sx; for (x = 0; x < xsize; x++) { for (i = 0; i < pixelsize; i++) { *out = PREBLEND(*mask, *out, ink[i], tmp1); @@ -491,16 +540,21 @@ fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask, } int -ImagingFill2(Imaging imOut, const void* ink, Imaging imMask, - int dx0, int dy0, int dx1, int dy1) -{ +ImagingFill2( + Imaging imOut, + const void *ink, + Imaging imMask, + int dx0, + int dy0, + int dx1, + int dy1) { ImagingSectionCookie cookie; int xsize, ysize; int pixelsize; int sx0, sy0; if (!imOut || !ink) { - (void) ImagingError_ModeError(); + (void)ImagingError_ModeError(); return -1; } @@ -510,7 +564,7 @@ ImagingFill2(Imaging imOut, const void* ink, Imaging imMask, ysize = dy1 - dy0; if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { - (void) ImagingError_Mismatch(); + (void)ImagingError_Mismatch(); return -1; } @@ -540,30 +594,26 @@ ImagingFill2(Imaging imOut, const void* ink, Imaging imMask, } else if (strcmp(imMask->mode, "1") == 0) { ImagingSectionEnter(&cookie); - fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "L") == 0) { ImagingSectionEnter(&cookie); - fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBA") == 0) { ImagingSectionEnter(&cookie); - fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else if (strcmp(imMask->mode, "RGBa") == 0) { ImagingSectionEnter(&cookie); - fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, - xsize, ysize, pixelsize); + fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); ImagingSectionLeave(&cookie); } else { - (void) ImagingError_ValueError("bad transparency mask"); + (void)ImagingError_ValueError("bad transparency mask"); return -1; } diff --git a/src/libImaging/PcdDecode.c b/src/libImaging/PcdDecode.c index ff192a174..f13803cb6 100644 --- a/src/libImaging/PcdDecode.c +++ b/src/libImaging/PcdDecode.c @@ -19,24 +19,20 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - int -ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ +ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { int x; int chunk; - UINT8* out; - UINT8* ptr; + UINT8 *out; + UINT8 *ptr; ptr = buf; chunk = 3 * state->xsize; for (;;) { - /* We need data for two full lines before we can do anything */ if (bytes < chunk) { return ptr - buf; @@ -46,13 +42,12 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt out = state->buffer; for (x = 0; x < state->xsize; x++) { out[0] = ptr[x]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; + out[1] = ptr[(x + 4 * state->xsize) / 2]; + out[2] = ptr[(x + 5 * state->xsize) / 2]; out += 3; } - state->shuffle((UINT8*) im->image[state->y], - state->buffer, state->xsize); + state->shuffle((UINT8 *)im->image[state->y], state->buffer, state->xsize); if (++state->y >= state->ysize) { return -1; /* This can hardly happen */ @@ -61,14 +56,13 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* Unpack second line */ out = state->buffer; for (x = 0; x < state->xsize; x++) { - out[0] = ptr[x+state->xsize]; - out[1] = ptr[(x+4*state->xsize)/2]; - out[2] = ptr[(x+5*state->xsize)/2]; + out[0] = ptr[x + state->xsize]; + out[1] = ptr[(x + 4 * state->xsize) / 2]; + out[2] = ptr[(x + 5 * state->xsize) / 2]; out += 3; } - state->shuffle((UINT8*) im->image[state->y], - state->buffer, state->xsize); + state->shuffle((UINT8 *)im->image[state->y], state->buffer, state->xsize); if (++state->y >= state->ysize) { return -1; @@ -76,6 +70,5 @@ ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt ptr += chunk; bytes -= chunk; - } } diff --git a/src/libImaging/PcxDecode.c b/src/libImaging/PcxDecode.c index eb0fecc83..c95ffc869 100644 --- a/src/libImaging/PcxDecode.c +++ b/src/libImaging/PcxDecode.c @@ -13,14 +13,12 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" int -ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ +ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { UINT8 n; - UINT8* ptr; + UINT8 *ptr; if ((state->xsize * state->bits + 7) / 8 > state->bytes) { state->errcode = IMAGING_CODEC_OVERRUN; @@ -30,13 +28,11 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt ptr = buf; for (;;) { - if (bytes < 1) { return ptr - buf; } if ((*ptr & 0xC0) == 0xC0) { - /* Run */ if (bytes < 2) { return ptr - buf; @@ -53,14 +49,14 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt n--; } - ptr += 2; bytes -= 2; + ptr += 2; + bytes -= 2; } else { - /* Literal */ state->buffer[state->x++] = ptr[0]; - ptr++; bytes--; - + ptr++; + bytes--; } if (state->x >= state->bytes) { @@ -68,16 +64,19 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt int bands = state->bytes / state->xsize; int stride = state->bytes / bands; int i; - for (i=1; i< bands; i++) { // note -- skipping first band - memmove(&state->buffer[i*state->xsize], - &state->buffer[i*stride], - state->xsize); + for (i = 1; i < bands; i++) { // note -- skipping first band + memmove( + &state->buffer[i * state->xsize], + &state->buffer[i * stride], + state->xsize); } } /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); state->x = 0; @@ -86,6 +85,5 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt return -1; } } - } } diff --git a/src/libImaging/PcxEncode.c b/src/libImaging/PcxEncode.c index 163b09b13..549614bfd 100644 --- a/src/libImaging/PcxEncode.c +++ b/src/libImaging/PcxEncode.c @@ -13,7 +13,6 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" enum { INIT, FETCH, ENCODE }; @@ -22,9 +21,8 @@ enum { INIT, FETCH, ENCODE }; #define LAST ystep int -ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - UINT8* ptr; +ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + UINT8 *ptr; int this; int bytes_per_line = 0; int padding = 0; @@ -45,12 +43,12 @@ ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } bpp = state->bits; - if (state->bits == 24){ + if (state->bits == 24) { planes = 3; bpp = 8; } - bytes_per_line = (state->xsize*bpp + 7) / 8; + bytes_per_line = (state->xsize * bpp + 7) / 8; /* The stride here needs to be kept in sync with the version in PcxImagePlugin.py. If it's not, the header and the body of the image will be out of sync and bad things will happen on decode. @@ -59,133 +57,131 @@ ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) padding = stride - bytes_per_line; - for (;;) { - switch (state->state) { - case FETCH: + case FETCH: - /* get a line of data */ - if (state->y >= state->ysize) { - state->errcode = IMAGING_CODEC_END; - return ptr - buf; - } + /* get a line of data */ + if (state->y >= state->ysize) { + state->errcode = IMAGING_CODEC_END; + return ptr - buf; + } - state->shuffle(state->buffer, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->xsize); + state->shuffle( + state->buffer, + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); - state->y += 1; + state->y += 1; - state->count = 1; - state->LAST = state->buffer[0]; + state->count = 1; + state->LAST = state->buffer[0]; - state->x = 1; + state->x = 1; - state->state = ENCODE; - /* fall through */ + state->state = ENCODE; + /* fall through */ - case ENCODE: - /* compress this line */ + case ENCODE: + /* compress this line */ - /* when we arrive here, "count" contains the number of - bytes having the value of "LAST" that we've already - seen */ - do { - /* If we're encoding an odd width file, and we've - got more than one plane, we need to pad each - color row with padding bytes at the end. Since - The pixels are stored RRRRRGGGGGBBBBB, so we need - to have the padding be RRRRRPGGGGGPBBBBBP. Hence - the double loop - */ - while (state->x % bytes_per_line) { - - if (state->count == 63) { - /* this run is full; flush it */ - if (bytes < 2) { - return ptr - buf; - } - ptr[0] = 0xff; - ptr[1] = state->LAST; - ptr += 2; - bytes -= 2; - - state->count = 0; - } - - this = state->buffer[state->x]; - - if (this == state->LAST) { - /* extend the current run */ - state->x += 1; - state->count += 1; - - } else { - /* start a new run */ - if (state->count == 1 && (state->LAST < 0xc0)) { - if (bytes < 1) { + /* when we arrive here, "count" contains the number of + bytes having the value of "LAST" that we've already + seen */ + do { + /* If we're encoding an odd width file, and we've + got more than one plane, we need to pad each + color row with padding bytes at the end. Since + The pixels are stored RRRRRGGGGGBBBBB, so we need + to have the padding be RRRRRPGGGGGPBBBBBP. Hence + the double loop + */ + while (state->x % bytes_per_line) { + if (state->count == 63) { + /* this run is full; flush it */ + if (bytes < 2) { return ptr - buf; } - ptr[0] = state->LAST; - ptr += 1; - bytes -= 1; + ptr[0] = 0xff; + ptr[1] = state->LAST; + ptr += 2; + bytes -= 2; + + state->count = 0; + } + + this = state->buffer[state->x]; + + if (this == state->LAST) { + /* extend the current run */ + state->x += 1; + state->count += 1; + } else { - if (state->count > 0) { - if (bytes < 2) { + /* start a new run */ + if (state->count == 1 && (state->LAST < 0xc0)) { + if (bytes < 1) { return ptr - buf; } - ptr[0] = 0xc0 | state->count; - ptr[1] = state->LAST; - ptr += 2; - bytes -= 2; + ptr[0] = state->LAST; + ptr += 1; + bytes -= 1; + } else { + if (state->count > 0) { + if (bytes < 2) { + return ptr - buf; + } + ptr[0] = 0xc0 | state->count; + ptr[1] = state->LAST; + ptr += 2; + bytes -= 2; + } } + + state->LAST = this; + state->count = 1; + + state->x += 1; } - - state->LAST = this; - state->count = 1; - - state->x += 1; } - } - /* end of line; flush the current run */ - if (state->count == 1 && (state->LAST < 0xc0)) { - if (bytes < 1 + padding) { - return ptr - buf; - } - ptr[0] = state->LAST; - ptr += 1; - bytes -= 1; - } else { - if (state->count > 0) { - if (bytes < 2 + padding) { + /* end of line; flush the current run */ + if (state->count == 1 && (state->LAST < 0xc0)) { + if (bytes < 1 + padding) { return ptr - buf; } - ptr[0] = 0xc0 | state->count; - ptr[1] = state->LAST; - ptr += 2; - bytes -= 2; + ptr[0] = state->LAST; + ptr += 1; + bytes -= 1; + } else { + if (state->count > 0) { + if (bytes < 2 + padding) { + return ptr - buf; + } + ptr[0] = 0xc0 | state->count; + ptr[1] = state->LAST; + ptr += 2; + bytes -= 2; + } } - } - /* add the padding */ - for (i = 0; i < padding; i++) { - ptr[0] = 0; - ptr += 1; - bytes -= 1; - } - /* reset for the next color plane. */ - if (state->x < planes * bytes_per_line) { - state->count = 1; - state->LAST = state->buffer[state->x]; - state->x += 1; - } - } while (state->x < planes * bytes_per_line); + /* add the padding */ + for (i = 0; i < padding; i++) { + ptr[0] = 0; + ptr += 1; + bytes -= 1; + } + /* reset for the next color plane. */ + if (state->x < planes * bytes_per_line) { + state->count = 1; + state->LAST = state->buffer[state->x]; + state->x += 1; + } + } while (state->x < planes * bytes_per_line); - /* read next line */ - state->state = FETCH; - break; + /* read next line */ + state->state = FETCH; + break; } } } - diff --git a/src/libImaging/Point.c b/src/libImaging/Point.c index b70840b07..8883578cb 100644 --- a/src/libImaging/Point.c +++ b/src/libImaging/Point.c @@ -19,22 +19,20 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" typedef struct { - const void* table; + const void *table; } im_point_context; static void -im_point_8_8(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_8_8(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 8-bit source, 8-bit destination */ - UINT8* table = (UINT8*) context->table; + UINT8 *table = (UINT8 *)context->table; for (y = 0; y < imIn->ysize; y++) { - UINT8* in = imIn->image8[y]; - UINT8* out = imOut->image8[y]; + UINT8 *in = imIn->image8[y]; + UINT8 *out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) { out[x] = table[in[x]]; } @@ -42,68 +40,67 @@ im_point_8_8(Imaging imOut, Imaging imIn, im_point_context* context) } static void -im_point_2x8_2x8(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_2x8_2x8(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 2x8-bit source, 2x8-bit destination */ - UINT8* table = (UINT8*) context->table; + UINT8 *table = (UINT8 *)context->table; for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; - out[3] = table[in[3]+256]; - in += 4; out += 4; + out[3] = table[in[3] + 256]; + in += 4; + out += 4; } } } static void -im_point_3x8_3x8(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_3x8_3x8(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 3x8-bit source, 3x8-bit destination */ - UINT8* table = (UINT8*) context->table; + UINT8 *table = (UINT8 *)context->table; for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; - out[1] = table[in[1]+256]; - out[2] = table[in[2]+512]; - in += 4; out += 4; + out[1] = table[in[1] + 256]; + out[2] = table[in[2] + 512]; + in += 4; + out += 4; } } } static void -im_point_4x8_4x8(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_4x8_4x8(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 4x8-bit source, 4x8-bit destination */ - UINT8* table = (UINT8*) context->table; + UINT8 *table = (UINT8 *)context->table; for (y = 0; y < imIn->ysize; y++) { - UINT8* in = (UINT8*) imIn->image[y]; - UINT8* out = (UINT8*) imOut->image[y]; + UINT8 *in = (UINT8 *)imIn->image[y]; + UINT8 *out = (UINT8 *)imOut->image[y]; for (x = 0; x < imIn->xsize; x++) { out[0] = table[in[0]]; - out[1] = table[in[1]+256]; - out[2] = table[in[2]+512]; - out[3] = table[in[3]+768]; - in += 4; out += 4; + out[1] = table[in[1] + 256]; + out[2] = table[in[2] + 512]; + out[3] = table[in[3] + 768]; + in += 4; + out += 4; } } } static void -im_point_8_32(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_8_32(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 8-bit source, 32-bit destination */ - char* table = (char*) context->table; + char *table = (char *)context->table; for (y = 0; y < imIn->ysize; y++) { - UINT8* in = imIn->image8[y]; - INT32* out = imOut->image32[y]; + UINT8 *in = imIn->image8[y]; + INT32 *out = imOut->image32[y]; for (x = 0; x < imIn->xsize; x++) { memcpy(out + x, table + in[x] * sizeof(INT32), sizeof(INT32)); } @@ -111,14 +108,13 @@ im_point_8_32(Imaging imOut, Imaging imIn, im_point_context* context) } static void -im_point_32_8(Imaging imOut, Imaging imIn, im_point_context* context) -{ +im_point_32_8(Imaging imOut, Imaging imIn, im_point_context *context) { int x, y; /* 32-bit source, 8-bit destination */ - UINT8* table = (UINT8*) context->table; + UINT8 *table = (UINT8 *)context->table; for (y = 0; y < imIn->ysize; y++) { - INT32* in = imIn->image32[y]; - UINT8* out = imOut->image8[y]; + INT32 *in = imIn->image32[y]; + UINT8 *out = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) { int v = in[x]; if (v < 0) { @@ -132,17 +128,16 @@ im_point_32_8(Imaging imOut, Imaging imIn, im_point_context* context) } Imaging -ImagingPoint(Imaging imIn, const char* mode, const void* table) -{ +ImagingPoint(Imaging imIn, const char *mode, const void *table) { /* lookup table transform */ ImagingSectionCookie cookie; Imaging imOut; im_point_context context; - void (*point)(Imaging imIn, Imaging imOut, im_point_context* context); + void (*point)(Imaging imIn, Imaging imOut, im_point_context * context); if (!imIn) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (!mode) { @@ -166,22 +161,22 @@ ImagingPoint(Imaging imIn, const char* mode, const void* table) if (imIn->type == IMAGING_TYPE_UINT8) { if (imIn->bands == imOut->bands && imIn->type == imOut->type) { switch (imIn->bands) { - case 1: - point = im_point_8_8; - break; - case 2: - point = im_point_2x8_2x8; - break; - case 3: - point = im_point_3x8_3x8; - break; - case 4: - point = im_point_4x8_4x8; - break; - default: - /* this cannot really happen */ - point = im_point_8_8; - break; + case 1: + point = im_point_8_8; + break; + case 2: + point = im_point_2x8_2x8; + break; + case 3: + point = im_point_3x8_3x8; + break; + case 4: + point = im_point_4x8_4x8; + break; + default: + /* this cannot really happen */ + point = im_point_8_8; + break; } } else { point = im_point_8_32; @@ -201,26 +196,22 @@ ImagingPoint(Imaging imIn, const char* mode, const void* table) return imOut; - mode_mismatch: - return (Imaging) ImagingError_ValueError( - "point operation not supported for this mode" - ); +mode_mismatch: + return (Imaging)ImagingError_ValueError( + "point operation not supported for this mode"); } - Imaging -ImagingPointTransform(Imaging imIn, double scale, double offset) -{ +ImagingPointTransform(Imaging imIn, double scale, double offset) { /* scale/offset transform */ ImagingSectionCookie cookie; Imaging imOut; int x, y; - if (!imIn || (strcmp(imIn->mode, "I") != 0 && - strcmp(imIn->mode, "I;16") != 0 && + if (!imIn || (strcmp(imIn->mode, "I") != 0 && strcmp(imIn->mode, "I;16") != 0 && strcmp(imIn->mode, "F") != 0)) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); @@ -229,50 +220,50 @@ ImagingPointTransform(Imaging imIn, double scale, double offset) } switch (imIn->type) { - case IMAGING_TYPE_INT32: - ImagingSectionEnter(&cookie); - for (y = 0; y < imIn->ysize; y++) { - INT32* in = imIn->image32[y]; - INT32* out = imOut->image32[y]; - /* FIXME: add clipping? */ - for (x = 0; x < imIn->xsize; x++) { - out[x] = in[x] * scale + offset; - } - } - ImagingSectionLeave(&cookie); - break; - case IMAGING_TYPE_FLOAT32: - ImagingSectionEnter(&cookie); - for (y = 0; y < imIn->ysize; y++) { - FLOAT32* in = (FLOAT32*) imIn->image32[y]; - FLOAT32* out = (FLOAT32*) imOut->image32[y]; - for (x = 0; x < imIn->xsize; x++) { - out[x] = in[x] * scale + offset; - } - } - ImagingSectionLeave(&cookie); - break; - case IMAGING_TYPE_SPECIAL: - if (strcmp(imIn->mode,"I;16") == 0) { + case IMAGING_TYPE_INT32: ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - char* in = (char*)imIn->image[y]; - char* out = (char*)imOut->image[y]; + INT32 *in = imIn->image32[y]; + INT32 *out = imOut->image32[y]; /* FIXME: add clipping? */ for (x = 0; x < imIn->xsize; x++) { - UINT16 v; - memcpy(&v, in + x * sizeof(v), sizeof(v)); - v = v * scale + offset; - memcpy(out + x * sizeof(UINT16), &v, sizeof(v)); + out[x] = in[x] * scale + offset; } } ImagingSectionLeave(&cookie); break; - } - /* FALL THROUGH */ - default: - ImagingDelete(imOut); - return (Imaging) ImagingError_ValueError("internal error"); + case IMAGING_TYPE_FLOAT32: + ImagingSectionEnter(&cookie); + for (y = 0; y < imIn->ysize; y++) { + FLOAT32 *in = (FLOAT32 *)imIn->image32[y]; + FLOAT32 *out = (FLOAT32 *)imOut->image32[y]; + for (x = 0; x < imIn->xsize; x++) { + out[x] = in[x] * scale + offset; + } + } + ImagingSectionLeave(&cookie); + break; + case IMAGING_TYPE_SPECIAL: + if (strcmp(imIn->mode, "I;16") == 0) { + ImagingSectionEnter(&cookie); + for (y = 0; y < imIn->ysize; y++) { + char *in = (char *)imIn->image[y]; + char *out = (char *)imOut->image[y]; + /* FIXME: add clipping? */ + for (x = 0; x < imIn->xsize; x++) { + UINT16 v; + memcpy(&v, in + x * sizeof(v), sizeof(v)); + v = v * scale + offset; + memcpy(out + x * sizeof(UINT16), &v, sizeof(v)); + } + } + ImagingSectionLeave(&cookie); + break; + } + /* FALL THROUGH */ + default: + ImagingDelete(imOut); + return (Imaging)ImagingError_ValueError("internal error"); } return imOut; diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index 6c9f8d9b7..bee5e5599 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -43,169 +43,155 @@ typedef struct { } PixelHashData; typedef struct _PixelList { - struct _PixelList *next[3],*prev[3]; + struct _PixelList *next[3], *prev[3]; Pixel p; - unsigned int flag:1; + unsigned int flag : 1; int count; } PixelList; typedef struct _BoxNode { - struct _BoxNode *l,*r; - PixelList *head[3],*tail[3]; + struct _BoxNode *l, *r; + PixelList *head[3], *tail[3]; int axis; int volume; uint32_t pixelCount; } BoxNode; -#define _SQR(x) ((x)*(x)) -#define _DISTSQR(p1,p2) \ - _SQR((int)((p1)->c.r)-(int)((p2)->c.r))+ \ - _SQR((int)((p1)->c.g)-(int)((p2)->c.g))+ \ - _SQR((int)((p1)->c.b)-(int)((p2)->c.b)) +#define _SQR(x) ((x) * (x)) +#define _DISTSQR(p1, p2) \ + _SQR((int)((p1)->c.r) - (int)((p2)->c.r)) + \ + _SQR((int)((p1)->c.g) - (int)((p2)->c.g)) + \ + _SQR((int)((p1)->c.b) - (int)((p2)->c.b)) #define MAX_HASH_ENTRIES 65536 -#define PIXEL_HASH(r,g,b) \ - (((unsigned int)(r) )*463 ^ \ - ((unsigned int)(g)<< 8)*10069 ^ \ - ((unsigned int)(b)<<16)*64997) +#define PIXEL_HASH(r, g, b) \ + (((unsigned int)(r)) * 463 ^ ((unsigned int)(g) << 8) * 10069 ^ \ + ((unsigned int)(b) << 16) * 64997) -#define PIXEL_UNSCALE(p,q,s) \ - ((q)->c.r=(p)->c.r<<(s)), \ - ((q)->c.g=(p)->c.g<<(s)), \ - ((q)->c.b=(p)->c.b<<(s)) +#define PIXEL_UNSCALE(p, q, s) \ + ((q)->c.r = (p)->c.r << (s)), ((q)->c.g = (p)->c.g << (s)), \ + ((q)->c.b = (p)->c.b << (s)) -#define PIXEL_SCALE(p,q,s)\ - ((q)->c.r=(p)->c.r>>(s)), \ - ((q)->c.g=(p)->c.g>>(s)), \ - ((q)->c.b=(p)->c.b>>(s)) +#define PIXEL_SCALE(p, q, s) \ + ((q)->c.r = (p)->c.r >> (s)), ((q)->c.g = (p)->c.g >> (s)), \ + ((q)->c.b = (p)->c.b >> (s)) static uint32_t -unshifted_pixel_hash(const HashTable *h, const Pixel pixel) -{ - return PIXEL_HASH(pixel.c.r, pixel.c.g, pixel.c.b); +unshifted_pixel_hash(const HashTable *h, const Pixel pixel) { + return PIXEL_HASH(pixel.c.r, pixel.c.g, pixel.c.b); } static int -unshifted_pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) -{ - if (pixel1.c.r==pixel2.c.r) { - if (pixel1.c.g==pixel2.c.g) { - if (pixel1.c.b==pixel2.c.b) { +unshifted_pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) { + if (pixel1.c.r == pixel2.c.r) { + if (pixel1.c.g == pixel2.c.g) { + if (pixel1.c.b == pixel2.c.b) { return 0; } else { - return (int)(pixel1.c.b)-(int)(pixel2.c.b); + return (int)(pixel1.c.b) - (int)(pixel2.c.b); } } else { - return (int)(pixel1.c.g)-(int)(pixel2.c.g); + return (int)(pixel1.c.g) - (int)(pixel2.c.g); } } else { - return (int)(pixel1.c.r)-(int)(pixel2.c.r); + return (int)(pixel1.c.r) - (int)(pixel2.c.r); } } static uint32_t -pixel_hash(const HashTable *h,const Pixel pixel) -{ - PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - return PIXEL_HASH(pixel.c.r>>d->scale, pixel.c.g>>d->scale, pixel.c.b>>d->scale); +pixel_hash(const HashTable *h, const Pixel pixel) { + PixelHashData *d = (PixelHashData *)hashtable_get_user_data(h); + return PIXEL_HASH( + pixel.c.r >> d->scale, pixel.c.g >> d->scale, pixel.c.b >> d->scale); } static int -pixel_cmp(const HashTable *h,const Pixel pixel1, const Pixel pixel2) -{ - PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - uint32_t A,B; - A=PIXEL_HASH(pixel1.c.r>>d->scale, pixel1.c.g>>d->scale, pixel1.c.b>>d->scale); - B=PIXEL_HASH(pixel2.c.r>>d->scale, pixel2.c.g>>d->scale, pixel2.c.b>>d->scale); - return (A==B)?0:((A> d->scale, pixel1.c.g >> d->scale, pixel1.c.b >> d->scale); + B = PIXEL_HASH( + pixel2.c.r >> d->scale, pixel2.c.g >> d->scale, pixel2.c.b >> d->scale); + return (A == B) ? 0 : ((A < B) ? -1 : 1); } static void -exists_count_func(const HashTable *h, const Pixel key, uint32_t *val) -{ - *val+=1; +exists_count_func(const HashTable *h, const Pixel key, uint32_t *val) { + *val += 1; } static void -new_count_func(const HashTable *h, const Pixel key, uint32_t *val) -{ - *val=1; +new_count_func(const HashTable *h, const Pixel key, uint32_t *val) { + *val = 1; } static void -rehash_collide(const HashTable *h, - Pixel *keyp, - uint32_t *valp, - Pixel newkey, - uint32_t newval) -{ +rehash_collide( + const HashTable *h, Pixel *keyp, uint32_t *valp, Pixel newkey, uint32_t newval) { *valp += newval; } /* %% */ static HashTable * -create_pixel_hash(Pixel *pixelData,uint32_t nPixels) -{ - PixelHashData *d; - HashTable *hash; - uint32_t i; +create_pixel_hash(Pixel *pixelData, uint32_t nPixels) { + PixelHashData *d; + HashTable *hash; + uint32_t i; #ifndef NO_OUTPUT - uint32_t timer,timer2,timer3; + uint32_t timer, timer2, timer3; #endif - /* malloc check ok, small constant allocation */ - d=malloc(sizeof(PixelHashData)); - if (!d) { - return NULL; - } - hash=hashtable_new(pixel_hash,pixel_cmp); - hashtable_set_user_data(hash,d); - d->scale=0; + /* malloc check ok, small constant allocation */ + d = malloc(sizeof(PixelHashData)); + if (!d) { + return NULL; + } + hash = hashtable_new(pixel_hash, pixel_cmp); + hashtable_set_user_data(hash, d); + d->scale = 0; #ifndef NO_OUTPUT - timer=timer3=clock(); + timer = timer3 = clock(); #endif - for (i=0;iMAX_HASH_ENTRIES) { - d->scale++; + for (i = 0; i < nPixels; i++) { + if (!hashtable_insert_or_update_computed( + hash, pixelData[i], new_count_func, exists_count_func)) { + ; + } + while (hashtable_get_count(hash) > MAX_HASH_ENTRIES) { + d->scale++; #ifndef NO_OUTPUT - printf ("rehashing - new scale: %d\n",(int)d->scale); - timer2=clock(); + printf("rehashing - new scale: %d\n", (int)d->scale); + timer2 = clock(); #endif - hashtable_rehash_compute(hash,rehash_collide); + hashtable_rehash_compute(hash, rehash_collide); #ifndef NO_OUTPUT - timer2=clock()-timer2; - printf ("rehash took %f sec\n",timer2/(double)CLOCKS_PER_SEC); - timer+=timer2; + timer2 = clock() - timer2; + printf("rehash took %f sec\n", timer2 / (double)CLOCKS_PER_SEC); + timer += timer2; #endif - } - } + } + } #ifndef NO_OUTPUT - printf ("inserts took %f sec\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("inserts took %f sec\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif #ifndef NO_OUTPUT - printf ("total %f sec\n",(clock()-timer3)/(double)CLOCKS_PER_SEC); + printf("total %f sec\n", (clock() - timer3) / (double)CLOCKS_PER_SEC); #endif - return hash; + return hash; } static void -destroy_pixel_hash(HashTable *hash) -{ - PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash); - if (d) { - free(d); - } - hashtable_free(hash); +destroy_pixel_hash(HashTable *hash) { + PixelHashData *d = (PixelHashData *)hashtable_get_user_data(hash); + if (d) { + free(d); + } + hashtable_free(hash); } - /* 1. hash quantized pixels. */ /* 2. create R,G,B lists of sorted quantized pixels. */ /* 3. median cut. */ @@ -215,659 +201,662 @@ destroy_pixel_hash(HashTable *hash) /* 7. map each pixel to nearest average. */ static int -compute_box_volume(BoxNode *b) -{ - unsigned char rl,rh,gl,gh,bl,bh; - if (b->volume>=0) { - return b->volume; - } - if (!b->head[0]) { - b->volume=0; - } else { - rh=b->head[0]->p.c.r; - rl=b->tail[0]->p.c.r; - gh=b->head[1]->p.c.g; - gl=b->tail[1]->p.c.g; - bh=b->head[2]->p.c.b; - bl=b->tail[2]->p.c.b; - b->volume=(rh-rl+1)*(gh-gl+1)*(bh-bl+1); - } - return b->volume; +compute_box_volume(BoxNode *b) { + unsigned char rl, rh, gl, gh, bl, bh; + if (b->volume >= 0) { + return b->volume; + } + if (!b->head[0]) { + b->volume = 0; + } else { + rh = b->head[0]->p.c.r; + rl = b->tail[0]->p.c.r; + gh = b->head[1]->p.c.g; + gl = b->tail[1]->p.c.g; + bh = b->head[2]->p.c.b; + bl = b->tail[2]->p.c.b; + b->volume = (rh - rl + 1) * (gh - gl + 1) * (bh - bl + 1); + } + return b->volume; } static void -hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) -{ - PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - PixelList **pl=(PixelList **)u; - PixelList *p; - int i; - Pixel q; +hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) { + PixelHashData *d = (PixelHashData *)hashtable_get_user_data(h); + PixelList **pl = (PixelList **)u; + PixelList *p; + int i; + Pixel q; - PIXEL_SCALE(&pixel,&q,d->scale); + PIXEL_SCALE(&pixel, &q, d->scale); - /* malloc check ok, small constant allocation */ - p=malloc(sizeof(PixelList)); - if (!p) { - return; - } + /* malloc check ok, small constant allocation */ + p = malloc(sizeof(PixelList)); + if (!p) { + return; + } - p->flag=0; - p->p=q; - p->count=count; - for (i=0;i<3;i++) { - p->next[i]=pl[i]; - p->prev[i]=NULL; - if (pl[i]) { - pl[i]->prev[i]=p; - } - pl[i]=p; - } + p->flag = 0; + p->p = q; + p->count = count; + for (i = 0; i < 3; i++) { + p->next[i] = pl[i]; + p->prev[i] = NULL; + if (pl[i]) { + pl[i]->prev[i] = p; + } + pl[i] = p; + } } static PixelList * -mergesort_pixels(PixelList *head, int i) -{ - PixelList *c,*t,*a,*b,*p; - if (!head||!head->next[i]) { - if (head) { - head->next[i]=NULL; - head->prev[i]=NULL; - } - return head; - } - for (c=t=head;c&&t;c=c->next[i],t=(t->next[i])?t->next[i]->next[i]:NULL); - if (c) { - if (c->prev[i]) { - c->prev[i]->next[i]=NULL; - } - c->prev[i]=NULL; - } - a=mergesort_pixels(head,i); - b=mergesort_pixels(c,i); - head=NULL; - p=NULL; - while (a&&b) { - if (a->p.a.v[i]>b->p.a.v[i]) { - c=a; - a=a->next[i]; - } else { - c=b; - b=b->next[i]; - } - c->prev[i]=p; - c->next[i]=NULL; - if (p) { - p->next[i]=c; - } - p=c; - if (!head) { - head=c; - } - } - if (a) { - c->next[i]=a; - a->prev[i]=c; - } else if (b) { - c->next[i]=b; - b->prev[i]=c; - } - return head; +mergesort_pixels(PixelList *head, int i) { + PixelList *c, *t, *a, *b, *p; + if (!head || !head->next[i]) { + if (head) { + head->next[i] = NULL; + head->prev[i] = NULL; + } + return head; + } + for (c = t = head; c && t; + c = c->next[i], t = (t->next[i]) ? t->next[i]->next[i] : NULL) + ; + if (c) { + if (c->prev[i]) { + c->prev[i]->next[i] = NULL; + } + c->prev[i] = NULL; + } + a = mergesort_pixels(head, i); + b = mergesort_pixels(c, i); + head = NULL; + p = NULL; + while (a && b) { + if (a->p.a.v[i] > b->p.a.v[i]) { + c = a; + a = a->next[i]; + } else { + c = b; + b = b->next[i]; + } + c->prev[i] = p; + c->next[i] = NULL; + if (p) { + p->next[i] = c; + } + p = c; + if (!head) { + head = c; + } + } + if (a) { + c->next[i] = a; + a->prev[i] = c; + } else if (b) { + c->next[i] = b; + b->prev[i] = c; + } + return head; } #if defined(TEST_MERGESORT) || defined(TEST_SORTED) static int -test_sorted(PixelList *pl[3]) -{ - int i,n,l; - PixelList *t; +test_sorted(PixelList *pl[3]) { + int i, n, l; + PixelList *t; - for(i=0;i<3;i++) { - n=0; - l=256; - for (t=pl[i];t;t=t->next[i]) { - if (lp.a.v[i]) return 0; - l=t->p.a.v[i]; - } - } - return 1; + for (i = 0; i < 3; i++) { + n = 0; + l = 256; + for (t = pl[i]; t; t = t->next[i]) { + if (l < t->p.a.v[i]) + return 0; + l = t->p.a.v[i]; + } + } + return 1; } #endif static int -box_heap_cmp(const Heap *h, const void *A, const void *B) -{ - BoxNode *a=(BoxNode *)A; - BoxNode *b=(BoxNode *)B; - return (int)a->pixelCount-(int)b->pixelCount; +box_heap_cmp(const Heap *h, const void *A, const void *B) { + BoxNode *a = (BoxNode *)A; + BoxNode *b = (BoxNode *)B; + return (int)a->pixelCount - (int)b->pixelCount; } -#define LUMINANCE(p) (77*(p)->c.r+150*(p)->c.g+29*(p)->c.b) +#define LUMINANCE(p) (77 * (p)->c.r + 150 * (p)->c.g + 29 * (p)->c.b) static int -splitlists(PixelList *h[3], - PixelList *t[3], - PixelList *nh[2][3], - PixelList *nt[2][3], - uint32_t nCount[2], - int axis, - uint32_t pixelCount) -{ - uint32_t left; +splitlists( + PixelList *h[3], + PixelList *t[3], + PixelList *nh[2][3], + PixelList *nt[2][3], + uint32_t nCount[2], + int axis, + uint32_t pixelCount) { + uint32_t left; - PixelList *l,*r,*c,*n; - int i; - int nRight,nLeft; - int splitColourVal; + PixelList *l, *r, *c, *n; + int i; + int nRight, nLeft; + int splitColourVal; #ifdef TEST_SPLIT - { - PixelList *_prevTest,*_nextTest; - int _i,_nextCount[3],_prevCount[3]; - for (_i=0;_i<3;_i++) { - for (_nextCount[_i]=0,_nextTest=h[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); - for (_prevCount[_i]=0,_prevTest=t[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); - if (_nextTest!=t[_i]) { - printf ("next-list of axis %d does not end at tail\n",_i); - exit(1); - } - if (_prevTest!=h[_i]) { - printf ("prev-list of axis %d does not end at head\n",_i); - exit(1); - } - for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); - for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); - if (_nextTest!=h[_i]) { - printf ("next-list of axis %d does not loop back to head\n",_i); - exit(1); - } - if (_prevTest!=t[_i]) { - printf ("prev-list of axis %d does not loop back to tail\n",_i); - exit(1); - } - } - for (_i=1;_i<3;_i++) { - if (_prevCount[_i]!=_prevCount[_i-1] || - _nextCount[_i]!=_nextCount[_i-1] || - _prevCount[_i]!=_nextCount[_i]) { - printf ("{%d %d %d} {%d %d %d}\n", + { + PixelList *_prevTest, *_nextTest; + int _i, _nextCount[3], _prevCount[3]; + for (_i = 0; _i < 3; _i++) { + for (_nextCount[_i] = 0, _nextTest = h[_i]; + _nextTest && _nextTest->next[_i]; + _nextTest = _nextTest->next[_i], _nextCount[_i]++) + ; + for (_prevCount[_i] = 0, _prevTest = t[_i]; + _prevTest && _prevTest->prev[_i]; + _prevTest = _prevTest->prev[_i], _prevCount[_i]++) + ; + if (_nextTest != t[_i]) { + printf("next-list of axis %d does not end at tail\n", _i); + exit(1); + } + if (_prevTest != h[_i]) { + printf("prev-list of axis %d does not end at head\n", _i); + exit(1); + } + for (; _nextTest && _nextTest->prev[_i]; _nextTest = _nextTest->prev[_i]) + ; + for (; _prevTest && _prevTest->next[_i]; _prevTest = _prevTest->next[_i]) + ; + if (_nextTest != h[_i]) { + printf("next-list of axis %d does not loop back to head\n", _i); + exit(1); + } + if (_prevTest != t[_i]) { + printf("prev-list of axis %d does not loop back to tail\n", _i); + exit(1); + } + } + for (_i = 1; _i < 3; _i++) { + if (_prevCount[_i] != _prevCount[_i - 1] || + _nextCount[_i] != _nextCount[_i - 1] || + _prevCount[_i] != _nextCount[_i]) { + printf( + "{%d %d %d} {%d %d %d}\n", _prevCount[0], _prevCount[1], _prevCount[2], _nextCount[0], _nextCount[1], _nextCount[2]); - exit(1); - } - } + exit(1); + } + } } #endif - nCount[0]=nCount[1]=0; - nLeft=nRight=0; - for (left=0,c=h[axis];c;) { - left=left+c->count; - nCount[0]+=c->count; - c->flag=0; - nLeft++; - c=c->next[axis]; - if (left*2>pixelCount) { - break; - } - } - if (c) { - splitColourVal=c->prev[axis]->p.a.v[axis]; - for (;c;c=c->next[axis]) { - if (splitColourVal!=c->p.a.v[axis]) { + nCount[0] = nCount[1] = 0; + nLeft = nRight = 0; + for (left = 0, c = h[axis]; c;) { + left = left + c->count; + nCount[0] += c->count; + c->flag = 0; + nLeft++; + c = c->next[axis]; + if (left * 2 > pixelCount) { break; - } - c->flag=0; - nLeft++; - nCount[0]+=c->count; - } - } - for (;c;c=c->next[axis]) { - c->flag=1; - nRight++; - nCount[1]+=c->count; - } - if (!nRight) { - for (c=t[axis],splitColourVal=t[axis]->p.a.v[axis];c;c=c->prev[axis]) { - if (splitColourVal!=c->p.a.v[axis]) { - break; - } - c->flag=1; - nRight++; - nLeft--; - nCount[0]-=c->count; - nCount[1]+=c->count; - } - } + } + } + if (c) { + splitColourVal = c->prev[axis]->p.a.v[axis]; + for (; c; c = c->next[axis]) { + if (splitColourVal != c->p.a.v[axis]) { + break; + } + c->flag = 0; + nLeft++; + nCount[0] += c->count; + } + } + for (; c; c = c->next[axis]) { + c->flag = 1; + nRight++; + nCount[1] += c->count; + } + if (!nRight) { + for (c = t[axis], splitColourVal = t[axis]->p.a.v[axis]; c; c = c->prev[axis]) { + if (splitColourVal != c->p.a.v[axis]) { + break; + } + c->flag = 1; + nRight++; + nLeft--; + nCount[0] -= c->count; + nCount[1] += c->count; + } + } #ifndef NO_OUTPUT - if (!nLeft) { - for (c=h[axis];c;c=c->next[axis]) { - printf ("[%d %d %d]\n",c->p.c.r,c->p.c.g,c->p.c.b); - } - printf ("warning... trivial split\n"); - } + if (!nLeft) { + for (c = h[axis]; c; c = c->next[axis]) { + printf("[%d %d %d]\n", c->p.c.r, c->p.c.g, c->p.c.b); + } + printf("warning... trivial split\n"); + } #endif - for (i=0;i<3;i++) { - l=r=NULL; - nh[0][i]=nt[0][i]=NULL; - nh[1][i]=nt[1][i]=NULL; - for (c=h[i];c;c=n) { - n=c->next[i]; - if (c->flag) { /* move pixel to right list*/ - if (r) { - r->next[i]=c; - } else { - nh[1][i]=c; + for (i = 0; i < 3; i++) { + l = r = NULL; + nh[0][i] = nt[0][i] = NULL; + nh[1][i] = nt[1][i] = NULL; + for (c = h[i]; c; c = n) { + n = c->next[i]; + if (c->flag) { /* move pixel to right list*/ + if (r) { + r->next[i] = c; + } else { + nh[1][i] = c; + } + c->prev[i] = r; + r = c; + } else { /* move pixel to left list */ + if (l) { + l->next[i] = c; + } else { + nh[0][i] = c; + } + c->prev[i] = l; + l = c; } - c->prev[i]=r; - r=c; - } else { /* move pixel to left list */ - if (l) { - l->next[i]=c; - } else { - nh[0][i]=c; - } - c->prev[i]=l; - l=c; - } - } - if (l) { - l->next[i]=NULL; - } - if (r) { - r->next[i]=NULL; - } - nt[0][i]=l; - nt[1][i]=r; - } - return 1; + } + if (l) { + l->next[i] = NULL; + } + if (r) { + r->next[i] = NULL; + } + nt[0][i] = l; + nt[1][i] = r; + } + return 1; } static int -split(BoxNode *node) -{ - unsigned char rl,rh,gl,gh,bl,bh; - int f[3]; - int best,axis; - int i; - PixelList *heads[2][3]; - PixelList *tails[2][3]; - uint32_t newCounts[2]; - BoxNode *left,*right; +split(BoxNode *node) { + unsigned char rl, rh, gl, gh, bl, bh; + int f[3]; + int best, axis; + int i; + PixelList *heads[2][3]; + PixelList *tails[2][3]; + uint32_t newCounts[2]; + BoxNode *left, *right; - rh=node->head[0]->p.c.r; - rl=node->tail[0]->p.c.r; - gh=node->head[1]->p.c.g; - gl=node->tail[1]->p.c.g; - bh=node->head[2]->p.c.b; - bl=node->tail[2]->p.c.b; + rh = node->head[0]->p.c.r; + rl = node->tail[0]->p.c.r; + gh = node->head[1]->p.c.g; + gl = node->tail[1]->p.c.g; + bh = node->head[2]->p.c.b; + bl = node->tail[2]->p.c.b; #ifdef TEST_SPLIT - printf ("splitting node [%d %d %d] [%d %d %d] ",rl,gl,bl,rh,gh,bh); + printf("splitting node [%d %d %d] [%d %d %d] ", rl, gl, bl, rh, gh, bh); #endif - f[0]=(rh-rl)*77; - f[1]=(gh-gl)*150; - f[2]=(bh-bl)*29; + f[0] = (rh - rl) * 77; + f[1] = (gh - gl) * 150; + f[2] = (bh - bl) * 29; - best=f[0]; - axis=0; - for (i=1;i<3;i++) { - if (besttail[_i]->next[_i]) { - printf ("tail is not tail\n"); - printf ("node->tail[%d]->next[%d]=%p\n",_i,_i,node->tail[_i]->next[_i]); - } - if (node->head[_i]->prev[_i]) { - printf ("head is not head\n"); - printf ("node->head[%d]->prev[%d]=%p\n",_i,_i,node->head[_i]->prev[_i]); - } - } + { + PixelList *_prevTest, *_nextTest; + int _i, _nextCount[3], _prevCount[3]; + for (_i = 0; _i < 3; _i++) { + if (node->tail[_i]->next[_i]) { + printf("tail is not tail\n"); + printf( + "node->tail[%d]->next[%d]=%p\n", _i, _i, node->tail[_i]->next[_i]); + } + if (node->head[_i]->prev[_i]) { + printf("head is not head\n"); + printf( + "node->head[%d]->prev[%d]=%p\n", _i, _i, node->head[_i]->prev[_i]); + } + } - for (_i=0;_i<3;_i++) { - for (_nextCount[_i]=0,_nextTest=node->head[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); - for (_prevCount[_i]=0,_prevTest=node->tail[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); - if (_nextTest!=node->tail[_i]) { - printf ("next-list of axis %d does not end at tail\n",_i); - } - if (_prevTest!=node->head[_i]) { - printf ("prev-list of axis %d does not end at head\n",_i); - } - for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); - for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); - if (_nextTest!=node->head[_i]) { - printf ("next-list of axis %d does not loop back to head\n",_i); - } - if (_prevTest!=node->tail[_i]) { - printf ("prev-list of axis %d does not loop back to tail\n",_i); - } - } - for (_i=1;_i<3;_i++) { - if (_prevCount[_i]!=_prevCount[_i-1] || - _nextCount[_i]!=_nextCount[_i-1] || - _prevCount[_i]!=_nextCount[_i]) { - printf ("{%d %d %d} {%d %d %d}\n", + for (_i = 0; _i < 3; _i++) { + for (_nextCount[_i] = 0, _nextTest = node->head[_i]; + _nextTest && _nextTest->next[_i]; + _nextTest = _nextTest->next[_i], _nextCount[_i]++) + ; + for (_prevCount[_i] = 0, _prevTest = node->tail[_i]; + _prevTest && _prevTest->prev[_i]; + _prevTest = _prevTest->prev[_i], _prevCount[_i]++) + ; + if (_nextTest != node->tail[_i]) { + printf("next-list of axis %d does not end at tail\n", _i); + } + if (_prevTest != node->head[_i]) { + printf("prev-list of axis %d does not end at head\n", _i); + } + for (; _nextTest && _nextTest->prev[_i]; _nextTest = _nextTest->prev[_i]) + ; + for (; _prevTest && _prevTest->next[_i]; _prevTest = _prevTest->next[_i]) + ; + if (_nextTest != node->head[_i]) { + printf("next-list of axis %d does not loop back to head\n", _i); + } + if (_prevTest != node->tail[_i]) { + printf("prev-list of axis %d does not loop back to tail\n", _i); + } + } + for (_i = 1; _i < 3; _i++) { + if (_prevCount[_i] != _prevCount[_i - 1] || + _nextCount[_i] != _nextCount[_i - 1] || + _prevCount[_i] != _nextCount[_i]) { + printf( + "{%d %d %d} {%d %d %d}\n", _prevCount[0], _prevCount[1], _prevCount[2], _nextCount[0], _nextCount[1], _nextCount[2]); - } - } + } + } } #endif - node->axis=axis; - if (!splitlists(node->head, - node->tail, - heads, - tails, - newCounts, - axis, - node->pixelCount)) { + node->axis = axis; + if (!splitlists( + node->head, node->tail, heads, tails, newCounts, axis, node->pixelCount)) { #ifndef NO_OUTPUT - printf ("list split failed.\n"); + printf("list split failed.\n"); #endif - return 0; - } + return 0; + } #ifdef TEST_SPLIT - if (!test_sorted(heads[0])) { - printf ("bug in split"); - exit(1); - } - if (!test_sorted(heads[1])) { - printf ("bug in split"); - exit(1); - } + if (!test_sorted(heads[0])) { + printf("bug in split"); + exit(1); + } + if (!test_sorted(heads[1])) { + printf("bug in split"); + exit(1); + } #endif - /* malloc check ok, small constant allocation */ - left=malloc(sizeof(BoxNode)); - right=malloc(sizeof(BoxNode)); - if (!left||!right) { - free(left); - free(right); - return 0; - } - for(i=0;i<3;i++) { - left->head[i]=heads[0][i]; - left->tail[i]=tails[0][i]; - right->head[i]=heads[1][i]; - right->tail[i]=tails[1][i]; - node->head[i]=NULL; - node->tail[i]=NULL; - } + /* malloc check ok, small constant allocation */ + left = malloc(sizeof(BoxNode)); + right = malloc(sizeof(BoxNode)); + if (!left || !right) { + free(left); + free(right); + return 0; + } + for (i = 0; i < 3; i++) { + left->head[i] = heads[0][i]; + left->tail[i] = tails[0][i]; + right->head[i] = heads[1][i]; + right->tail[i] = tails[1][i]; + node->head[i] = NULL; + node->tail[i] = NULL; + } #ifdef TEST_SPLIT - if (left->head[0]) { - rh=left->head[0]->p.c.r; - rl=left->tail[0]->p.c.r; - gh=left->head[1]->p.c.g; - gl=left->tail[1]->p.c.g; - bh=left->head[2]->p.c.b; - bl=left->tail[2]->p.c.b; - printf (" left node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); - } - if (right->head[0]) { - rh=right->head[0]->p.c.r; - rl=right->tail[0]->p.c.r; - gh=right->head[1]->p.c.g; - gl=right->tail[1]->p.c.g; - bh=right->head[2]->p.c.b; - bl=right->tail[2]->p.c.b; - printf (" right node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); - } + if (left->head[0]) { + rh = left->head[0]->p.c.r; + rl = left->tail[0]->p.c.r; + gh = left->head[1]->p.c.g; + gl = left->tail[1]->p.c.g; + bh = left->head[2]->p.c.b; + bl = left->tail[2]->p.c.b; + printf(" left node [%3d %3d %3d] [%3d %3d %3d]\n", rl, gl, bl, rh, gh, bh); + } + if (right->head[0]) { + rh = right->head[0]->p.c.r; + rl = right->tail[0]->p.c.r; + gh = right->head[1]->p.c.g; + gl = right->tail[1]->p.c.g; + bh = right->head[2]->p.c.b; + bl = right->tail[2]->p.c.b; + printf(" right node [%3d %3d %3d] [%3d %3d %3d]\n", rl, gl, bl, rh, gh, bh); + } #endif - left->l=left->r=NULL; - right->l=right->r=NULL; - left->axis=right->axis=-1; - left->volume=right->volume=-1; - left->pixelCount=newCounts[0]; - right->pixelCount=newCounts[1]; - node->l=left; - node->r=right; - return 1; + left->l = left->r = NULL; + right->l = right->r = NULL; + left->axis = right->axis = -1; + left->volume = right->volume = -1; + left->pixelCount = newCounts[0]; + right->pixelCount = newCounts[1]; + node->l = left; + node->r = right; + return 1; } static BoxNode * -median_cut(PixelList *hl[3], - uint32_t imPixelCount, - int nPixels) -{ - PixelList *tl[3]; - int i; - BoxNode *root; - Heap* h; - BoxNode *thisNode; +median_cut(PixelList *hl[3], uint32_t imPixelCount, int nPixels) { + PixelList *tl[3]; + int i; + BoxNode *root; + Heap *h; + BoxNode *thisNode; - h=ImagingQuantHeapNew(box_heap_cmp); - /* malloc check ok, small constant allocation */ - root=malloc(sizeof(BoxNode)); - if (!root) { ImagingQuantHeapFree(h); return NULL; } - for(i=0;i<3;i++) { - for (tl[i]=hl[i];tl[i]&&tl[i]->next[i];tl[i]=tl[i]->next[i]); - root->head[i]=hl[i]; - root->tail[i]=tl[i]; - } - root->l=root->r=NULL; - root->axis=-1; - root->volume=-1; - root->pixelCount=imPixelCount; + h = ImagingQuantHeapNew(box_heap_cmp); + /* malloc check ok, small constant allocation */ + root = malloc(sizeof(BoxNode)); + if (!root) { + ImagingQuantHeapFree(h); + return NULL; + } + for (i = 0; i < 3; i++) { + for (tl[i] = hl[i]; tl[i] && tl[i]->next[i]; tl[i] = tl[i]->next[i]) + ; + root->head[i] = hl[i]; + root->tail[i] = tl[i]; + } + root->l = root->r = NULL; + root->axis = -1; + root->volume = -1; + root->pixelCount = imPixelCount; - ImagingQuantHeapAdd(h,(void *)root); - while (--nPixels) { - do { - if (!ImagingQuantHeapRemove(h,(void **)&thisNode)) { - goto done; - } - } while (compute_box_volume(thisNode)==1); - if (!split(thisNode)) { + ImagingQuantHeapAdd(h, (void *)root); + while (--nPixels) { + do { + if (!ImagingQuantHeapRemove(h, (void **)&thisNode)) { + goto done; + } + } while (compute_box_volume(thisNode) == 1); + if (!split(thisNode)) { #ifndef NO_OUTPUT - printf ("Oops, split failed...\n"); + printf("Oops, split failed...\n"); #endif - exit (1); - } - ImagingQuantHeapAdd(h,(void *)(thisNode->l)); - ImagingQuantHeapAdd(h,(void *)(thisNode->r)); - } + exit(1); + } + ImagingQuantHeapAdd(h, (void *)(thisNode->l)); + ImagingQuantHeapAdd(h, (void *)(thisNode->r)); + } done: - ImagingQuantHeapFree(h); - return root; + ImagingQuantHeapFree(h); + return root; } static void -free_box_tree(BoxNode *n) -{ - PixelList *p,*pp; - if (n->l) { - free_box_tree(n->l); - } - if (n->r) { - free_box_tree(n->r); - } - for (p=n->head[0];p;p=pp) { - pp=p->next[0]; - free(p); - } - free(n); +free_box_tree(BoxNode *n) { + PixelList *p, *pp; + if (n->l) { + free_box_tree(n->l); + } + if (n->r) { + free_box_tree(n->r); + } + for (p = n->head[0]; p; p = pp) { + pp = p->next[0]; + free(p); + } + free(n); } #ifdef TEST_SPLIT_INTEGRITY static int -checkContained(BoxNode *n,Pixel *pp) -{ - if (n->l&&n->r) { - return checkContained(n->l,pp)+checkContained(n->r,pp); - } - if (n->l||n->r) { +checkContained(BoxNode *n, Pixel *pp) { + if (n->l && n->r) { + return checkContained(n->l, pp) + checkContained(n->r, pp); + } + if (n->l || n->r) { #ifndef NO_OUTPUT - printf ("box tree is dead\n"); + printf("box tree is dead\n"); #endif - return 0; - } - if ( - pp->c.r<=n->head[0]->p.c.r && - pp->c.r>=n->tail[0]->p.c.r && - pp->c.g<=n->head[1]->p.c.g && - pp->c.g>=n->tail[1]->p.c.g && - pp->c.b<=n->head[2]->p.c.b && - pp->c.b>=n->tail[2]->p.c.b) { - return 1; - } - return 0; + return 0; + } + if (pp->c.r <= n->head[0]->p.c.r && pp->c.r >= n->tail[0]->p.c.r && + pp->c.g <= n->head[1]->p.c.g && pp->c.g >= n->tail[1]->p.c.g && + pp->c.b <= n->head[2]->p.c.b && pp->c.b >= n->tail[2]->p.c.b) { + return 1; + } + return 0; } #endif static int -annotate_hash_table(BoxNode *n,HashTable *h,uint32_t *box) -{ - PixelList *p; - PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); - Pixel q; - if (n->l&&n->r) { - return annotate_hash_table(n->l,h,box) && annotate_hash_table(n->r,h,box); - } - if (n->l||n->r) { +annotate_hash_table(BoxNode *n, HashTable *h, uint32_t *box) { + PixelList *p; + PixelHashData *d = (PixelHashData *)hashtable_get_user_data(h); + Pixel q; + if (n->l && n->r) { + return annotate_hash_table(n->l, h, box) && annotate_hash_table(n->r, h, box); + } + if (n->l || n->r) { #ifndef NO_OUTPUT - printf ("box tree is dead\n"); + printf("box tree is dead\n"); #endif - return 0; - } - for (p=n->head[0];p;p=p->next[0]) { - PIXEL_UNSCALE(&(p->p),&q,d->scale); - if (!hashtable_insert(h,q,*box)) { + return 0; + } + for (p = n->head[0]; p; p = p->next[0]) { + PIXEL_UNSCALE(&(p->p), &q, d->scale); + if (!hashtable_insert(h, q, *box)) { #ifndef NO_OUTPUT - printf ("hashtable insert failed\n"); + printf("hashtable insert failed\n"); #endif - return 0; - } - } - if (n->head[0]) { - (*box)++; - } - return 1; + return 0; + } + } + if (n->head[0]) { + (*box)++; + } + return 1; } static int -_sort_ulong_ptr_keys(const void *a, const void *b) -{ - uint32_t A=**(uint32_t **)a; - uint32_t B=**(uint32_t **)b; - return (A==B)?0:((A*(skRow[k]));k--) { - skRow[k]=skRow[k-1]; - } - if (k!=j) { - skRow[k]=skElt; - } - } - } - return 1; + for (i = 0; i < nEntries; i++) { + avgDist[i * nEntries + i] = 0; + for (j = 0; j < i; j++) { + avgDist[j * nEntries + i] = avgDist[i * nEntries + j] = + _DISTSQR(p + i, p + j); + } + } + for (i = 0; i < nEntries; i++) { + skRow = avgDistSortKey + i * nEntries; + for (j = 1; j < nEntries; j++) { + skElt = skRow[j]; + for (k = j; k && (*(skRow[k - 1]) > *(skRow[k])); k--) { + skRow[k] = skRow[k - 1]; + } + if (k != j) { + skRow[k] = skElt; + } + } + } + return 1; } static int -build_distance_tables(uint32_t *avgDist, - uint32_t **avgDistSortKey, - Pixel *p, - uint32_t nEntries) -{ - uint32_t i,j; +build_distance_tables( + uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) { + uint32_t i, j; - for (i=0;i1) { - printf ("pixel in two boxes\n"); - for(i=0;i<3;i++) { - free (avg[i]); - } - free(count); - return 0; - } + if (!(i % 100)) { + printf("%05d\r", i); + fflush(stdout); + } + if (checkContained(root, pixelData + i) > 1) { + printf("pixel in two boxes\n"); + for (i = 0; i < 3; i++) { + free(avg[i]); + } + free(count); + return 0; + } #endif - if (!hashtable_lookup(medianBoxHash,pixelData[i],&paletteEntry)) { + if (!hashtable_lookup(medianBoxHash, pixelData[i], &paletteEntry)) { #ifndef NO_OUTPUT - printf ("pixel lookup failed\n"); + printf("pixel lookup failed\n"); #endif - for(i=0;i<3;i++) { - free (avg[i]); - } - free(count); - return 0; - } - if (paletteEntry>=nPaletteEntries) { + for (i = 0; i < 3; i++) { + free(avg[i]); + } + free(count); + return 0; + } + if (paletteEntry >= nPaletteEntries) { #ifndef NO_OUTPUT - printf ("panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",(int)paletteEntry,(int)nPaletteEntries); + printf( + "panic - paletteEntry>=nPaletteEntries (%d>=%d)\n", + (int)paletteEntry, + (int)nPaletteEntries); #endif - for(i=0;i<3;i++) { - free (avg[i]); - } - free(count); - return 0; - } - avg[0][paletteEntry]+=pixelData[i].c.r; - avg[1][paletteEntry]+=pixelData[i].c.g; - avg[2][paletteEntry]+=pixelData[i].c.b; - count[paletteEntry]++; - } - /* malloc check ok, using calloc */ - p=calloc(nPaletteEntries, sizeof(Pixel)); - if (!p) { - for(i=0;i<3;i++) { - free (avg[i]); - } - free(count); - return 0; - } - for (i=0;i=nPaletteEntries) { + memset(count, 0, sizeof(uint32_t) * nPaletteEntries); + for (i = 0; i < 3; i++) { + memset(avg[i], 0, sizeof(uint32_t) * nPaletteEntries); + } + for (i = 0; i < nPixels; i++) { + if (qp[i] >= nPaletteEntries) { #ifndef NO_OUTPUT - printf ("scream\n"); + printf("scream\n"); #endif - return 0; - } - avg[0][qp[i]]+=pixelData[i].c.r; - avg[1][qp[i]]+=pixelData[i].c.g; - avg[2][qp[i]]+=pixelData[i].c.b; - count[qp[i]]++; - } - for (i=0;i UINT32_MAX / (sizeof(uint32_t))) { - return 0; - } - /* malloc check ok, using calloc */ - if (!(count=calloc(nPaletteEntries, sizeof(uint32_t)))) { - return 0; - } - for(i=0;i<3;i++) { - avg[i]=NULL; - } - for(i=0;i<3;i++) { - /* malloc check ok, using calloc */ - if (!(avg[i]=calloc(nPaletteEntries, sizeof(uint32_t)))) { - goto error_1; - } - } + if (nPaletteEntries > UINT32_MAX / (sizeof(uint32_t))) { + return 0; + } + /* malloc check ok, using calloc */ + if (!(count = calloc(nPaletteEntries, sizeof(uint32_t)))) { + return 0; + } + for (i = 0; i < 3; i++) { + avg[i] = NULL; + } + for (i = 0; i < 3; i++) { + /* malloc check ok, using calloc */ + if (!(avg[i] = calloc(nPaletteEntries, sizeof(uint32_t)))) { + goto error_1; + } + } - /* this is enough of a check, since the multiplication n*size is done above */ - if (nPaletteEntries > UINT32_MAX / nPaletteEntries) { - goto error_1; - } - /* malloc check ok, using calloc, checking n*n above */ - avgDist=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t)); - if (!avgDist) { goto error_1; } + /* this is enough of a check, since the multiplication n*size is done above */ + if (nPaletteEntries > UINT32_MAX / nPaletteEntries) { + goto error_1; + } + /* malloc check ok, using calloc, checking n*n above */ + avgDist = calloc(nPaletteEntries * nPaletteEntries, sizeof(uint32_t)); + if (!avgDist) { + goto error_1; + } - /* malloc check ok, using calloc, checking n*n above */ - avgDistSortKey=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t *)); - if (!avgDistSortKey) { goto error_2; } + /* malloc check ok, using calloc, checking n*n above */ + avgDistSortKey = calloc(nPaletteEntries * nPaletteEntries, sizeof(uint32_t *)); + if (!avgDistSortKey) { + goto error_2; + } #ifndef NO_OUTPUT - printf("[");fflush(stdout); + printf("["); + fflush(stdout); #endif - while (1) { - if (!built) { - compute_palette_from_quantized_pixels(pixelData,nPixels,paletteData,nPaletteEntries,avg,count,qp); - build_distance_tables(avgDist,avgDistSortKey,paletteData,nPaletteEntries); - built=1; - } else { - recompute_palette_from_averages(paletteData,nPaletteEntries,avg,count); - resort_distance_tables(avgDist,avgDistSortKey,paletteData,nPaletteEntries); - } - changes=map_image_pixels_from_quantized_pixels(pixelData, - nPixels, - paletteData, - nPaletteEntries, - avgDist, - avgDistSortKey, - qp, - avg, - count); - if (changes<0) { - goto error_3; - } + while (1) { + if (!built) { + compute_palette_from_quantized_pixels( + pixelData, nPixels, paletteData, nPaletteEntries, avg, count, qp); + build_distance_tables( + avgDist, avgDistSortKey, paletteData, nPaletteEntries); + built = 1; + } else { + recompute_palette_from_averages(paletteData, nPaletteEntries, avg, count); + resort_distance_tables( + avgDist, avgDistSortKey, paletteData, nPaletteEntries); + } + changes = map_image_pixels_from_quantized_pixels( + pixelData, + nPixels, + paletteData, + nPaletteEntries, + avgDist, + avgDistSortKey, + qp, + avg, + count); + if (changes < 0) { + goto error_3; + } #ifndef NO_OUTPUT - printf (".(%d)",changes);fflush(stdout); + printf(".(%d)", changes); + fflush(stdout); #endif - if (changes<=threshold) { - break; - } - } + if (changes <= threshold) { + break; + } + } #ifndef NO_OUTPUT - printf("]\n"); + printf("]\n"); #endif - if (avgDistSortKey) { - free(avgDistSortKey); - } - if (avgDist) { - free(avgDist); - } - for(i=0;i<3;i++) { - if (avg[i]) { - free (avg[i]); - } - } - if (count) { - free(count); - } - return 1; + if (avgDistSortKey) { + free(avgDistSortKey); + } + if (avgDist) { + free(avgDist); + } + for (i = 0; i < 3; i++) { + if (avg[i]) { + free(avg[i]); + } + } + if (count) { + free(count); + } + return 1; error_3: - if (avgDistSortKey) { - free(avgDistSortKey); - } + if (avgDistSortKey) { + free(avgDistSortKey); + } error_2: - if (avgDist) { - free(avgDist); - } + if (avgDist) { + free(avgDist); + } error_1: - for(i=0;i<3;i++) { - if (avg[i]) { - free (avg[i]); - } - } - if (count) { - free(count); - } - return 0; + for (i = 0; i < 3; i++) { + if (avg[i]) { + free(avg[i]); + } + } + if (count) { + free(count); + } + return 0; } int -quantize(Pixel *pixelData, - uint32_t nPixels, - uint32_t nQuantPixels, - Pixel **palette, - uint32_t *paletteLength, - uint32_t **quantizedPixels, - int kmeans) -{ - PixelList *hl[3]; - HashTable *h; - BoxNode *root; - uint32_t i; - uint32_t *qp; - uint32_t nPaletteEntries; +quantize( + Pixel *pixelData, + uint32_t nPixels, + uint32_t nQuantPixels, + Pixel **palette, + uint32_t *paletteLength, + uint32_t **quantizedPixels, + int kmeans) { + PixelList *hl[3]; + HashTable *h; + BoxNode *root; + uint32_t i; + uint32_t *qp; + uint32_t nPaletteEntries; - uint32_t *avgDist; - uint32_t **avgDistSortKey; - Pixel *p; + uint32_t *avgDist; + uint32_t **avgDistSortKey; + Pixel *p; #ifndef NO_OUTPUT - uint32_t timer,timer2; + uint32_t timer, timer2; #endif #ifndef NO_OUTPUT - timer2=clock(); - printf ("create hash table..."); fflush(stdout); timer=clock(); + timer2 = clock(); + printf("create hash table..."); + fflush(stdout); + timer = clock(); #endif - h=create_pixel_hash(pixelData,nPixels); + h = create_pixel_hash(pixelData, nPixels); #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif - if (!h) { - goto error_0; - } + if (!h) { + goto error_0; + } #ifndef NO_OUTPUT - printf ("create lists from hash table..."); fflush(stdout); timer=clock(); + printf("create lists from hash table..."); + fflush(stdout); + timer = clock(); #endif - hl[0]=hl[1]=hl[2]=NULL; - hashtable_foreach(h,hash_to_list,hl); + hl[0] = hl[1] = hl[2] = NULL; + hashtable_foreach(h, hash_to_list, hl); #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif - if (!hl[0]) { - goto error_1; - } + if (!hl[0]) { + goto error_1; + } #ifndef NO_OUTPUT - printf ("mergesort lists..."); fflush(stdout); timer=clock(); + printf("mergesort lists..."); + fflush(stdout); + timer = clock(); #endif - for(i=0;i<3;i++) { - hl[i]=mergesort_pixels(hl[i],i); - } + for (i = 0; i < 3; i++) { + hl[i] = mergesort_pixels(hl[i], i); + } #ifdef TEST_MERGESORT - if (!test_sorted(hl)) { - printf ("bug in mergesort\n"); - goto error_1; - } + if (!test_sorted(hl)) { + printf("bug in mergesort\n"); + goto error_1; + } #endif #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif #ifndef NO_OUTPUT - printf ("median cut..."); fflush(stdout); timer=clock(); + printf("median cut..."); + fflush(stdout); + timer = clock(); #endif - root=median_cut(hl,nPixels,nQuantPixels); + root = median_cut(hl, nPixels, nQuantPixels); #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif - if (!root) { - goto error_1; - } - nPaletteEntries=0; + if (!root) { + goto error_1; + } + nPaletteEntries = 0; #ifndef NO_OUTPUT - printf ("median cut tree to hash table..."); fflush(stdout); timer=clock(); + printf("median cut tree to hash table..."); + fflush(stdout); + timer = clock(); #endif - annotate_hash_table(root,h,&nPaletteEntries); + annotate_hash_table(root, h, &nPaletteEntries); #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif #ifndef NO_OUTPUT - printf ("compute palette...\n"); fflush(stdout); timer=clock(); + printf("compute palette...\n"); + fflush(stdout); + timer = clock(); #endif - if (!compute_palette_from_median_cut(pixelData,nPixels,h,&p,nPaletteEntries)) { - goto error_3; - } + if (!compute_palette_from_median_cut(pixelData, nPixels, h, &p, nPaletteEntries)) { + goto error_3; + } #ifndef NO_OUTPUT - printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); + printf("done (%f)\n", (clock() - timer) / (double)CLOCKS_PER_SEC); #endif - free_box_tree(root); - root=NULL; + free_box_tree(root); + root = NULL; - /* malloc check ok, using calloc for overflow */ - qp=calloc(nPixels, sizeof(uint32_t)); - if (!qp) { goto error_4; } + /* malloc check ok, using calloc for overflow */ + qp = calloc(nPixels, sizeof(uint32_t)); + if (!qp) { + goto error_4; + } - if (nPaletteEntries > UINT32_MAX / nPaletteEntries ) { - goto error_5; - } - /* malloc check ok, using calloc for overflow, check of n*n above */ - avgDist=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t)); - if (!avgDist) { goto error_5; } + if (nPaletteEntries > UINT32_MAX / nPaletteEntries) { + goto error_5; + } + /* malloc check ok, using calloc for overflow, check of n*n above */ + avgDist = calloc(nPaletteEntries * nPaletteEntries, sizeof(uint32_t)); + if (!avgDist) { + goto error_5; + } - /* malloc check ok, using calloc for overflow, check of n*n above */ - avgDistSortKey=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t *)); - if (!avgDistSortKey) { goto error_6; } + /* malloc check ok, using calloc for overflow, check of n*n above */ + avgDistSortKey = calloc(nPaletteEntries * nPaletteEntries, sizeof(uint32_t *)); + if (!avgDistSortKey) { + goto error_6; + } - if (!build_distance_tables(avgDist,avgDistSortKey,p,nPaletteEntries)) { - goto error_7; - } + if (!build_distance_tables(avgDist, avgDistSortKey, p, nPaletteEntries)) { + goto error_7; + } - if (!map_image_pixels_from_median_box(pixelData,nPixels,p,nPaletteEntries,h,avgDist,avgDistSortKey,qp)) { - goto error_7; - } + if (!map_image_pixels_from_median_box( + pixelData, nPixels, p, nPaletteEntries, h, avgDist, avgDistSortKey, qp)) { + goto error_7; + } #ifdef TEST_NEAREST_NEIGHBOUR #include - { - uint32_t bestmatch,bestdist,dist; - HashTable *h2; - printf ("nearest neighbour search (full search)..."); fflush(stdout); timer=clock(); - h2=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); - for (i=0;inew),&pixel); - if (data->secondPixel || newDistdata->furthestDistance) { - data->furthestDistance=oldDist; - data->furthest.v=pixel.v; - } +compute_distances(const HashTable *h, const Pixel pixel, uint32_t *dist, void *u) { + DistanceData *data = (DistanceData *)u; + uint32_t oldDist = *dist; + uint32_t newDist; + newDist = _DISTSQR(&(data->new), &pixel); + if (data->secondPixel || newDist < oldDist) { + *dist = newDist; + oldDist = newDist; + } + if (oldDist > data->furthestDistance) { + data->furthestDistance = oldDist; + data->furthest.v = pixel.v; + } } int -quantize2(Pixel *pixelData, - uint32_t nPixels, - uint32_t nQuantPixels, - Pixel **palette, - uint32_t *paletteLength, - uint32_t **quantizedPixels, - int kmeans) -{ - HashTable *h; - uint32_t i; - uint32_t mean[3]; - Pixel *p; - DistanceData data; +quantize2( + Pixel *pixelData, + uint32_t nPixels, + uint32_t nQuantPixels, + Pixel **palette, + uint32_t *paletteLength, + uint32_t **quantizedPixels, + int kmeans) { + HashTable *h; + uint32_t i; + uint32_t mean[3]; + Pixel *p; + DistanceData data; - uint32_t *qp; - uint32_t *avgDist; - uint32_t **avgDistSortKey; + uint32_t *qp; + uint32_t *avgDist; + uint32_t **avgDistSortKey; - /* malloc check ok, using calloc */ - p=calloc(nQuantPixels, sizeof(Pixel)); - if (!p) { - return 0; - } - mean[0]=mean[1]=mean[2]=0; - h=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); - for (i=0;i UINT32_MAX / nQuantPixels ) { - goto error_2; - } + if (nQuantPixels > UINT32_MAX / nQuantPixels) { + goto error_2; + } - /* malloc check ok, using calloc for overflow, check of n*n above */ - avgDist=calloc(nQuantPixels*nQuantPixels, sizeof(uint32_t)); - if (!avgDist) { goto error_2; } + /* malloc check ok, using calloc for overflow, check of n*n above */ + avgDist = calloc(nQuantPixels * nQuantPixels, sizeof(uint32_t)); + if (!avgDist) { + goto error_2; + } - /* malloc check ok, using calloc for overflow, check of n*n above */ - avgDistSortKey=calloc(nQuantPixels*nQuantPixels, sizeof(uint32_t *)); - if (!avgDistSortKey) { goto error_3; } + /* malloc check ok, using calloc for overflow, check of n*n above */ + avgDistSortKey = calloc(nQuantPixels * nQuantPixels, sizeof(uint32_t *)); + if (!avgDistSortKey) { + goto error_3; + } - if (!build_distance_tables(avgDist,avgDistSortKey,p,nQuantPixels)) { - goto error_4; - } + if (!build_distance_tables(avgDist, avgDistSortKey, p, nQuantPixels)) { + goto error_4; + } - if (!map_image_pixels(pixelData,nPixels,p,nQuantPixels,avgDist,avgDistSortKey,qp)) { - goto error_4; - } - if (kmeans) { - k_means(pixelData,nPixels,p,nQuantPixels,qp,kmeans-1); - } + if (!map_image_pixels( + pixelData, nPixels, p, nQuantPixels, avgDist, avgDistSortKey, qp)) { + goto error_4; + } + if (kmeans) { + k_means(pixelData, nPixels, p, nQuantPixels, qp, kmeans - 1); + } - *paletteLength=nQuantPixels; - *palette=p; - *quantizedPixels=qp; - free(avgDistSortKey); - free(avgDist); - return 1; + *paletteLength = nQuantPixels; + *palette = p; + *quantizedPixels = qp; + free(avgDistSortKey); + free(avgDist); + return 1; error_4: - free(avgDistSortKey); + free(avgDistSortKey); error_3: - free(avgDist); + free(avgDist); error_2: - free(qp); + free(qp); error_1: - free(p); - return 0; + free(p); + return 0; } Imaging -ImagingQuantize(Imaging im, int colors, int mode, int kmeans) -{ +ImagingQuantize(Imaging im, int colors, int mode, int kmeans) { int i, j; int x, y, v; - UINT8* pp; - Pixel* p; - Pixel* palette; + UINT8 *pp; + Pixel *p; + Pixel *palette; uint32_t paletteLength; int result; - uint32_t* newData; + uint32_t *newData; Imaging imOut; int withAlpha = 0; ImagingSectionCookie cookie; @@ -1605,17 +1630,17 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) if (colors < 1 || colors > 256) { /* FIXME: for colors > 256, consider returning an RGB image instead (see @PIL205) */ - return (Imaging) ImagingError_ValueError("bad number of colors"); + return (Imaging)ImagingError_ValueError("bad number of colors"); } if (strcmp(im->mode, "L") != 0 && strcmp(im->mode, "P") != 0 && - strcmp(im->mode, "RGB") != 0 && strcmp(im->mode, "RGBA") !=0) { + strcmp(im->mode, "RGB") != 0 && strcmp(im->mode, "RGBA") != 0) { return ImagingError_ModeError(); } /* only octree and imagequant supports RGBA */ if (!strcmp(im->mode, "RGBA") && mode != 2 && mode != 3) { - return ImagingError_ModeError(); + return ImagingError_ModeError(); } if (im->xsize > INT_MAX / im->ysize) { @@ -1653,10 +1678,10 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) for (i = y = 0; y < im->ysize; y++) { for (x = 0; x < im->xsize; x++, i++) { v = im->image8[y][x]; - p[i].c.r = pp[v*4+0]; - p[i].c.g = pp[v*4+1]; - p[i].c.b = pp[v*4+2]; - p[i].c.a = pp[v*4+3]; + p[i].c.r = pp[v * 4 + 0]; + p[i].c.g = pp[v * 4 + 1]; + p[i].c.b = pp[v * 4 + 2]; + p[i].c.a = pp[v * 4 + 3]; } } @@ -1671,72 +1696,68 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) } else { free(p); - return (Imaging) ImagingError_ValueError("internal error"); + return (Imaging)ImagingError_ValueError("internal error"); } ImagingSectionEnter(&cookie); switch (mode) { - case 0: - /* median cut */ - result = quantize( - p, - im->xsize*im->ysize, - colors, - &palette, - &paletteLength, - &newData, - kmeans - ); - break; - case 1: - /* maximum coverage */ - result = quantize2( - p, - im->xsize*im->ysize, - colors, - &palette, - &paletteLength, - &newData, - kmeans - ); - break; - case 2: - if (!strcmp(im->mode, "RGBA")) { - withAlpha = 1; - } - result = quantize_octree( - p, - im->xsize*im->ysize, - colors, - &palette, - &paletteLength, - &newData, - withAlpha - ); - break; - case 3: + case 0: + /* median cut */ + result = quantize( + p, + im->xsize * im->ysize, + colors, + &palette, + &paletteLength, + &newData, + kmeans); + break; + case 1: + /* maximum coverage */ + result = quantize2( + p, + im->xsize * im->ysize, + colors, + &palette, + &paletteLength, + &newData, + kmeans); + break; + case 2: + if (!strcmp(im->mode, "RGBA")) { + withAlpha = 1; + } + result = quantize_octree( + p, + im->xsize * im->ysize, + colors, + &palette, + &paletteLength, + &newData, + withAlpha); + break; + case 3: #ifdef HAVE_LIBIMAGEQUANT - if (!strcmp(im->mode, "RGBA")) { - withAlpha = 1; - } - result = quantize_pngquant( - p, - im->xsize, - im->ysize, - colors, - &palette, - &paletteLength, - &newData, - withAlpha - ); + if (!strcmp(im->mode, "RGBA")) { + withAlpha = 1; + } + result = quantize_pngquant( + p, + im->xsize, + im->ysize, + colors, + &palette, + &paletteLength, + &newData, + withAlpha); #else - result = -1; + result = -1; #endif - break; - default: - result = 0; - break; + break; + default: + result = 0; + break; } free(p); @@ -1748,7 +1769,7 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) for (i = y = 0; y < im->ysize; y++) { for (x = 0; x < im->xsize; x++) { - imOut->image8[y][x] = (unsigned char) newData[i++]; + imOut->image8[y][x] = (unsigned char)newData[i++]; } } @@ -1756,14 +1777,14 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) pp = imOut->palette->palette; - for (i = j = 0; i < (int) paletteLength; i++) { + for (i = j = 0; i < (int)paletteLength; i++) { *pp++ = palette[i].c.r; *pp++ = palette[i].c.g; *pp++ = palette[i].c.b; if (withAlpha) { - *pp++ = palette[i].c.a; + *pp++ = palette[i].c.a; } else { - *pp++ = 255; + *pp++ = 255; } } for (; i < 256; i++) { @@ -1783,14 +1804,12 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) return imOut; } else { - if (result == -1) { - return (Imaging) ImagingError_ValueError( + return (Imaging)ImagingError_ValueError( "dependency required by this method was not " "enabled at compile time"); } - return (Imaging) ImagingError_ValueError("quantization error"); - + return (Imaging)ImagingError_ValueError("quantization error"); } } diff --git a/src/libImaging/QuantHash.c b/src/libImaging/QuantHash.c index 6ff95d885..ea75d6037 100644 --- a/src/libImaging/QuantHash.c +++ b/src/libImaging/QuantHash.c @@ -24,290 +24,313 @@ #include "QuantHash.h" typedef struct _HashNode { - struct _HashNode *next; - HashKey_t key; - HashVal_t value; + struct _HashNode *next; + HashKey_t key; + HashVal_t value; } HashNode; struct _HashTable { - HashNode **table; - uint32_t length; - uint32_t count; - HashFunc hashFunc; - HashCmpFunc cmpFunc; - void *userData; + HashNode **table; + uint32_t length; + uint32_t count; + HashFunc hashFunc; + HashCmpFunc cmpFunc; + void *userData; }; #define MIN_LENGTH 11 #define RESIZE_FACTOR 3 -static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); +static int +_hashtable_insert_node(HashTable *, HashNode *, int, int, CollisionFunc); -HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { - HashTable *h; - h=malloc(sizeof(HashTable)); - if (!h) { return NULL; } - h->hashFunc=hf; - h->cmpFunc=cf; - h->length=MIN_LENGTH; - h->count=0; - h->userData=NULL; - h->table=malloc(sizeof(HashNode *)*h->length); - if (!h->table) { free(h); return NULL; } - memset (h->table,0,sizeof(HashNode *)*h->length); - return h; +HashTable * +hashtable_new(HashFunc hf, HashCmpFunc cf) { + HashTable *h; + h = malloc(sizeof(HashTable)); + if (!h) { + return NULL; + } + h->hashFunc = hf; + h->cmpFunc = cf; + h->length = MIN_LENGTH; + h->count = 0; + h->userData = NULL; + h->table = malloc(sizeof(HashNode *) * h->length); + if (!h->table) { + free(h); + return NULL; + } + memset(h->table, 0, sizeof(HashNode *) * h->length); + return h; } -static uint32_t _findPrime(uint32_t start,int dir) { - static int unit[]={0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0}; - uint32_t t; - while (start>1) { - if (!unit[start&0x0f]) { - start+=dir; - continue; - } - for (t=2;t=sqrt((double)start)) { - break; - } - start+=dir; - } - return start; +static uint32_t +_findPrime(uint32_t start, int dir) { + static int unit[] = {0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}; + uint32_t t; + while (start > 1) { + if (!unit[start & 0x0f]) { + start += dir; + continue; + } + for (t = 2; t < sqrt((double)start); t++) { + if (!start % t) { + break; + } + } + if (t >= sqrt((double)start)) { + break; + } + start += dir; + } + return start; } -static void _hashtable_rehash(HashTable *h,CollisionFunc cf,uint32_t newSize) { - HashNode **oldTable=h->table; - uint32_t i; - HashNode *n,*nn; - uint32_t oldSize; - oldSize=h->length; - h->table=malloc(sizeof(HashNode *)*newSize); - if (!h->table) { - h->table=oldTable; - return; - } - h->length=newSize; - h->count=0; - memset (h->table,0,sizeof(HashNode *)*h->length); - for (i=0;inext; - _hashtable_insert_node(h,n,0,0,cf); - } - } - free(oldTable); +static void +_hashtable_rehash(HashTable *h, CollisionFunc cf, uint32_t newSize) { + HashNode **oldTable = h->table; + uint32_t i; + HashNode *n, *nn; + uint32_t oldSize; + oldSize = h->length; + h->table = malloc(sizeof(HashNode *) * newSize); + if (!h->table) { + h->table = oldTable; + return; + } + h->length = newSize; + h->count = 0; + memset(h->table, 0, sizeof(HashNode *) * h->length); + for (i = 0; i < oldSize; i++) { + for (n = oldTable[i]; n; n = nn) { + nn = n->next; + _hashtable_insert_node(h, n, 0, 0, cf); + } + } + free(oldTable); } -static void _hashtable_resize(HashTable *h) { - uint32_t newSize; - uint32_t oldSize; - oldSize=h->length; - newSize=oldSize; - if (h->count*RESIZE_FACTORlength) { - newSize=_findPrime(h->length/2-1,-1); - } else if (h->length*RESIZE_FACTORcount) { - newSize=_findPrime(h->length*2+1,+1); - } - if (newSizelength; + newSize = oldSize; + if (h->count * RESIZE_FACTOR < h->length) { + newSize = _findPrime(h->length / 2 - 1, -1); + } else if (h->length * RESIZE_FACTOR < h->count) { + newSize = _findPrime(h->length * 2 + 1, +1); + } + if (newSize < MIN_LENGTH) { + newSize = oldSize; + } + if (newSize != oldSize) { + _hashtable_rehash(h, NULL, newSize); + } } -static int _hashtable_insert_node(HashTable *h,HashNode *node,int resize,int update,CollisionFunc cf) { - uint32_t hash=h->hashFunc(h,node->key)%h->length; - HashNode **n,*nv; - int i; +static int +_hashtable_insert_node( + HashTable *h, HashNode *node, int resize, int update, CollisionFunc cf) { + uint32_t hash = h->hashFunc(h, node->key) % h->length; + HashNode **n, *nv; + int i; - for (n=&(h->table[hash]);*n;n=&((*n)->next)) { - nv=*n; - i=h->cmpFunc(h,nv->key,node->key); - if (!i) { - if (cf) { - nv->key=node->key; - cf(h,&(nv->key),&(nv->value),node->key,node->value); - free(node); + for (n = &(h->table[hash]); *n; n = &((*n)->next)) { + nv = *n; + i = h->cmpFunc(h, nv->key, node->key); + if (!i) { + if (cf) { + nv->key = node->key; + cf(h, &(nv->key), &(nv->value), node->key, node->value); + free(node); + return 1; + } else { + nv->key = node->key; + nv->value = node->value; + free(node); + return 1; + } + } else if (i > 0) { + break; + } + } + if (!update) { + node->next = *n; + *n = node; + h->count++; + if (resize) { + _hashtable_resize(h); + } + return 1; + } else { + return 0; + } +} + +static int +_hashtable_insert(HashTable *h, HashKey_t key, HashVal_t val, int resize, int update) { + HashNode **n, *nv; + HashNode *t; + int i; + uint32_t hash = h->hashFunc(h, key) % h->length; + + for (n = &(h->table[hash]); *n; n = &((*n)->next)) { + nv = *n; + i = h->cmpFunc(h, nv->key, key); + if (!i) { + nv->value = val; return 1; - } else { - nv->key=node->key; - nv->value=node->value; - free(node); - return 1; - } - } else if (i>0) { - break; - } - } - if (!update) { - node->next=*n; - *n=node; - h->count++; - if (resize) { - _hashtable_resize(h); - } - return 1; - } else { - return 0; - } -} - -static int _hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val,int resize,int update) { - HashNode **n,*nv; - HashNode *t; - int i; - uint32_t hash=h->hashFunc(h,key)%h->length; - - for (n=&(h->table[hash]);*n;n=&((*n)->next)) { - nv=*n; - i=h->cmpFunc(h,nv->key,key); - if (!i) { - nv->value=val; - return 1; - } else if (i>0) { - break; - } - } - if (!update) { - t=malloc(sizeof(HashNode)); - if (!t) { - return 0; - } - t->next=*n; - *n=t; - t->key=key; - t->value=val; - h->count++; - if (resize) { - _hashtable_resize(h); - } - return 1; - } else { - return 0; - } -} - -int hashtable_insert_or_update_computed(HashTable *h, - HashKey_t key, - ComputeFunc newFunc, - ComputeFunc existsFunc) { - HashNode **n,*nv; - HashNode *t; - int i; - uint32_t hash=h->hashFunc(h,key)%h->length; - - for (n=&(h->table[hash]);*n;n=&((*n)->next)) { - nv=*n; - i=h->cmpFunc(h,nv->key,key); - if (!i) { - if (existsFunc) { - existsFunc(h,nv->key,&(nv->value)); - } else { + } else if (i > 0) { + break; + } + } + if (!update) { + t = malloc(sizeof(HashNode)); + if (!t) { return 0; - } - return 1; - } else if (i>0) { - break; - } - } - t=malloc(sizeof(HashNode)); - if (!t) { - return 0; - } - t->key=key; - t->next=*n; - *n=t; - if (newFunc) { - newFunc(h,t->key,&(t->value)); - } else { - free(t); - return 0; - } - h->count++; - _hashtable_resize(h); - return 1; + } + t->next = *n; + *n = t; + t->key = key; + t->value = val; + h->count++; + if (resize) { + _hashtable_resize(h); + } + return 1; + } else { + return 0; + } } -int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val) { - return _hashtable_insert(h,key,val,1,0); +int +hashtable_insert_or_update_computed( + HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc) { + HashNode **n, *nv; + HashNode *t; + int i; + uint32_t hash = h->hashFunc(h, key) % h->length; + + for (n = &(h->table[hash]); *n; n = &((*n)->next)) { + nv = *n; + i = h->cmpFunc(h, nv->key, key); + if (!i) { + if (existsFunc) { + existsFunc(h, nv->key, &(nv->value)); + } else { + return 0; + } + return 1; + } else if (i > 0) { + break; + } + } + t = malloc(sizeof(HashNode)); + if (!t) { + return 0; + } + t->key = key; + t->next = *n; + *n = t; + if (newFunc) { + newFunc(h, t->key, &(t->value)); + } else { + free(t); + return 0; + } + h->count++; + _hashtable_resize(h); + return 1; } -void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u) { - HashNode *n; - uint32_t x; - - if (h->table) { - for (x=0;xlength;x++) { - for (n=h->table[x];n;n=n->next) { - i(h,n->key,&(n->value),u); - } - } - } +int +hashtable_insert(HashTable *h, HashKey_t key, HashVal_t val) { + return _hashtable_insert(h, key, val, 1, 0); } -void hashtable_foreach(HashTable *h,IteratorFunc i,void *u) { - HashNode *n; - uint32_t x; +void +hashtable_foreach_update(HashTable *h, IteratorUpdateFunc i, void *u) { + HashNode *n; + uint32_t x; - if (h->table) { - for (x=0;xlength;x++) { - for (n=h->table[x];n;n=n->next) { - i(h,n->key,n->value,u); - } - } - } + if (h->table) { + for (x = 0; x < h->length; x++) { + for (n = h->table[x]; n; n = n->next) { + i(h, n->key, &(n->value), u); + } + } + } } -void hashtable_free(HashTable *h) { - HashNode *n,*nn; - uint32_t i; +void +hashtable_foreach(HashTable *h, IteratorFunc i, void *u) { + HashNode *n; + uint32_t x; - if (h->table) { - for (i=0;ilength;i++) { - for (n=h->table[i];n;n=nn) { - nn=n->next; - free(n); - } - } - free(h->table); - } - free(h); + if (h->table) { + for (x = 0; x < h->length; x++) { + for (n = h->table[x]; n; n = n->next) { + i(h, n->key, n->value, u); + } + } + } } -void hashtable_rehash_compute(HashTable *h,CollisionFunc cf) { - _hashtable_rehash(h,cf,h->length); +void +hashtable_free(HashTable *h) { + HashNode *n, *nn; + uint32_t i; + + if (h->table) { + for (i = 0; i < h->length; i++) { + for (n = h->table[i]; n; n = nn) { + nn = n->next; + free(n); + } + } + free(h->table); + } + free(h); } -int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp) { - uint32_t hash=h->hashFunc(h,key)%h->length; - HashNode *n; - int i; - - for (n=h->table[hash];n;n=n->next) { - i=h->cmpFunc(h,n->key,key); - if (!i) { - *valp=n->value; - return 1; - } else if (i>0) { - break; - } - } - return 0; +void +hashtable_rehash_compute(HashTable *h, CollisionFunc cf) { + _hashtable_rehash(h, cf, h->length); } -uint32_t hashtable_get_count(const HashTable *h) { - return h->count; +int +hashtable_lookup(const HashTable *h, const HashKey_t key, HashVal_t *valp) { + uint32_t hash = h->hashFunc(h, key) % h->length; + HashNode *n; + int i; + + for (n = h->table[hash]; n; n = n->next) { + i = h->cmpFunc(h, n->key, key); + if (!i) { + *valp = n->value; + return 1; + } else if (i > 0) { + break; + } + } + return 0; } -void *hashtable_get_user_data(const HashTable *h) { - return h->userData; +uint32_t +hashtable_get_count(const HashTable *h) { + return h->count; } -void *hashtable_set_user_data(HashTable *h,void *data) { - void *r=h->userData; - h->userData=data; - return r; +void * +hashtable_get_user_data(const HashTable *h) { + return h->userData; +} + +void * +hashtable_set_user_data(HashTable *h, void *data) { + void *r = h->userData; + h->userData = data; + return r; } diff --git a/src/libImaging/QuantHash.h b/src/libImaging/QuantHash.h index 9874114e5..fc1a99003 100644 --- a/src/libImaging/QuantHash.h +++ b/src/libImaging/QuantHash.h @@ -18,23 +18,38 @@ typedef struct _HashTable HashTable; typedef Pixel HashKey_t; typedef uint32_t HashVal_t; -typedef uint32_t (*HashFunc)(const HashTable *,const HashKey_t); -typedef int (*HashCmpFunc)(const HashTable *,const HashKey_t,const HashKey_t); -typedef void (*IteratorFunc)(const HashTable *,const HashKey_t,const HashVal_t,void *); -typedef void (*IteratorUpdateFunc)(const HashTable *,const HashKey_t,HashVal_t *,void *); -typedef void (*ComputeFunc)(const HashTable *,const HashKey_t,HashVal_t *); -typedef void (*CollisionFunc)(const HashTable *,HashKey_t *,HashVal_t *,HashKey_t,HashVal_t); +typedef uint32_t (*HashFunc)(const HashTable *, const HashKey_t); +typedef int (*HashCmpFunc)(const HashTable *, const HashKey_t, const HashKey_t); +typedef void (*IteratorFunc)( + const HashTable *, const HashKey_t, const HashVal_t, void *); +typedef void (*IteratorUpdateFunc)( + const HashTable *, const HashKey_t, HashVal_t *, void *); +typedef void (*ComputeFunc)(const HashTable *, const HashKey_t, HashVal_t *); +typedef void (*CollisionFunc)( + const HashTable *, HashKey_t *, HashVal_t *, HashKey_t, HashVal_t); -HashTable * hashtable_new(HashFunc hf,HashCmpFunc cf); -void hashtable_free(HashTable *h); -void hashtable_foreach(HashTable *h,IteratorFunc i,void *u); -void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u); -int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val); -int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp); -int hashtable_insert_or_update_computed(HashTable *h,HashKey_t key,ComputeFunc newFunc,ComputeFunc existsFunc); -void *hashtable_set_user_data(HashTable *h,void *data); -void *hashtable_get_user_data(const HashTable *h); -uint32_t hashtable_get_count(const HashTable *h); -void hashtable_rehash_compute(HashTable *h,CollisionFunc cf); +HashTable * +hashtable_new(HashFunc hf, HashCmpFunc cf); +void +hashtable_free(HashTable *h); +void +hashtable_foreach(HashTable *h, IteratorFunc i, void *u); +void +hashtable_foreach_update(HashTable *h, IteratorUpdateFunc i, void *u); +int +hashtable_insert(HashTable *h, HashKey_t key, HashVal_t val); +int +hashtable_lookup(const HashTable *h, const HashKey_t key, HashVal_t *valp); +int +hashtable_insert_or_update_computed( + HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc); +void * +hashtable_set_user_data(HashTable *h, void *data); +void * +hashtable_get_user_data(const HashTable *h); +uint32_t +hashtable_get_count(const HashTable *h); +void +hashtable_rehash_compute(HashTable *h, CollisionFunc cf); -#endif // __QUANTHASH_H__ +#endif // __QUANTHASH_H__ diff --git a/src/libImaging/QuantHeap.c b/src/libImaging/QuantHeap.c index 6877e34a3..6fb52d890 100644 --- a/src/libImaging/QuantHeap.c +++ b/src/libImaging/QuantHeap.c @@ -25,10 +25,10 @@ #include "QuantHeap.h" struct _Heap { - void **heap; - unsigned int heapsize; - unsigned int heapcount; - HeapCmpFunc cf; + void **heap; + unsigned int heapsize; + unsigned int heapcount; + HeapCmpFunc cf; }; #define INITIAL_SIZE 256 @@ -36,127 +36,141 @@ struct _Heap { // #define DEBUG #ifdef DEBUG -static int _heap_test(Heap *); +static int +_heap_test(Heap *); #endif -void ImagingQuantHeapFree(Heap *h) { - free(h->heap); - free(h); +void +ImagingQuantHeapFree(Heap *h) { + free(h->heap); + free(h); } -static int _heap_grow(Heap *h,unsigned int newsize) { - void *newheap; - if (!newsize) { - newsize=h->heapsize<<1; - } - if (newsizeheapsize) { - return 0; - } - if (newsize > INT_MAX / sizeof(void *)){ - return 0; - } - /* malloc check ok, using calloc for overflow, also checking - above due to memcpy below*/ - newheap=calloc(newsize, sizeof(void *)); - if (!newheap) { - return 0; - } - memcpy(newheap,h->heap,sizeof(void *)*h->heapsize); - free(h->heap); - h->heap=newheap; - h->heapsize=newsize; - return 1; +static int +_heap_grow(Heap *h, unsigned int newsize) { + void *newheap; + if (!newsize) { + newsize = h->heapsize << 1; + } + if (newsize < h->heapsize) { + return 0; + } + if (newsize > INT_MAX / sizeof(void *)) { + return 0; + } + /* malloc check ok, using calloc for overflow, also checking + above due to memcpy below*/ + newheap = calloc(newsize, sizeof(void *)); + if (!newheap) { + return 0; + } + memcpy(newheap, h->heap, sizeof(void *) * h->heapsize); + free(h->heap); + h->heap = newheap; + h->heapsize = newsize; + return 1; } #ifdef DEBUG -static int _heap_test(Heap *h) { - unsigned int k; - for (k=1;k*2<=h->heapcount;k++) { - if (h->cf(h,h->heap[k],h->heap[k*2])<0) { - printf ("heap is bad\n"); - return 0; - } - if (k*2+1<=h->heapcount && h->cf(h,h->heap[k],h->heap[k*2+1])<0) { - printf ("heap is bad\n"); - return 0; - } - } - return 1; +static int +_heap_test(Heap *h) { + unsigned int k; + for (k = 1; k * 2 <= h->heapcount; k++) { + if (h->cf(h, h->heap[k], h->heap[k * 2]) < 0) { + printf("heap is bad\n"); + return 0; + } + if (k * 2 + 1 <= h->heapcount && h->cf(h, h->heap[k], h->heap[k * 2 + 1]) < 0) { + printf("heap is bad\n"); + return 0; + } + } + return 1; } #endif -int ImagingQuantHeapRemove(Heap* h,void **r) { - unsigned int k,l; - void *v; +int +ImagingQuantHeapRemove(Heap *h, void **r) { + unsigned int k, l; + void *v; - if (!h->heapcount) { - return 0; - } - *r=h->heap[1]; - v=h->heap[h->heapcount--]; - for (k=1;k*2<=h->heapcount;k=l) { - l=k*2; - if (lheapcount) { - if (h->cf(h,h->heap[l],h->heap[l+1])<0) { - l++; - } - } - if (h->cf(h,v,h->heap[l])>0) { - break; - } - h->heap[k]=h->heap[l]; - } - h->heap[k]=v; + if (!h->heapcount) { + return 0; + } + *r = h->heap[1]; + v = h->heap[h->heapcount--]; + for (k = 1; k * 2 <= h->heapcount; k = l) { + l = k * 2; + if (l < h->heapcount) { + if (h->cf(h, h->heap[l], h->heap[l + 1]) < 0) { + l++; + } + } + if (h->cf(h, v, h->heap[l]) > 0) { + break; + } + h->heap[k] = h->heap[l]; + } + h->heap[k] = v; #ifdef DEBUG - if (!_heap_test(h)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } + if (!_heap_test(h)) { + printf("oops - heap_remove messed up the heap\n"); + exit(1); + } #endif - return 1; + return 1; } -int ImagingQuantHeapAdd(Heap *h,void *val) { - int k; - if (h->heapcount==h->heapsize-1) { - _heap_grow(h,0); - } - k=++h->heapcount; - while (k!=1) { - if (h->cf(h,val,h->heap[k/2])<=0) { - break; - } - h->heap[k]=h->heap[k/2]; - k>>=1; - } - h->heap[k]=val; +int +ImagingQuantHeapAdd(Heap *h, void *val) { + int k; + if (h->heapcount == h->heapsize - 1) { + _heap_grow(h, 0); + } + k = ++h->heapcount; + while (k != 1) { + if (h->cf(h, val, h->heap[k / 2]) <= 0) { + break; + } + h->heap[k] = h->heap[k / 2]; + k >>= 1; + } + h->heap[k] = val; #ifdef DEBUG - if (!_heap_test(h)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } + if (!_heap_test(h)) { + printf("oops - heap_add messed up the heap\n"); + exit(1); + } #endif - return 1; + return 1; } -int ImagingQuantHeapTop(Heap *h,void **r) { - if (!h->heapcount) { - return 0; - } - *r=h->heap[1]; - return 1; +int +ImagingQuantHeapTop(Heap *h, void **r) { + if (!h->heapcount) { + return 0; + } + *r = h->heap[1]; + return 1; } -Heap *ImagingQuantHeapNew(HeapCmpFunc cf) { - Heap *h; +Heap * +ImagingQuantHeapNew(HeapCmpFunc cf) { + Heap *h; - /* malloc check ok, small constant allocation */ - h=malloc(sizeof(Heap)); - if (!h) { - return NULL; - } - h->heapsize=INITIAL_SIZE; - /* malloc check ok, using calloc for overflow */ - h->heap=calloc(h->heapsize, sizeof(void *)); - if (!h->heap) { - free(h); - return NULL; - } - h->heapcount=0; - h->cf=cf; - return h; + /* malloc check ok, small constant allocation */ + h = malloc(sizeof(Heap)); + if (!h) { + return NULL; + } + h->heapsize = INITIAL_SIZE; + /* malloc check ok, using calloc for overflow */ + h->heap = calloc(h->heapsize, sizeof(void *)); + if (!h->heap) { + free(h); + return NULL; + } + h->heapcount = 0; + h->cf = cf; + return h; } diff --git a/src/libImaging/QuantHeap.h b/src/libImaging/QuantHeap.h index 77bf0d9d5..c5286dff2 100644 --- a/src/libImaging/QuantHeap.h +++ b/src/libImaging/QuantHeap.h @@ -16,12 +16,16 @@ typedef struct _Heap Heap; -typedef int (*HeapCmpFunc)(const Heap *,const void *,const void *); +typedef int (*HeapCmpFunc)(const Heap *, const void *, const void *); -void ImagingQuantHeapFree(Heap *); -int ImagingQuantHeapRemove(Heap *,void **); -int ImagingQuantHeapAdd(Heap *,void *); -int ImagingQuantHeapTop(Heap *,void **); +void +ImagingQuantHeapFree(Heap *); +int +ImagingQuantHeapRemove(Heap *, void **); +int +ImagingQuantHeapAdd(Heap *, void *); +int +ImagingQuantHeapTop(Heap *, void **); Heap *ImagingQuantHeapNew(HeapCmpFunc); -#endif // __QUANTHEAP_H__ +#endif // __QUANTHEAP_H__ diff --git a/src/libImaging/QuantOctree.c b/src/libImaging/QuantOctree.c index e1205acc3..b8d4d1d7c 100644 --- a/src/libImaging/QuantOctree.c +++ b/src/libImaging/QuantOctree.c @@ -31,490 +31,508 @@ #include "ImagingUtils.h" #include "QuantOctree.h" -typedef struct _ColorBucket{ - /* contains palette index when used for look up cube */ - uint32_t count; - uint64_t r; - uint64_t g; - uint64_t b; - uint64_t a; -} *ColorBucket; +typedef struct _ColorBucket { + /* contains palette index when used for look up cube */ + uint32_t count; + uint64_t r; + uint64_t g; + uint64_t b; + uint64_t a; +} * ColorBucket; -typedef struct _ColorCube{ - unsigned int rBits, gBits, bBits, aBits; - unsigned int rWidth, gWidth, bWidth, aWidth; - unsigned int rOffset, gOffset, bOffset, aOffset; +typedef struct _ColorCube { + unsigned int rBits, gBits, bBits, aBits; + unsigned int rWidth, gWidth, bWidth, aWidth; + unsigned int rOffset, gOffset, bOffset, aOffset; - unsigned long size; - ColorBucket buckets; -} *ColorCube; + unsigned long size; + ColorBucket buckets; +} * ColorCube; -#define MAX(a, b) (a)>(b) ? (a) : (b) +#define MAX(a, b) (a) > (b) ? (a) : (b) static ColorCube new_color_cube(int r, int g, int b, int a) { - ColorCube cube; + ColorCube cube; - /* malloc check ok, small constant allocation */ - cube = malloc(sizeof(struct _ColorCube)); - if (!cube) { - return NULL; + /* malloc check ok, small constant allocation */ + cube = malloc(sizeof(struct _ColorCube)); + if (!cube) { + return NULL; } - cube->rBits = MAX(r, 0); - cube->gBits = MAX(g, 0); - cube->bBits = MAX(b, 0); - cube->aBits = MAX(a, 0); + cube->rBits = MAX(r, 0); + cube->gBits = MAX(g, 0); + cube->bBits = MAX(b, 0); + cube->aBits = MAX(a, 0); - /* overflow check for size multiplication below */ - if (cube->rBits + cube->gBits + cube->bBits + cube->aBits > 31) { - free(cube); - return NULL; - } + /* overflow check for size multiplication below */ + if (cube->rBits + cube->gBits + cube->bBits + cube->aBits > 31) { + free(cube); + return NULL; + } - /* the width of the cube for each dimension */ - cube->rWidth = 1<rBits; - cube->gWidth = 1<gBits; - cube->bWidth = 1<bBits; - cube->aWidth = 1<aBits; + /* the width of the cube for each dimension */ + cube->rWidth = 1 << cube->rBits; + cube->gWidth = 1 << cube->gBits; + cube->bWidth = 1 << cube->bBits; + cube->aWidth = 1 << cube->aBits; - /* the offsets of each color */ + /* the offsets of each color */ - cube->rOffset = cube->gBits + cube->bBits + cube->aBits; - cube->gOffset = cube->bBits + cube->aBits; - cube->bOffset = cube->aBits; - cube->aOffset = 0; + cube->rOffset = cube->gBits + cube->bBits + cube->aBits; + cube->gOffset = cube->bBits + cube->aBits; + cube->bOffset = cube->aBits; + cube->aOffset = 0; - /* the number of color buckets */ - cube->size = cube->rWidth * cube->gWidth * cube->bWidth * cube->aWidth; - /* malloc check ok, overflow checked above */ - cube->buckets = calloc(cube->size, sizeof(struct _ColorBucket)); + /* the number of color buckets */ + cube->size = cube->rWidth * cube->gWidth * cube->bWidth * cube->aWidth; + /* malloc check ok, overflow checked above */ + cube->buckets = calloc(cube->size, sizeof(struct _ColorBucket)); - if (!cube->buckets) { - free(cube); - return NULL; - } - return cube; + if (!cube->buckets) { + free(cube); + return NULL; + } + return cube; } static void free_color_cube(ColorCube cube) { - if (cube != NULL) { - free(cube->buckets); - free(cube); - } + if (cube != NULL) { + free(cube->buckets); + free(cube); + } } static long -color_bucket_offset_pos(const ColorCube cube, - unsigned int r, unsigned int g, unsigned int b, unsigned int a) -{ - return r<rOffset | g<gOffset | b<bOffset | a<aOffset; +color_bucket_offset_pos( + const ColorCube cube, + unsigned int r, + unsigned int g, + unsigned int b, + unsigned int a) { + return r << cube->rOffset | g << cube->gOffset | b << cube->bOffset | + a << cube->aOffset; } static long color_bucket_offset(const ColorCube cube, const Pixel *p) { - unsigned int r = p->c.r>>(8-cube->rBits); - unsigned int g = p->c.g>>(8-cube->gBits); - unsigned int b = p->c.b>>(8-cube->bBits); - unsigned int a = p->c.a>>(8-cube->aBits); - return color_bucket_offset_pos(cube, r, g, b, a); + unsigned int r = p->c.r >> (8 - cube->rBits); + unsigned int g = p->c.g >> (8 - cube->gBits); + unsigned int b = p->c.b >> (8 - cube->bBits); + unsigned int a = p->c.a >> (8 - cube->aBits); + return color_bucket_offset_pos(cube, r, g, b, a); } static ColorBucket color_bucket_from_cube(const ColorCube cube, const Pixel *p) { - unsigned int offset = color_bucket_offset(cube, p); - return &cube->buckets[offset]; + unsigned int offset = color_bucket_offset(cube, p); + return &cube->buckets[offset]; } static void add_color_to_color_cube(const ColorCube cube, const Pixel *p) { - ColorBucket bucket = color_bucket_from_cube(cube, p); - bucket->count += 1; - bucket->r += p->c.r; - bucket->g += p->c.g; - bucket->b += p->c.b; - bucket->a += p->c.a; + ColorBucket bucket = color_bucket_from_cube(cube, p); + bucket->count += 1; + bucket->r += p->c.r; + bucket->g += p->c.g; + bucket->b += p->c.b; + bucket->a += p->c.a; } static unsigned long count_used_color_buckets(const ColorCube cube) { - unsigned long usedBuckets = 0; - unsigned long i; - for (i=0; i < cube->size; i++) { - if (cube->buckets[i].count > 0) { - usedBuckets += 1; - } - } - return usedBuckets; + unsigned long usedBuckets = 0; + unsigned long i; + for (i = 0; i < cube->size; i++) { + if (cube->buckets[i].count > 0) { + usedBuckets += 1; + } + } + return usedBuckets; } static void avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { - float count = bucket->count; - if (count != 0) { - dst->c.r = CLIP8((int)(bucket->r / count)); - dst->c.g = CLIP8((int)(bucket->g / count)); - dst->c.b = CLIP8((int)(bucket->b / count)); - dst->c.a = CLIP8((int)(bucket->a / count)); - } else { - dst->c.r = 0; - dst->c.g = 0; - dst->c.b = 0; - dst->c.a = 0; - } + float count = bucket->count; + if (count != 0) { + dst->c.r = CLIP8((int)(bucket->r / count)); + dst->c.g = CLIP8((int)(bucket->g / count)); + dst->c.b = CLIP8((int)(bucket->b / count)); + dst->c.a = CLIP8((int)(bucket->a / count)); + } else { + dst->c.r = 0; + dst->c.g = 0; + dst->c.b = 0; + dst->c.a = 0; + } } static int compare_bucket_count(const ColorBucket a, const ColorBucket b) { - return b->count - a->count; + return b->count - a->count; } static ColorBucket create_sorted_color_palette(const ColorCube cube) { - ColorBucket buckets; - if (cube->size > LONG_MAX / sizeof(struct _ColorBucket)) { - return NULL; - } - /* malloc check ok, calloc + overflow check above for memcpy */ - buckets = calloc(cube->size, sizeof(struct _ColorBucket)); - if (!buckets) { - return NULL; - } - memcpy(buckets, cube->buckets, sizeof(struct _ColorBucket)*cube->size); + ColorBucket buckets; + if (cube->size > LONG_MAX / sizeof(struct _ColorBucket)) { + return NULL; + } + /* malloc check ok, calloc + overflow check above for memcpy */ + buckets = calloc(cube->size, sizeof(struct _ColorBucket)); + if (!buckets) { + return NULL; + } + memcpy(buckets, cube->buckets, sizeof(struct _ColorBucket) * cube->size); - qsort(buckets, cube->size, sizeof(struct _ColorBucket), - (int (*)(void const *, void const *))&compare_bucket_count); + qsort( + buckets, + cube->size, + sizeof(struct _ColorBucket), + (int (*)(void const *, void const *)) & compare_bucket_count); - return buckets; + return buckets; } -void add_bucket_values(ColorBucket src, ColorBucket dst) { - dst->count += src->count; - dst->r += src->r; - dst->g += src->g; - dst->b += src->b; - dst->a += src->a; +void +add_bucket_values(ColorBucket src, ColorBucket dst) { + dst->count += src->count; + dst->r += src->r; + dst->g += src->g; + dst->b += src->b; + dst->a += src->a; } /* expand or shrink a given cube to level */ -static ColorCube copy_color_cube(const ColorCube cube, - unsigned int rBits, unsigned int gBits, unsigned int bBits, unsigned int aBits) -{ - unsigned int r, g, b, a; - long src_pos, dst_pos; - unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0}; - unsigned int width[4]; - ColorCube result; +static ColorCube +copy_color_cube( + const ColorCube cube, + unsigned int rBits, + unsigned int gBits, + unsigned int bBits, + unsigned int aBits) { + unsigned int r, g, b, a; + long src_pos, dst_pos; + unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0}; + unsigned int width[4]; + ColorCube result; - result = new_color_cube(rBits, gBits, bBits, aBits); - if (!result) { - return NULL; - } + result = new_color_cube(rBits, gBits, bBits, aBits); + if (!result) { + return NULL; + } - if (cube->rBits > rBits) { - dst_reduce[0] = cube->rBits - result->rBits; - width[0] = cube->rWidth; - } else { - src_reduce[0] = result->rBits - cube->rBits; - width[0] = result->rWidth; - } - if (cube->gBits > gBits) { - dst_reduce[1] = cube->gBits - result->gBits; - width[1] = cube->gWidth; - } else { - src_reduce[1] = result->gBits - cube->gBits; - width[1] = result->gWidth; - } - if (cube->bBits > bBits) { - dst_reduce[2] = cube->bBits - result->bBits; - width[2] = cube->bWidth; - } else { - src_reduce[2] = result->bBits - cube->bBits; - width[2] = result->bWidth; - } - if (cube->aBits > aBits) { - dst_reduce[3] = cube->aBits - result->aBits; - width[3] = cube->aWidth; - } else { - src_reduce[3] = result->aBits - cube->aBits; - width[3] = result->aWidth; - } + if (cube->rBits > rBits) { + dst_reduce[0] = cube->rBits - result->rBits; + width[0] = cube->rWidth; + } else { + src_reduce[0] = result->rBits - cube->rBits; + width[0] = result->rWidth; + } + if (cube->gBits > gBits) { + dst_reduce[1] = cube->gBits - result->gBits; + width[1] = cube->gWidth; + } else { + src_reduce[1] = result->gBits - cube->gBits; + width[1] = result->gWidth; + } + if (cube->bBits > bBits) { + dst_reduce[2] = cube->bBits - result->bBits; + width[2] = cube->bWidth; + } else { + src_reduce[2] = result->bBits - cube->bBits; + width[2] = result->bWidth; + } + if (cube->aBits > aBits) { + dst_reduce[3] = cube->aBits - result->aBits; + width[3] = cube->aWidth; + } else { + src_reduce[3] = result->aBits - cube->aBits; + width[3] = result->aWidth; + } - for (r=0; r>src_reduce[0], - g>>src_reduce[1], - b>>src_reduce[2], - a>>src_reduce[3]); - dst_pos = color_bucket_offset_pos(result, - r>>dst_reduce[0], - g>>dst_reduce[1], - b>>dst_reduce[2], - a>>dst_reduce[3]); - add_bucket_values( - &cube->buckets[src_pos], - &result->buckets[dst_pos] - ); + for (r = 0; r < width[0]; r++) { + for (g = 0; g < width[1]; g++) { + for (b = 0; b < width[2]; b++) { + for (a = 0; a < width[3]; a++) { + src_pos = color_bucket_offset_pos( + cube, + r >> src_reduce[0], + g >> src_reduce[1], + b >> src_reduce[2], + a >> src_reduce[3]); + dst_pos = color_bucket_offset_pos( + result, + r >> dst_reduce[0], + g >> dst_reduce[1], + b >> dst_reduce[2], + a >> dst_reduce[3]); + add_bucket_values( + &cube->buckets[src_pos], &result->buckets[dst_pos]); + } } - } - } - } - return result; + } + } + return result; } void subtract_color_buckets(ColorCube cube, ColorBucket buckets, long nBuckets) { - ColorBucket minuend, subtrahend; - long i; - Pixel p; - for (i=0; icount == 0) { - continue; - } + // If the subtrahend contains no buckets, there is nothing to subtract. + if (subtrahend->count == 0) { + continue; + } - avg_color_from_color_bucket(subtrahend, &p); - minuend = color_bucket_from_cube(cube, &p); - minuend->count -= subtrahend->count; - minuend->r -= subtrahend->r; - minuend->g -= subtrahend->g; - minuend->b -= subtrahend->b; - minuend->a -= subtrahend->a; - } + avg_color_from_color_bucket(subtrahend, &p); + minuend = color_bucket_from_cube(cube, &p); + minuend->count -= subtrahend->count; + minuend->r -= subtrahend->r; + minuend->g -= subtrahend->g; + minuend->b -= subtrahend->b; + minuend->a -= subtrahend->a; + } } static void set_lookup_value(const ColorCube cube, const Pixel *p, long value) { - ColorBucket bucket = color_bucket_from_cube(cube, p); - bucket->count = value; + ColorBucket bucket = color_bucket_from_cube(cube, p); + bucket->count = value; } uint64_t lookup_color(const ColorCube cube, const Pixel *p) { - ColorBucket bucket = color_bucket_from_cube(cube, p); - return bucket->count; + ColorBucket bucket = color_bucket_from_cube(cube, p); + return bucket->count; } -void add_lookup_buckets(ColorCube cube, ColorBucket palette, long nColors, long offset) { - long i; - Pixel p; - for (i=offset; i LONG_MAX - nBucketsB || - (nBucketsA+nBucketsB) > LONG_MAX / sizeof(struct _ColorBucket)) { - return NULL; - } - /* malloc check ok, overflow check above */ - result = calloc(nBucketsA + nBucketsB, sizeof(struct _ColorBucket)); - if (!result) { - return NULL; - } - memcpy(result, bucketsA, sizeof(struct _ColorBucket) * nBucketsA); - memcpy(&result[nBucketsA], bucketsB, sizeof(struct _ColorBucket) * nBucketsB); - return result; +combined_palette( + ColorBucket bucketsA, + unsigned long nBucketsA, + ColorBucket bucketsB, + unsigned long nBucketsB) { + ColorBucket result; + if (nBucketsA > LONG_MAX - nBucketsB || + (nBucketsA + nBucketsB) > LONG_MAX / sizeof(struct _ColorBucket)) { + return NULL; + } + /* malloc check ok, overflow check above */ + result = calloc(nBucketsA + nBucketsB, sizeof(struct _ColorBucket)); + if (!result) { + return NULL; + } + memcpy(result, bucketsA, sizeof(struct _ColorBucket) * nBucketsA); + memcpy(&result[nBucketsA], bucketsB, sizeof(struct _ColorBucket) * nBucketsB); + return result; } static Pixel * create_palette_array(const ColorBucket palette, unsigned int paletteLength) { - Pixel *paletteArray; - unsigned int i; + Pixel *paletteArray; + unsigned int i; - /* malloc check ok, calloc for overflow */ - paletteArray = calloc(paletteLength, sizeof(Pixel)); - if (!paletteArray) { - return NULL; - } + /* malloc check ok, calloc for overflow */ + paletteArray = calloc(paletteLength, sizeof(Pixel)); + if (!paletteArray) { + return NULL; + } - for (i=0; i 64). + /* + Create two color cubes, one fine grained with 8x16x8=1024 + colors buckets and a coarse with 4x4x4=64 color buckets. + The coarse one guarantees that there are color buckets available for + the whole color range (assuming nQuantPixels > 64). - For a quantization to 256 colors all 64 coarse colors will be used - plus the 192 most used color buckets from the fine color cube. - The average of all colors within one bucket is used as the actual - color for that bucket. + For a quantization to 256 colors all 64 coarse colors will be used + plus the 192 most used color buckets from the fine color cube. + The average of all colors within one bucket is used as the actual + color for that bucket. - For images with alpha the cubes gets a forth dimension, - 8x16x8x8 and 4x4x4x4. - */ + For images with alpha the cubes gets a forth dimension, + 8x16x8x8 and 4x4x4x4. + */ - /* create fine cube */ - fineCube = new_color_cube(cubeBits[0], cubeBits[1], - cubeBits[2], cubeBits[3]); - if (!fineCube) { - goto error; - } - for (i=0; i nQuantPixels) { - nCoarseColors = nQuantPixels; - } + /* limit to nQuantPixels */ + if (nCoarseColors > nQuantPixels) { + nCoarseColors = nQuantPixels; + } - /* how many space do we have in our palette for fine colors? */ - nFineColors = nQuantPixels - nCoarseColors; + /* how many space do we have in our palette for fine colors? */ + nFineColors = nQuantPixels - nCoarseColors; - /* create fine color palette */ - paletteBucketsFine = create_sorted_color_palette(fineCube); - if (!paletteBucketsFine) { - goto error; - } + /* create fine color palette */ + paletteBucketsFine = create_sorted_color_palette(fineCube); + if (!paletteBucketsFine) { + goto error; + } - /* remove the used fine colors from the coarse cube */ - subtract_color_buckets(coarseCube, paletteBucketsFine, nFineColors); + /* remove the used fine colors from the coarse cube */ + subtract_color_buckets(coarseCube, paletteBucketsFine, nFineColors); - /* did the subtraction cleared one or more coarse bucket? */ - while (nCoarseColors > count_used_color_buckets(coarseCube)) { - /* then we can use the free buckets for fine colors */ - nAlreadySubtracted = nFineColors; - nCoarseColors = count_used_color_buckets(coarseCube); - nFineColors = nQuantPixels - nCoarseColors; - subtract_color_buckets(coarseCube, &paletteBucketsFine[nAlreadySubtracted], - nFineColors-nAlreadySubtracted); - } + /* did the subtraction cleared one or more coarse bucket? */ + while (nCoarseColors > count_used_color_buckets(coarseCube)) { + /* then we can use the free buckets for fine colors */ + nAlreadySubtracted = nFineColors; + nCoarseColors = count_used_color_buckets(coarseCube); + nFineColors = nQuantPixels - nCoarseColors; + subtract_color_buckets( + coarseCube, + &paletteBucketsFine[nAlreadySubtracted], + nFineColors - nAlreadySubtracted); + } - /* create our palette buckets with fine and coarse combined */ - paletteBucketsCoarse = create_sorted_color_palette(coarseCube); - if (!paletteBucketsCoarse) { - goto error; - } - paletteBuckets = combined_palette(paletteBucketsCoarse, nCoarseColors, - paletteBucketsFine, nFineColors); + /* create our palette buckets with fine and coarse combined */ + paletteBucketsCoarse = create_sorted_color_palette(coarseCube); + if (!paletteBucketsCoarse) { + goto error; + } + paletteBuckets = combined_palette( + paletteBucketsCoarse, nCoarseColors, paletteBucketsFine, nFineColors); - free(paletteBucketsFine); - paletteBucketsFine = NULL; - free(paletteBucketsCoarse); - paletteBucketsCoarse = NULL; - if (!paletteBuckets) { - goto error; - } + free(paletteBucketsFine); + paletteBucketsFine = NULL; + free(paletteBucketsCoarse); + paletteBucketsCoarse = NULL; + if (!paletteBuckets) { + goto error; + } - /* add all coarse colors to our coarse lookup cube. */ - coarseLookupCube = new_color_cube(cubeBits[4], cubeBits[5], - cubeBits[6], cubeBits[7]); - if (!coarseLookupCube) { - goto error; - } - add_lookup_buckets(coarseLookupCube, paletteBuckets, nCoarseColors, 0); + /* add all coarse colors to our coarse lookup cube. */ + coarseLookupCube = + new_color_cube(cubeBits[4], cubeBits[5], cubeBits[6], cubeBits[7]); + if (!coarseLookupCube) { + goto error; + } + add_lookup_buckets(coarseLookupCube, paletteBuckets, nCoarseColors, 0); - /* expand coarse cube (64) to larger fine cube (4k). the value of each - coarse bucket is then present in the according 64 fine buckets. */ - lookupCube = copy_color_cube(coarseLookupCube, cubeBits[0], cubeBits[1], - cubeBits[2], cubeBits[3]); - if (!lookupCube) { - goto error; - } + /* expand coarse cube (64) to larger fine cube (4k). the value of each + coarse bucket is then present in the according 64 fine buckets. */ + lookupCube = copy_color_cube( + coarseLookupCube, cubeBits[0], cubeBits[1], cubeBits[2], cubeBits[3]); + if (!lookupCube) { + goto error; + } - /* add fine colors to the lookup cube */ - add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); + /* add fine colors to the lookup cube */ + add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); - /* create result pixels and map palette indices */ - /* malloc check ok, calloc for overflow */ - qp = calloc(nPixels, sizeof(Pixel)); - if (!qp) { - goto error; - } - map_image_pixels(pixelData, nPixels, lookupCube, qp); + /* create result pixels and map palette indices */ + /* malloc check ok, calloc for overflow */ + qp = calloc(nPixels, sizeof(Pixel)); + if (!qp) { + goto error; + } + map_image_pixels(pixelData, nPixels, lookupCube, qp); - /* convert palette buckets to RGB pixel palette */ - *palette = create_palette_array(paletteBuckets, nQuantPixels); - if (!(*palette)) { - goto error; - } + /* convert palette buckets to RGB pixel palette */ + *palette = create_palette_array(paletteBuckets, nQuantPixels); + if (!(*palette)) { + goto error; + } - *quantizedPixels = qp; - *paletteLength = nQuantPixels; + *quantizedPixels = qp; + *paletteLength = nQuantPixels; - free_color_cube(coarseCube); - free_color_cube(fineCube); - free_color_cube(lookupCube); - free_color_cube(coarseLookupCube); - free(paletteBuckets); - return 1; + free_color_cube(coarseCube); + free_color_cube(fineCube); + free_color_cube(lookupCube); + free_color_cube(coarseLookupCube); + free(paletteBuckets); + return 1; error: - /* everything is initialized to NULL - so we are safe to call free */ - free(qp); - free_color_cube(lookupCube); - free_color_cube(coarseLookupCube); - free(paletteBuckets); - free(paletteBucketsCoarse); - free(paletteBucketsFine); - free_color_cube(coarseCube); - free_color_cube(fineCube); - return 0; + /* everything is initialized to NULL + so we are safe to call free */ + free(qp); + free_color_cube(lookupCube); + free_color_cube(coarseLookupCube); + free(paletteBuckets); + free(paletteBucketsCoarse); + free(paletteBucketsFine); + free_color_cube(coarseCube); + free_color_cube(fineCube); + return 0; } diff --git a/src/libImaging/QuantOctree.h b/src/libImaging/QuantOctree.h index 968644eda..e1c504074 100644 --- a/src/libImaging/QuantOctree.h +++ b/src/libImaging/QuantOctree.h @@ -3,12 +3,7 @@ #include "QuantTypes.h" -int quantize_octree(Pixel *, - uint32_t, - uint32_t, - Pixel **, - uint32_t *, - uint32_t **, - int); +int +quantize_octree(Pixel *, uint32_t, uint32_t, Pixel **, uint32_t *, uint32_t **, int); #endif diff --git a/src/libImaging/QuantPngQuant.c b/src/libImaging/QuantPngQuant.c index 7a23ec8c5..7a36300e4 100644 --- a/src/libImaging/QuantPngQuant.c +++ b/src/libImaging/QuantPngQuant.c @@ -26,8 +26,7 @@ quantize_pngquant( Pixel **palette, uint32_t *paletteLength, uint32_t **quantizedPixels, - int withAlpha) -{ + int withAlpha) { int result = 0; liq_image *image = NULL; liq_attr *attr = NULL; @@ -41,23 +40,24 @@ quantize_pngquant( /* configure pngquant */ attr = liq_attr_create(); - if (!attr) { goto err; } + if (!attr) { + goto err; + } if (quantPixels) { liq_set_max_colors(attr, quantPixels); } /* prepare input image */ - image = liq_image_create_rgba( - attr, - pixelData, - width, - height, - 0.45455 /* gamma */); - if (!image) { goto err; } + image = liq_image_create_rgba(attr, pixelData, width, height, 0.45455 /* gamma */); + if (!image) { + goto err; + } /* quantize the image */ remap = liq_quantize_image(attr, image); - if (!remap) { goto err; } + if (!remap) { + goto err; + } liq_set_output_gamma(remap, 0.45455); liq_set_dithering_level(remap, 1); @@ -65,7 +65,9 @@ quantize_pngquant( const liq_palette *l_palette = liq_get_palette(remap); *paletteLength = l_palette->count; *palette = malloc(sizeof(Pixel) * l_palette->count); - if (!*palette) { goto err; } + if (!*palette) { + goto err; + } for (i = 0; i < l_palette->count; i++) { (*palette)[i].c.b = l_palette->entries[i].b; (*palette)[i].c.g = l_palette->entries[i].g; @@ -75,9 +77,13 @@ quantize_pngquant( /* write output pixels (pngquant uses char array) */ charMatrix = malloc(width * height); - if (!charMatrix) { goto err; } - charMatrixRows = malloc(height * sizeof(unsigned char*)); - if (!charMatrixRows) { goto err; } + if (!charMatrix) { + goto err; + } + charMatrixRows = malloc(height * sizeof(unsigned char *)); + if (!charMatrixRows) { + goto err; + } for (y = 0; y < height; y++) { charMatrixRows[y] = &charMatrix[y * width]; } @@ -87,7 +93,9 @@ quantize_pngquant( /* transcribe output pixels (pillow uses uint32_t array) */ *quantizedPixels = malloc(sizeof(uint32_t) * width * height); - if (!*quantizedPixels) { goto err; } + if (!*quantizedPixels) { + goto err; + } for (i = 0; i < width * height; i++) { (*quantizedPixels)[i] = charMatrix[i]; } @@ -106,16 +114,15 @@ err: } free(charMatrix); free(charMatrixRows); - if (!result) { + if (!result) { free(*quantizedPixels); free(*palette); } return result; } -const char* -ImagingImageQuantVersion(void) -{ +const char * +ImagingImageQuantVersion(void) { static char version[20]; int number = liq_version(); sprintf(version, "%d.%d.%d", number / 10000, (number / 100) % 100, number % 100); diff --git a/src/libImaging/QuantPngQuant.h b/src/libImaging/QuantPngQuant.h index fb0b4cc03..d65e42590 100644 --- a/src/libImaging/QuantPngQuant.h +++ b/src/libImaging/QuantPngQuant.h @@ -3,7 +3,9 @@ #include "QuantTypes.h" -int quantize_pngquant(Pixel *, +int +quantize_pngquant( + Pixel *, unsigned int, unsigned int, uint32_t, diff --git a/src/libImaging/QuantTypes.h b/src/libImaging/QuantTypes.h index 411485498..986b70806 100644 --- a/src/libImaging/QuantTypes.h +++ b/src/libImaging/QuantTypes.h @@ -20,13 +20,13 @@ typedef unsigned __int64 uint64_t; #endif typedef union { - struct { - unsigned char r,g,b,a; - } c; - struct { - unsigned char v[4]; - } a; - uint32_t v; + struct { + unsigned char r, g, b, a; + } c; + struct { + unsigned char v[4]; + } a; + uint32_t v; } Pixel; #endif diff --git a/src/libImaging/RankFilter.c b/src/libImaging/RankFilter.c index 897e4d7b6..73a6baecb 100644 --- a/src/libImaging/RankFilter.c +++ b/src/libImaging/RankFilter.c @@ -17,94 +17,98 @@ /* Fast rank algorithm (due to Wirth), based on public domain code by Nicolas Devillard, available at http://ndevilla.free.fr */ -#define SWAP(type,a,b) { register type t=(a);(a)=(b);(b)=t; } +#define SWAP(type, a, b) \ + { \ + register type t = (a); \ + (a) = (b); \ + (b) = t; \ + } -#define MakeRankFunction(type)\ -static type Rank##type(type a[], int n, int k)\ -{\ - register int i, j, l, m;\ - register type x;\ - l = 0; m = n-1;\ - while (l < m) {\ - x = a[k];\ - i = l;\ - j = m;\ - do {\ - while (a[i] < x) {\ - i++;\ - }\ - while (x < a[j]) {\ - j--;\ - }\ - if (i <= j) {\ - SWAP(type, a[i], a[j]);\ - i++; j--;\ - }\ - } while (i <= j);\ - if (j < k) {\ - l = i;\ - }\ - if (k < i) {\ - m = j;\ - }\ - }\ - return a[k];\ -} +#define MakeRankFunction(type) \ + static type Rank##type(type a[], int n, int k) { \ + register int i, j, l, m; \ + register type x; \ + l = 0; \ + m = n - 1; \ + while (l < m) { \ + x = a[k]; \ + i = l; \ + j = m; \ + do { \ + while (a[i] < x) { \ + i++; \ + } \ + while (x < a[j]) { \ + j--; \ + } \ + if (i <= j) { \ + SWAP(type, a[i], a[j]); \ + i++; \ + j--; \ + } \ + } while (i <= j); \ + if (j < k) { \ + l = i; \ + } \ + if (k < i) { \ + m = j; \ + } \ + } \ + return a[k]; \ + } -MakeRankFunction(UINT8) -MakeRankFunction(INT32) -MakeRankFunction(FLOAT32) +MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) -Imaging -ImagingRankFilter(Imaging im, int size, int rank) -{ + Imaging ImagingRankFilter(Imaging im, int size, int rank) { Imaging imOut = NULL; int x, y; int i, margin, size2; if (!im || im->bands != 1 || im->type == IMAGING_TYPE_SPECIAL) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (!(size & 1)) { - return (Imaging) ImagingError_ValueError("bad filter size"); + return (Imaging)ImagingError_ValueError("bad filter size"); } /* malloc check ok, for overflow in the define below */ - if (size > INT_MAX / size || - size > INT_MAX / (size * (int)sizeof(FLOAT32))) { - return (Imaging) ImagingError_ValueError("filter size too large"); + if (size > INT_MAX / size || size > INT_MAX / (size * (int)sizeof(FLOAT32))) { + return (Imaging)ImagingError_ValueError("filter size too large"); } size2 = size * size; - margin = (size-1) / 2; + margin = (size - 1) / 2; if (rank < 0 || rank >= size2) { - return (Imaging) ImagingError_ValueError("bad rank value"); + return (Imaging)ImagingError_ValueError("bad rank value"); } - imOut = ImagingNew(im->mode, im->xsize - 2*margin, im->ysize - 2*margin); + imOut = ImagingNew(im->mode, im->xsize - 2 * margin, im->ysize - 2 * margin); if (!imOut) { return NULL; } /* malloc check ok, checked above */ -#define RANK_BODY(type) do {\ - type* buf = malloc(size2 * sizeof(type));\ - if (!buf) {\ - goto nomemory;\ - }\ - for (y = 0; y < imOut->ysize; y++) {\ - for (x = 0; x < imOut->xsize; x++) {\ - for (i = 0; i < size; i++) {\ - memcpy(buf + i*size, &IMAGING_PIXEL_##type(im, x, y+i),\ - size * sizeof(type));\ - }\ - IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank);\ - }\ - }\ - free(buf); \ -} while (0) +#define RANK_BODY(type) \ + do { \ + type *buf = malloc(size2 * sizeof(type)); \ + if (!buf) { \ + goto nomemory; \ + } \ + for (y = 0; y < imOut->ysize; y++) { \ + for (x = 0; x < imOut->xsize; x++) { \ + for (i = 0; i < size; i++) { \ + memcpy( \ + buf + i * size, \ + &IMAGING_PIXEL_##type(im, x, y + i), \ + size * sizeof(type)); \ + } \ + IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank); \ + } \ + } \ + free(buf); \ + } while (0) if (im->image8) { RANK_BODY(UINT8); @@ -115,7 +119,7 @@ ImagingRankFilter(Imaging im, int size, int rank) } else { /* safety net (we shouldn't end up here) */ ImagingDelete(imOut); - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } ImagingCopyPalette(imOut, im); @@ -124,5 +128,5 @@ ImagingRankFilter(Imaging im, int size, int rank) nomemory: ImagingDelete(imOut); - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } diff --git a/src/libImaging/Raw.h b/src/libImaging/Raw.h index 4d28fa546..ab718837f 100644 --- a/src/libImaging/Raw.h +++ b/src/libImaging/Raw.h @@ -1,7 +1,6 @@ /* Raw.h */ typedef struct { - /* CONFIGURATION */ /* Distance between lines (0=no padding) */ diff --git a/src/libImaging/RawDecode.c b/src/libImaging/RawDecode.c index ca3d37149..24abe4804 100644 --- a/src/libImaging/RawDecode.c +++ b/src/libImaging/RawDecode.c @@ -13,22 +13,18 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include "Raw.h" - int -ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ +ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { enum { LINE = 1, SKIP }; - RAWSTATE* rawstate = state->context; + RAWSTATE *rawstate = state->context; - UINT8* ptr; + UINT8 *ptr; if (state->state == 0) { - /* Initialize context variables */ /* get size of image data and padding */ @@ -45,22 +41,19 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* check image orientation */ if (state->ystep < 0) { - state->y = state->ysize-1; + state->y = state->ysize - 1; state->ystep = -1; } else { state->ystep = 1; } state->state = LINE; - } ptr = buf; for (;;) { - if (state->state == SKIP) { - /* Skip padding between lines */ if (bytes < rawstate->skip) { @@ -71,7 +64,6 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt bytes -= rawstate->skip; state->state = LINE; - } if (bytes < state->bytes) { @@ -79,8 +71,10 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt } /* Unpack data */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, ptr, state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize, + ptr, + state->xsize); ptr += state->bytes; bytes -= state->bytes; @@ -93,7 +87,5 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt } state->state = SKIP; - } - } diff --git a/src/libImaging/RawEncode.c b/src/libImaging/RawEncode.c index fb4ab3346..50de8d982 100644 --- a/src/libImaging/RawEncode.c +++ b/src/libImaging/RawEncode.c @@ -17,16 +17,13 @@ * * See the README file for information on usage and redistribution. */ - #include "Imaging.h" int -ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - UINT8* ptr; +ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + UINT8 *ptr; if (!state->state) { - /* The "count" field holds the stride, if specified. Fix things up so "bytes" is the full size, and "count" the packed size */ @@ -48,14 +45,13 @@ ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* The "ystep" field specifies the orientation */ if (state->ystep < 0) { - state->y = state->ysize-1; + state->y = state->ysize - 1; state->ystep = -1; } else { state->ystep = 1; } state->state = 1; - } if (bytes < state->bytes) { @@ -66,9 +62,10 @@ ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) ptr = buf; while (bytes >= state->bytes) { - - state->shuffle(ptr, (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->xsize); + state->shuffle( + ptr, + (UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize, + state->xsize); if (state->bytes > state->count) { /* zero-pad the buffer, if necessary */ @@ -84,9 +81,7 @@ ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) state->errcode = IMAGING_CODEC_END; break; } - } return ptr - buf; - } diff --git a/src/libImaging/Reduce.c b/src/libImaging/Reduce.c index f6488deb2..60928d2bc 100644 --- a/src/libImaging/Reduce.c +++ b/src/libImaging/Reduce.c @@ -2,39 +2,35 @@ #include -#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) - +#define ROUND_UP(f) ((int)((f) >= 0.0 ? (f) + 0.5F : (f)-0.5F)) UINT32 -division_UINT32(int divider, int result_bits) -{ +division_UINT32(int divider, int result_bits) { UINT32 max_dividend = (1 << result_bits) * divider; float max_int = (1 << 30) * 4.0; - return (UINT32) (max_int / max_dividend); + return (UINT32)(max_int / max_dividend); } - void -ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -{ +ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) { /* The most general implementation for any xscale and yscale - */ + */ int x, y, xx, yy; UINT32 multiplier = division_UINT32(yscale * xscale, 8); UINT32 amend = yscale * xscale / 2; if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 ss = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image8[yy]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss += line0[xx + 0] + line0[xx + 1] + - line1[xx + 0] + line1[xx + 1]; + ss += line0[xx + 0] + line0[xx + 1] + line1[xx + 0] + + line1[xx + 1]; } if (xscale & 0x01) { ss += line0[xx + 0] + line1[xx + 0]; @@ -54,125 +50,128 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss3 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; + ss0 += line0[xx * 4 + 0] + line0[xx * 4 + 4] + + line1[xx * 4 + 0] + line1[xx * 4 + 4]; + ss3 += line0[xx * 4 + 3] + line0[xx * 4 + 7] + + line1[xx * 4 + 3] + line1[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss3 += line0[xx * 4 + 3] + line1[xx * 4 + 3]; } } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss3 += line[xx * 4 + 3] + line[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss3 += line[xx * 4 + 3]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; + ss0 += line0[xx * 4 + 0] + line0[xx * 4 + 4] + + line1[xx * 4 + 0] + line1[xx * 4 + 4]; + ss1 += line0[xx * 4 + 1] + line0[xx * 4 + 5] + + line1[xx * 4 + 1] + line1[xx * 4 + 5]; + ss2 += line0[xx * 4 + 2] + line0[xx * 4 + 6] + + line1[xx * 4 + 2] + line1[xx * 4 + 6]; } if (xscale & 0x01) { - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 += line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 += line0[xx * 4 + 2] + line1[xx * 4 + 2]; } } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss1 += line[xx * 4 + 1] + line[xx * 4 + 5]; + ss2 += line[xx * 4 + 2] + line[xx * 4 + 6]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; - ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; + ss0 += line0[xx * 4 + 0] + line0[xx * 4 + 4] + + line1[xx * 4 + 0] + line1[xx * 4 + 4]; + ss1 += line0[xx * 4 + 1] + line0[xx * 4 + 5] + + line1[xx * 4 + 1] + line1[xx * 4 + 5]; + ss2 += line0[xx * 4 + 2] + line0[xx * 4 + 6] + + line1[xx * 4 + 2] + line1[xx * 4 + 6]; + ss3 += line0[xx * 4 + 3] + line0[xx * 4 + 7] + + line1[xx * 4 + 3] + line1[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 += line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 += line0[xx * 4 + 2] + line1[xx * 4 + 2]; + ss3 += line0[xx * 4 + 3] + line1[xx * 4 + 3]; } } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss1 += line[xx * 4 + 1] + line[xx * 4 + 5]; + ss2 += line[xx * 4 + 2] + line[xx * 4 + 6]; + ss3 += line[xx * 4 + 3] + line[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -180,12 +179,10 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale } } - void -ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) -{ +ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) { /* Optimized implementation for xscale = 1. - */ + */ int x, y, yy; int xscale = 1; UINT32 multiplier = division_UINT32(yscale * xscale, 8); @@ -193,9 +190,9 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 ss = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image8[yy]; @@ -211,74 +208,77 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss3 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss3 += line0[xx * 4 + 3] + line1[xx * 4 + 3]; } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[xx*4 + 0]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss3 += line[xx * 4 + 3]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 += line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 += line0[xx * 4 + 2] + line1[xx * 4 + 2]; } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { UINT8 *line0 = (UINT8 *)imIn->image[yy]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; + ss0 += line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 += line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 += line0[xx * 4 + 2] + line1[xx * 4 + 2]; + ss3 += line0[xx * 4 + 3] + line1[xx * 4 + 3]; } if (yscale & 0x01) { UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -286,12 +286,10 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) } } - void -ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) -{ +ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) { /* Optimized implementation for yscale = 1. - */ + */ int x, y, xx; int yscale = 1; UINT32 multiplier = division_UINT32(yscale * xscale, 8); @@ -299,10 +297,10 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line = (UINT8 *)imIn->image8[yy]; for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 ss = amend; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { ss += line[xx + 0] + line[xx + 1]; @@ -315,66 +313,69 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line = (UINT8 *)imIn->image[yy]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss3 = amend; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss3 += line[xx * 4 + 3] + line[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss3 += line[xx * 4 + 3]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss1 += line[xx * 4 + 1] + line[xx * 4 + 5]; + ss2 += line[xx * 4 + 2] + line[xx * 4 + 6]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + ss0 += line[xx * 4 + 0] + line[xx * 4 + 4]; + ss1 += line[xx * 4 + 1] + line[xx * 4 + 5]; + ss2 += line[xx * 4 + 2] + line[xx * 4 + 6]; + ss3 += line[xx * 4 + 3] + line[xx * 4 + 7]; } if (xscale & 0x01) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -383,10 +384,9 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) } void -ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 1 and yscale = 2. - */ + */ int xscale = 1, yscale = 2; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -394,61 +394,53 @@ ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; - ss0 = line0[xx + 0] + - line1[xx + 0]; + int xx = box[0] + x * xscale; + ss0 = line0[xx + 0] + line1[xx + 0]; imOut->image8[y][x] = (ss0 + amend) >> 1; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0]; - ss3 = line0[xx*4 + 3] + - line1[xx*4 + 3]; - v = MAKE_UINT32((ss0 + amend) >> 1, 0, - 0, (ss3 + amend) >> 1); + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss3 = line0[xx * 4 + 3] + line1[xx * 4 + 3]; + v = MAKE_UINT32((ss0 + amend) >> 1, 0, 0, (ss3 + amend) >> 1); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0]; - ss1 = line0[xx*4 + 1] + - line1[xx*4 + 1]; - ss2 = line0[xx*4 + 2] + - line1[xx*4 + 2]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, 0); + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 = line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 = line0[xx * 4 + 2] + line1[xx * 4 + 2]; + v = MAKE_UINT32( + (ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0]; - ss1 = line0[xx*4 + 1] + - line1[xx*4 + 1]; - ss2 = line0[xx*4 + 2] + - line1[xx*4 + 2]; - ss3 = line0[xx*4 + 3] + - line1[xx*4 + 3]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, (ss3 + amend) >> 1); + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0]; + ss1 = line0[xx * 4 + 1] + line1[xx * 4 + 1]; + ss2 = line0[xx * 4 + 2] + line1[xx * 4 + 2]; + ss3 = line0[xx * 4 + 3] + line1[xx * 4 + 3]; + v = MAKE_UINT32( + (ss0 + amend) >> 1, + (ss1 + amend) >> 1, + (ss2 + amend) >> 1, + (ss3 + amend) >> 1); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -456,12 +448,10 @@ ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 2 and yscale = 1. - */ + */ int xscale = 2, yscale = 1; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -469,49 +459,51 @@ ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; ss0 = line0[xx + 0] + line0[xx + 1]; imOut->image8[y][x] = (ss0 + amend) >> 1; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 1, 0, - 0, (ss3 + amend) >> 1); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 1, 0, 0, (ss3 + amend) >> 1); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, 0); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6]; + v = MAKE_UINT32( + (ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, (ss3 + amend) >> 1); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7]; + v = MAKE_UINT32( + (ss0 + amend) >> 1, + (ss1 + amend) >> 1, + (ss2 + amend) >> 1, + (ss3 + amend) >> 1); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -519,12 +511,10 @@ ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 2 and yscale = 2. - */ + */ int xscale = 2, yscale = 2; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -532,61 +522,62 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; - ss0 = line0[xx + 0] + line0[xx + 1] + - line1[xx + 0] + line1[xx + 1]; + int xx = box[0] + x * xscale; + ss0 = line0[xx + 0] + line0[xx + 1] + line1[xx + 0] + line1[xx + 1]; imOut->image8[y][x] = (ss0 + amend) >> 2; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 2, 0, - 0, (ss3 + amend) >> 2); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line1[xx * 4 + 0] + + line1[xx * 4 + 4]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line1[xx * 4 + 3] + + line1[xx * 4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 2, 0, 0, (ss3 + amend) >> 2); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; - v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, - (ss2 + amend) >> 2, 0); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line1[xx * 4 + 0] + + line1[xx * 4 + 4]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line1[xx * 4 + 1] + + line1[xx * 4 + 5]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line1[xx * 4 + 2] + + line1[xx * 4 + 6]; + v = MAKE_UINT32( + (ss0 + amend) >> 2, (ss1 + amend) >> 2, (ss2 + amend) >> 2, 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, - (ss2 + amend) >> 2, (ss3 + amend) >> 2); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line1[xx * 4 + 0] + + line1[xx * 4 + 4]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line1[xx * 4 + 1] + + line1[xx * 4 + 5]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line1[xx * 4 + 2] + + line1[xx * 4 + 6]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line1[xx * 4 + 3] + + line1[xx * 4 + 7]; + v = MAKE_UINT32( + (ss0 + amend) >> 2, + (ss1 + amend) >> 2, + (ss2 + amend) >> 2, + (ss3 + amend) >> 2); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -594,12 +585,10 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 1 and yscale = 3. - */ + */ int xscale = 1, yscale = 3; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -608,76 +597,62 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; - ss0 = line0[xx + 0] + - line1[xx + 0] + - line2[xx + 0]; + int xx = box[0] + x * xscale; + ss0 = line0[xx + 0] + line1[xx + 0] + line2[xx + 0]; imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0] + - line2[xx*4 + 0]; - ss3 = line0[xx*4 + 3] + - line1[xx*4 + 3] + - line2[xx*4 + 3]; + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0] + line2[xx * 4 + 0]; + ss3 = line0[xx * 4 + 3] + line1[xx * 4 + 3] + line2[xx * 4 + 3]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + 0, + 0, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0] + - line2[xx*4 + 0]; - ss1 = line0[xx*4 + 1] + - line1[xx*4 + 1] + - line2[xx*4 + 1]; - ss2 = line0[xx*4 + 2] + - line1[xx*4 + 2] + - line2[xx*4 + 2]; + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0] + line2[xx * 4 + 0]; + ss1 = line0[xx * 4 + 1] + line1[xx * 4 + 1] + line2[xx * 4 + 1]; + ss2 = line0[xx * 4 + 2] + line1[xx * 4 + 2] + line2[xx * 4 + 2]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + - line1[xx*4 + 0] + - line2[xx*4 + 0]; - ss1 = line0[xx*4 + 1] + - line1[xx*4 + 1] + - line2[xx*4 + 1]; - ss2 = line0[xx*4 + 2] + - line1[xx*4 + 2] + - line2[xx*4 + 2]; - ss3 = line0[xx*4 + 3] + - line1[xx*4 + 3] + - line2[xx*4 + 3]; + ss0 = line0[xx * 4 + 0] + line1[xx * 4 + 0] + line2[xx * 4 + 0]; + ss1 = line0[xx * 4 + 1] + line1[xx * 4 + 1] + line2[xx * 4 + 1]; + ss2 = line0[xx * 4 + 2] + line1[xx * 4 + 2] + line2[xx * 4 + 2]; + ss3 = line0[xx * 4 + 3] + line1[xx * 4 + 3] + line2[xx * 4 + 3]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -685,12 +660,10 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 3 and yscale = 1. - */ + */ int xscale = 3, yscale = 1; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -699,52 +672,58 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2]; imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + 0, + 0, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -752,12 +731,10 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 3 and yscale = 3. - */ + */ int xscale = 3, yscale = 3; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -766,76 +743,82 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; - ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + - line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + - line2[xx + 0] + line2[xx + 1] + line2[xx + 2]; + int xx = box[0] + x * xscale; + ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line1[xx + 0] + + line1[xx + 1] + line1[xx + 2] + line2[xx + 0] + line2[xx + 1] + + line2[xx + 2]; imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line1[xx * 4 + 0] + line1[xx * 4 + 4] + line1[xx * 4 + 8] + + line2[xx * 4 + 0] + line2[xx * 4 + 4] + line2[xx * 4 + 8]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line1[xx * 4 + 3] + line1[xx * 4 + 7] + line1[xx * 4 + 11] + + line2[xx * 4 + 3] + line2[xx * 4 + 7] + line2[xx * 4 + 11]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + 0, + 0, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line1[xx * 4 + 0] + line1[xx * 4 + 4] + line1[xx * 4 + 8] + + line2[xx * 4 + 0] + line2[xx * 4 + 4] + line2[xx * 4 + 8]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line1[xx * 4 + 1] + line1[xx * 4 + 5] + line1[xx * 4 + 9] + + line2[xx * 4 + 1] + line2[xx * 4 + 5] + line2[xx * 4 + 9]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line1[xx * 4 + 2] + line1[xx * 4 + 6] + line1[xx * 4 + 10] + + line2[xx * 4 + 2] + line2[xx * 4 + 6] + line2[xx * 4 + 10]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line1[xx * 4 + 0] + line1[xx * 4 + 4] + line1[xx * 4 + 8] + + line2[xx * 4 + 0] + line2[xx * 4 + 4] + line2[xx * 4 + 8]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line1[xx * 4 + 1] + line1[xx * 4 + 5] + line1[xx * 4 + 9] + + line2[xx * 4 + 1] + line2[xx * 4 + 5] + line2[xx * 4 + 9]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line1[xx * 4 + 2] + line1[xx * 4 + 6] + line1[xx * 4 + 10] + + line2[xx * 4 + 2] + line2[xx * 4 + 6] + line2[xx * 4 + 10]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line1[xx * 4 + 3] + line1[xx * 4 + 7] + line1[xx * 4 + 11] + + line2[xx * 4 + 3] + line2[xx * 4 + 7] + line2[xx * 4 + 11]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -844,10 +827,9 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) } void -ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) { /* Optimized implementation for xscale = 4 and yscale = 4. - */ + */ int xscale = 4, yscale = 4; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -855,13 +837,13 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; UINT8 *line3 = (UINT8 *)imIn->image8[yy + 3]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line0[xx + 3] + line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + line1[xx + 3] + line2[xx + 0] + line2[xx + 1] + line2[xx + 2] + line2[xx + 3] + @@ -871,69 +853,89 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; UINT8 *line3 = (UINT8 *)imIn->image[yy + 3]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + - line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15]; - v = MAKE_UINT32((ss0 + amend) >> 4, 0, - 0, (ss3 + amend) >> 4); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line1[xx * 4 + 0] + line1[xx * 4 + 4] + + line1[xx * 4 + 8] + line1[xx * 4 + 12] + line2[xx * 4 + 0] + + line2[xx * 4 + 4] + line2[xx * 4 + 8] + line2[xx * 4 + 12] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line0[xx * 4 + 15] + line1[xx * 4 + 3] + line1[xx * 4 + 7] + + line1[xx * 4 + 11] + line1[xx * 4 + 15] + line2[xx * 4 + 3] + + line2[xx * 4 + 7] + line2[xx * 4 + 11] + line2[xx * 4 + 15] + + line3[xx * 4 + 3] + line3[xx * 4 + 7] + line3[xx * 4 + 11] + + line3[xx * 4 + 15]; + v = MAKE_UINT32((ss0 + amend) >> 4, 0, 0, (ss3 + amend) >> 4); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + - line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + - line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14]; - v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, - (ss2 + amend) >> 4, 0); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line1[xx * 4 + 0] + line1[xx * 4 + 4] + + line1[xx * 4 + 8] + line1[xx * 4 + 12] + line2[xx * 4 + 0] + + line2[xx * 4 + 4] + line2[xx * 4 + 8] + line2[xx * 4 + 12] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line0[xx * 4 + 13] + line1[xx * 4 + 1] + line1[xx * 4 + 5] + + line1[xx * 4 + 9] + line1[xx * 4 + 13] + line2[xx * 4 + 1] + + line2[xx * 4 + 5] + line2[xx * 4 + 9] + line2[xx * 4 + 13] + + line3[xx * 4 + 1] + line3[xx * 4 + 5] + line3[xx * 4 + 9] + + line3[xx * 4 + 13]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line0[xx * 4 + 14] + line1[xx * 4 + 2] + line1[xx * 4 + 6] + + line1[xx * 4 + 10] + line1[xx * 4 + 14] + line2[xx * 4 + 2] + + line2[xx * 4 + 6] + line2[xx * 4 + 10] + line2[xx * 4 + 14] + + line3[xx * 4 + 2] + line3[xx * 4 + 6] + line3[xx * 4 + 10] + + line3[xx * 4 + 14]; + v = MAKE_UINT32( + (ss0 + amend) >> 4, (ss1 + amend) >> 4, (ss2 + amend) >> 4, 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + - line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + - line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + - line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15]; - v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, - (ss2 + amend) >> 4, (ss3 + amend) >> 4); + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line1[xx * 4 + 0] + line1[xx * 4 + 4] + + line1[xx * 4 + 8] + line1[xx * 4 + 12] + line2[xx * 4 + 0] + + line2[xx * 4 + 4] + line2[xx * 4 + 8] + line2[xx * 4 + 12] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line0[xx * 4 + 13] + line1[xx * 4 + 1] + line1[xx * 4 + 5] + + line1[xx * 4 + 9] + line1[xx * 4 + 13] + line2[xx * 4 + 1] + + line2[xx * 4 + 5] + line2[xx * 4 + 9] + line2[xx * 4 + 13] + + line3[xx * 4 + 1] + line3[xx * 4 + 5] + line3[xx * 4 + 9] + + line3[xx * 4 + 13]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line0[xx * 4 + 14] + line1[xx * 4 + 2] + line1[xx * 4 + 6] + + line1[xx * 4 + 10] + line1[xx * 4 + 14] + line2[xx * 4 + 2] + + line2[xx * 4 + 6] + line2[xx * 4 + 10] + line2[xx * 4 + 14] + + line3[xx * 4 + 2] + line3[xx * 4 + 6] + line3[xx * 4 + 10] + + line3[xx * 4 + 14]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line0[xx * 4 + 15] + line1[xx * 4 + 3] + line1[xx * 4 + 7] + + line1[xx * 4 + 11] + line1[xx * 4 + 15] + line2[xx * 4 + 3] + + line2[xx * 4 + 7] + line2[xx * 4 + 11] + line2[xx * 4 + 15] + + line3[xx * 4 + 3] + line3[xx * 4 + 7] + line3[xx * 4 + 11] + + line3[xx * 4 + 15]; + v = MAKE_UINT32( + (ss0 + amend) >> 4, + (ss1 + amend) >> 4, + (ss2 + amend) >> 4, + (ss3 + amend) >> 4); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -941,12 +943,10 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) -{ +ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) { /* Fast special case for xscale = 5 and yscale = 5. - */ + */ int xscale = 5, yscale = 5; int x, y; UINT32 ss0, ss1, ss2, ss3; @@ -955,25 +955,27 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) if (imIn->image8) { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; UINT8 *line3 = (UINT8 *)imIn->image8[yy + 3]; UINT8 *line4 = (UINT8 *)imIn->image8[yy + 4]; for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; - ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line0[xx + 3] + line0[xx + 4] + - line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + line1[xx + 3] + line1[xx + 4] + - line2[xx + 0] + line2[xx + 1] + line2[xx + 2] + line2[xx + 3] + line2[xx + 4] + - line3[xx + 0] + line3[xx + 1] + line3[xx + 2] + line3[xx + 3] + line3[xx + 4] + - line4[xx + 0] + line4[xx + 1] + line4[xx + 2] + line4[xx + 3] + line4[xx + 4]; + int xx = box[0] + x * xscale; + ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line0[xx + 3] + + line0[xx + 4] + line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + + line1[xx + 3] + line1[xx + 4] + line2[xx + 0] + line2[xx + 1] + + line2[xx + 2] + line2[xx + 3] + line2[xx + 4] + line3[xx + 0] + + line3[xx + 1] + line3[xx + 2] + line3[xx + 3] + line3[xx + 4] + + line4[xx + 0] + line4[xx + 1] + line4[xx + 2] + line4[xx + 3] + + line4[xx + 4]; imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; } } } else { for (y = 0; y < box[3] / yscale; y++) { - int yy = box[1] + y*yscale; + int yy = box[1] + y * yscale; UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; @@ -981,74 +983,116 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) UINT8 *line4 = (UINT8 *)imIn->image[yy + 4]; if (imIn->bands == 2) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + - line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + line0[xx*4 + 19] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + line1[xx*4 + 19] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + line2[xx*4 + 19] + - line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15] + line3[xx*4 + 19] + - line4[xx*4 + 3] + line4[xx*4 + 7] + line4[xx*4 + 11] + line4[xx*4 + 15] + line4[xx*4 + 19]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line0[xx * 4 + 16] + line1[xx * 4 + 0] + + line1[xx * 4 + 4] + line1[xx * 4 + 8] + line1[xx * 4 + 12] + + line1[xx * 4 + 16] + line2[xx * 4 + 0] + line2[xx * 4 + 4] + + line2[xx * 4 + 8] + line2[xx * 4 + 12] + line2[xx * 4 + 16] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12] + line3[xx * 4 + 16] + line4[xx * 4 + 0] + + line4[xx * 4 + 4] + line4[xx * 4 + 8] + line4[xx * 4 + 12] + + line4[xx * 4 + 16]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line0[xx * 4 + 15] + line0[xx * 4 + 19] + line1[xx * 4 + 3] + + line1[xx * 4 + 7] + line1[xx * 4 + 11] + line1[xx * 4 + 15] + + line1[xx * 4 + 19] + line2[xx * 4 + 3] + line2[xx * 4 + 7] + + line2[xx * 4 + 11] + line2[xx * 4 + 15] + line2[xx * 4 + 19] + + line3[xx * 4 + 3] + line3[xx * 4 + 7] + line3[xx * 4 + 11] + + line3[xx * 4 + 15] + line3[xx * 4 + 19] + line4[xx * 4 + 3] + + line4[xx * 4 + 7] + line4[xx * 4 + 11] + line4[xx * 4 + 15] + + line4[xx * 4 + 19]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + 0, + 0, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else if (imIn->bands == 3) { for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + - line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + line0[xx*4 + 17] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + line1[xx*4 + 17] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + line2[xx*4 + 17] + - line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13] + line3[xx*4 + 17] + - line4[xx*4 + 1] + line4[xx*4 + 5] + line4[xx*4 + 9] + line4[xx*4 + 13] + line4[xx*4 + 17]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + line0[xx*4 + 18] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + line1[xx*4 + 18] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + line2[xx*4 + 18] + - line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14] + line3[xx*4 + 18] + - line4[xx*4 + 2] + line4[xx*4 + 6] + line4[xx*4 + 10] + line4[xx*4 + 14] + line4[xx*4 + 18]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line0[xx * 4 + 16] + line1[xx * 4 + 0] + + line1[xx * 4 + 4] + line1[xx * 4 + 8] + line1[xx * 4 + 12] + + line1[xx * 4 + 16] + line2[xx * 4 + 0] + line2[xx * 4 + 4] + + line2[xx * 4 + 8] + line2[xx * 4 + 12] + line2[xx * 4 + 16] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12] + line3[xx * 4 + 16] + line4[xx * 4 + 0] + + line4[xx * 4 + 4] + line4[xx * 4 + 8] + line4[xx * 4 + 12] + + line4[xx * 4 + 16]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line0[xx * 4 + 13] + line0[xx * 4 + 17] + line1[xx * 4 + 1] + + line1[xx * 4 + 5] + line1[xx * 4 + 9] + line1[xx * 4 + 13] + + line1[xx * 4 + 17] + line2[xx * 4 + 1] + line2[xx * 4 + 5] + + line2[xx * 4 + 9] + line2[xx * 4 + 13] + line2[xx * 4 + 17] + + line3[xx * 4 + 1] + line3[xx * 4 + 5] + line3[xx * 4 + 9] + + line3[xx * 4 + 13] + line3[xx * 4 + 17] + line4[xx * 4 + 1] + + line4[xx * 4 + 5] + line4[xx * 4 + 9] + line4[xx * 4 + 13] + + line4[xx * 4 + 17]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line0[xx * 4 + 14] + line0[xx * 4 + 18] + line1[xx * 4 + 2] + + line1[xx * 4 + 6] + line1[xx * 4 + 10] + line1[xx * 4 + 14] + + line1[xx * 4 + 18] + line2[xx * 4 + 2] + line2[xx * 4 + 6] + + line2[xx * 4 + 10] + line2[xx * 4 + 14] + line2[xx * 4 + 18] + + line3[xx * 4 + 2] + line3[xx * 4 + 6] + line3[xx * 4 + 10] + + line3[xx * 4 + 14] + line3[xx * 4 + 18] + line4[xx * 4 + 2] + + line4[xx * 4 + 6] + line4[xx * 4 + 10] + line4[xx * 4 + 14] + + line4[xx * 4 + 18]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + 0); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } else { // bands == 4 for (x = 0; x < box[2] / xscale; x++) { - int xx = box[0] + x*xscale; + int xx = box[0] + x * xscale; UINT32 v; - ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + - line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + - line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + - line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + - line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; - ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + line0[xx*4 + 17] + - line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + line1[xx*4 + 17] + - line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + line2[xx*4 + 17] + - line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13] + line3[xx*4 + 17] + - line4[xx*4 + 1] + line4[xx*4 + 5] + line4[xx*4 + 9] + line4[xx*4 + 13] + line4[xx*4 + 17]; - ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + line0[xx*4 + 18] + - line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + line1[xx*4 + 18] + - line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + line2[xx*4 + 18] + - line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14] + line3[xx*4 + 18] + - line4[xx*4 + 2] + line4[xx*4 + 6] + line4[xx*4 + 10] + line4[xx*4 + 14] + line4[xx*4 + 18]; - ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + line0[xx*4 + 19] + - line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + line1[xx*4 + 19] + - line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + line2[xx*4 + 19] + - line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15] + line3[xx*4 + 19] + - line4[xx*4 + 3] + line4[xx*4 + 7] + line4[xx*4 + 11] + line4[xx*4 + 15] + line4[xx*4 + 19]; + ss0 = line0[xx * 4 + 0] + line0[xx * 4 + 4] + line0[xx * 4 + 8] + + line0[xx * 4 + 12] + line0[xx * 4 + 16] + line1[xx * 4 + 0] + + line1[xx * 4 + 4] + line1[xx * 4 + 8] + line1[xx * 4 + 12] + + line1[xx * 4 + 16] + line2[xx * 4 + 0] + line2[xx * 4 + 4] + + line2[xx * 4 + 8] + line2[xx * 4 + 12] + line2[xx * 4 + 16] + + line3[xx * 4 + 0] + line3[xx * 4 + 4] + line3[xx * 4 + 8] + + line3[xx * 4 + 12] + line3[xx * 4 + 16] + line4[xx * 4 + 0] + + line4[xx * 4 + 4] + line4[xx * 4 + 8] + line4[xx * 4 + 12] + + line4[xx * 4 + 16]; + ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5] + line0[xx * 4 + 9] + + line0[xx * 4 + 13] + line0[xx * 4 + 17] + line1[xx * 4 + 1] + + line1[xx * 4 + 5] + line1[xx * 4 + 9] + line1[xx * 4 + 13] + + line1[xx * 4 + 17] + line2[xx * 4 + 1] + line2[xx * 4 + 5] + + line2[xx * 4 + 9] + line2[xx * 4 + 13] + line2[xx * 4 + 17] + + line3[xx * 4 + 1] + line3[xx * 4 + 5] + line3[xx * 4 + 9] + + line3[xx * 4 + 13] + line3[xx * 4 + 17] + line4[xx * 4 + 1] + + line4[xx * 4 + 5] + line4[xx * 4 + 9] + line4[xx * 4 + 13] + + line4[xx * 4 + 17]; + ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line0[xx * 4 + 10] + + line0[xx * 4 + 14] + line0[xx * 4 + 18] + line1[xx * 4 + 2] + + line1[xx * 4 + 6] + line1[xx * 4 + 10] + line1[xx * 4 + 14] + + line1[xx * 4 + 18] + line2[xx * 4 + 2] + line2[xx * 4 + 6] + + line2[xx * 4 + 10] + line2[xx * 4 + 14] + line2[xx * 4 + 18] + + line3[xx * 4 + 2] + line3[xx * 4 + 6] + line3[xx * 4 + 10] + + line3[xx * 4 + 14] + line3[xx * 4 + 18] + line4[xx * 4 + 2] + + line4[xx * 4 + 6] + line4[xx * 4 + 10] + line4[xx * 4 + 14] + + line4[xx * 4 + 18]; + ss3 = line0[xx * 4 + 3] + line0[xx * 4 + 7] + line0[xx * 4 + 11] + + line0[xx * 4 + 15] + line0[xx * 4 + 19] + line1[xx * 4 + 3] + + line1[xx * 4 + 7] + line1[xx * 4 + 11] + line1[xx * 4 + 15] + + line1[xx * 4 + 19] + line2[xx * 4 + 3] + line2[xx * 4 + 7] + + line2[xx * 4 + 11] + line2[xx * 4 + 15] + line2[xx * 4 + 19] + + line3[xx * 4 + 3] + line3[xx * 4 + 7] + line3[xx * 4 + 11] + + line3[xx * 4 + 15] + line3[xx * 4 + 19] + line4[xx * 4 + 3] + + line4[xx * 4 + 7] + line4[xx * 4 + 11] + line4[xx * 4 + 15] + + line4[xx * 4 + 19]; v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + ((ss0 + amend) * multiplier) >> 24, + ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, + ((ss3 + amend) * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -1056,12 +1100,10 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) } } - void -ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -{ +ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) { /* Fill the last row and the last column for any xscale and yscale. - */ + */ int x, y, xx, yy; if (imIn->image8) { @@ -1070,13 +1112,13 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 multiplier = division_UINT32(scale, 8); UINT32 amend = scale / 2; for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; UINT32 ss = amend; x = box[2] / xscale; for (yy = yy_from; yy < yy_from + yscale; yy++) { UINT8 *line = (UINT8 *)imIn->image8[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { ss += line[xx + 0]; } } @@ -1089,9 +1131,9 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 amend = scale / 2; y = box[3] / yscale; for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 ss = amend; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { UINT8 *line = (UINT8 *)imIn->image8[yy]; for (xx = xx_from; xx < xx_from + xscale; xx++) { ss += line[xx + 0]; @@ -1107,9 +1149,9 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 ss = amend; x = box[2] / xscale; y = box[3] / yscale; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { UINT8 *line = (UINT8 *)imIn->image8[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { ss += line[xx + 0]; } } @@ -1121,23 +1163,25 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 multiplier = division_UINT32(scale, 8); UINT32 amend = scale / 2; for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + int yy_from = box[1] + y * yscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; x = box[2] / xscale; for (yy = yy_from; yy < yy_from + yscale; yy++) { UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -1147,21 +1191,23 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 amend = scale / 2; y = box[3] / yscale; for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; + int xx_from = box[0] + x * xscale; UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { UINT8 *line = (UINT8 *)imIn->image[yy]; for (xx = xx_from; xx < xx_from + xscale; xx++) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } @@ -1173,265 +1219,262 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; x = box[2] / xscale; y = box[3] / yscale; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { + ss0 += line[xx * 4 + 0]; + ss1 += line[xx * 4 + 1]; + ss2 += line[xx * 4 + 2]; + ss3 += line[xx * 4 + 3]; } } v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + (ss0 * multiplier) >> 24, + (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, + (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } } - void -ImagingReduceNxN_32bpc(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -{ +ImagingReduceNxN_32bpc( + Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) { /* The most general implementation for any xscale and yscale - */ + */ int x, y, xx, yy; double multiplier = 1.0 / (yscale * xscale); - switch(imIn->type) { - case IMAGING_TYPE_INT32: - for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; - for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; - double ss = 0; - for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { - INT32 *line0 = (INT32 *)imIn->image32[yy]; - INT32 *line1 = (INT32 *)imIn->image32[yy + 1]; - for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss += line0[xx + 0] + line0[xx + 1] + - line1[xx + 0] + line1[xx + 1]; + switch (imIn->type) { + case IMAGING_TYPE_INT32: + for (y = 0; y < box[3] / yscale; y++) { + int yy_from = box[1] + y * yscale; + for (x = 0; x < box[2] / xscale; x++) { + int xx_from = box[0] + x * xscale; + double ss = 0; + for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { + INT32 *line0 = (INT32 *)imIn->image32[yy]; + INT32 *line1 = (INT32 *)imIn->image32[yy + 1]; + for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { + ss += line0[xx + 0] + line0[xx + 1] + line1[xx + 0] + + line1[xx + 1]; + } + if (xscale & 0x01) { + ss += line0[xx + 0] + line1[xx + 0]; + } } - if (xscale & 0x01) { - ss += line0[xx + 0] + line1[xx + 0]; + if (yscale & 0x01) { + INT32 *line = (INT32 *)imIn->image32[yy]; + for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { + ss += line[xx + 0] + line[xx + 1]; + } + if (xscale & 0x01) { + ss += line[xx + 0]; + } } + IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); } - if (yscale & 0x01) { - INT32 *line = (INT32 *)imIn->image32[yy]; - for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss += line[xx + 0] + line[xx + 1]; - } - if (xscale & 0x01) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); } - } - break; + break; - case IMAGING_TYPE_FLOAT32: - for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; - for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; - double ss = 0; - for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { - FLOAT32 *line0 = (FLOAT32 *)imIn->image32[yy]; - FLOAT32 *line1 = (FLOAT32 *)imIn->image32[yy + 1]; - for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss += line0[xx + 0] + line0[xx + 1] + - line1[xx + 0] + line1[xx + 1]; + case IMAGING_TYPE_FLOAT32: + for (y = 0; y < box[3] / yscale; y++) { + int yy_from = box[1] + y * yscale; + for (x = 0; x < box[2] / xscale; x++) { + int xx_from = box[0] + x * xscale; + double ss = 0; + for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { + FLOAT32 *line0 = (FLOAT32 *)imIn->image32[yy]; + FLOAT32 *line1 = (FLOAT32 *)imIn->image32[yy + 1]; + for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { + ss += line0[xx + 0] + line0[xx + 1] + line1[xx + 0] + + line1[xx + 1]; + } + if (xscale & 0x01) { + ss += line0[xx + 0] + line1[xx + 0]; + } } - if (xscale & 0x01) { - ss += line0[xx + 0] + line1[xx + 0]; + if (yscale & 0x01) { + FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; + for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { + ss += line[xx + 0] + line[xx + 1]; + } + if (xscale & 0x01) { + ss += line[xx + 0]; + } } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; } - if (yscale & 0x01) { - FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; - for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { - ss += line[xx + 0] + line[xx + 1]; - } - if (xscale & 0x01) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; } - } - break; + break; } } - void -ImagingReduceCorners_32bpc(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -{ +ImagingReduceCorners_32bpc( + Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) { /* Fill the last row and the last column for any xscale and yscale. - */ + */ int x, y, xx, yy; - switch(imIn->type) { - case IMAGING_TYPE_INT32: - if (box[2] % xscale) { - double multiplier = 1.0 / ((box[2] % xscale) * yscale); - for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + switch (imIn->type) { + case IMAGING_TYPE_INT32: + if (box[2] % xscale) { + double multiplier = 1.0 / ((box[2] % xscale) * yscale); + for (y = 0; y < box[3] / yscale; y++) { + int yy_from = box[1] + y * yscale; + double ss = 0; + x = box[2] / xscale; + for (yy = yy_from; yy < yy_from + yscale; yy++) { + INT32 *line = (INT32 *)imIn->image32[yy]; + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); + } + } + if (box[3] % yscale) { + double multiplier = 1.0 / (xscale * (box[3] % yscale)); + y = box[3] / yscale; + for (x = 0; x < box[2] / xscale; x++) { + int xx_from = box[0] + x * xscale; + double ss = 0; + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { + INT32 *line = (INT32 *)imIn->image32[yy]; + for (xx = xx_from; xx < xx_from + xscale; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); + } + } + if (box[2] % xscale && box[3] % yscale) { + double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); double ss = 0; x = box[2] / xscale; - for (yy = yy_from; yy < yy_from + yscale; yy++) { + y = box[3] / yscale; + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { INT32 *line = (INT32 *)imIn->image32[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { ss += line[xx + 0]; } } IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); } - } - if (box[3] % yscale) { - double multiplier = 1.0 / (xscale * (box[3] % yscale)); - y = box[3] / yscale; - for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; - double ss = 0; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { - INT32 *line = (INT32 *)imIn->image32[yy]; - for (xx = xx_from; xx < xx_from + xscale; xx++) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); - } - } - if (box[2] % xscale && box[3] % yscale) { - double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); - double ss = 0; - x = box[2] / xscale; - y = box[3] / yscale; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { - INT32 *line = (INT32 *)imIn->image32[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); - } - break; + break; - case IMAGING_TYPE_FLOAT32: - if (box[2] % xscale) { - double multiplier = 1.0 / ((box[2] % xscale) * yscale); - for (y = 0; y < box[3] / yscale; y++) { - int yy_from = box[1] + y*yscale; + case IMAGING_TYPE_FLOAT32: + if (box[2] % xscale) { + double multiplier = 1.0 / ((box[2] % xscale) * yscale); + for (y = 0; y < box[3] / yscale; y++) { + int yy_from = box[1] + y * yscale; + double ss = 0; + x = box[2] / xscale; + for (yy = yy_from; yy < yy_from + yscale; yy++) { + FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + } + if (box[3] % yscale) { + double multiplier = 1.0 / (xscale * (box[3] % yscale)); + y = box[3] / yscale; + for (x = 0; x < box[2] / xscale; x++) { + int xx_from = box[0] + x * xscale; + double ss = 0; + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { + FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; + for (xx = xx_from; xx < xx_from + xscale; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + } + if (box[2] % xscale && box[3] % yscale) { + double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); double ss = 0; x = box[2] / xscale; - for (yy = yy_from; yy < yy_from + yscale; yy++) { + y = box[3] / yscale; + for (yy = box[1] + y * yscale; yy < box[1] + box[3]; yy++) { FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { + for (xx = box[0] + x * xscale; xx < box[0] + box[2]; xx++) { ss += line[xx + 0]; } } IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; } - } - if (box[3] % yscale) { - double multiplier = 1.0 / (xscale * (box[3] % yscale)); - y = box[3] / yscale; - for (x = 0; x < box[2] / xscale; x++) { - int xx_from = box[0] + x*xscale; - double ss = 0; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { - FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; - for (xx = xx_from; xx < xx_from + xscale; xx++) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; - } - } - if (box[2] % xscale && box[3] % yscale) { - double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); - double ss = 0; - x = box[2] / xscale; - y = box[3] / yscale; - for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { - FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; - for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { - ss += line[xx + 0]; - } - } - IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; - } - break; + break; } } - Imaging -ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) -{ +ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) { ImagingSectionCookie cookie; Imaging imOut = NULL; if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->type == IMAGING_TYPE_SPECIAL) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } - imOut = ImagingNewDirty(imIn->mode, - (box[2] + xscale - 1) / xscale, - (box[3] + yscale - 1) / yscale); - if ( ! imOut) { + imOut = ImagingNewDirty( + imIn->mode, (box[2] + xscale - 1) / xscale, (box[3] + yscale - 1) / yscale); + if (!imOut) { return NULL; } ImagingSectionEnter(&cookie); - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - if (xscale == 1) { - if (yscale == 2) { - ImagingReduce1x2(imOut, imIn, box); - } else if (yscale == 3) { - ImagingReduce1x3(imOut, imIn, box); + switch (imIn->type) { + case IMAGING_TYPE_UINT8: + if (xscale == 1) { + if (yscale == 2) { + ImagingReduce1x2(imOut, imIn, box); + } else if (yscale == 3) { + ImagingReduce1x3(imOut, imIn, box); + } else { + ImagingReduce1xN(imOut, imIn, box, yscale); + } + } else if (yscale == 1) { + if (xscale == 2) { + ImagingReduce2x1(imOut, imIn, box); + } else if (xscale == 3) { + ImagingReduce3x1(imOut, imIn, box); + } else { + ImagingReduceNx1(imOut, imIn, box, xscale); + } + } else if (xscale == yscale && xscale <= 5) { + if (xscale == 2) { + ImagingReduce2x2(imOut, imIn, box); + } else if (xscale == 3) { + ImagingReduce3x3(imOut, imIn, box); + } else if (xscale == 4) { + ImagingReduce4x4(imOut, imIn, box); + } else { + ImagingReduce5x5(imOut, imIn, box); + } } else { - ImagingReduce1xN(imOut, imIn, box, yscale); + ImagingReduceNxN(imOut, imIn, box, xscale, yscale); } - } else if (yscale == 1) { - if (xscale == 2) { - ImagingReduce2x1(imOut, imIn, box); - } else if (xscale == 3) { - ImagingReduce3x1(imOut, imIn, box); - } else { - ImagingReduceNx1(imOut, imIn, box, xscale); - } - } else if (xscale == yscale && xscale <= 5) { - if (xscale == 2) { - ImagingReduce2x2(imOut, imIn, box); - } else if (xscale == 3) { - ImagingReduce3x3(imOut, imIn, box); - } else if (xscale == 4) { - ImagingReduce4x4(imOut, imIn, box); - } else { - ImagingReduce5x5(imOut, imIn, box); - } - } else { - ImagingReduceNxN(imOut, imIn, box, xscale, yscale); - } - ImagingReduceCorners(imOut, imIn, box, xscale, yscale); - break; + ImagingReduceCorners(imOut, imIn, box, xscale, yscale); + break; - case IMAGING_TYPE_INT32: - case IMAGING_TYPE_FLOAT32: - ImagingReduceNxN_32bpc(imOut, imIn, box, xscale, yscale); + case IMAGING_TYPE_INT32: + case IMAGING_TYPE_FLOAT32: + ImagingReduceNxN_32bpc(imOut, imIn, box, xscale, yscale); - ImagingReduceCorners_32bpc(imOut, imIn, box, xscale, yscale); - break; + ImagingReduceCorners_32bpc(imOut, imIn, box, xscale, yscale); + break; } ImagingSectionLeave(&cookie); diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index b12e023f8..cf79d8a4e 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -2,36 +2,34 @@ #include - -#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) - +#define ROUND_UP(f) ((int)((f) >= 0.0 ? (f) + 0.5F : (f)-0.5F)) struct filter { double (*filter)(double x); double support; }; -static inline double box_filter(double x) -{ +static inline double +box_filter(double x) { if (x > -0.5 && x <= 0.5) { return 1.0; } return 0.0; } -static inline double bilinear_filter(double x) -{ +static inline double +bilinear_filter(double x) { if (x < 0.0) { x = -x; } if (x < 1.0) { - return 1.0-x; + return 1.0 - x; } return 0.0; } -static inline double hamming_filter(double x) -{ +static inline double +hamming_filter(double x) { if (x < 0.0) { x = -x; } @@ -45,15 +43,16 @@ static inline double hamming_filter(double x) return sin(x) / x * (0.54f + 0.46f * cos(x)); } -static inline double bicubic_filter(double x) -{ - /* https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm */ +static inline double +bicubic_filter(double x) { + /* https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm + */ #define a -0.5 if (x < 0.0) { x = -x; } if (x < 1.0) { - return ((a + 2.0) * x - (a + 3.0)) * x*x + 1; + return ((a + 2.0) * x - (a + 3.0)) * x * x + 1; } if (x < 2.0) { return (((x - 5) * x + 8) * x - 4) * a; @@ -62,8 +61,8 @@ static inline double bicubic_filter(double x) #undef a } -static inline double sinc_filter(double x) -{ +static inline double +sinc_filter(double x) { if (x == 0.0) { return 1.0; } @@ -71,21 +70,20 @@ static inline double sinc_filter(double x) return sin(x) / x; } -static inline double lanczos_filter(double x) -{ +static inline double +lanczos_filter(double x) { /* truncated sinc */ if (-3.0 <= x && x < 3.0) { - return sinc_filter(x) * sinc_filter(x/3); + return sinc_filter(x) * sinc_filter(x / 3); } return 0.0; } -static struct filter BOX = { box_filter, 0.5 }; -static struct filter BILINEAR = { bilinear_filter, 1.0 }; -static struct filter HAMMING = { hamming_filter, 1.0 }; -static struct filter BICUBIC = { bicubic_filter, 2.0 }; -static struct filter LANCZOS = { lanczos_filter, 3.0 }; - +static struct filter BOX = {box_filter, 0.5}; +static struct filter BILINEAR = {bilinear_filter, 1.0}; +static struct filter HAMMING = {hamming_filter, 1.0}; +static struct filter BICUBIC = {bicubic_filter, 2.0}; +static struct filter LANCZOS = {lanczos_filter, 3.0}; /* 8 bits for result. Filter can have negative areas. In one cases the sum of the coefficients will be negative, @@ -93,102 +91,102 @@ static struct filter LANCZOS = { lanczos_filter, 3.0 }; two extra bits for overflow and int type. */ #define PRECISION_BITS (32 - 8 - 2) - /* Handles values form -640 to 639. */ UINT8 _clip8_lookups[1280] = { - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, }; UINT8 *clip8_lookups = &_clip8_lookups[640]; -static inline UINT8 clip8(int in) -{ +static inline UINT8 +clip8(int in) { return clip8_lookups[in >> PRECISION_BITS]; } - int -precompute_coeffs(int inSize, float in0, float in1, int outSize, - struct filter *filterp, int **boundsp, double **kkp) { +precompute_coeffs( + int inSize, + float in0, + float in1, + int outSize, + struct filter *filterp, + int **boundsp, + double **kkp) { double support, scale, filterscale; double center, ww, ss; int xx, x, ksize, xmin, xmax; @@ -196,7 +194,7 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, double *kk, *k; /* prepare for horizontal stretch */ - filterscale = scale = (double) (in1 - in0) / outSize; + filterscale = scale = (double)(in1 - in0) / outSize; if (filterscale < 1.0) { filterscale = 1.0; } @@ -205,7 +203,7 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, support = filterp->support * filterscale; /* maximum number of coeffs */ - ksize = (int) ceil(support) * 2 + 1; + ksize = (int)ceil(support) * 2 + 1; // check for overflow if (outSize > INT_MAX / (ksize * (int)sizeof(double))) { @@ -216,14 +214,14 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, /* coefficient buffer */ /* malloc check ok, overflow checked above */ kk = malloc(outSize * ksize * sizeof(double)); - if ( ! kk) { + if (!kk) { ImagingError_MemoryError(); return 0; } /* malloc check ok, ksize*sizeof(double) > 2*sizeof(int) */ bounds = malloc(outSize * 2 * sizeof(int)); - if ( ! bounds) { + if (!bounds) { free(kk); ImagingError_MemoryError(); return 0; @@ -234,12 +232,12 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, ww = 0.0; ss = 1.0 / filterscale; // Round the value - xmin = (int) (center - support + 0.5); + xmin = (int)(center - support + 0.5); if (xmin < 0) { xmin = 0; } // Round the value - xmax = (int) (center + support + 0.5); + xmax = (int)(center + support + 0.5); if (xmax > inSize) { xmax = inSize; } @@ -267,38 +265,33 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize, return ksize; } - void -normalize_coeffs_8bpc(int outSize, int ksize, double *prekk) -{ +normalize_coeffs_8bpc(int outSize, int ksize, double *prekk) { int x; INT32 *kk; // use the same buffer for normalized coefficients - kk = (INT32 *) prekk; + kk = (INT32 *)prekk; for (x = 0; x < outSize * ksize; x++) { if (prekk[x] < 0) { - kk[x] = (int) (-0.5 + prekk[x] * (1 << PRECISION_BITS)); + kk[x] = (int)(-0.5 + prekk[x] * (1 << PRECISION_BITS)); } else { - kk[x] = (int) (0.5 + prekk[x] * (1 << PRECISION_BITS)); + kk[x] = (int)(0.5 + prekk[x] * (1 << PRECISION_BITS)); } } } - - void -ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, - int ksize, int *bounds, double *prekk) -{ +ImagingResampleHorizontal_8bpc( + Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk) { ImagingSectionCookie cookie; int ss0, ss1, ss2, ss3; int xx, yy, x, xmin, xmax; INT32 *k, *kk; // use the same buffer for normalized coefficients - kk = (INT32 *) prekk; + kk = (INT32 *)prekk; normalize_coeffs_8bpc(imOut->xsize, ksize, prekk); ImagingSectionEnter(&cookie); @@ -308,9 +301,9 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, xmin = bounds[xx * 2 + 0]; xmax = bounds[xx * 2 + 1]; k = &kk[xx * ksize]; - ss0 = 1 << (PRECISION_BITS -1); + ss0 = 1 << (PRECISION_BITS - 1); for (x = 0; x < xmax; x++) { - ss0 += ((UINT8) imIn->image8[yy + offset][x + xmin]) * k[x]; + ss0 += ((UINT8)imIn->image8[yy + offset][x + xmin]) * k[x]; } imOut->image8[yy][xx] = clip8(ss0); } @@ -323,10 +316,12 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, xmin = bounds[xx * 2 + 0]; xmax = bounds[xx * 2 + 1]; k = &kk[xx * ksize]; - ss0 = ss3 = 1 << (PRECISION_BITS -1); + ss0 = ss3 = 1 << (PRECISION_BITS - 1); for (x = 0; x < xmax; x++) { - ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; - ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; + ss0 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 0]) * + k[x]; + ss3 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 3]) * + k[x]; } v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -339,11 +334,14 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, xmin = bounds[xx * 2 + 0]; xmax = bounds[xx * 2 + 1]; k = &kk[xx * ksize]; - ss0 = ss1 = ss2 = 1 << (PRECISION_BITS -1); + ss0 = ss1 = ss2 = 1 << (PRECISION_BITS - 1); for (x = 0; x < xmax; x++) { - ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; - ss1 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 1]) * k[x]; - ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; + ss0 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 0]) * + k[x]; + ss1 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 1]) * + k[x]; + ss2 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 2]) * + k[x]; } v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -356,12 +354,16 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, xmin = bounds[xx * 2 + 0]; xmax = bounds[xx * 2 + 1]; k = &kk[xx * ksize]; - ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS -1); + ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS - 1); for (x = 0; x < xmax; x++) { - ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; - ss1 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 1]) * k[x]; - ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; - ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; + ss0 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 0]) * + k[x]; + ss1 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 1]) * + k[x]; + ss2 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 2]) * + k[x]; + ss3 += ((UINT8)imIn->image[yy + offset][(x + xmin) * 4 + 3]) * + k[x]; } v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -372,18 +374,16 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, ImagingSectionLeave(&cookie); } - void -ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, - int ksize, int *bounds, double *prekk) -{ +ImagingResampleVertical_8bpc( + Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk) { ImagingSectionCookie cookie; int ss0, ss1, ss2, ss3; int xx, yy, y, ymin, ymax; INT32 *k, *kk; // use the same buffer for normalized coefficients - kk = (INT32 *) prekk; + kk = (INT32 *)prekk; normalize_coeffs_8bpc(imOut->ysize, ksize, prekk); ImagingSectionEnter(&cookie); @@ -393,9 +393,9 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, ymin = bounds[yy * 2 + 0]; ymax = bounds[yy * 2 + 1]; for (xx = 0; xx < imOut->xsize; xx++) { - ss0 = 1 << (PRECISION_BITS -1); + ss0 = 1 << (PRECISION_BITS - 1); for (y = 0; y < ymax; y++) { - ss0 += ((UINT8) imIn->image8[y + ymin][xx]) * k[y]; + ss0 += ((UINT8)imIn->image8[y + ymin][xx]) * k[y]; } imOut->image8[yy][xx] = clip8(ss0); } @@ -408,10 +408,10 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, ymax = bounds[yy * 2 + 1]; for (xx = 0; xx < imOut->xsize; xx++) { UINT32 v; - ss0 = ss3 = 1 << (PRECISION_BITS -1); + ss0 = ss3 = 1 << (PRECISION_BITS - 1); for (y = 0; y < ymax; y++) { - ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; - ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; + ss0 += ((UINT8)imIn->image[y + ymin][xx * 4 + 0]) * k[y]; + ss3 += ((UINT8)imIn->image[y + ymin][xx * 4 + 3]) * k[y]; } v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -424,11 +424,11 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, ymax = bounds[yy * 2 + 1]; for (xx = 0; xx < imOut->xsize; xx++) { UINT32 v; - ss0 = ss1 = ss2 = 1 << (PRECISION_BITS -1); + ss0 = ss1 = ss2 = 1 << (PRECISION_BITS - 1); for (y = 0; y < ymax; y++) { - ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; - ss1 += ((UINT8) imIn->image[y + ymin][xx*4 + 1]) * k[y]; - ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; + ss0 += ((UINT8)imIn->image[y + ymin][xx * 4 + 0]) * k[y]; + ss1 += ((UINT8)imIn->image[y + ymin][xx * 4 + 1]) * k[y]; + ss2 += ((UINT8)imIn->image[y + ymin][xx * 4 + 2]) * k[y]; } v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -441,12 +441,12 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, ymax = bounds[yy * 2 + 1]; for (xx = 0; xx < imOut->xsize; xx++) { UINT32 v; - ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS -1); + ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS - 1); for (y = 0; y < ymax; y++) { - ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; - ss1 += ((UINT8) imIn->image[y + ymin][xx*4 + 1]) * k[y]; - ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; - ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; + ss0 += ((UINT8)imIn->image[y + ymin][xx * 4 + 0]) * k[y]; + ss1 += ((UINT8)imIn->image[y + ymin][xx * 4 + 1]) * k[y]; + ss2 += ((UINT8)imIn->image[y + ymin][xx * 4 + 2]) * k[y]; + ss3 += ((UINT8)imIn->image[y + ymin][xx * 4 + 3]) * k[y]; } v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); @@ -457,18 +457,16 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, ImagingSectionLeave(&cookie); } - void -ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn, int offset, - int ksize, int *bounds, double *kk) -{ +ImagingResampleHorizontal_32bpc( + Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk) { ImagingSectionCookie cookie; double ss; int xx, yy, x, xmin, xmax; double *k; ImagingSectionEnter(&cookie); - switch(imIn->type) { + switch (imIn->type) { case IMAGING_TYPE_INT32: for (yy = 0; yy < imOut->ysize; yy++) { for (xx = 0; xx < imOut->xsize; xx++) { @@ -502,18 +500,16 @@ ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn, int offset, ImagingSectionLeave(&cookie); } - void -ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn, int offset, - int ksize, int *bounds, double *kk) -{ +ImagingResampleVertical_32bpc( + Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk) { ImagingSectionCookie cookie; double ss; int xx, yy, y, ymin, ymax; double *k; ImagingSectionEnter(&cookie); - switch(imIn->type) { + switch (imIn->type) { case IMAGING_TYPE_INT32: for (yy = 0; yy < imOut->ysize; yy++) { ymin = bounds[yy * 2 + 0]; @@ -547,36 +543,36 @@ ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn, int offset, ImagingSectionLeave(&cookie); } - -typedef void (*ResampleFunction)(Imaging imOut, Imaging imIn, int offset, - int ksize, int *bounds, double *kk); - +typedef void (*ResampleFunction)( + Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk); Imaging -ImagingResampleInner(Imaging imIn, int xsize, int ysize, - struct filter *filterp, float box[4], - ResampleFunction ResampleHorizontal, - ResampleFunction ResampleVertical); - +ImagingResampleInner( + Imaging imIn, + int xsize, + int ysize, + struct filter *filterp, + float box[4], + ResampleFunction ResampleHorizontal, + ResampleFunction ResampleVertical); Imaging -ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) -{ +ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) { struct filter *filterp; ResampleFunction ResampleHorizontal; ResampleFunction ResampleVertical; if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } if (imIn->type == IMAGING_TYPE_SPECIAL) { - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } else if (imIn->image8) { ResampleHorizontal = ImagingResampleHorizontal_8bpc; ResampleVertical = ImagingResampleVertical_8bpc; } else { - switch(imIn->type) { + switch (imIn->type) { case IMAGING_TYPE_UINT8: ResampleHorizontal = ImagingResampleHorizontal_8bpc; ResampleVertical = ImagingResampleVertical_8bpc; @@ -587,44 +583,44 @@ ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) ResampleVertical = ImagingResampleVertical_32bpc; break; default: - return (Imaging) ImagingError_ModeError(); + return (Imaging)ImagingError_ModeError(); } } /* check filter */ switch (filter) { - case IMAGING_TRANSFORM_BOX: - filterp = &BOX; - break; - case IMAGING_TRANSFORM_BILINEAR: - filterp = &BILINEAR; - break; - case IMAGING_TRANSFORM_HAMMING: - filterp = &HAMMING; - break; - case IMAGING_TRANSFORM_BICUBIC: - filterp = &BICUBIC; - break; - case IMAGING_TRANSFORM_LANCZOS: - filterp = &LANCZOS; - break; - default: - return (Imaging) ImagingError_ValueError( - "unsupported resampling filter" - ); + case IMAGING_TRANSFORM_BOX: + filterp = &BOX; + break; + case IMAGING_TRANSFORM_BILINEAR: + filterp = &BILINEAR; + break; + case IMAGING_TRANSFORM_HAMMING: + filterp = &HAMMING; + break; + case IMAGING_TRANSFORM_BICUBIC: + filterp = &BICUBIC; + break; + case IMAGING_TRANSFORM_LANCZOS: + filterp = &LANCZOS; + break; + default: + return (Imaging)ImagingError_ValueError("unsupported resampling filter"); } - return ImagingResampleInner(imIn, xsize, ysize, filterp, box, - ResampleHorizontal, ResampleVertical); + return ImagingResampleInner( + imIn, xsize, ysize, filterp, box, ResampleHorizontal, ResampleVertical); } - Imaging -ImagingResampleInner(Imaging imIn, int xsize, int ysize, - struct filter *filterp, float box[4], - ResampleFunction ResampleHorizontal, - ResampleFunction ResampleVertical) -{ +ImagingResampleInner( + Imaging imIn, + int xsize, + int ysize, + struct filter *filterp, + float box[4], + ResampleFunction ResampleHorizontal, + ResampleFunction ResampleVertical) { Imaging imTemp = NULL; Imaging imOut = NULL; @@ -637,15 +633,15 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, need_horizontal = xsize != imIn->xsize || box[0] || box[2] != xsize; need_vertical = ysize != imIn->ysize || box[1] || box[3] != ysize; - ksize_horiz = precompute_coeffs(imIn->xsize, box[0], box[2], xsize, - filterp, &bounds_horiz, &kk_horiz); - if ( ! ksize_horiz) { + ksize_horiz = precompute_coeffs( + imIn->xsize, box[0], box[2], xsize, filterp, &bounds_horiz, &kk_horiz); + if (!ksize_horiz) { return NULL; } - ksize_vert = precompute_coeffs(imIn->ysize, box[1], box[3], ysize, - filterp, &bounds_vert, &kk_vert); - if ( ! ksize_vert) { + ksize_vert = precompute_coeffs( + imIn->ysize, box[1], box[3], ysize, filterp, &bounds_vert, &kk_vert); + if (!ksize_vert) { free(bounds_horiz); free(kk_horiz); return NULL; @@ -654,8 +650,7 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, // First used row in the source image ybox_first = bounds_vert[0]; // Last used row in the source image - ybox_last = bounds_vert[ysize*2 - 2] + bounds_vert[ysize*2 - 1]; - + ybox_last = bounds_vert[ysize * 2 - 2] + bounds_vert[ysize * 2 - 1]; /* two-pass resize, horizontal pass */ if (need_horizontal) { @@ -666,12 +661,12 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, imTemp = ImagingNewDirty(imIn->mode, xsize, ybox_last - ybox_first); if (imTemp) { - ResampleHorizontal(imTemp, imIn, ybox_first, - ksize_horiz, bounds_horiz, kk_horiz); + ResampleHorizontal( + imTemp, imIn, ybox_first, ksize_horiz, bounds_horiz, kk_horiz); } free(bounds_horiz); free(kk_horiz); - if ( ! imTemp) { + if (!imTemp) { free(bounds_vert); free(kk_vert); return NULL; @@ -688,15 +683,14 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, imOut = ImagingNewDirty(imIn->mode, imIn->xsize, ysize); if (imOut) { /* imIn can be the original image or horizontally resampled one */ - ResampleVertical(imOut, imIn, 0, - ksize_vert, bounds_vert, kk_vert); + ResampleVertical(imOut, imIn, 0, ksize_vert, bounds_vert, kk_vert); } /* it's safe to call ImagingDelete with empty value if previous step was not performed. */ ImagingDelete(imTemp); free(bounds_vert); free(kk_vert); - if ( ! imOut) { + if (!imOut) { return NULL; } } else { @@ -706,7 +700,7 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, } /* none of the previous steps are performed, copying */ - if ( ! imOut) { + if (!imOut) { imOut = ImagingCopy(imIn); } diff --git a/src/libImaging/Sgi.h b/src/libImaging/Sgi.h index 8015d6661..39dd68825 100644 --- a/src/libImaging/Sgi.h +++ b/src/libImaging/Sgi.h @@ -1,7 +1,6 @@ /* Sgi.h */ typedef struct { - /* CONFIGURATION */ /* Number of bytes per channel per pixel */ diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index 9a8814b50..c19231e02 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -20,18 +20,17 @@ #define RLE_COPY_FLAG 0x80 #define RLE_MAX_RUN 0x7f -static void read4B(UINT32* dest, UINT8* buf) -{ +static void +read4B(UINT32 *dest, UINT8 *buf) { *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); } -static int expandrow(UINT8* dest, UINT8* src, int n, int z, int xsize) -{ +static int +expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { UINT8 pixel, count; int x = 0; - for (;n > 0; n--) - { + for (; n > 0; n--) { pixel = *src++; if (n == 1 && pixel != 0) { return n; @@ -45,34 +44,31 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z, int xsize) } x += count; if (pixel & RLE_COPY_FLAG) { - while(count--) { + while (count--) { *dest = *src++; dest += z; } - } - else { + } else { pixel = *src++; while (count--) { *dest = pixel; dest += z; } } - } return 0; } -static int expandrow2(UINT8* dest, const UINT8* src, int n, int z, int xsize) -{ +static int +expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { UINT8 pixel, count; int x = 0; - for (;n > 0; n--) - { + for (; n > 0; n--) { pixel = src[1]; - src+=2; + src += 2; if (n == 1 && pixel != 0) { return n; } @@ -85,42 +81,37 @@ static int expandrow2(UINT8* dest, const UINT8* src, int n, int z, int xsize) } x += count; if (pixel & RLE_COPY_FLAG) { - while(count--) { + while (count--) { memcpy(dest, src, 2); src += 2; dest += z * 2; } - } - else { + } else { while (count--) { memcpy(dest, src, 2); dest += z * 2; } - src+=2; + src += 2; } } return 0; } - int -ImagingSgiRleDecode(Imaging im, ImagingCodecState state, - UINT8* buf, Py_ssize_t bytes) -{ +ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { UINT8 *ptr; SGISTATE *c; int err = 0; int status; /* size check */ - if (im->xsize > INT_MAX / im->bands || - im->ysize > INT_MAX / im->bands) { + if (im->xsize > INT_MAX / im->bands || im->ysize > INT_MAX / im->bands) { state->errcode = IMAGING_CODEC_MEMORY; return -1; } /* Get all data from File descriptor */ - c = (SGISTATE*)state->context; + c = (SGISTATE *)state->context; _imaging_seek_pyFd(state->fd, 0L, SEEK_END); c->bufsize = _imaging_tell_pyFd(state->fd); c->bufsize -= SGI_HEADER_SIZE; @@ -130,7 +121,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, each with 4 bytes per element of tablen Check here before we allocate any memory */ - if (c->bufsize < 8*c->tablen) { + if (c->bufsize < 8 * c->tablen) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; } @@ -141,8 +132,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, return -1; } _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); - _imaging_read_pyFd(state->fd, (char*)ptr, c->bufsize); - + _imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize); /* decoder initialization */ state->count = 0; @@ -160,28 +150,27 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, state->buffer = calloc(im->xsize * im->bands, sizeof(UINT8) * 2); c->starttab = calloc(c->tablen, sizeof(UINT32)); c->lengthtab = calloc(c->tablen, sizeof(UINT32)); - if (!state->buffer || - !c->starttab || - !c->lengthtab) { + if (!state->buffer || !c->starttab || !c->lengthtab) { err = IMAGING_CODEC_MEMORY; goto sgi_finish_decode; } /* populate offsets table */ - for (c->tabindex = 0, c->bufindex = 0; c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { + for (c->tabindex = 0, c->bufindex = 0; c->tabindex < c->tablen; + c->tabindex++, c->bufindex += 4) { read4B(&c->starttab[c->tabindex], &ptr[c->bufindex]); } /* populate lengths table */ - for (c->tabindex = 0, c->bufindex = c->tablen * sizeof(UINT32); c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { + for (c->tabindex = 0, c->bufindex = c->tablen * sizeof(UINT32); + c->tabindex < c->tablen; + c->tabindex++, c->bufindex += 4) { read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); } state->count += c->tablen * sizeof(UINT32) * 2; /* read compressed rows */ - for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) - { - for (c->channo = 0; c->channo < im->bands; c->channo++) - { + for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) { + for (c->channo = 0; c->channo < im->bands; c->channo++) { c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; c->rleoffset -= SGI_HEADER_SIZE; @@ -192,11 +181,20 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, } /* row decompression */ - if (c->bpc ==1) { - status = expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); - } - else { - status = expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); + if (c->bpc == 1) { + status = expandrow( + &state->buffer[c->channo], + &ptr[c->rleoffset], + c->rlelength, + im->bands, + im->xsize); + } else { + status = expandrow2( + &state->buffer[c->channo * 2], + &ptr[c->rleoffset], + c->rlelength, + im->bands, + im->xsize); } if (status == -1) { state->errcode = IMAGING_CODEC_OVERRUN; @@ -209,19 +207,18 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, } /* store decompressed data in image */ - state->shuffle((UINT8*)im->image[state->y], state->buffer, im->xsize); - + state->shuffle((UINT8 *)im->image[state->y], state->buffer, im->xsize); } c->bufsize++; -sgi_finish_decode: ; +sgi_finish_decode:; free(c->starttab); free(c->lengthtab); free(ptr); - if (err != 0){ - state->errcode=err; + if (err != 0) { + state->errcode = err; return -1; } return state->count - c->bufsize; diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index c9a24e6aa..76750aaf7 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -34,11 +34,9 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" #include - int ImagingNewCount = 0; /* -------------------------------------------------------------------- @@ -46,18 +44,17 @@ int ImagingNewCount = 0; */ Imaging -ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) -{ +ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { Imaging im; /* linesize overflow check, roughly the current largest space req'd */ if (xsize > (INT_MAX / 4) - 1) { - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } - im = (Imaging) calloc(1, size); + im = (Imaging)calloc(1, size); if (!im) { - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } /* Setup image descriptor */ @@ -115,8 +112,9 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) im->linesize = xsize * 4; im->type = IMAGING_TYPE_INT32; - } else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 \ - || strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) { + } else if ( + strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 || + strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) { /* EXPERIMENTAL */ /* 16-bit raw integer images */ im->bands = 1; @@ -135,7 +133,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) /* 15-bit reversed true colour */ im->bands = 1; im->pixelsize = 2; - im->linesize = (xsize*2 + 3) & -4; + im->linesize = (xsize * 2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;16") == 0) { @@ -143,7 +141,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) /* 16-bit reversed true colour */ im->bands = 1; im->pixelsize = 2; - im->linesize = (xsize*2 + 3) & -4; + im->linesize = (xsize * 2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;24") == 0) { @@ -151,7 +149,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) /* 24-bit reversed true colour */ im->bands = 1; im->pixelsize = 3; - im->linesize = (xsize*3 + 3) & -4; + im->linesize = (xsize * 3 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "BGR;32") == 0) { @@ -159,7 +157,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) /* 32-bit reversed true colour */ im->bands = 1; im->pixelsize = 4; - im->linesize = (xsize*4 + 3) & -4; + im->linesize = (xsize * 4 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; } else if (strcmp(mode, "RGBX") == 0) { @@ -204,7 +202,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) } else { free(im); - return (Imaging) ImagingError_ValueError("unrecognized image mode"); + return (Imaging)ImagingError_ValueError("unrecognized image mode"); } /* Setup image descriptor */ @@ -212,21 +210,23 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) /* Pointer array (allocate at least one line, to avoid MemoryError exceptions on platforms where calloc(0, x) returns NULL) */ - im->image = (char **) calloc((ysize > 0) ? ysize : 1, sizeof(void *)); + im->image = (char **)calloc((ysize > 0) ? ysize : 1, sizeof(void *)); - if ( ! im->image) { + if (!im->image) { free(im); - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } /* Initialize alias pointers to pixel data. */ switch (im->pixelsize) { - case 1: case 2: case 3: - im->image8 = (UINT8 **) im->image; - break; - case 4: - im->image32 = (INT32 **) im->image; - break; + case 1: + case 2: + case 3: + im->image8 = (UINT8 **)im->image; + break; + case 4: + im->image32 = (INT32 **)im->image; + break; } ImagingDefaultArena.stats_new_count += 1; @@ -235,15 +235,13 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) } Imaging -ImagingNewPrologue(const char *mode, int xsize, int ysize) -{ +ImagingNewPrologue(const char *mode, int xsize, int ysize) { return ImagingNewPrologueSubtype( mode, xsize, ysize, sizeof(struct ImagingMemoryInstance)); } void -ImagingDelete(Imaging im) -{ +ImagingDelete(Imaging im) { if (!im) { return; } @@ -263,7 +261,6 @@ ImagingDelete(Imaging im) free(im); } - /* Array Storage Type */ /* ------------------ */ /* Allocate image as an array of line buffers. */ @@ -271,17 +268,20 @@ ImagingDelete(Imaging im) #define IMAGING_PAGE_SIZE (4096) struct ImagingMemoryArena ImagingDefaultArena = { - 1, // alignment - 16*1024*1024, // block_size - 0, // blocks_max - 0, // blocks_cached - NULL, // blocks_pool - 0, 0, 0, 0, 0 // Stats + 1, // alignment + 16 * 1024 * 1024, // block_size + 0, // blocks_max + 0, // blocks_cached + NULL, // blocks_pool + 0, + 0, + 0, + 0, + 0 // Stats }; int -ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) -{ +ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) { void *p; /* Free already cached blocks */ ImagingMemoryClearCache(arena, blocks_max); @@ -291,14 +291,14 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) arena->blocks_pool = NULL; } else if (arena->blocks_pool != NULL) { p = realloc(arena->blocks_pool, sizeof(*arena->blocks_pool) * blocks_max); - if ( ! p) { + if (!p) { // Leave previous blocks_max value return 0; } arena->blocks_pool = p; } else { arena->blocks_pool = calloc(sizeof(*arena->blocks_pool), blocks_max); - if ( ! arena->blocks_pool) { + if (!arena->blocks_pool) { return 0; } } @@ -308,8 +308,7 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) } void -ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size) -{ +ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size) { while (arena->blocks_cached > new_size) { arena->blocks_cached -= 1; free(arena->blocks_pool[arena->blocks_cached].ptr); @@ -318,8 +317,7 @@ ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size) } ImagingMemoryBlock -memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) -{ +memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) { ImagingMemoryBlock block = {NULL, 0}; if (arena->blocks_cached > 0) { @@ -327,16 +325,16 @@ memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) arena->blocks_cached -= 1; block = arena->blocks_pool[arena->blocks_cached]; // Reallocate if needed - if (block.size != requested_size){ + if (block.size != requested_size) { block.ptr = realloc(block.ptr, requested_size); } - if ( ! block.ptr) { + if (!block.ptr) { // Can't allocate, free previous pointer (it is still valid) free(arena->blocks_pool[arena->blocks_cached].ptr); arena->stats_freed_blocks += 1; return block; } - if ( ! dirty) { + if (!dirty) { memset(block.ptr, 0, requested_size); } arena->stats_reused_blocks += 1; @@ -356,9 +354,8 @@ memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) } void -memory_return_block(ImagingMemoryArena arena, ImagingMemoryBlock block) -{ - if (arena->blocks_cached < arena->blocks_max) { +memory_return_block(ImagingMemoryArena arena, ImagingMemoryBlock block) { + if (arena->blocks_cached < arena->blocks_max) { // Reduce block size if (block.size > arena->block_size) { block.size = arena->block_size; @@ -372,15 +369,13 @@ memory_return_block(ImagingMemoryArena arena, ImagingMemoryBlock block) } } - static void -ImagingDestroyArray(Imaging im) -{ +ImagingDestroyArray(Imaging im) { int y = 0; if (im->blocks) { while (im->blocks[y].ptr) { - memory_return_block(&ImagingDefaultArena, im->blocks[y]); + memory_return_block(&ImagingDefaultArena, im->blocks[y]); y += 1; } free(im->blocks); @@ -388,8 +383,7 @@ ImagingDestroyArray(Imaging im) } Imaging -ImagingAllocateArray(Imaging im, int dirty, int block_size) -{ +ImagingAllocateArray(Imaging im, int dirty, int block_size) { int y, line_in_block, current_block; ImagingMemoryArena arena = &ImagingDefaultArena; ImagingMemoryBlock block = {NULL, 0}; @@ -397,7 +391,7 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size) char *aligned_ptr = NULL; /* 0-width or 0-height image. No need to do anything */ - if ( ! im->linesize || ! im->ysize) { + if (!im->linesize || !im->ysize) { return im; } @@ -412,8 +406,8 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size) /* One extra pointer is always NULL */ im->blocks = calloc(sizeof(*im->blocks), blocks_count + 1); - if ( ! im->blocks) { - return (Imaging) ImagingError_MemoryError(); + if (!im->blocks) { + return (Imaging)ImagingError_MemoryError(); } /* Allocate image as an array of lines */ @@ -428,9 +422,9 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size) } required = lines_remaining * aligned_linesize + arena->alignment - 1; block = memory_get_block(arena, required, dirty); - if ( ! block.ptr) { + if (!block.ptr) { ImagingDestroyArray(im); - return (Imaging) ImagingError_MemoryError(); + return (Imaging)ImagingError_MemoryError(); } im->blocks[current_block] = block; /* Bulletproof code from libc _int_memalign */ @@ -454,42 +448,38 @@ ImagingAllocateArray(Imaging im, int dirty, int block_size) return im; } - /* Block Storage Type */ /* ------------------ */ /* Allocate image as a single block. */ static void -ImagingDestroyBlock(Imaging im) -{ +ImagingDestroyBlock(Imaging im) { if (im->block) { free(im->block); } } Imaging -ImagingAllocateBlock(Imaging im) -{ +ImagingAllocateBlock(Imaging im) { Py_ssize_t y, i; /* overflow check for malloc */ - if (im->linesize && - im->ysize > INT_MAX / im->linesize) { - return (Imaging) ImagingError_MemoryError(); + if (im->linesize && im->ysize > INT_MAX / im->linesize) { + return (Imaging)ImagingError_MemoryError(); } if (im->ysize * im->linesize <= 0) { /* some platforms return NULL for malloc(0); this fix prevents MemoryError on zero-sized images on such platforms */ - im->block = (char *) malloc(1); + im->block = (char *)malloc(1); } else { /* malloc check ok, overflow check above */ - im->block = (char *) calloc(im->ysize, im->linesize); + im->block = (char *)calloc(im->ysize, im->linesize); } - if ( ! im->block) { - return (Imaging) ImagingError_MemoryError(); + if (!im->block) { + return (Imaging)ImagingError_MemoryError(); } for (y = i = 0; y < im->ysize; y++) { @@ -507,16 +497,15 @@ ImagingAllocateBlock(Imaging im) */ Imaging -ImagingNewInternal(const char* mode, int xsize, int ysize, int dirty) -{ +ImagingNewInternal(const char *mode, int xsize, int ysize, int dirty) { Imaging im; if (xsize < 0 || ysize < 0) { - return (Imaging) ImagingError_ValueError("bad image size"); + return (Imaging)ImagingError_ValueError("bad image size"); } im = ImagingNewPrologue(mode, xsize, ysize); - if ( ! im) { + if (!im) { return NULL; } @@ -536,28 +525,25 @@ ImagingNewInternal(const char* mode, int xsize, int ysize, int dirty) } Imaging -ImagingNew(const char* mode, int xsize, int ysize) -{ +ImagingNew(const char *mode, int xsize, int ysize) { return ImagingNewInternal(mode, xsize, ysize, 0); } Imaging -ImagingNewDirty(const char* mode, int xsize, int ysize) -{ +ImagingNewDirty(const char *mode, int xsize, int ysize) { return ImagingNewInternal(mode, xsize, ysize, 1); } Imaging -ImagingNewBlock(const char* mode, int xsize, int ysize) -{ +ImagingNewBlock(const char *mode, int xsize, int ysize) { Imaging im; if (xsize < 0 || ysize < 0) { - return (Imaging) ImagingError_ValueError("bad image size"); + return (Imaging)ImagingError_ValueError("bad image size"); } im = ImagingNewPrologue(mode, xsize, ysize); - if ( ! im) { + if (!im) { return NULL; } @@ -570,15 +556,13 @@ ImagingNewBlock(const char* mode, int xsize, int ysize) } Imaging -ImagingNew2Dirty(const char* mode, Imaging imOut, Imaging imIn) -{ +ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn) { /* allocate or validate output image */ if (imOut) { /* make sure images match */ - if (strcmp(imOut->mode, mode) != 0 - || imOut->xsize != imIn->xsize - || imOut->ysize != imIn->ysize) { + if (strcmp(imOut->mode, mode) != 0 || imOut->xsize != imIn->xsize || + imOut->ysize != imIn->ysize) { return ImagingError_Mismatch(); } } else { @@ -593,8 +577,7 @@ ImagingNew2Dirty(const char* mode, Imaging imOut, Imaging imIn) } void -ImagingCopyPalette(Imaging destination, Imaging source) -{ +ImagingCopyPalette(Imaging destination, Imaging source) { if (source->palette) { if (destination->palette) { ImagingPaletteDelete(destination->palette); diff --git a/src/libImaging/SunRleDecode.c b/src/libImaging/SunRleDecode.c index acb39133a..9d8e1292a 100644 --- a/src/libImaging/SunRleDecode.c +++ b/src/libImaging/SunRleDecode.c @@ -15,37 +15,30 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - int -ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ +ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { int n; - UINT8* ptr; + UINT8 *ptr; UINT8 extra_data = 0; UINT8 extra_bytes = 0; ptr = buf; for (;;) { - if (bytes < 1) { return ptr - buf; } if (ptr[0] == 0x80) { - if (bytes < 2) { break; } n = ptr[1]; - if (n == 0) { - /* Literal 0x80 (2 bytes) */ n = 1; @@ -55,7 +48,6 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes -= 2; } else { - /* Run (3 bytes) */ if (bytes < 3) { break; @@ -84,7 +76,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t n += 1; if (state->x + n > state->bytes) { - extra_bytes = n; /* full value */ + extra_bytes = n; /* full value */ n = state->bytes - state->x; extra_bytes -= n; extra_data = ptr[2]; @@ -94,11 +86,9 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t ptr += 3; bytes -= 3; - } } else { - /* Literal byte */ n = 1; @@ -106,18 +96,18 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t ptr += 1; bytes -= 1; - } for (;;) { state->x += n; if (state->x >= state->bytes) { - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); state->x = 0; @@ -132,7 +122,7 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t } if (state->x > 0) { - break; // assert + break; // assert } if (extra_bytes >= state->bytes) { diff --git a/src/libImaging/TgaRleDecode.c b/src/libImaging/TgaRleDecode.c index b1364e004..273ecdffd 100644 --- a/src/libImaging/TgaRleDecode.c +++ b/src/libImaging/TgaRleDecode.c @@ -14,43 +14,35 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - int -ImagingTgaRleDecode(Imaging im, ImagingCodecState state, - UINT8* buf, Py_ssize_t bytes) -{ +ImagingTgaRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { int n, depth; - UINT8* ptr; + UINT8 *ptr; ptr = buf; if (state->state == 0) { - /* check image orientation */ if (state->ystep < 0) { - state->y = state->ysize-1; + state->y = state->ysize - 1; state->ystep = -1; } else { state->ystep = 1; } state->state = 1; - } depth = state->count; for (;;) { - if (bytes < 1) { return ptr - buf; } if (ptr[0] & 0x80) { - /* Run (1 + pixelsize bytes) */ if (bytes < 1 + depth) { @@ -69,7 +61,7 @@ ImagingTgaRleDecode(Imaging im, ImagingCodecState state, } else { int i; for (i = 0; i < n; i += depth) { - memcpy(state->buffer + state->x + i, ptr+1, depth); + memcpy(state->buffer + state->x + i, ptr + 1, depth); } } @@ -77,7 +69,6 @@ ImagingTgaRleDecode(Imaging im, ImagingCodecState state, bytes -= 1 + depth; } else { - /* Literal (1+n+1 bytes block) */ n = depth * (ptr[0] + 1); @@ -94,17 +85,17 @@ ImagingTgaRleDecode(Imaging im, ImagingCodecState state, ptr += 1 + n; bytes -= 1 + n; - } state->x += n; if (state->x >= state->bytes) { - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); state->x = 0; @@ -114,9 +105,7 @@ ImagingTgaRleDecode(Imaging im, ImagingCodecState state, /* End of file (errcode = 0) */ return -1; } - } - } return ptr - buf; diff --git a/src/libImaging/TgaRleEncode.c b/src/libImaging/TgaRleEncode.c index c65dcf5ec..aa7e7b96d 100644 --- a/src/libImaging/TgaRleEncode.c +++ b/src/libImaging/TgaRleEncode.c @@ -4,18 +4,15 @@ #include #include - -static int comparePixels(const UINT8* buf, int x, int bytesPerPixel) -{ +static int +comparePixels(const UINT8 *buf, int x, int bytesPerPixel) { buf += x * bytesPerPixel; return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0; } - int -ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - UINT8* dst; +ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + UINT8 *dst; int bytesPerPixel; if (state->state == 0) { @@ -40,7 +37,7 @@ ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) * excluding the 1-byte descriptor. */ if (state->count == 0) { - UINT8* row; + UINT8 *row; UINT8 descriptor; int startX; @@ -64,8 +61,8 @@ ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) if (state->x == 0) { state->shuffle( state->buffer, - (UINT8*)im->image[state->y + state->yoff] - + state->xoff * im->pixelsize, + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, state->xsize); } @@ -149,9 +146,7 @@ ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) } memcpy( - dst, - state->buffer + (state->x * bytesPerPixel - state->count), - flushCount); + dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount); dst += flushCount; bytes -= flushCount; diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 5cbbe7380..7f14b5a34 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -23,7 +23,8 @@ /* Convert C file descriptor to WinApi HFILE if LibTiff was compiled with tif_win32.c * * This cast is safe, as the top 32-bits of HFILE are guaranteed to be zero, - * see https://docs.microsoft.com/en-us/windows/win32/winprog64/interprocess-communication + * see + * https://docs.microsoft.com/en-us/windows/win32/winprog64/interprocess-communication */ #ifndef USE_WIN32_FILEIO #define fd_to_tiff_fd(fd) (fd) @@ -31,16 +32,23 @@ #define fd_to_tiff_fd(fd) ((int)_get_osfhandle(fd)) #endif -void dump_state(const TIFFSTATE *state){ - TRACE(("State: Location %u size %d eof %d data: %p ifd: %d\n", (uint)state->loc, - (int)state->size, (uint)state->eof, state->data, state->ifd)); +void +dump_state(const TIFFSTATE *state) { + TRACE( + ("State: Location %u size %d eof %d data: %p ifd: %d\n", + (uint)state->loc, + (int)state->size, + (uint)state->eof, + state->data, + state->ifd)); } /* procs for TIFFOpenClient */ -tsize_t _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { +tsize_t +_tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { TIFFSTATE *state = (TIFFSTATE *)hdata; tsize_t to_read; @@ -53,11 +61,12 @@ tsize_t _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { _TIFFmemcpy(buf, (UINT8 *)state->data + state->loc, to_read); state->loc += (toff_t)to_read; - TRACE( ("location: %u\n", (uint)state->loc)); + TRACE(("location: %u\n", (uint)state->loc)); return to_read; } -tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { +tsize_t +_tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { TIFFSTATE *state = (TIFFSTATE *)hdata; tsize_t to_write; @@ -65,14 +74,14 @@ tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { dump_state(state); to_write = min(size, state->size - (tsize_t)state->loc); - if (state->flrealloc && size>to_write) { + if (state->flrealloc && size > to_write) { tdata_t new_data; - tsize_t newsize=state->size; + tsize_t newsize = state->size; while (newsize < (size + state->size)) { - if (newsize > INT_MAX - 64*1024){ + if (newsize > INT_MAX - 64 * 1024) { return 0; } - newsize += 64*1024; + newsize += 64 * 1024; // newsize*=2; // UNDONE, by 64k chunks? } TRACE(("Reallocing in write to %d bytes\n", (int)newsize)); @@ -97,27 +106,29 @@ tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { return to_write; } -toff_t _tiffSeekProc(thandle_t hdata, toff_t off, int whence) { +toff_t +_tiffSeekProc(thandle_t hdata, toff_t off, int whence) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffSeekProc: off: %u whence: %d \n", (uint)off, whence)); dump_state(state); switch (whence) { - case 0: - state->loc = off; - break; - case 1: - state->loc += off; - break; - case 2: - state->loc = state->eof + off; - break; + case 0: + state->loc = off; + break; + case 1: + state->loc += off; + break; + case 2: + state->loc = state->eof + off; + break; } dump_state(state); return state->loc; } -int _tiffCloseProc(thandle_t hdata) { +int +_tiffCloseProc(thandle_t hdata) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffCloseProc \n")); @@ -126,8 +137,8 @@ int _tiffCloseProc(thandle_t hdata) { return 0; } - -toff_t _tiffSizeProc(thandle_t hdata) { +toff_t +_tiffSizeProc(thandle_t hdata) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffSizeProc \n")); @@ -136,7 +147,8 @@ toff_t _tiffSizeProc(thandle_t hdata) { return (toff_t)state->size; } -int _tiffMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { +int +_tiffMapProc(thandle_t hdata, tdata_t *pbase, toff_t *psize) { TIFFSTATE *state = (TIFFSTATE *)hdata; TRACE(("_tiffMapProc input size: %u, data: %p\n", (uint)*psize, *pbase)); @@ -148,25 +160,41 @@ int _tiffMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { return (1); } -int _tiffNullMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { - (void) hdata; (void) pbase; (void) psize; +int +_tiffNullMapProc(thandle_t hdata, tdata_t *pbase, toff_t *psize) { + (void)hdata; + (void)pbase; + (void)psize; return (0); } -void _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { +void +_tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { TRACE(("_tiffUnMapProc\n")); - (void) hdata; (void) base; (void) size; + (void)hdata; + (void)base; + (void)size; } -int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { +int +ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TRACE(("initing libtiff\n")); - TRACE(("filepointer: %d \n", fp)); - TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, - state->x, state->y, state->ystep)); - TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, - state->xoff, state->yoff)); + TRACE(("filepointer: %d \n", fp)); + TRACE( + ("State: count %d, state %d, x %d, y %d, ystep %d\n", + state->count, + state->state, + state->x, + state->y, + state->ystep)); + TRACE( + ("State: xsize %d, ysize %d, xoff %d, yoff %d \n", + state->xsize, + state->ysize, + state->xoff, + state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("State: context %p \n", state->context)); @@ -180,12 +208,12 @@ int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { return 1; } - -int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { +int +_decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { // To avoid dealing with YCbCr subsampling, let libtiff handle it // Use a TIFFRGBAImage wrapping the tiff image, and let libtiff handle // all of the conversion. Metadata read from the TIFFRGBAImage could - // be different from the metadata that the base tiff returns. + // be different from the metadata that the base tiff returns. INT32 strip_row; UINT8 *new_data; @@ -211,8 +239,12 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { img.col_offset = 0; if (state->xsize != img.width || state->ysize != img.height) { - TRACE(("Inconsistent Image Error: %d =? %d, %d =? %d", - state->xsize, img.width, state->ysize, img.height)); + TRACE( + ("Inconsistent Image Error: %d =? %d, %d =? %d", + state->xsize, + img.width, + state->ysize, + img.height)); state->errcode = IMAGING_CODEC_BROKEN; goto decodeycbcr_err; } @@ -221,9 +253,9 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { if (INT_MAX / 4 < img.width) { state->errcode = IMAGING_CODEC_MEMORY; goto decodeycbcr_err; - } - - // TiffRGBAImages are 32bits/pixel. + } + + // TiffRGBAImages are 32bits/pixel. row_byte_size = img.width * 4; /* overflow check for realloc */ @@ -238,7 +270,7 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { /* realloc to fit whole strip */ /* malloc check above */ - new_data = realloc (state->buffer, state->bytes); + new_data = realloc(state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; goto decodeycbcr_err; @@ -247,11 +279,12 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { state->buffer = new_data; for (; state->y < state->ysize; state->y += rows_per_strip) { - img.row_offset = state->y; + img.row_offset = state->y; rows_to_read = min(rows_per_strip, img.height - state->y); - if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == -1) { - TRACE(("Decode Error, y: %d\n", state->y )); + if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == + -1) { + TRACE(("Decode Error, y: %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; goto decodeycbcr_err; } @@ -259,20 +292,24 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { TRACE(("Decoded strip for row %d \n", state->y)); // iterate over each row in the strip and stuff data into image - for (strip_row = 0; strip_row < min((INT32) rows_per_strip, state->ysize - state->y); strip_row++) { + for (strip_row = 0; + strip_row < min((INT32)rows_per_strip, state->ysize - state->y); + strip_row++) { TRACE(("Writing data into line %d ; \n", state->y + strip_row)); - // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); - // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + // UINT8 * bbb = state->buffer + strip_row * (state->bytes / + // rows_per_strip); TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], + // ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - state->shuffle((UINT8*) im->image[state->y + state->yoff + strip_row] + - state->xoff * im->pixelsize, - state->buffer + strip_row * row_byte_size, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff + strip_row] + + state->xoff * im->pixelsize, + state->buffer + strip_row * row_byte_size, + state->xsize); } } - decodeycbcr_err: +decodeycbcr_err: TIFFRGBAImageEnd(&img); if (state->errcode != 0) { return -1; @@ -280,7 +317,8 @@ int _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { return 0; } -int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { +int +_decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { INT32 strip_row; UINT8 *new_data; UINT32 rows_per_strip, row_byte_size; @@ -307,7 +345,8 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { if (TIFFStripSize(tiff) > state->bytes) { // If the strip size as expected by LibTiff isn't what we're expecting, abort. - // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a + // man: TIFFStripSize returns the equivalent size for a strip of data as it + // would be returned in a // call to TIFFReadEncodedStrip ... state->errcode = IMAGING_CODEC_MEMORY; @@ -316,7 +355,7 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { /* realloc to fit whole strip */ /* malloc check above */ - new_data = realloc (state->buffer, state->bytes); + new_data = realloc(state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; return -1; @@ -325,7 +364,11 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { state->buffer = new_data; for (; state->y < state->ysize; state->y += rows_per_strip) { - if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, 0), (tdata_t)state->buffer, -1) == -1) { + if (TIFFReadEncodedStrip( + tiff, + TIFFComputeStrip(tiff, state->y, 0), + (tdata_t)state->buffer, + -1) == -1) { TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); state->errcode = IMAGING_CODEC_BROKEN; return -1; @@ -334,46 +377,80 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { TRACE(("Decoded strip for row %d \n", state->y)); // iterate over each row in the strip and stuff data into image - for (strip_row = 0; strip_row < min((INT32) rows_per_strip, state->ysize - state->y); strip_row++) { + for (strip_row = 0; + strip_row < min((INT32)rows_per_strip, state->ysize - state->y); + strip_row++) { TRACE(("Writing data into line %d ; \n", state->y + strip_row)); - // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); - // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + // UINT8 * bbb = state->buffer + strip_row * (state->bytes / + // rows_per_strip); TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], + // ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - state->shuffle((UINT8*) im->image[state->y + state->yoff + strip_row] + - state->xoff * im->pixelsize, - state->buffer + strip_row * row_byte_size, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff + strip_row] + + state->xoff * im->pixelsize, + state->buffer + strip_row * row_byte_size, + state->xsize); } } return 0; } -int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t bytes) { +int +ImagingLibTiffDecode( + Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; char *filename = "tempfile.tif"; char *mode = "r"; TIFF *tiff; - uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR + uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR int isYCbCr = 0; /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ TRACE(("in decoder: bytes %d\n", bytes)); - TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, - state->x, state->y, state->ystep)); - TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, - state->xoff, state->yoff)); + TRACE( + ("State: count %d, state %d, x %d, y %d, ystep %d\n", + state->count, + state->state, + state->x, + state->y, + state->ystep)); + TRACE( + ("State: xsize %d, ysize %d, xoff %d, yoff %d \n", + state->xsize, + state->ysize, + state->xoff, + state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); - TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); - TRACE(("State->Buffer: %c%c%c%c\n", (char)state->buffer[0], (char)state->buffer[1],(char)state->buffer[2], (char)state->buffer[3])); - TRACE(("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", - im->mode, im->type, im->bands, im->xsize, im->ysize)); - TRACE(("Image: image8 %p, image32 %p, image %p, block %p \n", - im->image8, im->image32, im->image, im->block)); - TRACE(("Image: pixelsize: %d, linesize %d \n", - im->pixelsize, im->linesize)); + TRACE( + ("Buffer: %p: %c%c%c%c\n", + buffer, + (char)buffer[0], + (char)buffer[1], + (char)buffer[2], + (char)buffer[3])); + TRACE( + ("State->Buffer: %c%c%c%c\n", + (char)state->buffer[0], + (char)state->buffer[1], + (char)state->buffer[2], + (char)state->buffer[3])); + TRACE( + ("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", + im->mode, + im->type, + im->bands, + im->xsize, + im->ysize)); + TRACE( + ("Image: image8 %p, image32 %p, image %p, block %p \n", + im->image8, + im->image32, + im->image, + im->block)); + TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize)); dump_state(clientstate); clientstate->size = bytes; @@ -387,54 +464,59 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ TIFFSetWarningHandlerExt(NULL); if (clientstate->fp) { - TRACE(("Opening using fd: %d\n",clientstate->fp)); - lseek(clientstate->fp,0,SEEK_SET); // Sometimes, I get it set to the end. + TRACE(("Opening using fd: %d\n", clientstate->fp)); + lseek(clientstate->fp, 0, SEEK_SET); // Sometimes, I get it set to the end. tiff = TIFFFdOpen(fd_to_tiff_fd(clientstate->fp), filename, mode); } else { TRACE(("Opening from string\n")); - tiff = TIFFClientOpen(filename, mode, - (thandle_t) clientstate, - _tiffReadProc, _tiffWriteProc, - _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, - _tiffMapProc, _tiffUnmapProc); + tiff = TIFFClientOpen( + filename, + mode, + (thandle_t)clientstate, + _tiffReadProc, + _tiffWriteProc, + _tiffSeekProc, + _tiffCloseProc, + _tiffSizeProc, + _tiffMapProc, + _tiffUnmapProc); } - if (!tiff){ + if (!tiff) { TRACE(("Error, didn't get the tiff\n")); state->errcode = IMAGING_CODEC_BROKEN; return -1; } - if (clientstate->ifd){ + if (clientstate->ifd) { int rv; uint32 ifdoffset = clientstate->ifd; TRACE(("reading tiff ifd %u\n", ifdoffset)); rv = TIFFSetSubDirectory(tiff, ifdoffset); - if (!rv){ + if (!rv) { TRACE(("error in TIFFSetSubDirectory")); goto decode_err; } } - TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); isYCbCr = photometric == PHOTOMETRIC_YCBCR; - + if (TIFFIsTiled(tiff)) { INT32 x, y, tile_y; - UINT32 tile_width, tile_length, current_tile_length, current_line, current_tile_width, row_byte_size; + UINT32 tile_width, tile_length, current_tile_length, current_line, + current_tile_width, row_byte_size; UINT8 *new_data; TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); /* overflow check for row_byte_size calculation */ - if ((UINT32) INT_MAX / state->bits < tile_width) { + if ((UINT32)INT_MAX / state->bits < tile_width) { state->errcode = IMAGING_CODEC_MEMORY; goto decode_err; } - if (isYCbCr) { row_byte_size = tile_width * 4; /* sanity check, we use this value in shuffle below */ @@ -443,7 +525,8 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ goto decode_err; } } else { - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size + // We could use TIFFTileSize, but for YCbCr data it returns subsampled data + // size row_byte_size = (tile_width * state->bits + 7) / 8; } @@ -456,14 +539,15 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ state->bytes = row_byte_size * tile_length; if (TIFFTileSize(tiff) > state->bytes) { - // If the strip size as expected by LibTiff isn't what we're expecting, abort. + // If the strip size as expected by LibTiff isn't what we're expecting, + // abort. state->errcode = IMAGING_CODEC_MEMORY; goto decode_err; } /* realloc to fit whole tile */ /* malloc check above */ - new_data = realloc (state->buffer, state->bytes); + new_data = realloc(state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; goto decode_err; @@ -492,14 +576,19 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ TRACE(("Read tile at %dx%d; \n\n", x, y)); - current_tile_width = min((INT32) tile_width, state->xsize - x); - current_tile_length = min((INT32) tile_length, state->ysize - y); + current_tile_width = min((INT32)tile_width, state->xsize - x); + current_tile_length = min((INT32)tile_length, state->ysize - y); // iterate over each line in the tile and stuff data into image for (tile_y = 0; tile_y < current_tile_length; tile_y++) { - TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); + TRACE( + ("Writing tile data at %dx%d using tile_width: %d; \n", + tile_y + y, + x, + current_tile_width)); // UINT8 * bbb = state->buffer + tile_y * row_byte_size; - // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], + // ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); /* * For some reason the TIFFReadRGBATile() function * chooses the lower left corner as the origin. @@ -512,24 +601,23 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ } else { current_line = tile_y; } - - state->shuffle((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + current_line * row_byte_size, - current_tile_width - ); + + state->shuffle( + (UINT8 *)im->image[tile_y + y] + x * im->pixelsize, + state->buffer + current_line * row_byte_size, + current_tile_width); } } } } else { if (!isYCbCr) { _decodeStrip(im, state, tiff); - } - else { + } else { _decodeStripYCbCr(im, state, tiff); } } - decode_err: +decode_err: TIFFClose(tiff); TRACE(("Done Decoding, Returning \n")); // Returning -1 here to force ImageFile.load to break, rather than @@ -537,7 +625,8 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ return -1; } -int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { +int +ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { // Open the FD or the pointer as a tiff file, for writing. // We may have to do some monkeying around to make this really work. // If we have a fp, then we're good. @@ -546,21 +635,30 @@ int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { // Going to have to deal with the directory as well. TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - int bufsize = 64*1024; + int bufsize = 64 * 1024; char *mode = "w"; TRACE(("initing libtiff\n")); - TRACE(("Filename %s, filepointer: %d \n", filename, fp)); - TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, - state->x, state->y, state->ystep)); - TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, - state->xoff, state->yoff)); + TRACE(("Filename %s, filepointer: %d \n", filename, fp)); + TRACE( + ("State: count %d, state %d, x %d, y %d, ystep %d\n", + state->count, + state->state, + state->x, + state->y, + state->ystep)); + TRACE( + ("State: xsize %d, ysize %d, xoff %d, yoff %d \n", + state->xsize, + state->ysize, + state->xoff, + state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); TRACE(("State: context %p \n", state->context)); clientstate->loc = 0; clientstate->size = 0; - clientstate->eof =0; + clientstate->eof = 0; clientstate->data = 0; clientstate->flrealloc = 0; clientstate->fp = fp; @@ -568,27 +666,33 @@ int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { state->state = 0; if (fp) { - TRACE(("Opening using fd: %d for writing \n",clientstate->fp)); + TRACE(("Opening using fd: %d for writing \n", clientstate->fp)); clientstate->tiff = TIFFFdOpen(fd_to_tiff_fd(clientstate->fp), filename, mode); } else { - // malloc a buffer to write the tif, we're going to need to realloc or something if we need bigger. + // malloc a buffer to write the tif, we're going to need to realloc or something + // if we need bigger. TRACE(("Opening a buffer for writing \n")); /* malloc check ok, small constant allocation */ clientstate->data = malloc(bufsize); clientstate->size = bufsize; - clientstate->flrealloc=1; + clientstate->flrealloc = 1; if (!clientstate->data) { TRACE(("Error, couldn't allocate a buffer of size %d\n", bufsize)); return 0; } - clientstate->tiff = TIFFClientOpen(filename, mode, - (thandle_t) clientstate, - _tiffReadProc, _tiffWriteProc, - _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, - _tiffNullMapProc, _tiffUnmapProc); /*force no mmap*/ - + clientstate->tiff = TIFFClientOpen( + filename, + mode, + (thandle_t)clientstate, + _tiffReadProc, + _tiffWriteProc, + _tiffSeekProc, + _tiffCloseProc, + _tiffSizeProc, + _tiffNullMapProc, + _tiffUnmapProc); /*force no mmap*/ } if (!clientstate->tiff) { @@ -597,10 +701,11 @@ int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { } return 1; - } -int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length){ +int +ImagingLibTiffMergeFieldInfo( + ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length) { // Refer to libtiff docs (http://www.simplesystems.org/libtiff/addingtags.html) TIFFSTATE *clientstate = (TIFFSTATE *)state->context; uint32 n; @@ -615,8 +720,14 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ int passcount = 0; TIFFFieldInfo info[] = { - { key, readcount, writecount, field_type, FIELD_CUSTOM, 1, passcount, "CustomField" } - }; + {key, + readcount, + writecount, + field_type, + FIELD_CUSTOM, + 1, + passcount, + "CustomField"}}; if (is_var_length) { info[0].field_writecount = -1; @@ -629,7 +740,8 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ n = sizeof(info) / sizeof(info[0]); // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 -#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && TIFFLIB_VERSION != 20120922 +#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && \ + TIFFLIB_VERSION != 20120922 status = TIFFMergeFieldInfo(clientstate->tiff, info, n); #else TIFFMergeFieldInfo(clientstate->tiff, info, n); @@ -637,7 +749,8 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ return status; } -int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ +int +ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...) { // after tif_dir.c->TIFFSetField. TIFFSTATE *clientstate = (TIFFSTATE *)state->context; va_list ap; @@ -649,8 +762,8 @@ int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ return status; } - -int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes) { +int +ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes) { /* One shot encoder. Encode everything to the tiff in the clientstate. If we're running off of a FD, then run once, we're good, everything ends up in the file, we close and we're done. @@ -664,35 +777,65 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int TIFF *tiff = clientstate->tiff; TRACE(("in encoder: bytes %d\n", bytes)); - TRACE(("State: count %d, state %d, x %d, y %d, ystep %d\n", state->count, state->state, - state->x, state->y, state->ystep)); - TRACE(("State: xsize %d, ysize %d, xoff %d, yoff %d \n", state->xsize, state->ysize, - state->xoff, state->yoff)); + TRACE( + ("State: count %d, state %d, x %d, y %d, ystep %d\n", + state->count, + state->state, + state->x, + state->y, + state->ystep)); + TRACE( + ("State: xsize %d, ysize %d, xoff %d, yoff %d \n", + state->xsize, + state->ysize, + state->xoff, + state->yoff)); TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes)); - TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); - TRACE(("State->Buffer: %c%c%c%c\n", (char)state->buffer[0], (char)state->buffer[1],(char)state->buffer[2], (char)state->buffer[3])); - TRACE(("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", - im->mode, im->type, im->bands, im->xsize, im->ysize)); - TRACE(("Image: image8 %p, image32 %p, image %p, block %p \n", - im->image8, im->image32, im->image, im->block)); - TRACE(("Image: pixelsize: %d, linesize %d \n", - im->pixelsize, im->linesize)); + TRACE( + ("Buffer: %p: %c%c%c%c\n", + buffer, + (char)buffer[0], + (char)buffer[1], + (char)buffer[2], + (char)buffer[3])); + TRACE( + ("State->Buffer: %c%c%c%c\n", + (char)state->buffer[0], + (char)state->buffer[1], + (char)state->buffer[2], + (char)state->buffer[3])); + TRACE( + ("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n", + im->mode, + im->type, + im->bands, + im->xsize, + im->ysize)); + TRACE( + ("Image: image8 %p, image32 %p, image %p, block %p \n", + im->image8, + im->image32, + im->image, + im->block)); + TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize)); dump_state(clientstate); if (state->state == 0) { TRACE(("Encoding line bt line")); - while(state->y < state->ysize){ - state->shuffle(state->buffer, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, - state->xsize); + while (state->y < state->ysize) { + state->shuffle( + state->buffer, + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); - if (TIFFWriteScanline(tiff, (tdata_t)(state->buffer), (uint32)state->y, 0) == -1) { + if (TIFFWriteScanline( + tiff, (tdata_t)(state->buffer), (uint32)state->y, 0) == -1) { TRACE(("Encode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; TIFFClose(tiff); - if (!clientstate->fp){ + if (!clientstate->fp) { free(clientstate->data); } return -1; @@ -701,7 +844,7 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int } if (state->y == state->ysize) { - state->state=1; + state->state = 1; TRACE(("Flushing \n")); if (!TIFFFlush(tiff)) { @@ -709,7 +852,7 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int // likely reason is memory. state->errcode = IMAGING_CODEC_MEMORY; TIFFClose(tiff); - if (!clientstate->fp){ + if (!clientstate->fp) { free(clientstate->data); } return -1; @@ -718,13 +861,19 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int TIFFClose(tiff); // reset the clientstate metadata to use it to read out the buffer. clientstate->loc = 0; - clientstate->size = clientstate->eof; // redundant? + clientstate->size = clientstate->eof; // redundant? } } if (state->state == 1 && !clientstate->fp) { int read = (int)_tiffReadProc(clientstate, (tdata_t)buffer, (tsize_t)bytes); - TRACE(("Buffer: %p: %c%c%c%c\n", buffer, (char)buffer[0], (char)buffer[1],(char)buffer[2], (char)buffer[3])); + TRACE( + ("Buffer: %p: %c%c%c%c\n", + buffer, + (char)buffer[0], + (char)buffer[1], + (char)buffer[2], + (char)buffer[3])); if (clientstate->loc == clientstate->eof) { TRACE(("Hit EOF, calling an end, freeing data")); state->errcode = IMAGING_CODEC_END; @@ -737,9 +886,8 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int return 0; } -const char* -ImagingTiffVersion(void) -{ +const char * +ImagingTiffVersion(void) { return TIFFGetVersion(); } diff --git a/src/libImaging/TiffDecode.h b/src/libImaging/TiffDecode.h index 3d27e65b6..2c3d88caa 100644 --- a/src/libImaging/TiffDecode.h +++ b/src/libImaging/TiffDecode.h @@ -20,8 +20,8 @@ */ #ifndef min -#define min(x,y) (( x > y ) ? y : x ) -#define max(x,y) (( x < y ) ? y : x ) +#define min(x, y) ((x > y) ? y : x) +#define max(x, y) ((x < y) ? y : x) #endif #ifndef _PIL_LIBTIFF_ @@ -32,22 +32,24 @@ typedef struct { toff_t loc; /* toff_t == uint32 */ tsize_t size; /* tsize_t == int32 */ int fp; - uint32 ifd; /* offset of the ifd, used for multipage - * Should be uint32 for libtiff 3.9.x - * uint64 for libtiff 4.0.x - */ - TIFF *tiff; /* Used in write */ + uint32 ifd; /* offset of the ifd, used for multipage + * Should be uint32 for libtiff 3.9.x + * uint64 for libtiff 4.0.x + */ + TIFF *tiff; /* Used in write */ toff_t eof; - int flrealloc;/* may we realloc */ + int flrealloc; /* may we realloc */ } TIFFSTATE; - - -extern int ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset); -extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); -extern int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length); -extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); - +extern int +ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset); +extern int +ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); +extern int +ImagingLibTiffMergeFieldInfo( + ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length); +extern int +ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); /* Trace debugging diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 917da6ab3..b4ba283b2 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -46,20 +46,28 @@ /* byte-swapping macros */ -#define C16N\ - (tmp[0]=in[0], tmp[1]=in[1]); -#define C16S\ - (tmp[1]=in[0], tmp[0]=in[1]); -#define C32N\ - (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3]); -#define C32S\ - (tmp[3]=in[0], tmp[2]=in[1], tmp[1]=in[2], tmp[0]=in[3]); -#define C64N\ - (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3],\ - tmp[4]=in[4], tmp[5]=in[5], tmp[6]=in[6], tmp[7]=in[7]); -#define C64S\ - (tmp[7]=in[0], tmp[6]=in[1], tmp[5]=in[2], tmp[4]=in[3],\ - tmp[3]=in[4], tmp[2]=in[5], tmp[1]=in[6], tmp[0]=in[7]); +#define C16N (tmp[0] = in[0], tmp[1] = in[1]); +#define C16S (tmp[1] = in[0], tmp[0] = in[1]); +#define C32N (tmp[0] = in[0], tmp[1] = in[1], tmp[2] = in[2], tmp[3] = in[3]); +#define C32S (tmp[3] = in[0], tmp[2] = in[1], tmp[1] = in[2], tmp[0] = in[3]); +#define C64N \ + (tmp[0] = in[0], \ + tmp[1] = in[1], \ + tmp[2] = in[2], \ + tmp[3] = in[3], \ + tmp[4] = in[4], \ + tmp[5] = in[5], \ + tmp[6] = in[6], \ + tmp[7] = in[7]); +#define C64S \ + (tmp[7] = in[0], \ + tmp[6] = in[1], \ + tmp[5] = in[2], \ + tmp[4] = in[3], \ + tmp[3] = in[4], \ + tmp[2] = in[5], \ + tmp[1] = in[6], \ + tmp[0] = in[7]); #ifdef WORDS_BIGENDIAN #define C16B C16N @@ -80,111 +88,163 @@ /* bit-swapping */ static UINT8 BITFLIP[] = { - 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, - 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, - 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, - 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, - 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, - 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, - 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, - 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, - 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, - 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, - 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, - 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, - 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, - 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, - 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, - 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, - 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, - 255 -}; + 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, + 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, + 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, + 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, + 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, + 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, + 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, + 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, + 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, + 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, + 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, + 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, + 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, + 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, + 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, + 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255}; /* Unpack to "1" image */ static void -unpack1(UINT8* out, const UINT8* in, int pixels) -{ +unpack1(UINT8 *out, const UINT8 *in, int pixels) { /* bits (msb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 7: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 6: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 5: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 4: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 3: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 2: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; - case 1: *out++ = (byte & 128) ? 255 : 0; + default: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 7: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 6: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 5: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 4: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 3: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 2: + *out++ = (byte & 128) ? 255 : 0; + byte <<= 1; + case 1: + *out++ = (byte & 128) ? 255 : 0; } pixels -= 8; } } static void -unpack1I(UINT8* out, const UINT8* in, int pixels) -{ +unpack1I(UINT8 *out, const UINT8 *in, int pixels) { /* bits (msb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 7: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 6: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 5: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 4: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 3: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 2: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; - case 1: *out++ = (byte & 128) ? 0 : 255; + default: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 7: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 6: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 5: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 4: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 3: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 2: + *out++ = (byte & 128) ? 0 : 255; + byte <<= 1; + case 1: + *out++ = (byte & 128) ? 0 : 255; } pixels -= 8; } } static void -unpack1R(UINT8* out, const UINT8* in, int pixels) -{ +unpack1R(UINT8 *out, const UINT8 *in, int pixels) { /* bits (lsb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 7: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 6: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 5: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 4: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 3: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 2: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; - case 1: *out++ = (byte & 1) ? 255 : 0; + default: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 7: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 6: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 5: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 4: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 3: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 2: + *out++ = (byte & 1) ? 255 : 0; + byte >>= 1; + case 1: + *out++ = (byte & 1) ? 255 : 0; } pixels -= 8; } } static void -unpack1IR(UINT8* out, const UINT8* in, int pixels) -{ +unpack1IR(UINT8 *out, const UINT8 *in, int pixels) { /* bits (lsb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 7: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 6: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 5: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 4: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 3: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 2: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; - case 1: *out++ = (byte & 1) ? 0 : 255; + default: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 7: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 6: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 5: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 4: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 3: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 2: + *out++ = (byte & 1) ? 0 : 255; + byte >>= 1; + case 1: + *out++ = (byte & 1) ? 0 : 255; } pixels -= 8; } } static void -unpack18(UINT8* out, const UINT8* in, int pixels) -{ +unpack18(UINT8 *out, const UINT8 *in, int pixels) { /* Unpack a '|b1' image, which is a numpy boolean. 1 == true, 0==false, in bytes */ @@ -194,160 +254,188 @@ unpack18(UINT8* out, const UINT8* in, int pixels) } } - - /* Unpack to "L" image */ static void -unpackL2(UINT8* out, const UINT8* in, int pixels) -{ +unpackL2(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (msb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 3: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 2: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 1: *out++ = ((byte >> 6) & 0x03U) * 0x55U; + default: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 3: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 2: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 1: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; } pixels -= 4; } } static void -unpackL2I(UINT8* out, const UINT8* in, int pixels) -{ +unpackL2I(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (msb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 3: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 2: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 1: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + default: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 3: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 2: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 1: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); } pixels -= 4; } } static void -unpackL2R(UINT8* out, const UINT8* in, int pixels) -{ +unpackL2R(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (bit order reversed, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; byte = BITFLIP[byte]; switch (pixels) { - default: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 3: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 2: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; - case 1: *out++ = ((byte >> 6) & 0x03U) * 0x55U; + default: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 3: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 2: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; + byte <<= 2; + case 1: + *out++ = ((byte >> 6) & 0x03U) * 0x55U; } pixels -= 4; } } static void -unpackL2IR(UINT8* out, const UINT8* in, int pixels) -{ +unpackL2IR(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (bit order reversed, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; byte = BITFLIP[byte]; switch (pixels) { - default: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 3: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 2: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; - case 1: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + default: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 3: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 2: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); + byte <<= 2; + case 1: + *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); } pixels -= 4; } } static void -unpackL4(UINT8* out, const UINT8* in, int pixels) -{ +unpackL4(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (msb first, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; byte <<= 4; - case 1: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; + default: + *out++ = ((byte >> 4) & 0x0FU) * 0x11U; + byte <<= 4; + case 1: + *out++ = ((byte >> 4) & 0x0FU) * 0x11U; } pixels -= 2; } } static void -unpackL4I(UINT8* out, const UINT8* in, int pixels) -{ +unpackL4I(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (msb first, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); byte <<= 4; - case 1: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); + default: + *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); + byte <<= 4; + case 1: + *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); } pixels -= 2; } } static void -unpackL4R(UINT8* out, const UINT8* in, int pixels) -{ +unpackL4R(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (bit order reversed, white is non-zero) */ while (pixels > 0) { UINT8 byte = *in++; byte = BITFLIP[byte]; switch (pixels) { - default: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; byte <<= 4; - case 1: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; + default: + *out++ = ((byte >> 4) & 0x0FU) * 0x11U; + byte <<= 4; + case 1: + *out++ = ((byte >> 4) & 0x0FU) * 0x11U; } pixels -= 2; } } static void -unpackL4IR(UINT8* out, const UINT8* in, int pixels) -{ +unpackL4IR(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles (bit order reversed, white is zero) */ while (pixels > 0) { UINT8 byte = *in++; byte = BITFLIP[byte]; switch (pixels) { - default: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); byte <<= 4; - case 1: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); + default: + *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); + byte <<= 4; + case 1: + *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); } pixels -= 2; } } static void -unpackLA(UINT8* _out, const UINT8* in, int pixels) -{ +unpackLA(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* LA, pixel interleaved */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[1]); memcpy(_out, &iv, sizeof(iv)); - in += 2; _out += 4; + in += 2; + _out += 4; } } static void -unpackLAL(UINT8* _out, const UINT8* in, int pixels) -{ +unpackLAL(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* LA, line interleaved */ - for (i = 0; i < pixels; i++, _out+=4) { - UINT32 iv = MAKE_UINT32(in[i], in[i], in[i], in[i+pixels]); + for (i = 0; i < pixels; i++, _out += 4) { + UINT32 iv = MAKE_UINT32(in[i], in[i], in[i], in[i + pixels]); memcpy(_out, &iv, sizeof(iv)); } } static void -unpackLI(UINT8* out, const UINT8* in, int pixels) -{ +unpackLI(UINT8 *out, const UINT8 *in, int pixels) { /* negative */ int i; for (i = 0; i < pixels; i++) { @@ -356,8 +444,7 @@ unpackLI(UINT8* out, const UINT8* in, int pixels) } static void -unpackLR(UINT8* out, const UINT8* in, int pixels) -{ +unpackLR(UINT8 *out, const UINT8 *in, int pixels) { int i; /* RGB, bit reversed */ for (i = 0; i < pixels; i++) { @@ -366,8 +453,7 @@ unpackLR(UINT8* out, const UINT8* in, int pixels) } static void -unpackL16(UINT8* out, const UINT8* in, int pixels) -{ +unpackL16(UINT8 *out, const UINT8 *in, int pixels) { /* int16 (upper byte, little endian) */ int i; for (i = 0; i < pixels; i++) { @@ -377,8 +463,7 @@ unpackL16(UINT8* out, const UINT8* in, int pixels) } static void -unpackL16B(UINT8* out, const UINT8* in, int pixels) -{ +unpackL16B(UINT8 *out, const UINT8 *in, int pixels) { int i; /* int16 (upper byte, big endian) */ for (i = 0; i < pixels; i++) { @@ -387,66 +472,86 @@ unpackL16B(UINT8* out, const UINT8* in, int pixels) } } - /* Unpack to "P" image */ static void -unpackP1(UINT8* out, const UINT8* in, int pixels) -{ +unpackP1(UINT8 *out, const UINT8 *in, int pixels) { /* bits */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte >> 7) & 1; byte <<= 1; - case 7: *out++ = (byte >> 7) & 1; byte <<= 1; - case 6: *out++ = (byte >> 7) & 1; byte <<= 1; - case 5: *out++ = (byte >> 7) & 1; byte <<= 1; - case 4: *out++ = (byte >> 7) & 1; byte <<= 1; - case 3: *out++ = (byte >> 7) & 1; byte <<= 1; - case 2: *out++ = (byte >> 7) & 1; byte <<= 1; - case 1: *out++ = (byte >> 7) & 1; + default: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 7: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 6: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 5: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 4: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 3: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 2: + *out++ = (byte >> 7) & 1; + byte <<= 1; + case 1: + *out++ = (byte >> 7) & 1; } pixels -= 8; } } static void -unpackP2(UINT8* out, const UINT8* in, int pixels) -{ +unpackP2(UINT8 *out, const UINT8 *in, int pixels) { /* bit pairs */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte >> 6) & 3; byte <<= 2; - case 3: *out++ = (byte >> 6) & 3; byte <<= 2; - case 2: *out++ = (byte >> 6) & 3; byte <<= 2; - case 1: *out++ = (byte >> 6) & 3; + default: + *out++ = (byte >> 6) & 3; + byte <<= 2; + case 3: + *out++ = (byte >> 6) & 3; + byte <<= 2; + case 2: + *out++ = (byte >> 6) & 3; + byte <<= 2; + case 1: + *out++ = (byte >> 6) & 3; } pixels -= 4; } } static void -unpackP4(UINT8* out, const UINT8* in, int pixels) -{ +unpackP4(UINT8 *out, const UINT8 *in, int pixels) { /* nibbles */ while (pixels > 0) { UINT8 byte = *in++; switch (pixels) { - default: *out++ = (byte >> 4) & 15; byte <<= 4; - case 1: *out++ = (byte >> 4) & 15; + default: + *out++ = (byte >> 4) & 15; + byte <<= 4; + case 1: + *out++ = (byte >> 4) & 15; } pixels -= 2; } } static void -unpackP2L(UINT8* out, const UINT8* in, int pixels) -{ +unpackP2L(UINT8 *out, const UINT8 *in, int pixels) { int i, j, m, s; /* bit layers */ m = 128; - s = (pixels+7)/8; + s = (pixels + 7) / 8; for (i = j = 0; i < pixels; i++) { out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0); if ((m >>= 1) == 0) { @@ -457,15 +562,14 @@ unpackP2L(UINT8* out, const UINT8* in, int pixels) } static void -unpackP4L(UINT8* out, const UINT8* in, int pixels) -{ +unpackP4L(UINT8 *out, const UINT8 *in, int pixels) { int i, j, m, s; /* bit layers (trust the optimizer ;-) */ m = 128; - s = (pixels+7)/8; + s = (pixels + 7) / 8; for (i = j = 0; i < pixels; i++) { out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0) + - ((in[j + 2*s] & m) ? 4 : 0) + ((in[j + 3*s] & m) ? 8 : 0); + ((in[j + 2 * s] & m) ? 4 : 0) + ((in[j + 3 * s] & m) ? 8 : 0); if ((m >>= 1) == 0) { m = 128; j++; @@ -473,403 +577,410 @@ unpackP4L(UINT8* out, const UINT8* in, int pixels) } } - /* Unpack to "RGB" image */ void -ImagingUnpackRGB(UINT8* _out, const UINT8* in, int pixels) -{ +ImagingUnpackRGB(UINT8 *_out, const UINT8 *in, int pixels) { int i = 0; /* RGB triplets */ - for (; i < pixels-1; i++) { + for (; i < pixels - 1; i++) { UINT32 iv; memcpy(&iv, in, sizeof(iv)); iv |= MASK_UINT32_CHANNEL_3; memcpy(_out, &iv, sizeof(iv)); - in += 3; _out += 4; + in += 3; + _out += 4; } for (; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[0], in[1], in[2], 255); memcpy(_out, &iv, sizeof(iv)); - in += 3; _out += 4; + in += 3; + _out += 4; } } void -unpackRGB16L(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGB16L(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* 16-bit RGB triplets, little-endian order */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], 255); memcpy(_out, &iv, sizeof(iv)); - in += 6; _out += 4; + in += 6; + _out += 4; } } void -unpackRGB16B(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGB16B(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* 16-bit RGB triplets, big-endian order */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], 255); memcpy(_out, &iv, sizeof(iv)); - in += 6; _out += 4; + in += 6; + _out += 4; } } static void -unpackRGBL(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBL(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, line interleaved */ - for (i = 0; i < pixels; i++, _out+=4) { - UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], 255); + for (i = 0; i < pixels; i++, _out += 4) { + UINT32 iv = MAKE_UINT32(in[i], in[i + pixels], in[i + pixels + pixels], 255); memcpy(_out, &iv, sizeof(iv)); } } static void -unpackRGBR(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBR(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, bit reversed */ for (i = 0; i < pixels; i++) { - UINT32 iv = MAKE_UINT32(BITFLIP[in[0]], BITFLIP[in[1]], - BITFLIP[in[2]], 255); + UINT32 iv = MAKE_UINT32(BITFLIP[in[0]], BITFLIP[in[1]], BITFLIP[in[2]], 255); memcpy(_out, &iv, sizeof(iv)); - in += 3; _out += 4; + in += 3; + _out += 4; } } void -ImagingUnpackBGR(UINT8* _out, const UINT8* in, int pixels) -{ +ImagingUnpackBGR(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, reversed bytes */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); memcpy(_out, &iv, sizeof(iv)); - in += 3; _out += 4; + in += 3; + _out += 4; } } void -ImagingUnpackRGB15(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackRGB15(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, 5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 31) * 255 / 31; - out[B] = ((pixel>>10) & 31) * 255 / 31; + out[G] = ((pixel >> 5) & 31) * 255 / 31; + out[B] = ((pixel >> 10) & 31) * 255 / 31; out[A] = 255; - out += 4; in += 2; + out += 4; + in += 2; } } void -ImagingUnpackRGBA15(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackRGBA15(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, 5/5/5/1 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 31) * 255 / 31; - out[B] = ((pixel>>10) & 31) * 255 / 31; - out[A] = (pixel>>15) * 255; - out += 4; in += 2; + out[G] = ((pixel >> 5) & 31) * 255 / 31; + out[B] = ((pixel >> 10) & 31) * 255 / 31; + out[A] = (pixel >> 15) * 255; + out += 4; + in += 2; } } void -ImagingUnpackBGR15(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackBGR15(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 31) * 255 / 31; - out[R] = ((pixel>>10) & 31) * 255 / 31; + out[G] = ((pixel >> 5) & 31) * 255 / 31; + out[R] = ((pixel >> 10) & 31) * 255 / 31; out[A] = 255; - out += 4; in += 2; + out += 4; + in += 2; } } void -ImagingUnpackBGRA15(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackBGRA15(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5/5/5/1 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 31) * 255 / 31; - out[R] = ((pixel>>10) & 31) * 255 / 31; - out[A] = (pixel>>15) * 255; - out += 4; in += 2; + out[G] = ((pixel >> 5) & 31) * 255 / 31; + out[R] = ((pixel >> 10) & 31) * 255 / 31; + out[A] = (pixel >> 15) * 255; + out += 4; + in += 2; } } void -ImagingUnpackRGB16(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackRGB16(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, 5/6/5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 63) * 255 / 63; - out[B] = ((pixel>>11) & 31) * 255 / 31; + out[G] = ((pixel >> 5) & 63) * 255 / 63; + out[B] = ((pixel >> 11) & 31) * 255 / 31; out[A] = 255; - out += 4; in += 2; + out += 4; + in += 2; } } void -ImagingUnpackBGR16(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackBGR16(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, reversed bytes, 5/6/5 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[B] = (pixel & 31) * 255 / 31; - out[G] = ((pixel>>5) & 63) * 255 / 63; - out[R] = ((pixel>>11) & 31) * 255 / 31; + out[G] = ((pixel >> 5) & 63) * 255 / 63; + out[R] = ((pixel >> 11) & 31) * 255 / 31; out[A] = 255; - out += 4; in += 2; + out += 4; + in += 2; } } void -ImagingUnpackRGB4B(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackRGB4B(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGB, 4 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 15) * 17; - out[G] = ((pixel>>4) & 15) * 17; - out[B] = ((pixel>>8) & 15) * 17; + out[G] = ((pixel >> 4) & 15) * 17; + out[B] = ((pixel >> 8) & 15) * 17; out[A] = 255; - out += 4; in += 2; + out += 4; + in += 2; } } void -ImagingUnpackRGBA4B(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackRGBA4B(UINT8 *out, const UINT8 *in, int pixels) { int i, pixel; /* RGBA, 4 bits per pixel */ for (i = 0; i < pixels; i++) { pixel = in[0] + (in[1] << 8); out[R] = (pixel & 15) * 17; - out[G] = ((pixel>>4) & 15) * 17; - out[B] = ((pixel>>8) & 15) * 17; - out[A] = ((pixel>>12) & 15) * 17; - out += 4; in += 2; + out[G] = ((pixel >> 4) & 15) * 17; + out[B] = ((pixel >> 8) & 15) * 17; + out[A] = ((pixel >> 12) & 15) * 17; + out += 4; + in += 2; } } static void -ImagingUnpackBGRX(UINT8* _out, const UINT8* in, int pixels) -{ +ImagingUnpackBGRX(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, reversed bytes with padding */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -ImagingUnpackXRGB(UINT8* _out, const UINT8* in, int pixels) -{ +ImagingUnpackXRGB(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, leading pad */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], 255); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -ImagingUnpackXBGR(UINT8* _out, const UINT8* in, int pixels) -{ +ImagingUnpackXBGR(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGB, reversed bytes, leading pad */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], 255); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } /* Unpack to "RGBA" image */ static void -unpackRGBALA(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBALA(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* greyscale with alpha */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[1]); memcpy(_out, &iv, sizeof(iv)); - in += 2; _out += 4; + in += 2; + _out += 4; } } static void -unpackRGBALA16B(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBALA16B(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* 16-bit greyscale with alpha, big-endian */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[2]); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -unpackRGBa16L(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBa16L(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* premultiplied 16-bit RGBA, little-endian */ for (i = 0; i < pixels; i++) { int a = in[7]; UINT32 iv; - if ( ! a) { + if (!a) { iv = 0; } else if (a == 255) { iv = MAKE_UINT32(in[1], in[3], in[5], a); } else { - iv = MAKE_UINT32(CLIP8(in[1] * 255 / a), - CLIP8(in[3] * 255 / a), - CLIP8(in[5] * 255 / a), a); + iv = MAKE_UINT32( + CLIP8(in[1] * 255 / a), + CLIP8(in[3] * 255 / a), + CLIP8(in[5] * 255 / a), + a); } memcpy(_out, &iv, sizeof(iv)); - in += 8; _out += 4; + in += 8; + _out += 4; } } static void -unpackRGBa16B(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBa16B(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* premultiplied 16-bit RGBA, big-endian */ for (i = 0; i < pixels; i++) { int a = in[6]; UINT32 iv; - if ( ! a) { + if (!a) { iv = 0; } else if (a == 255) { iv = MAKE_UINT32(in[0], in[2], in[4], a); } else { - iv = MAKE_UINT32(CLIP8(in[0] * 255 / a), - CLIP8(in[2] * 255 / a), - CLIP8(in[4] * 255 / a), a); + iv = MAKE_UINT32( + CLIP8(in[0] * 255 / a), + CLIP8(in[2] * 255 / a), + CLIP8(in[4] * 255 / a), + a); } memcpy(_out, &iv, sizeof(iv)); - in += 8; _out += 4; + in += 8; + _out += 4; } } static void -unpackRGBa(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBa(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* premultiplied RGBA */ for (i = 0; i < pixels; i++) { int a = in[3]; UINT32 iv; - if ( ! a) { + if (!a) { iv = 0; } else if (a == 255) { iv = MAKE_UINT32(in[0], in[1], in[2], a); } else { - iv = MAKE_UINT32(CLIP8(in[0] * 255 / a), - CLIP8(in[1] * 255 / a), - CLIP8(in[2] * 255 / a), a); + iv = MAKE_UINT32( + CLIP8(in[0] * 255 / a), + CLIP8(in[1] * 255 / a), + CLIP8(in[2] * 255 / a), + a); } memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -unpackRGBaskip1(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBaskip1(UINT8 *_out, const UINT8 *in, int pixels) { int i; - UINT32* out = (UINT32*) _out; + UINT32 *out = (UINT32 *)_out; /* premultiplied RGBA */ for (i = 0; i < pixels; i++) { int a = in[3]; - if ( ! a) { + if (!a) { out[i] = 0; } else if (a == 255) { out[i] = MAKE_UINT32(in[0], in[1], in[2], a); } else { - out[i] = MAKE_UINT32(CLIP8(in[0] * 255 / a), - CLIP8(in[1] * 255 / a), - CLIP8(in[2] * 255 / a), a); + out[i] = MAKE_UINT32( + CLIP8(in[0] * 255 / a), + CLIP8(in[1] * 255 / a), + CLIP8(in[2] * 255 / a), + a); } in += 5; } } static void -unpackRGBaskip2(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBaskip2(UINT8 *_out, const UINT8 *in, int pixels) { int i; - UINT32* out = (UINT32*) _out; + UINT32 *out = (UINT32 *)_out; /* premultiplied RGBA */ for (i = 0; i < pixels; i++) { int a = in[3]; - if ( ! a) { + if (!a) { out[i] = 0; } else if (a == 255) { out[i] = MAKE_UINT32(in[0], in[1], in[2], a); } else { - out[i] = MAKE_UINT32(CLIP8(in[0] * 255 / a), - CLIP8(in[1] * 255 / a), - CLIP8(in[2] * 255 / a), a); + out[i] = MAKE_UINT32( + CLIP8(in[0] * 255 / a), + CLIP8(in[1] * 255 / a), + CLIP8(in[2] * 255 / a), + a); } in += 6; } } static void -unpackBGRa(UINT8* _out, const UINT8* in, int pixels) -{ +unpackBGRa(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* premultiplied BGRA */ for (i = 0; i < pixels; i++) { int a = in[3]; UINT32 iv; - if ( ! a) { + if (!a) { iv = 0; } else if (a == 255) { iv = MAKE_UINT32(in[2], in[1], in[0], a); } else { - iv = MAKE_UINT32(CLIP8(in[2] * 255 / a), - CLIP8(in[1] * 255 / a), - CLIP8(in[0] * 255 / a), a); + iv = MAKE_UINT32( + CLIP8(in[2] * 255 / a), + CLIP8(in[1] * 255 / a), + CLIP8(in[0] * 255 / a), + a); } memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -unpackRGBAI(UINT8* out, const UINT8* in, int pixels) -{ +unpackRGBAI(UINT8 *out, const UINT8 *in, int pixels) { int i; /* RGBA, inverted RGB bytes (FlashPix) */ for (i = 0; i < pixels; i++) { @@ -877,28 +988,30 @@ unpackRGBAI(UINT8* out, const UINT8* in, int pixels) out[G] = ~in[1]; out[B] = ~in[2]; out[A] = in[3]; - out += 4; in += 4; + out += 4; + in += 4; } } static void -unpackRGBAL(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBAL(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGBA, line interleaved */ - for (i = 0; i < pixels; i++, _out+=4) { - UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], - in[i+pixels+pixels+pixels]); + for (i = 0; i < pixels; i++, _out += 4) { + UINT32 iv = MAKE_UINT32( + in[i], + in[i + pixels], + in[i + pixels + pixels], + in[i + pixels + pixels + pixels]); memcpy(_out, &iv, sizeof(iv)); } } void -unpackRGBA16L(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBA16L(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* 16-bit RGBA, little-endian order */ - for (i = 0; i < pixels; i++, _out+=4) { + for (i = 0; i < pixels; i++, _out += 4) { UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], in[7]); memcpy(_out, &iv, sizeof(iv)); in += 8; @@ -906,11 +1019,10 @@ unpackRGBA16L(UINT8* _out, const UINT8* in, int pixels) } void -unpackRGBA16B(UINT8* _out, const UINT8* in, int pixels) -{ +unpackRGBA16B(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* 16-bit RGBA, big-endian order */ - for (i = 0; i < pixels; i++, _out+=4) { + for (i = 0; i < pixels; i++, _out += 4) { UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], in[6]); memcpy(_out, &iv, sizeof(iv)); in += 8; @@ -918,53 +1030,52 @@ unpackRGBA16B(UINT8* _out, const UINT8* in, int pixels) } static void -unpackARGB(UINT8* _out, const UINT8* in, int pixels) -{ +unpackARGB(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGBA, leading pad */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], in[0]); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -unpackABGR(UINT8* _out, const UINT8* in, int pixels) -{ +unpackABGR(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGBA, reversed bytes */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], in[0]); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } static void -unpackBGRA(UINT8* _out, const UINT8* in, int pixels) -{ +unpackBGRA(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* RGBA, reversed bytes */ for (i = 0; i < pixels; i++) { UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], in[3]); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } - /* Unpack to "CMYK" image */ static void -unpackCMYKI(UINT8* _out, const UINT8* in, int pixels) -{ +unpackCMYKI(UINT8 *_out, const UINT8 *in, int pixels) { int i; /* CMYK, inverted bytes (Photoshop 2.5) */ for (i = 0; i < pixels; i++) { UINT32 iv = ~MAKE_UINT32(in[0], in[1], in[2], in[3]); memcpy(_out, &iv, sizeof(iv)); - in += 4; _out += 4; + in += 4; + _out += 4; } } @@ -980,8 +1091,7 @@ unpackCMYKI(UINT8* _out, const UINT8* in, int pixels) internally, and we'll unshift for saving and whatnot. */ void -ImagingUnpackLAB(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackLAB(UINT8 *out, const UINT8 *in, int pixels) { int i; /* LAB triplets */ for (i = 0; i < pixels; i++) { @@ -989,32 +1099,34 @@ ImagingUnpackLAB(UINT8* out, const UINT8* in, int pixels) out[1] = in[1] ^ 128; /* signed in outside world */ out[2] = in[2] ^ 128; out[3] = 255; - out += 4; in += 3; + out += 4; + in += 3; } } static void -unpackI16N_I16B(UINT8* out, const UINT8* in, int pixels){ +unpackI16N_I16B(UINT8 *out, const UINT8 *in, int pixels) { int i; - UINT8* tmp = (UINT8*) out; + UINT8 *tmp = (UINT8 *)out; for (i = 0; i < pixels; i++) { C16B; - in += 2; tmp += 2; + in += 2; + tmp += 2; } - } static void -unpackI16N_I16(UINT8* out, const UINT8* in, int pixels){ +unpackI16N_I16(UINT8 *out, const UINT8 *in, int pixels) { int i; - UINT8* tmp = (UINT8*) out; + UINT8 *tmp = (UINT8 *)out; for (i = 0; i < pixels; i++) { C16L; - in += 2; tmp += 2; + in += 2; + tmp += 2; } } static void -unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ +unpackI12_I16(UINT8 *out, const UINT8 *in, int pixels) { /* Fillorder 1/MSB -> LittleEndian, for 12bit integer greyscale tiffs. According to the TIFF spec: @@ -1036,103 +1148,100 @@ unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ int i; UINT16 pixel; #ifdef WORDS_BIGENDIAN - UINT8* tmp = (UINT8 *)&pixel; + UINT8 *tmp = (UINT8 *)&pixel; #endif - for (i = 0; i < pixels-1; i+=2) { - pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); + for (i = 0; i < pixels - 1; i += 2) { + pixel = (((UINT16)in[0]) << 4) + (in[1] >> 4); #ifdef WORDS_BIGENDIAN - out[0] = tmp[1]; out[1] = tmp[0]; + out[0] = tmp[1]; + out[1] = tmp[0]; #else memcpy(out, &pixel, sizeof(pixel)); #endif - out+=2; - pixel = (((UINT16) (in[1] & 0x0F)) << 8) + in[2]; + out += 2; + pixel = (((UINT16)(in[1] & 0x0F)) << 8) + in[2]; #ifdef WORDS_BIGENDIAN - out[0] = tmp[1]; out[1] = tmp[0]; + out[0] = tmp[1]; + out[1] = tmp[0]; #else memcpy(out, &pixel, sizeof(pixel)); #endif - in += 3; out+=2; + in += 3; + out += 2; } - if (i == pixels-1) { - pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); + if (i == pixels - 1) { + pixel = (((UINT16)in[0]) << 4) + (in[1] >> 4); #ifdef WORDS_BIGENDIAN - out[0] = tmp[1]; out[1] = tmp[0]; + out[0] = tmp[1]; + out[1] = tmp[0]; #else memcpy(out, &pixel, sizeof(pixel)); #endif } } - static void -copy1(UINT8* out, const UINT8* in, int pixels) -{ +copy1(UINT8 *out, const UINT8 *in, int pixels) { /* L, P */ memcpy(out, in, pixels); } static void -copy2(UINT8* out, const UINT8* in, int pixels) -{ +copy2(UINT8 *out, const UINT8 *in, int pixels) { /* I;16 */ - memcpy(out, in, pixels*2); + memcpy(out, in, pixels * 2); } static void -copy4(UINT8* out, const UINT8* in, int pixels) -{ +copy4(UINT8 *out, const UINT8 *in, int pixels) { /* RGBA, CMYK quadruples */ memcpy(out, in, 4 * pixels); } static void -copy4skip1(UINT8* _out, const UINT8* in, int pixels) -{ +copy4skip1(UINT8 *_out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++) { memcpy(_out, in, 4); - in += 5; _out += 4; + in += 5; + _out += 4; } } static void -copy4skip2(UINT8* _out, const UINT8* in, int pixels) -{ +copy4skip2(UINT8 *_out, const UINT8 *in, int pixels) { int i; for (i = 0; i < pixels; i++) { memcpy(_out, in, 4); - in += 6; _out += 4; + in += 6; + _out += 4; } } - /* Unpack to "I" and "F" images */ -#define UNPACK_RAW(NAME, GET, INTYPE, OUTTYPE)\ -static void NAME(UINT8* out_, const UINT8* in, int pixels)\ -{\ - int i;\ - OUTTYPE* out = (OUTTYPE*) out_;\ - for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) {\ - out[i] = (OUTTYPE) ((INTYPE) GET);\ - }\ -} +#define UNPACK_RAW(NAME, GET, INTYPE, OUTTYPE) \ + static void NAME(UINT8 *out_, const UINT8 *in, int pixels) { \ + int i; \ + OUTTYPE *out = (OUTTYPE *)out_; \ + for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) { \ + out[i] = (OUTTYPE)((INTYPE)GET); \ + } \ + } -#define UNPACK(NAME, COPY, INTYPE, OUTTYPE)\ -static void NAME(UINT8* out_, const UINT8* in, int pixels)\ -{\ - int i;\ - OUTTYPE* out = (OUTTYPE*) out_;\ - INTYPE tmp_;\ - UINT8* tmp = (UINT8*) &tmp_;\ - for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) {\ - COPY;\ - out[i] = (OUTTYPE) tmp_;\ - }\ -} +#define UNPACK(NAME, COPY, INTYPE, OUTTYPE) \ + static void NAME(UINT8 *out_, const UINT8 *in, int pixels) { \ + int i; \ + OUTTYPE *out = (OUTTYPE *)out_; \ + INTYPE tmp_; \ + UINT8 *tmp = (UINT8 *)&tmp_; \ + for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) { \ + COPY; \ + out[i] = (OUTTYPE)tmp_; \ + } \ + } UNPACK_RAW(unpackI8, in[0], UINT8, INT32) UNPACK_RAW(unpackI8S, in[0], INT8, INT32) @@ -1172,12 +1281,10 @@ UNPACK(unpackF64BF, C64B, FLOAT64, FLOAT32) UNPACK(unpackF64NF, C64N, FLOAT64, FLOAT32) #endif - /* Misc. unpackers */ static void -band0(UINT8* out, const UINT8* in, int pixels) -{ +band0(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 0 only */ for (i = 0; i < pixels; i++) { @@ -1187,8 +1294,7 @@ band0(UINT8* out, const UINT8* in, int pixels) } static void -band1(UINT8* out, const UINT8* in, int pixels) -{ +band1(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 1 only */ for (i = 0; i < pixels; i++) { @@ -1198,8 +1304,7 @@ band1(UINT8* out, const UINT8* in, int pixels) } static void -band2(UINT8* out, const UINT8* in, int pixels) -{ +band2(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 2 only */ for (i = 0; i < pixels; i++) { @@ -1209,8 +1314,7 @@ band2(UINT8* out, const UINT8* in, int pixels) } static void -band3(UINT8* out, const UINT8* in, int pixels) -{ +band3(UINT8 *out, const UINT8 *in, int pixels) { /* band 3 only */ int i; for (i = 0; i < pixels; i++) { @@ -1220,8 +1324,7 @@ band3(UINT8* out, const UINT8* in, int pixels) } static void -band0I(UINT8* out, const UINT8* in, int pixels) -{ +band0I(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 0 only */ for (i = 0; i < pixels; i++) { @@ -1231,8 +1334,7 @@ band0I(UINT8* out, const UINT8* in, int pixels) } static void -band1I(UINT8* out, const UINT8* in, int pixels) -{ +band1I(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 1 only */ for (i = 0; i < pixels; i++) { @@ -1242,8 +1344,7 @@ band1I(UINT8* out, const UINT8* in, int pixels) } static void -band2I(UINT8* out, const UINT8* in, int pixels) -{ +band2I(UINT8 *out, const UINT8 *in, int pixels) { int i; /* band 2 only */ for (i = 0; i < pixels; i++) { @@ -1253,8 +1354,7 @@ band2I(UINT8* out, const UINT8* in, int pixels) } static void -band3I(UINT8* out, const UINT8* in, int pixels) -{ +band3I(UINT8 *out, const UINT8 *in, int pixels) { /* band 3 only */ int i; for (i = 0; i < pixels; i++) { @@ -1264,8 +1364,8 @@ band3I(UINT8* out, const UINT8* in, int pixels) } static struct { - const char* mode; - const char* rawmode; + const char *mode; + const char *rawmode; int bits; ImagingShuffler unpack; } unpackers[] = { @@ -1282,244 +1382,242 @@ static struct { /* exception: rawmodes "I" and "F" are always native endian byte order */ /* bilevel */ - {"1", "1", 1, unpack1}, - {"1", "1;I", 1, unpack1I}, - {"1", "1;R", 1, unpack1R}, - {"1", "1;IR", 1, unpack1IR}, - {"1", "1;8", 8, unpack18}, + {"1", "1", 1, unpack1}, + {"1", "1;I", 1, unpack1I}, + {"1", "1;R", 1, unpack1R}, + {"1", "1;IR", 1, unpack1IR}, + {"1", "1;8", 8, unpack18}, /* greyscale */ - {"L", "L;2", 2, unpackL2}, - {"L", "L;2I", 2, unpackL2I}, - {"L", "L;2R", 2, unpackL2R}, - {"L", "L;2IR", 2, unpackL2IR}, + {"L", "L;2", 2, unpackL2}, + {"L", "L;2I", 2, unpackL2I}, + {"L", "L;2R", 2, unpackL2R}, + {"L", "L;2IR", 2, unpackL2IR}, - {"L", "L;4", 4, unpackL4}, - {"L", "L;4I", 4, unpackL4I}, - {"L", "L;4R", 4, unpackL4R}, - {"L", "L;4IR", 4, unpackL4IR}, + {"L", "L;4", 4, unpackL4}, + {"L", "L;4I", 4, unpackL4I}, + {"L", "L;4R", 4, unpackL4R}, + {"L", "L;4IR", 4, unpackL4IR}, - {"L", "L", 8, copy1}, - {"L", "L;I", 8, unpackLI}, - {"L", "L;R", 8, unpackLR}, - {"L", "L;16", 16, unpackL16}, - {"L", "L;16B", 16, unpackL16B}, + {"L", "L", 8, copy1}, + {"L", "L;I", 8, unpackLI}, + {"L", "L;R", 8, unpackLR}, + {"L", "L;16", 16, unpackL16}, + {"L", "L;16B", 16, unpackL16B}, /* greyscale w. alpha */ - {"LA", "LA", 16, unpackLA}, - {"LA", "LA;L", 16, unpackLAL}, + {"LA", "LA", 16, unpackLA}, + {"LA", "LA;L", 16, unpackLAL}, /* greyscale w. alpha premultiplied */ - {"La", "La", 16, unpackLA}, + {"La", "La", 16, unpackLA}, /* palette */ - {"P", "P;1", 1, unpackP1}, - {"P", "P;2", 2, unpackP2}, - {"P", "P;2L", 2, unpackP2L}, - {"P", "P;4", 4, unpackP4}, - {"P", "P;4L", 4, unpackP4L}, - {"P", "P", 8, copy1}, - {"P", "P;R", 8, unpackLR}, + {"P", "P;1", 1, unpackP1}, + {"P", "P;2", 2, unpackP2}, + {"P", "P;2L", 2, unpackP2L}, + {"P", "P;4", 4, unpackP4}, + {"P", "P;4L", 4, unpackP4L}, + {"P", "P", 8, copy1}, + {"P", "P;R", 8, unpackLR}, /* palette w. alpha */ - {"PA", "PA", 16, unpackLA}, - {"PA", "PA;L", 16, unpackLAL}, + {"PA", "PA", 16, unpackLA}, + {"PA", "PA;L", 16, unpackLAL}, /* true colour */ - {"RGB", "RGB", 24, ImagingUnpackRGB}, - {"RGB", "RGB;L", 24, unpackRGBL}, - {"RGB", "RGB;R", 24, unpackRGBR}, - {"RGB", "RGB;16L", 48, unpackRGB16L}, - {"RGB", "RGB;16B", 48, unpackRGB16B}, - {"RGB", "BGR", 24, ImagingUnpackBGR}, - {"RGB", "RGB;15", 16, ImagingUnpackRGB15}, - {"RGB", "BGR;15", 16, ImagingUnpackBGR15}, - {"RGB", "RGB;16", 16, ImagingUnpackRGB16}, - {"RGB", "BGR;16", 16, ImagingUnpackBGR16}, - {"RGB", "RGB;4B", 16, ImagingUnpackRGB4B}, - {"RGB", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ - {"RGB", "RGBX", 32, copy4}, - {"RGB", "RGBX;L", 32, unpackRGBAL}, - {"RGB", "RGBA;L", 32, unpackRGBAL}, - {"RGB", "BGRX", 32, ImagingUnpackBGRX}, - {"RGB", "XRGB", 32, ImagingUnpackXRGB}, - {"RGB", "XBGR", 32, ImagingUnpackXBGR}, - {"RGB", "YCC;P", 24, ImagingUnpackYCC}, - {"RGB", "R", 8, band0}, - {"RGB", "G", 8, band1}, - {"RGB", "B", 8, band2}, + {"RGB", "RGB", 24, ImagingUnpackRGB}, + {"RGB", "RGB;L", 24, unpackRGBL}, + {"RGB", "RGB;R", 24, unpackRGBR}, + {"RGB", "RGB;16L", 48, unpackRGB16L}, + {"RGB", "RGB;16B", 48, unpackRGB16B}, + {"RGB", "BGR", 24, ImagingUnpackBGR}, + {"RGB", "RGB;15", 16, ImagingUnpackRGB15}, + {"RGB", "BGR;15", 16, ImagingUnpackBGR15}, + {"RGB", "RGB;16", 16, ImagingUnpackRGB16}, + {"RGB", "BGR;16", 16, ImagingUnpackBGR16}, + {"RGB", "RGB;4B", 16, ImagingUnpackRGB4B}, + {"RGB", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ + {"RGB", "RGBX", 32, copy4}, + {"RGB", "RGBX;L", 32, unpackRGBAL}, + {"RGB", "RGBA;L", 32, unpackRGBAL}, + {"RGB", "BGRX", 32, ImagingUnpackBGRX}, + {"RGB", "XRGB", 32, ImagingUnpackXRGB}, + {"RGB", "XBGR", 32, ImagingUnpackXBGR}, + {"RGB", "YCC;P", 24, ImagingUnpackYCC}, + {"RGB", "R", 8, band0}, + {"RGB", "G", 8, band1}, + {"RGB", "B", 8, band2}, /* true colour w. alpha */ - {"RGBA", "LA", 16, unpackRGBALA}, - {"RGBA", "LA;16B", 32, unpackRGBALA16B}, - {"RGBA", "RGBA", 32, copy4}, - {"RGBA", "RGBAX", 40, copy4skip1}, - {"RGBA", "RGBAXX", 48, copy4skip2}, - {"RGBA", "RGBa", 32, unpackRGBa}, - {"RGBA", "RGBaX", 40, unpackRGBaskip1}, - {"RGBA", "RGBaXX", 48, unpackRGBaskip2}, - {"RGBA", "RGBa;16L", 64, unpackRGBa16L}, - {"RGBA", "RGBa;16B", 64, unpackRGBa16B}, - {"RGBA", "BGRa", 32, unpackBGRa}, - {"RGBA", "RGBA;I", 32, unpackRGBAI}, - {"RGBA", "RGBA;L", 32, unpackRGBAL}, - {"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15}, - {"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15}, - {"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B}, - {"RGBA", "RGBA;16L", 64, unpackRGBA16L}, - {"RGBA", "RGBA;16B", 64, unpackRGBA16B}, - {"RGBA", "BGRA", 32, unpackBGRA}, - {"RGBA", "ARGB", 32, unpackARGB}, - {"RGBA", "ABGR", 32, unpackABGR}, - {"RGBA", "YCCA;P", 32, ImagingUnpackYCCA}, - {"RGBA", "R", 8, band0}, - {"RGBA", "G", 8, band1}, - {"RGBA", "B", 8, band2}, - {"RGBA", "A", 8, band3}, + {"RGBA", "LA", 16, unpackRGBALA}, + {"RGBA", "LA;16B", 32, unpackRGBALA16B}, + {"RGBA", "RGBA", 32, copy4}, + {"RGBA", "RGBAX", 40, copy4skip1}, + {"RGBA", "RGBAXX", 48, copy4skip2}, + {"RGBA", "RGBa", 32, unpackRGBa}, + {"RGBA", "RGBaX", 40, unpackRGBaskip1}, + {"RGBA", "RGBaXX", 48, unpackRGBaskip2}, + {"RGBA", "RGBa;16L", 64, unpackRGBa16L}, + {"RGBA", "RGBa;16B", 64, unpackRGBa16B}, + {"RGBA", "BGRa", 32, unpackBGRa}, + {"RGBA", "RGBA;I", 32, unpackRGBAI}, + {"RGBA", "RGBA;L", 32, unpackRGBAL}, + {"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15}, + {"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15}, + {"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B}, + {"RGBA", "RGBA;16L", 64, unpackRGBA16L}, + {"RGBA", "RGBA;16B", 64, unpackRGBA16B}, + {"RGBA", "BGRA", 32, unpackBGRA}, + {"RGBA", "ARGB", 32, unpackARGB}, + {"RGBA", "ABGR", 32, unpackABGR}, + {"RGBA", "YCCA;P", 32, ImagingUnpackYCCA}, + {"RGBA", "R", 8, band0}, + {"RGBA", "G", 8, band1}, + {"RGBA", "B", 8, band2}, + {"RGBA", "A", 8, band3}, #ifdef WORDS_BIGENDIAN - {"RGB", "RGB;16N", 48, unpackRGB16B}, - {"RGBA", "RGBa;16N", 64, unpackRGBa16B}, - {"RGBA", "RGBA;16N", 64, unpackRGBA16B}, - {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, + {"RGB", "RGB;16N", 48, unpackRGB16B}, + {"RGBA", "RGBa;16N", 64, unpackRGBa16B}, + {"RGBA", "RGBA;16N", 64, unpackRGBA16B}, + {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, #else - {"RGB", "RGB;16N", 48, unpackRGB16L}, - {"RGBA", "RGBa;16N", 64, unpackRGBa16L}, - {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, - {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, + {"RGB", "RGB;16N", 48, unpackRGB16L}, + {"RGBA", "RGBa;16N", 64, unpackRGBa16L}, + {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, + {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, #endif /* true colour w. alpha premultiplied */ - {"RGBa", "RGBa", 32, copy4}, - {"RGBa", "BGRa", 32, unpackBGRA}, - {"RGBa", "aRGB", 32, unpackARGB}, - {"RGBa", "aBGR", 32, unpackABGR}, + {"RGBa", "RGBa", 32, copy4}, + {"RGBa", "BGRa", 32, unpackBGRA}, + {"RGBa", "aRGB", 32, unpackARGB}, + {"RGBa", "aBGR", 32, unpackABGR}, /* true colour w. padding */ - {"RGBX", "RGB", 24, ImagingUnpackRGB}, - {"RGBX", "RGB;L", 24, unpackRGBL}, - {"RGBX", "RGB;16B", 48, unpackRGB16B}, - {"RGBX", "BGR", 24, ImagingUnpackBGR}, - {"RGBX", "RGB;15", 16, ImagingUnpackRGB15}, - {"RGBX", "BGR;15", 16, ImagingUnpackBGR15}, - {"RGBX", "RGB;4B", 16, ImagingUnpackRGB4B}, - {"RGBX", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ - {"RGBX", "RGBX", 32, copy4}, - {"RGBX", "RGBXX", 40, copy4skip1}, - {"RGBX", "RGBXXX", 48, copy4skip2}, - {"RGBX", "RGBX;L", 32, unpackRGBAL}, - {"RGBX", "RGBX;16L", 64, unpackRGBA16L}, - {"RGBX", "RGBX;16B", 64, unpackRGBA16B}, - {"RGBX", "BGRX", 32, ImagingUnpackBGRX}, - {"RGBX", "XRGB", 32, ImagingUnpackXRGB}, - {"RGBX", "XBGR", 32, ImagingUnpackXBGR}, - {"RGBX", "YCC;P", 24, ImagingUnpackYCC}, - {"RGBX", "R", 8, band0}, - {"RGBX", "G", 8, band1}, - {"RGBX", "B", 8, band2}, - {"RGBX", "X", 8, band3}, + {"RGBX", "RGB", 24, ImagingUnpackRGB}, + {"RGBX", "RGB;L", 24, unpackRGBL}, + {"RGBX", "RGB;16B", 48, unpackRGB16B}, + {"RGBX", "BGR", 24, ImagingUnpackBGR}, + {"RGBX", "RGB;15", 16, ImagingUnpackRGB15}, + {"RGBX", "BGR;15", 16, ImagingUnpackBGR15}, + {"RGBX", "RGB;4B", 16, ImagingUnpackRGB4B}, + {"RGBX", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ + {"RGBX", "RGBX", 32, copy4}, + {"RGBX", "RGBXX", 40, copy4skip1}, + {"RGBX", "RGBXXX", 48, copy4skip2}, + {"RGBX", "RGBX;L", 32, unpackRGBAL}, + {"RGBX", "RGBX;16L", 64, unpackRGBA16L}, + {"RGBX", "RGBX;16B", 64, unpackRGBA16B}, + {"RGBX", "BGRX", 32, ImagingUnpackBGRX}, + {"RGBX", "XRGB", 32, ImagingUnpackXRGB}, + {"RGBX", "XBGR", 32, ImagingUnpackXBGR}, + {"RGBX", "YCC;P", 24, ImagingUnpackYCC}, + {"RGBX", "R", 8, band0}, + {"RGBX", "G", 8, band1}, + {"RGBX", "B", 8, band2}, + {"RGBX", "X", 8, band3}, /* colour separation */ - {"CMYK", "CMYK", 32, copy4}, - {"CMYK", "CMYKX", 40, copy4skip1}, - {"CMYK", "CMYKXX", 48, copy4skip2}, - {"CMYK", "CMYK;I", 32, unpackCMYKI}, - {"CMYK", "CMYK;L", 32, unpackRGBAL}, - {"CMYK", "CMYK;16L", 64, unpackRGBA16L}, - {"CMYK", "CMYK;16B", 64, unpackRGBA16B}, - {"CMYK", "C", 8, band0}, - {"CMYK", "M", 8, band1}, - {"CMYK", "Y", 8, band2}, - {"CMYK", "K", 8, band3}, - {"CMYK", "C;I", 8, band0I}, - {"CMYK", "M;I", 8, band1I}, - {"CMYK", "Y;I", 8, band2I}, - {"CMYK", "K;I", 8, band3I}, + {"CMYK", "CMYK", 32, copy4}, + {"CMYK", "CMYKX", 40, copy4skip1}, + {"CMYK", "CMYKXX", 48, copy4skip2}, + {"CMYK", "CMYK;I", 32, unpackCMYKI}, + {"CMYK", "CMYK;L", 32, unpackRGBAL}, + {"CMYK", "CMYK;16L", 64, unpackRGBA16L}, + {"CMYK", "CMYK;16B", 64, unpackRGBA16B}, + {"CMYK", "C", 8, band0}, + {"CMYK", "M", 8, band1}, + {"CMYK", "Y", 8, band2}, + {"CMYK", "K", 8, band3}, + {"CMYK", "C;I", 8, band0I}, + {"CMYK", "M;I", 8, band1I}, + {"CMYK", "Y;I", 8, band2I}, + {"CMYK", "K;I", 8, band3I}, #ifdef WORDS_BIGENDIAN - {"CMYK", "CMYK;16N", 64, unpackRGBA16B}, + {"CMYK", "CMYK;16N", 64, unpackRGBA16B}, #else - {"CMYK", "CMYK;16N", 64, unpackRGBA16L}, + {"CMYK", "CMYK;16N", 64, unpackRGBA16L}, #endif /* video (YCbCr) */ - {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, - {"YCbCr", "YCbCr;L", 24, unpackRGBL}, - {"YCbCr", "YCbCrX", 32, copy4}, - {"YCbCr", "YCbCrK", 32, copy4}, + {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, + {"YCbCr", "YCbCr;L", 24, unpackRGBL}, + {"YCbCr", "YCbCrX", 32, copy4}, + {"YCbCr", "YCbCrK", 32, copy4}, /* LAB Color */ - {"LAB", "LAB", 24, ImagingUnpackLAB}, - {"LAB", "L", 8, band0}, - {"LAB", "A", 8, band1}, - {"LAB", "B", 8, band2}, + {"LAB", "LAB", 24, ImagingUnpackLAB}, + {"LAB", "L", 8, band0}, + {"LAB", "A", 8, band1}, + {"LAB", "B", 8, band2}, /* HSV Color */ - {"HSV", "HSV", 24, ImagingUnpackRGB}, - {"HSV", "H", 8, band0}, - {"HSV", "S", 8, band1}, - {"HSV", "V", 8, band2}, + {"HSV", "HSV", 24, ImagingUnpackRGB}, + {"HSV", "H", 8, band0}, + {"HSV", "S", 8, band1}, + {"HSV", "V", 8, band2}, /* integer variations */ - {"I", "I", 32, copy4}, - {"I", "I;8", 8, unpackI8}, - {"I", "I;8S", 8, unpackI8S}, - {"I", "I;16", 16, unpackI16}, - {"I", "I;16S", 16, unpackI16S}, - {"I", "I;16B", 16, unpackI16B}, - {"I", "I;16BS", 16, unpackI16BS}, - {"I", "I;16N", 16, unpackI16N}, - {"I", "I;16NS", 16, unpackI16NS}, - {"I", "I;32", 32, unpackI32}, - {"I", "I;32S", 32, unpackI32S}, - {"I", "I;32B", 32, unpackI32B}, - {"I", "I;32BS", 32, unpackI32BS}, - {"I", "I;32N", 32, unpackI32N}, - {"I", "I;32NS", 32, unpackI32NS}, + {"I", "I", 32, copy4}, + {"I", "I;8", 8, unpackI8}, + {"I", "I;8S", 8, unpackI8S}, + {"I", "I;16", 16, unpackI16}, + {"I", "I;16S", 16, unpackI16S}, + {"I", "I;16B", 16, unpackI16B}, + {"I", "I;16BS", 16, unpackI16BS}, + {"I", "I;16N", 16, unpackI16N}, + {"I", "I;16NS", 16, unpackI16NS}, + {"I", "I;32", 32, unpackI32}, + {"I", "I;32S", 32, unpackI32S}, + {"I", "I;32B", 32, unpackI32B}, + {"I", "I;32BS", 32, unpackI32BS}, + {"I", "I;32N", 32, unpackI32N}, + {"I", "I;32NS", 32, unpackI32NS}, /* floating point variations */ - {"F", "F", 32, copy4}, - {"F", "F;8", 8, unpackF8}, - {"F", "F;8S", 8, unpackF8S}, - {"F", "F;16", 16, unpackF16}, - {"F", "F;16S", 16, unpackF16S}, - {"F", "F;16B", 16, unpackF16B}, - {"F", "F;16BS", 16, unpackF16BS}, - {"F", "F;16N", 16, unpackF16N}, - {"F", "F;16NS", 16, unpackF16NS}, - {"F", "F;32", 32, unpackF32}, - {"F", "F;32S", 32, unpackF32S}, - {"F", "F;32B", 32, unpackF32B}, - {"F", "F;32BS", 32, unpackF32BS}, - {"F", "F;32N", 32, unpackF32N}, - {"F", "F;32NS", 32, unpackF32NS}, - {"F", "F;32F", 32, unpackF32F}, - {"F", "F;32BF", 32, unpackF32BF}, - {"F", "F;32NF", 32, unpackF32NF}, + {"F", "F", 32, copy4}, + {"F", "F;8", 8, unpackF8}, + {"F", "F;8S", 8, unpackF8S}, + {"F", "F;16", 16, unpackF16}, + {"F", "F;16S", 16, unpackF16S}, + {"F", "F;16B", 16, unpackF16B}, + {"F", "F;16BS", 16, unpackF16BS}, + {"F", "F;16N", 16, unpackF16N}, + {"F", "F;16NS", 16, unpackF16NS}, + {"F", "F;32", 32, unpackF32}, + {"F", "F;32S", 32, unpackF32S}, + {"F", "F;32B", 32, unpackF32B}, + {"F", "F;32BS", 32, unpackF32BS}, + {"F", "F;32N", 32, unpackF32N}, + {"F", "F;32NS", 32, unpackF32NS}, + {"F", "F;32F", 32, unpackF32F}, + {"F", "F;32BF", 32, unpackF32BF}, + {"F", "F;32NF", 32, unpackF32NF}, #ifdef FLOAT64 - {"F", "F;64F", 64, unpackF64F}, - {"F", "F;64BF", 64, unpackF64BF}, - {"F", "F;64NF", 64, unpackF64NF}, + {"F", "F;64F", 64, unpackF64F}, + {"F", "F;64BF", 64, unpackF64BF}, + {"F", "F;64NF", 64, unpackF64NF}, #endif /* storage modes */ - {"I;16", "I;16", 16, copy2}, - {"I;16B", "I;16B", 16, copy2}, - {"I;16L", "I;16L", 16, copy2}, + {"I;16", "I;16", 16, copy2}, + {"I;16B", "I;16B", 16, copy2}, + {"I;16L", "I;16L", 16, copy2}, - {"I;16", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. - {"I;16L", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. - {"I;16B", "I;16N", 16, unpackI16N_I16B}, + {"I;16", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. + {"I;16L", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. + {"I;16B", "I;16N", 16, unpackI16N_I16B}, - {"I;16", "I;12", 12, unpackI12_I16}, // 12 bit Tiffs stored in 16bits. + {"I;16", "I;12", 12, unpackI12_I16}, // 12 bit Tiffs stored in 16bits. {NULL} /* sentinel */ }; - ImagingShuffler -ImagingFindUnpacker(const char* mode, const char* rawmode, int* bits_out) -{ +ImagingFindUnpacker(const char *mode, const char *rawmode, int *bits_out) { int i; /* find a suitable pixel unpacker */ diff --git a/src/libImaging/UnpackYCC.c b/src/libImaging/UnpackYCC.c index d6bce17ad..0b177bdd4 100644 --- a/src/libImaging/UnpackYCC.c +++ b/src/libImaging/UnpackYCC.c @@ -13,150 +13,151 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - /* Tables generated by pcdtables.py, based on transforms taken from the "Colour Space Conversions FAQ" by Roberts/Ford. */ -static INT16 L[] = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, -19, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, -42, 43, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, -65, 67, 68, 69, 71, 72, 73, 75, 76, 77, 79, 80, 82, 83, 84, 86, 87, -88, 90, 91, 92, 94, 95, 96, 98, 99, 101, 102, 103, 105, 106, 107, 109, -110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 124, 125, 126, 128, -129, 130, 132, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 147, -148, 149, 151, 152, 153, 155, 156, 158, 159, 160, 162, 163, 164, 166, -167, 168, 170, 171, 173, 174, 175, 177, 178, 179, 181, 182, 183, 185, -186, 187, 189, 190, 192, 193, 194, 196, 197, 198, 200, 201, 202, 204, -205, 206, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 223, -224, 225, 227, 228, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, -243, 245, 246, 247, 249, 250, 251, 253, 254, 255, 257, 258, 259, 261, -262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, -281, 283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, -300, 302, 303, 304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, -319, 321, 322, 323, 325, 326, 327, 329, 330, 331, 333, 334, 336, 337, -338, 340, 341, 342, 344, 345, 346 }; +static INT16 L[] = { + 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 20, + 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 42, + 43, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, + 65, 67, 68, 69, 71, 72, 73, 75, 76, 77, 79, 80, 82, 83, 84, 86, + 87, 88, 90, 91, 92, 94, 95, 96, 98, 99, 101, 102, 103, 105, 106, 107, + 109, 110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, + 130, 132, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 147, 148, 149, 151, + 152, 153, 155, 156, 158, 159, 160, 162, 163, 164, 166, 167, 168, 170, 171, 173, + 174, 175, 177, 178, 179, 181, 182, 183, 185, 186, 187, 189, 190, 192, 193, 194, + 196, 197, 198, 200, 201, 202, 204, 205, 206, 208, 209, 211, 212, 213, 215, 216, + 217, 219, 220, 221, 223, 224, 225, 227, 228, 230, 231, 232, 234, 235, 236, 238, + 239, 240, 242, 243, 245, 246, 247, 249, 250, 251, 253, 254, 255, 257, 258, 259, + 261, 262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, 281, + 283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, 300, 302, 303, + 304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, 319, 321, 322, 323, 325, + 326, 327, 329, 330, 331, 333, 334, 336, 337, 338, 340, 341, 342, 344, 345, 346}; -static INT16 CB[] = { -345, -343, -341, -338, -336, -334, -332, -329, --327, -325, -323, -321, -318, -316, -314, -312, -310, -307, -305, --303, -301, -298, -296, -294, -292, -290, -287, -285, -283, -281, --278, -276, -274, -272, -270, -267, -265, -263, -261, -258, -256, --254, -252, -250, -247, -245, -243, -241, -239, -236, -234, -232, --230, -227, -225, -223, -221, -219, -216, -214, -212, -210, -207, --205, -203, -201, -199, -196, -194, -192, -190, -188, -185, -183, --181, -179, -176, -174, -172, -170, -168, -165, -163, -161, -159, --156, -154, -152, -150, -148, -145, -143, -141, -139, -137, -134, --132, -130, -128, -125, -123, -121, -119, -117, -114, -112, -110, --108, -105, -103, -101, -99, -97, -94, -92, -90, -88, -85, -83, -81, --79, -77, -74, -72, -70, -68, -66, -63, -61, -59, -57, -54, -52, -50, --48, -46, -43, -41, -39, -37, -34, -32, -30, -28, -26, -23, -21, -19, --17, -15, -12, -10, -8, -6, -3, -1, 0, 2, 4, 7, 9, 11, 13, 16, 18, 20, -22, 24, 27, 29, 31, 33, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, -60, 62, 64, 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 95, -98, 100, 102, 104, 106, 109, 111, 113, 115, 118, 120, 122, 124, 126, -129, 131, 133, 135, 138, 140, 142, 144, 146, 149, 151, 153, 155, 157, -160, 162, 164, 166, 169, 171, 173, 175, 177, 180, 182, 184, 186, 189, -191, 193, 195, 197, 200, 202, 204, 206, 208, 211, 213, 215, 217, 220 }; +static INT16 CB[] = { + -345, -343, -341, -338, -336, -334, -332, -329, -327, -325, -323, -321, -318, -316, + -314, -312, -310, -307, -305, -303, -301, -298, -296, -294, -292, -290, -287, -285, + -283, -281, -278, -276, -274, -272, -270, -267, -265, -263, -261, -258, -256, -254, + -252, -250, -247, -245, -243, -241, -239, -236, -234, -232, -230, -227, -225, -223, + -221, -219, -216, -214, -212, -210, -207, -205, -203, -201, -199, -196, -194, -192, + -190, -188, -185, -183, -181, -179, -176, -174, -172, -170, -168, -165, -163, -161, + -159, -156, -154, -152, -150, -148, -145, -143, -141, -139, -137, -134, -132, -130, + -128, -125, -123, -121, -119, -117, -114, -112, -110, -108, -105, -103, -101, -99, + -97, -94, -92, -90, -88, -85, -83, -81, -79, -77, -74, -72, -70, -68, + -66, -63, -61, -59, -57, -54, -52, -50, -48, -46, -43, -41, -39, -37, + -34, -32, -30, -28, -26, -23, -21, -19, -17, -15, -12, -10, -8, -6, + -3, -1, 0, 2, 4, 7, 9, 11, 13, 16, 18, 20, 22, 24, + 27, 29, 31, 33, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, + 58, 60, 62, 64, 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, + 89, 91, 93, 95, 98, 100, 102, 104, 106, 109, 111, 113, 115, 118, + 120, 122, 124, 126, 129, 131, 133, 135, 138, 140, 142, 144, 146, 149, + 151, 153, 155, 157, 160, 162, 164, 166, 169, 171, 173, 175, 177, 180, + 182, 184, 186, 189, 191, 193, 195, 197, 200, 202, 204, 206, 208, 211, + 213, 215, 217, 220}; -static INT16 GB[] = { 67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, -62, 62, 61, 61, 60, 60, 59, 59, 59, 58, 58, 57, 57, 56, 56, 56, 55, -55, 54, 54, 53, 53, 52, 52, 52, 51, 51, 50, 50, 49, 49, 49, 48, 48, -47, 47, 46, 46, 46, 45, 45, 44, 44, 43, 43, 43, 42, 42, 41, 41, 40, -40, 40, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 34, 34, 34, 33, -33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, 26, -25, 25, 25, 24, 24, 23, 23, 22, 22, 22, 21, 21, 20, 20, 19, 19, 19, -18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, -11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, -1, 1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5, -5, --6, -6, -7, -7, -8, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -12, --13, -13, -14, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, --19, -19, -20, -20, -21, -21, -21, -22, -22, -23, -23, -24, -24, -24, --25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, --31, -31, -32, -32, -33, -33, -33, -34, -34, -35, -35, -36, -36, -36, --37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42 }; +static INT16 GB[] = { + 67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, 62, 62, 61, 61, + 60, 60, 59, 59, 59, 58, 58, 57, 57, 56, 56, 56, 55, 55, 54, 54, + 53, 53, 52, 52, 52, 51, 51, 50, 50, 49, 49, 49, 48, 48, 47, 47, + 46, 46, 46, 45, 45, 44, 44, 43, 43, 43, 42, 42, 41, 41, 40, 40, + 40, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 34, 34, 34, 33, + 33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, + 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 22, 21, 21, 20, 20, 19, + 19, 19, 18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, + 12, 12, 11, 11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, + 5, 5, 4, 4, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, + -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5, -5, -6, -6, -7, -7, + -8, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -12, -13, -13, -14, -14, + -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -19, -19, -20, -20, -21, -21, + -21, -22, -22, -23, -23, -24, -24, -24, -25, -25, -26, -26, -27, -27, -27, -28, + -28, -29, -29, -30, -30, -30, -31, -31, -32, -32, -33, -33, -33, -34, -34, -35, + -35, -36, -36, -36, -37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42}; -static INT16 CR[] = { -249, -247, -245, -243, -241, -239, -238, -236, --234, -232, -230, -229, -227, -225, -223, -221, -219, -218, -216, --214, -212, -210, -208, -207, -205, -203, -201, -199, -198, -196, --194, -192, -190, -188, -187, -185, -183, -181, -179, -178, -176, --174, -172, -170, -168, -167, -165, -163, -161, -159, -157, -156, --154, -152, -150, -148, -147, -145, -143, -141, -139, -137, -136, --134, -132, -130, -128, -127, -125, -123, -121, -119, -117, -116, --114, -112, -110, -108, -106, -105, -103, -101, -99, -97, -96, -94, --92, -90, -88, -86, -85, -83, -81, -79, -77, -76, -74, -72, -70, -68, --66, -65, -63, -61, -59, -57, -55, -54, -52, -50, -48, -46, -45, -43, --41, -39, -37, -35, -34, -32, -30, -28, -26, -25, -23, -21, -19, -17, --15, -14, -12, -10, -8, -6, -4, -3, -1, 0, 2, 4, 5, 7, 9, 11, 13, 15, -16, 18, 20, 22, 24, 26, 27, 29, 31, 33, 35, 36, 38, 40, 42, 44, 46, -47, 49, 51, 53, 55, 56, 58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 77, -78, 80, 82, 84, 86, 87, 89, 91, 93, 95, 97, 98, 100, 102, 104, 106, -107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 129, 131, -133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157, -158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182, -184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208, -209, 211, 213, 215 }; +static INT16 CR[] = { + -249, -247, -245, -243, -241, -239, -238, -236, -234, -232, -230, -229, -227, -225, + -223, -221, -219, -218, -216, -214, -212, -210, -208, -207, -205, -203, -201, -199, + -198, -196, -194, -192, -190, -188, -187, -185, -183, -181, -179, -178, -176, -174, + -172, -170, -168, -167, -165, -163, -161, -159, -157, -156, -154, -152, -150, -148, + -147, -145, -143, -141, -139, -137, -136, -134, -132, -130, -128, -127, -125, -123, + -121, -119, -117, -116, -114, -112, -110, -108, -106, -105, -103, -101, -99, -97, + -96, -94, -92, -90, -88, -86, -85, -83, -81, -79, -77, -76, -74, -72, + -70, -68, -66, -65, -63, -61, -59, -57, -55, -54, -52, -50, -48, -46, + -45, -43, -41, -39, -37, -35, -34, -32, -30, -28, -26, -25, -23, -21, + -19, -17, -15, -14, -12, -10, -8, -6, -4, -3, -1, 0, 2, 4, + 5, 7, 9, 11, 13, 15, 16, 18, 20, 22, 24, 26, 27, 29, + 31, 33, 35, 36, 38, 40, 42, 44, 46, 47, 49, 51, 53, 55, + 56, 58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 77, 78, 80, + 82, 84, 86, 87, 89, 91, 93, 95, 97, 98, 100, 102, 104, 106, + 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 129, 131, + 133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157, + 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182, + 184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208, + 209, 211, 213, 215}; -static INT16 GR[] = { 127, 126, 125, 124, 123, 122, 121, 121, 120, 119, -118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 108, 107, 106, -105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 95, 94, 93, 92, 91, -90, 89, 88, 87, 86, 85, 84, 83, 83, 82, 81, 80, 79, 78, 77, 76, 75, -74, 73, 72, 71, 70, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, -58, 57, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 44, -43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 32, 31, 30, 29, 28, -27, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, -11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -5, --6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -18, -19, --20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, --33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, --46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, --59, -60, -61, -62, -63, -64, -65, -66, -67, -68, -69, -69, -70, -71, --72, -73, -74, -75, -76, -77, -78, -79, -80, -81, -82, -82, -83, -84, --85, -86, -87, -88, -89, -90, -91, -92, -93, -94, -94, -95, -96, -97, --98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107, -108 }; +static INT16 GR[] = { + 127, 126, 125, 124, 123, 122, 121, 121, 120, 119, 118, 117, 116, 115, 114, + 113, 112, 111, 110, 109, 108, 108, 107, 106, 105, 104, 103, 102, 101, 100, + 99, 98, 97, 96, 95, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, + 85, 84, 83, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, + 71, 70, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, + 57, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, + 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 32, 31, + 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, + 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 3, + 2, 1, 0, 0, -1, -2, -3, -4, -5, -5, -6, -7, -8, -9, -10, + -11, -12, -13, -14, -15, -16, -17, -18, -18, -19, -20, -21, -22, -23, -24, + -25, -26, -27, -28, -29, -30, -31, -31, -32, -33, -34, -35, -36, -37, -38, + -39, -40, -41, -42, -43, -44, -44, -45, -46, -47, -48, -49, -50, -51, -52, + -53, -54, -55, -56, -56, -57, -58, -59, -60, -61, -62, -63, -64, -65, -66, + -67, -68, -69, -69, -70, -71, -72, -73, -74, -75, -76, -77, -78, -79, -80, + -81, -82, -82, -83, -84, -85, -86, -87, -88, -89, -90, -91, -92, -93, -94, + -94, -95, -96, -97, -98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107, + -108}; #define R 0 #define G 1 #define B 2 #define A 3 -#define YCC2RGB(rgb, y, cb, cr) {\ - int l = L[y];\ - int r = l + CR[cr];\ - int g = l + GR[cr] + GB[cb];\ - int b = l + CB[cb];\ - rgb[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r;\ - rgb[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g;\ - rgb[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b;\ -} +#define YCC2RGB(rgb, y, cb, cr) \ + { \ + int l = L[y]; \ + int r = l + CR[cr]; \ + int g = l + GR[cr] + GB[cb]; \ + int b = l + CB[cb]; \ + rgb[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r; \ + rgb[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g; \ + rgb[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b; \ + } void -ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackYCC(UINT8 *out, const UINT8 *in, int pixels) { int i; /* PhotoYCC triplets */ for (i = 0; i < pixels; i++) { YCC2RGB(out, in[0], in[1], in[2]); out[A] = 255; - out += 4; in += 3; + out += 4; + in += 3; } } void -ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels) -{ +ImagingUnpackYCCA(UINT8 *out, const UINT8 *in, int pixels) { int i; /* PhotoYCC triplets plus premultiplied alpha */ for (i = 0; i < pixels; i++) { /* Divide by alpha */ UINT8 rgb[3]; - rgb[0] = (in[3] == 0) ? 0 : (((int) in[0] * 255) / in[3]); - rgb[1] = (in[3] == 0) ? 0 : (((int) in[1] * 255) / in[3]); - rgb[2] = (in[3] == 0) ? 0 : (((int) in[2] * 255) / in[3]); + rgb[0] = (in[3] == 0) ? 0 : (((int)in[0] * 255) / in[3]); + rgb[1] = (in[3] == 0) ? 0 : (((int)in[1] * 255) / in[3]); + rgb[2] = (in[3] == 0) ? 0 : (((int)in[2] * 255) / in[3]); /* Convert non-multiplied data to RGB */ YCC2RGB(out, rgb[0], rgb[1], rgb[2]); out[A] = in[3]; - out += 4; in += 4; + out += 4; + in += 4; } } diff --git a/src/libImaging/UnsharpMask.c b/src/libImaging/UnsharpMask.c index 59e595e82..643ced49f 100644 --- a/src/libImaging/UnsharpMask.c +++ b/src/libImaging/UnsharpMask.c @@ -8,26 +8,22 @@ #include "Imaging.h" - typedef UINT8 pixel[4]; - -static inline UINT8 clip8(int in) -{ +static inline UINT8 +clip8(int in) { if (in >= 255) { - return 255; + return 255; } if (in <= 0) { return 0; } - return (UINT8) in; + return (UINT8)in; } - Imaging -ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, - int threshold) -{ +ImagingUnsharpMask( + Imaging imOut, Imaging imIn, float radius, int percent, int threshold) { ImagingSectionCookie cookie; Imaging result; @@ -53,8 +49,7 @@ ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - if (imIn->image8) - { + if (imIn->image8) { lineIn8 = imIn->image8[y]; lineOut8 = imOut->image8[y]; for (x = 0; x < imIn->xsize; x++) { @@ -74,20 +69,24 @@ ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, for (x = 0; x < imIn->xsize; x++) { /* compare in/out pixels, apply sharpening */ diff = lineIn[x][0] - lineOut[x][0]; - lineOut[x][0] = abs(diff) > threshold ? - clip8(lineIn[x][0] + diff * percent / 100) : lineIn[x][0]; + lineOut[x][0] = abs(diff) > threshold + ? clip8(lineIn[x][0] + diff * percent / 100) + : lineIn[x][0]; diff = lineIn[x][1] - lineOut[x][1]; - lineOut[x][1] = abs(diff) > threshold ? - clip8(lineIn[x][1] + diff * percent / 100) : lineIn[x][1]; + lineOut[x][1] = abs(diff) > threshold + ? clip8(lineIn[x][1] + diff * percent / 100) + : lineIn[x][1]; diff = lineIn[x][2] - lineOut[x][2]; - lineOut[x][2] = abs(diff) > threshold ? - clip8(lineIn[x][2] + diff * percent / 100) : lineIn[x][2]; + lineOut[x][2] = abs(diff) > threshold + ? clip8(lineIn[x][2] + diff * percent / 100) + : lineIn[x][2]; diff = lineIn[x][3] - lineOut[x][3]; - lineOut[x][3] = abs(diff) > threshold ? - clip8(lineIn[x][3] + diff * percent / 100) : lineIn[x][3]; + lineOut[x][3] = abs(diff) > threshold + ? clip8(lineIn[x][3] + diff * percent / 100) + : lineIn[x][3]; } } } diff --git a/src/libImaging/XbmDecode.c b/src/libImaging/XbmDecode.c index 607f1058a..d6690de3d 100644 --- a/src/libImaging/XbmDecode.c +++ b/src/libImaging/XbmDecode.c @@ -13,19 +13,19 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" -#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ - (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ - (v >= 'A' && v <= 'F') ? v - 'A' + 10 : 0) +#define HEX(v) \ + ((v >= '0' && v <= '9') ? v - '0' \ + : (v >= 'a' && v <= 'f') ? v - 'a' + 10 \ + : (v >= 'A' && v <= 'F') ? v - 'A' + 10 \ + : 0) int -ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ +ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { enum { BYTE = 1, SKIP }; - UINT8* ptr; + UINT8 *ptr; if (!state->state) { state->state = SKIP; @@ -34,9 +34,7 @@ ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt ptr = buf; for (;;) { - if (state->state == SKIP) { - /* Skip forward until next 'x' */ while (bytes > 0) { @@ -52,20 +50,17 @@ ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt } state->state = BYTE; - } if (bytes < 3) { return ptr - buf; } - state->buffer[state->x] = (HEX(ptr[1])<<4) + HEX(ptr[2]); + state->buffer[state->x] = (HEX(ptr[1]) << 4) + HEX(ptr[2]); if (++state->x >= state->bytes) { - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y], state->buffer, - state->xsize); + state->shuffle((UINT8 *)im->image[state->y], state->buffer, state->xsize); state->x = 0; @@ -79,7 +74,5 @@ ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt bytes -= 3; state->state = SKIP; - } - } diff --git a/src/libImaging/XbmEncode.c b/src/libImaging/XbmEncode.c index d1bc086db..eec4c0d84 100644 --- a/src/libImaging/XbmEncode.c +++ b/src/libImaging/XbmEncode.c @@ -13,25 +13,20 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" - int -ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ +ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { const char *hex = "0123456789abcdef"; - UINT8* ptr = buf; + UINT8 *ptr = buf; int i, n; if (!state->state) { - /* 8 pixels are stored in no more than 6 bytes */ - state->bytes = 6*(state->xsize+7)/8; + state->bytes = 6 * (state->xsize + 7) / 8; state->state = 1; - } if (bytes < state->bytes) { @@ -42,60 +37,54 @@ ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) ptr = buf; while (bytes >= state->bytes) { + state->shuffle( + state->buffer, + (UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize, + state->xsize); - state->shuffle(state->buffer, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->xsize); - - if (state->y < state->ysize-1) { - + if (state->y < state->ysize - 1) { /* any line but the last */ for (n = 0; n < state->xsize; n += 8) { - - i = state->buffer[n/8]; + i = state->buffer[n / 8]; *ptr++ = '0'; *ptr++ = 'x'; - *ptr++ = hex[(i>>4)&15]; - *ptr++ = hex[i&15]; + *ptr++ = hex[(i >> 4) & 15]; + *ptr++ = hex[i & 15]; *ptr++ = ','; bytes -= 5; - if (++state->count >= 79/5) { + if (++state->count >= 79 / 5) { *ptr++ = '\n'; bytes--; state->count = 0; } - } state->y++; } else { - /* last line */ for (n = 0; n < state->xsize; n += 8) { - - i = state->buffer[n/8]; + i = state->buffer[n / 8]; *ptr++ = '0'; *ptr++ = 'x'; - *ptr++ = hex[(i>>4)&15]; - *ptr++ = hex[i&15]; + *ptr++ = hex[(i >> 4) & 15]; + *ptr++ = hex[i & 15]; - if (n < state->xsize-8) { + if (n < state->xsize - 8) { *ptr++ = ','; - if (++state->count >= 79/5) { - *ptr++ = '\n'; - bytes--; - state->count = 0; + if (++state->count >= 79 / 5) { + *ptr++ = '\n'; + bytes--; + state->count = 0; } } else { *ptr++ = '\n'; } bytes -= 5; - } state->errcode = IMAGING_CODEC_END; diff --git a/src/libImaging/ZipCodecs.h b/src/libImaging/ZipCodecs.h index b05c93bb4..50218b6c6 100644 --- a/src/libImaging/ZipCodecs.h +++ b/src/libImaging/ZipCodecs.h @@ -7,19 +7,15 @@ * Copyright (c) Fredrik Lundh 1996. */ - #include "zlib.h" - /* modes */ #define ZIP_PNG 0 /* continuous, filtered image data */ #define ZIP_PNG_PALETTE 1 /* non-continuous data, disable filtering */ #define ZIP_TIFF_PREDICTOR 2 /* TIFF, with predictor */ #define ZIP_TIFF 3 /* TIFF, without predictor */ - typedef struct { - /* CONFIGURATION */ /* Codec mode */ @@ -34,29 +30,29 @@ typedef struct { int compress_type; /* Predefined dictionary (experimental) */ - char* dictionary; + char *dictionary; int dictionary_size; /* PRIVATE CONTEXT (set by decoder/encoder) */ - z_stream z_stream; /* (de)compression stream */ + z_stream z_stream; /* (de)compression stream */ - UINT8* previous; /* previous line (allocated) */ + UINT8 *previous; /* previous line (allocated) */ - int last_output; /* # bytes last output by inflate */ + int last_output; /* # bytes last output by inflate */ /* Compressor specific stuff */ - UINT8* prior; /* filter storage (allocated) */ - UINT8* up; - UINT8* average; - UINT8* paeth; + UINT8 *prior; /* filter storage (allocated) */ + UINT8 *up; + UINT8 *average; + UINT8 *paeth; - UINT8* output; /* output data */ + UINT8 *output; /* output data */ - int prefix; /* size of filter prefix (0 for TIFF data) */ + int prefix; /* size of filter prefix (0 for TIFF data) */ - int interlaced; /* is the image interlaced? (PNG) */ + int interlaced; /* is the image interlaced? (PNG) */ - int pass; /* current pass of the interlaced image (PNG) */ + int pass; /* current pass of the interlaced image (PNG) */ } ZIPSTATE; diff --git a/src/libImaging/ZipDecode.c b/src/libImaging/ZipDecode.c index a09ee82f7..874967834 100644 --- a/src/libImaging/ZipDecode.c +++ b/src/libImaging/ZipDecode.c @@ -15,23 +15,22 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" -#ifdef HAVE_LIBZ +#ifdef HAVE_LIBZ #include "ZipCodecs.h" -static const int OFFSET[] = { 7, 3, 3, 1, 1, 0, 0 }; -static const int STARTING_COL[] = { 0, 4, 0, 2, 0, 1, 0 }; -static const int STARTING_ROW[] = { 0, 0, 4, 0, 2, 0, 1 }; -static const int COL_INCREMENT[] = { 8, 8, 4, 4, 2, 2, 1 }; -static const int ROW_INCREMENT[] = { 8, 8, 8, 4, 4, 2, 2 }; +static const int OFFSET[] = {7, 3, 3, 1, 1, 0, 0}; +static const int STARTING_COL[] = {0, 4, 0, 2, 0, 1, 0}; +static const int STARTING_ROW[] = {0, 0, 4, 0, 2, 0, 1}; +static const int COL_INCREMENT[] = {8, 8, 4, 4, 2, 2, 1}; +static const int ROW_INCREMENT[] = {8, 8, 8, 4, 4, 2, 2}; /* Get the length in bytes of a scanline in the pass specified, * for interlaced images */ -static int get_row_len(ImagingCodecState state, int pass) -{ +static int +get_row_len(ImagingCodecState state, int pass) { int row_len = (state->xsize + OFFSET[pass]) / COL_INCREMENT[pass]; return ((row_len * state->bits) + 7) / 8; } @@ -41,17 +40,15 @@ static int get_row_len(ImagingCodecState state, int pass) /* -------------------------------------------------------------------- */ int -ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -{ - ZIPSTATE* context = (ZIPSTATE*) state->context; +ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) { + ZIPSTATE *context = (ZIPSTATE *)state->context; int err; int n; - UINT8* ptr; + UINT8 *ptr; int i, bpp; int row_len; if (!state->state) { - /* Initialization */ if (context->mode == ZIP_PNG || context->mode == ZIP_PNG_PALETTE) { context->prefix = 1; /* PNG */ @@ -66,8 +63,8 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt prefix, and allocate a buffer to hold the previous line */ free(state->buffer); /* malloc check ok, overflow checked above */ - state->buffer = (UINT8*) malloc(state->bytes+1); - context->previous = (UINT8*) malloc(state->bytes+1); + state->buffer = (UINT8 *)malloc(state->bytes + 1); + context->previous = (UINT8 *)malloc(state->bytes + 1); if (!state->buffer || !context->previous) { state->errcode = IMAGING_CODEC_MEMORY; return -1; @@ -76,12 +73,12 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt context->last_output = 0; /* Initialize to black */ - memset(context->previous, 0, state->bytes+1); + memset(context->previous, 0, state->bytes + 1); /* Setup decompression context */ - context->z_stream.zalloc = (alloc_func) NULL; - context->z_stream.zfree = (free_func) NULL; - context->z_stream.opaque = (voidpf) NULL; + context->z_stream.zalloc = (alloc_func)NULL; + context->z_stream.zfree = (free_func)NULL; + context->z_stream.opaque = (voidpf)NULL; err = inflateInit(&context->z_stream); if (err < 0) { @@ -98,7 +95,6 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* Ready to decode */ state->state = 1; - } if (context->interlaced) { @@ -113,10 +109,8 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* Decompress what we've got this far */ while (context->z_stream.avail_in > 0) { - context->z_stream.next_out = state->buffer + context->last_output; - context->z_stream.avail_out = - row_len + context->prefix - context->last_output; + context->z_stream.avail_out = row_len + context->prefix - context->last_output; err = inflate(&context->z_stream, Z_NO_FLUSH); @@ -144,74 +138,74 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt /* Apply predictor */ switch (context->mode) { - case ZIP_PNG: - switch (state->buffer[0]) { - case 0: + case ZIP_PNG: + switch (state->buffer[0]) { + case 0: + break; + case 1: + /* prior */ + bpp = (state->bits + 7) / 8; + for (i = bpp + 1; i <= row_len; i++) { + state->buffer[i] += state->buffer[i - bpp]; + } + break; + case 2: + /* up */ + for (i = 1; i <= row_len; i++) { + state->buffer[i] += context->previous[i]; + } + break; + case 3: + /* average */ + bpp = (state->bits + 7) / 8; + for (i = 1; i <= bpp; i++) { + state->buffer[i] += context->previous[i] / 2; + } + for (; i <= row_len; i++) { + state->buffer[i] += + (state->buffer[i - bpp] + context->previous[i]) / 2; + } + break; + case 4: + /* paeth filtering */ + bpp = (state->bits + 7) / 8; + for (i = 1; i <= bpp; i++) { + state->buffer[i] += context->previous[i]; + } + for (; i <= row_len; i++) { + int a, b, c; + int pa, pb, pc; + + /* fetch pixels */ + a = state->buffer[i - bpp]; + b = context->previous[i]; + c = context->previous[i - bpp]; + + /* distances to surrounding pixels */ + pa = abs(b - c); + pb = abs(a - c); + pc = abs(a + b - 2 * c); + + /* pick predictor with the shortest distance */ + state->buffer[i] += (pa <= pb && pa <= pc) ? a + : (pb <= pc) ? b + : c; + } + break; + default: + state->errcode = IMAGING_CODEC_UNKNOWN; + free(context->previous); + context->previous = NULL; + inflateEnd(&context->z_stream); + return -1; + } break; - case 1: - /* prior */ + case ZIP_TIFF_PREDICTOR: bpp = (state->bits + 7) / 8; - for (i = bpp+1; i <= row_len; i++) { - state->buffer[i] += state->buffer[i-bpp]; + for (i = bpp + 1; i <= row_len; i++) { + state->buffer[i] += state->buffer[i - bpp]; } break; - case 2: - /* up */ - for (i = 1; i <= row_len; i++) { - state->buffer[i] += context->previous[i]; - } - break; - case 3: - /* average */ - bpp = (state->bits + 7) / 8; - for (i = 1; i <= bpp; i++) { - state->buffer[i] += context->previous[i]/2; - } - for (; i <= row_len; i++) { - state->buffer[i] += - (state->buffer[i-bpp] + context->previous[i])/2; - } - break; - case 4: - /* paeth filtering */ - bpp = (state->bits + 7) / 8; - for (i = 1; i <= bpp; i++) { - state->buffer[i] += context->previous[i]; - } - for (; i <= row_len; i++) { - int a, b, c; - int pa, pb, pc; - - /* fetch pixels */ - a = state->buffer[i-bpp]; - b = context->previous[i]; - c = context->previous[i-bpp]; - - /* distances to surrounding pixels */ - pa = abs(b - c); - pb = abs(a - c); - pc = abs(a + b - 2*c); - - /* pick predictor with the shortest distance */ - state->buffer[i] += - (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; - - } - break; - default: - state->errcode = IMAGING_CODEC_UNKNOWN; - free(context->previous); - context->previous = NULL; - inflateEnd(&context->z_stream); - return -1; - } - break; - case ZIP_TIFF_PREDICTOR: - bpp = (state->bits + 7) / 8; - for (i = bpp+1; i <= row_len; i++) { - state->buffer[i] += state->buffer[i-bpp]; - } - break; } /* Stuff data into the image */ @@ -220,20 +214,22 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt if (state->bits >= 8) { /* Stuff pixels in their correct location, one by one */ for (i = 0; i < row_len; i += ((state->bits + 7) / 8)) { - state->shuffle((UINT8*) im->image[state->y] + - col * im->pixelsize, - state->buffer + context->prefix + i, 1); + state->shuffle( + (UINT8 *)im->image[state->y] + col * im->pixelsize, + state->buffer + context->prefix + i, + 1); col += COL_INCREMENT[context->pass]; } } else { /* Handle case with more than a pixel in each byte */ - int row_bits = ((state->xsize + OFFSET[context->pass]) - / COL_INCREMENT[context->pass]) * state->bits; + int row_bits = ((state->xsize + OFFSET[context->pass]) / + COL_INCREMENT[context->pass]) * + state->bits; for (i = 0; i < row_bits; i += state->bits) { UINT8 byte = *(state->buffer + context->prefix + (i / 8)); byte <<= (i % 8); - state->shuffle((UINT8*) im->image[state->y] + - col * im->pixelsize, &byte, 1); + state->shuffle( + (UINT8 *)im->image[state->y] + col * im->pixelsize, &byte, 1); col += COL_INCREMENT[context->pass]; } } @@ -250,13 +246,14 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt row_len = get_row_len(state, context->pass); /* Since we're moving to the "first" line, the previous line * should be black to make filters work correctly */ - memset(state->buffer, 0, state->bytes+1); + memset(state->buffer, 0, state->bytes + 1); } } else { - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, - state->buffer + context->prefix, - state->xsize); + state->shuffle( + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer + context->prefix, + state->xsize); state->y++; } @@ -264,7 +261,6 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt context->last_output = 0; if (state->y >= state->ysize || err == Z_STREAM_END) { - /* The image and the data should end simultaneously */ /* if (state->y < state->ysize || err != Z_STREAM_END) state->errcode = IMAGING_CODEC_BROKEN; */ @@ -273,26 +269,23 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t byt context->previous = NULL; inflateEnd(&context->z_stream); return -1; /* end of file (errcode=0) */ - } /* Swap buffer pointers */ ptr = state->buffer; state->buffer = context->previous; context->previous = ptr; - } return bytes; /* consumed all of it */ - } - -int ImagingZipDecodeCleanup(ImagingCodecState state){ +int +ImagingZipDecodeCleanup(ImagingCodecState state) { /* called to free the decompression engine when the decode terminates due to a corrupt or truncated image */ - ZIPSTATE* context = (ZIPSTATE*) state->context; + ZIPSTATE *context = (ZIPSTATE *)state->context; /* Clean up */ if (context->previous) { diff --git a/src/libImaging/ZipEncode.c b/src/libImaging/ZipEncode.c index 4e862af57..edbce3682 100644 --- a/src/libImaging/ZipEncode.c +++ b/src/libImaging/ZipEncode.c @@ -14,25 +14,22 @@ * See the README file for information on usage and redistribution. */ - #include "Imaging.h" -#ifdef HAVE_LIBZ +#ifdef HAVE_LIBZ #include "ZipCodecs.h" int -ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - ZIPSTATE* context = (ZIPSTATE*) state->context; +ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { + ZIPSTATE *context = (ZIPSTATE *)state->context; int err; int compress_level, compress_type; - UINT8* ptr; + UINT8 *ptr; int i, bpp, s, sum; ImagingSectionCookie cookie; if (!state->state) { - /* Initialization */ /* Valid modes are ZIP_PNG, ZIP_PNG_PALETTE, and ZIP_TIFF */ @@ -47,14 +44,14 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) and allocate filter buffers */ free(state->buffer); /* malloc check ok, overflow checked above */ - state->buffer = (UINT8*) malloc(state->bytes+1); - context->previous = (UINT8*) malloc(state->bytes+1); - context->prior = (UINT8*) malloc(state->bytes+1); - context->up = (UINT8*) malloc(state->bytes+1); - context->average = (UINT8*) malloc(state->bytes+1); - context->paeth = (UINT8*) malloc(state->bytes+1); - if (!state->buffer || !context->previous || !context->prior || - !context->up || !context->average || !context->paeth) { + state->buffer = (UINT8 *)malloc(state->bytes + 1); + context->previous = (UINT8 *)malloc(state->bytes + 1); + context->prior = (UINT8 *)malloc(state->bytes + 1); + context->up = (UINT8 *)malloc(state->bytes + 1); + context->average = (UINT8 *)malloc(state->bytes + 1); + context->paeth = (UINT8 *)malloc(state->bytes + 1); + if (!state->buffer || !context->previous || !context->prior || !context->up || + !context->average || !context->paeth) { free(context->paeth); free(context->average); free(context->up); @@ -72,7 +69,7 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->paeth[0] = 4; /* Initialise previous buffer to black */ - memset(context->previous, 0, state->bytes+1); + memset(context->previous, 0, state->bytes + 1); /* Setup compression context */ context->z_stream.zalloc = (alloc_func)0; @@ -81,33 +78,37 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) context->z_stream.next_in = 0; context->z_stream.avail_in = 0; - compress_level = (context->optimize) ? Z_BEST_COMPRESSION - : context->compress_level; + compress_level = + (context->optimize) ? Z_BEST_COMPRESSION : context->compress_level; if (context->compress_type == -1) { - compress_type = (context->mode == ZIP_PNG) ? Z_FILTERED - : Z_DEFAULT_STRATEGY; + compress_type = + (context->mode == ZIP_PNG) ? Z_FILTERED : Z_DEFAULT_STRATEGY; } else { compress_type = context->compress_type; } - err = deflateInit2(&context->z_stream, - /* compression level */ - compress_level, - /* compression method */ - Z_DEFLATED, - /* compression memory resources */ - 15, 9, - /* compression strategy (image data are filtered)*/ - compress_type); + err = deflateInit2( + &context->z_stream, + /* compression level */ + compress_level, + /* compression method */ + Z_DEFLATED, + /* compression memory resources */ + 15, + 9, + /* compression strategy (image data are filtered)*/ + compress_type); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; return -1; } if (context->dictionary && context->dictionary_size > 0) { - err = deflateSetDictionary(&context->z_stream, (unsigned char *)context->dictionary, - context->dictionary_size); + err = deflateSetDictionary( + &context->z_stream, + (unsigned char *)context->dictionary, + context->dictionary_size); if (err < 0) { state->errcode = IMAGING_CODEC_CONFIG; return -1; @@ -116,7 +117,6 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) /* Ready to decode */ state->state = 1; - } /* Setup the destination buffer */ @@ -147,203 +147,194 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) ImagingSectionEnter(&cookie); for (;;) { - switch (state->state) { + case 1: - case 1: - - /* Compress image data */ - while (context->z_stream.avail_out > 0) { - - if (state->y >= state->ysize) { - /* End of image; now flush compressor buffers */ - state->state = 2; - break; - - } - - /* Stuff image data into the compressor */ - state->shuffle(state->buffer+1, - (UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, - state->xsize); - - state->y++; - - context->output = state->buffer; - - if (context->mode == ZIP_PNG) { - - /* Filter the image data. For each line, select - the filter that gives the least total distance - from zero for the filtered data (taken from - LIBPNG) */ - - bpp = (state->bits + 7) / 8; - - /* 0. No filter */ - for (i = 1, sum = 0; i <= state->bytes; i++) { - UINT8 v = state->buffer[i]; - sum += (v < 128) ? v : 256 - v; + /* Compress image data */ + while (context->z_stream.avail_out > 0) { + if (state->y >= state->ysize) { + /* End of image; now flush compressor buffers */ + state->state = 2; + break; } - /* 2. Up. We'll test this first to save time when - an image line is identical to the one above. */ - if (sum > 0) { - for (i = 1, s = 0; i <= state->bytes; i++) { - UINT8 v = state->buffer[i] - context->previous[i]; - context->up[i] = v; - s += (v < 128) ? v : 256 - v; - } - if (s < sum) { - context->output = context->up; - sum = s; /* 0 if line was duplicated */ - } - } + /* Stuff image data into the compressor */ + state->shuffle( + state->buffer + 1, + (UINT8 *)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); - /* 1. Prior */ - if (sum > 0) { - for (i = 1, s = 0; i <= bpp; i++) { + state->y++; + + context->output = state->buffer; + + if (context->mode == ZIP_PNG) { + /* Filter the image data. For each line, select + the filter that gives the least total distance + from zero for the filtered data (taken from + LIBPNG) */ + + bpp = (state->bits + 7) / 8; + + /* 0. No filter */ + for (i = 1, sum = 0; i <= state->bytes; i++) { UINT8 v = state->buffer[i]; - context->prior[i] = v; - s += (v < 128) ? v : 256 - v; + sum += (v < 128) ? v : 256 - v; } - for (; i <= state->bytes; i++) { - UINT8 v = state->buffer[i] - state->buffer[i-bpp]; - context->prior[i] = v; - s += (v < 128) ? v : 256 - v; + + /* 2. Up. We'll test this first to save time when + an image line is identical to the one above. */ + if (sum > 0) { + for (i = 1, s = 0; i <= state->bytes; i++) { + UINT8 v = state->buffer[i] - context->previous[i]; + context->up[i] = v; + s += (v < 128) ? v : 256 - v; + } + if (s < sum) { + context->output = context->up; + sum = s; /* 0 if line was duplicated */ + } } - if (s < sum) { - context->output = context->prior; - sum = s; /* 0 if line is solid */ + + /* 1. Prior */ + if (sum > 0) { + for (i = 1, s = 0; i <= bpp; i++) { + UINT8 v = state->buffer[i]; + context->prior[i] = v; + s += (v < 128) ? v : 256 - v; + } + for (; i <= state->bytes; i++) { + UINT8 v = state->buffer[i] - state->buffer[i - bpp]; + context->prior[i] = v; + s += (v < 128) ? v : 256 - v; + } + if (s < sum) { + context->output = context->prior; + sum = s; /* 0 if line is solid */ + } + } + + /* 3. Average (not very common in real-life images, + so its only used with the optimize option) */ + if (context->optimize && sum > 0) { + for (i = 1, s = 0; i <= bpp; i++) { + UINT8 v = state->buffer[i] - context->previous[i] / 2; + context->average[i] = v; + s += (v < 128) ? v : 256 - v; + } + for (; i <= state->bytes; i++) { + UINT8 v = + state->buffer[i] - + (state->buffer[i - bpp] + context->previous[i]) / 2; + context->average[i] = v; + s += (v < 128) ? v : 256 - v; + } + if (s < sum) { + context->output = context->average; + sum = s; + } + } + + /* 4. Paeth */ + if (sum > 0) { + for (i = 1, s = 0; i <= bpp; i++) { + UINT8 v = state->buffer[i] - context->previous[i]; + context->paeth[i] = v; + s += (v < 128) ? v : 256 - v; + } + for (; i <= state->bytes; i++) { + UINT8 v; + int a, b, c; + int pa, pb, pc; + + /* fetch pixels */ + a = state->buffer[i - bpp]; + b = context->previous[i]; + c = context->previous[i - bpp]; + + /* distances to surrounding pixels */ + pa = abs(b - c); + pb = abs(a - c); + pc = abs(a + b - 2 * c); + + /* pick predictor with the shortest distance */ + v = state->buffer[i] - ((pa <= pb && pa <= pc) ? a + : (pb <= pc) ? b + : c); + context->paeth[i] = v; + s += (v < 128) ? v : 256 - v; + } + if (s < sum) { + context->output = context->paeth; + sum = s; + } } } - /* 3. Average (not very common in real-life images, - so its only used with the optimize option) */ - if (context->optimize && sum > 0) { - for (i = 1, s = 0; i <= bpp; i++) { - UINT8 v = state->buffer[i] - context->previous[i]/2; - context->average[i] = v; - s += (v < 128) ? v : 256 - v; - } - for (; i <= state->bytes; i++) { - UINT8 v = state->buffer[i] - - (state->buffer[i-bpp] + context->previous[i])/2; - context->average[i] = v; - s += (v < 128) ? v : 256 - v; - } - if (s < sum) { - context->output = context->average; - sum = s; + /* Compress this line */ + context->z_stream.next_in = context->output; + context->z_stream.avail_in = state->bytes + 1; + + err = deflate(&context->z_stream, Z_NO_FLUSH); + + if (err < 0) { + /* Something went wrong inside the compression library */ + if (err == Z_DATA_ERROR) { + state->errcode = IMAGING_CODEC_BROKEN; + } else if (err == Z_MEM_ERROR) { + state->errcode = IMAGING_CODEC_MEMORY; + } else { + state->errcode = IMAGING_CODEC_CONFIG; } + free(context->paeth); + free(context->average); + free(context->up); + free(context->prior); + free(context->previous); + deflateEnd(&context->z_stream); + ImagingSectionLeave(&cookie); + return -1; } - /* 4. Paeth */ - if (sum > 0) { - for (i = 1, s = 0; i <= bpp; i++) { - UINT8 v = state->buffer[i] - context->previous[i]; - context->paeth[i] = v; - s += (v < 128) ? v : 256 - v; - } - for (; i <= state->bytes; i++) { - UINT8 v; - int a, b, c; - int pa, pb, pc; - - /* fetch pixels */ - a = state->buffer[i-bpp]; - b = context->previous[i]; - c = context->previous[i-bpp]; - - /* distances to surrounding pixels */ - pa = abs(b - c); - pb = abs(a - c); - pc = abs(a + b - 2*c); - - /* pick predictor with the shortest distance */ - v = state->buffer[i] - - ((pa <= pb && pa <= pc) ? a : - (pb <= pc) ? b : c); - context->paeth[i] = v; - s += (v < 128) ? v : 256 - v; - } - if (s < sum) { - context->output = context->paeth; - sum = s; - } - } - } - - /* Compress this line */ - context->z_stream.next_in = context->output; - context->z_stream.avail_in = state->bytes+1; - - err = deflate(&context->z_stream, Z_NO_FLUSH); - - if (err < 0) { - /* Something went wrong inside the compression library */ - if (err == Z_DATA_ERROR) { - state->errcode = IMAGING_CODEC_BROKEN; - } else if (err == Z_MEM_ERROR) { - state->errcode = IMAGING_CODEC_MEMORY; - } else { - state->errcode = IMAGING_CODEC_CONFIG; - } - free(context->paeth); - free(context->average); - free(context->up); - free(context->prior); - free(context->previous); - deflateEnd(&context->z_stream); - ImagingSectionLeave(&cookie); - return -1; - } - - /* Swap buffer pointers */ - ptr = state->buffer; - state->buffer = context->previous; - context->previous = ptr; - - } - - if (context->z_stream.avail_out == 0) { - break; /* Buffer full */ - } - - case 2: - - /* End of image data; flush compressor buffers */ - - while (context->z_stream.avail_out > 0) { - - err = deflate(&context->z_stream, Z_FINISH); - - if (err == Z_STREAM_END) { - - free(context->paeth); - free(context->average); - free(context->up); - free(context->prior); - free(context->previous); - - deflateEnd(&context->z_stream); - - state->errcode = IMAGING_CODEC_END; - - break; + /* Swap buffer pointers */ + ptr = state->buffer; + state->buffer = context->previous; + context->previous = ptr; } if (context->z_stream.avail_out == 0) { break; /* Buffer full */ } - } + case 2: + /* End of image data; flush compressor buffers */ + + while (context->z_stream.avail_out > 0) { + err = deflate(&context->z_stream, Z_FINISH); + + if (err == Z_STREAM_END) { + free(context->paeth); + free(context->average); + free(context->up); + free(context->prior); + free(context->previous); + + deflateEnd(&context->z_stream); + + state->errcode = IMAGING_CODEC_END; + + break; + } + + if (context->z_stream.avail_out == 0) { + break; /* Buffer full */ + } + } } ImagingSectionLeave(&cookie); return bytes - context->z_stream.avail_out; - } /* Should never ever arrive here... */ @@ -358,21 +349,18 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) int ImagingZipEncodeCleanup(ImagingCodecState state) { - ZIPSTATE* context = (ZIPSTATE*) state->context; + ZIPSTATE *context = (ZIPSTATE *)state->context; if (context->dictionary) { - free (context->dictionary); + free(context->dictionary); context->dictionary = NULL; } return -1; } - - -const char* -ImagingZipVersion(void) -{ +const char * +ImagingZipVersion(void) { return zlibVersion(); } diff --git a/src/libImaging/codec_fd.c b/src/libImaging/codec_fd.c index 5cde31cdc..526168110 100644 --- a/src/libImaging/codec_fd.c +++ b/src/libImaging/codec_fd.c @@ -1,10 +1,8 @@ #include "Python.h" #include "Imaging.h" - Py_ssize_t -_imaging_read_pyFd(PyObject *fd, char* dest, Py_ssize_t bytes) -{ +_imaging_read_pyFd(PyObject *fd, char *dest, Py_ssize_t bytes) { /* dest should be a buffer bytes long, returns length of read -1 on error */ @@ -29,16 +27,13 @@ _imaging_read_pyFd(PyObject *fd, char* dest, Py_ssize_t bytes) Py_DECREF(result); return length; - err: +err: Py_DECREF(result); return -1; - } Py_ssize_t -_imaging_write_pyFd(PyObject *fd, char* src, Py_ssize_t bytes) -{ - +_imaging_write_pyFd(PyObject *fd, char *src, Py_ssize_t bytes) { PyObject *result; PyObject *byteObj; @@ -49,24 +44,20 @@ _imaging_write_pyFd(PyObject *fd, char* src, Py_ssize_t bytes) Py_DECREF(result); return bytes; - } int -_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence) -{ +_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence) { PyObject *result; result = PyObject_CallMethod(fd, "seek", "ni", offset, whence); Py_DECREF(result); return 0; - } Py_ssize_t -_imaging_tell_pyFd(PyObject *fd) -{ +_imaging_tell_pyFd(PyObject *fd) { PyObject *result; Py_ssize_t location; diff --git a/src/libImaging/raqm.h b/src/libImaging/raqm.h index eae1f43b7..5f865853a 100644 --- a/src/libImaging/raqm.h +++ b/src/libImaging/raqm.h @@ -63,8 +63,7 @@ typedef struct _raqm raqm_t; * * Since: 0.1 */ -typedef enum -{ +typedef enum { RAQM_DIRECTION_DEFAULT, RAQM_DIRECTION_RTL, RAQM_DIRECTION_LTR, @@ -106,73 +105,50 @@ typedef struct raqm_glyph_t_01 { uint32_t cluster; } raqm_glyph_t_01; +raqm_t * +raqm_create(void); raqm_t * -raqm_create (void); - -raqm_t * -raqm_reference (raqm_t *rq); +raqm_reference(raqm_t *rq); void -raqm_destroy (raqm_t *rq); +raqm_destroy(raqm_t *rq); bool -raqm_set_text (raqm_t *rq, - const uint32_t *text, - size_t len); +raqm_set_text(raqm_t *rq, const uint32_t *text, size_t len); bool -raqm_set_text_utf8 (raqm_t *rq, - const char *text, - size_t len); +raqm_set_text_utf8(raqm_t *rq, const char *text, size_t len); bool -raqm_set_par_direction (raqm_t *rq, - raqm_direction_t dir); +raqm_set_par_direction(raqm_t *rq, raqm_direction_t dir); bool -raqm_set_language (raqm_t *rq, - const char *lang, - size_t start, - size_t len); +raqm_set_language(raqm_t *rq, const char *lang, size_t start, size_t len); bool -raqm_add_font_feature (raqm_t *rq, - const char *feature, - int len); +raqm_add_font_feature(raqm_t *rq, const char *feature, int len); bool -raqm_set_freetype_face (raqm_t *rq, - FT_Face face); +raqm_set_freetype_face(raqm_t *rq, FT_Face face); bool -raqm_set_freetype_face_range (raqm_t *rq, - FT_Face face, - size_t start, - size_t len); +raqm_set_freetype_face_range(raqm_t *rq, FT_Face face, size_t start, size_t len); bool -raqm_set_freetype_load_flags (raqm_t *rq, - int flags); +raqm_set_freetype_load_flags(raqm_t *rq, int flags); bool -raqm_layout (raqm_t *rq); +raqm_layout(raqm_t *rq); raqm_glyph_t * -raqm_get_glyphs (raqm_t *rq, - size_t *length); +raqm_get_glyphs(raqm_t *rq, size_t *length); bool -raqm_index_to_position (raqm_t *rq, - size_t *index, - int *x, - int *y); +raqm_index_to_position(raqm_t *rq, size_t *index, int *x, int *y); bool -raqm_position_to_index (raqm_t *rq, - int x, - int y, - size_t *index); +raqm_position_to_index(raqm_t *rq, int x, int y, size_t *index); #ifdef __cplusplus } diff --git a/src/map.c b/src/map.c index df2718ed7..2636a684b 100644 --- a/src/map.c +++ b/src/map.c @@ -23,17 +23,18 @@ #include "libImaging/Imaging.h" /* compatibility wrappers (defined in _imaging.c) */ -extern int PyImaging_CheckBuffer(PyObject* buffer); -extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); +extern int +PyImaging_CheckBuffer(PyObject *buffer); +extern int +PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view); /* -------------------------------------------------------------------- */ /* Standard mapper */ typedef struct { - PyObject_HEAD - char* base; - int size; - int offset; + PyObject_HEAD char *base; + int size; + int offset; #ifdef _WIN32 HANDLE hFile; HANDLE hMap; @@ -42,9 +43,8 @@ typedef struct { static PyTypeObject ImagingMapperType; -ImagingMapperObject* -PyImaging_MapperNew(const char* filename, int readonly) -{ +ImagingMapperObject * +PyImaging_MapperNew(const char *filename, int readonly) { ImagingMapperObject *mapper; if (PyType_Ready(&ImagingMapperType) < 0) { @@ -61,14 +61,15 @@ PyImaging_MapperNew(const char* filename, int readonly) #ifdef _WIN32 mapper->hFile = (HANDLE)-1; - mapper->hMap = (HANDLE)-1; + mapper->hMap = (HANDLE)-1; /* FIXME: currently supports readonly mappings only */ mapper->hFile = CreateFile( filename, GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, + NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (mapper->hFile == (HANDLE)-1) { @@ -77,10 +78,7 @@ PyImaging_MapperNew(const char* filename, int readonly) return NULL; } - mapper->hMap = CreateFileMapping( - mapper->hFile, NULL, - PAGE_READONLY, - 0, 0, NULL); + mapper->hMap = CreateFileMapping(mapper->hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (mapper->hMap == (HANDLE)-1) { CloseHandle(mapper->hFile); PyErr_SetString(PyExc_OSError, "cannot map file"); @@ -88,10 +86,7 @@ PyImaging_MapperNew(const char* filename, int readonly) return NULL; } - mapper->base = (char*) MapViewOfFile( - mapper->hMap, - FILE_MAP_READ, - 0, 0, 0); + mapper->base = (char *)MapViewOfFile(mapper->hMap, FILE_MAP_READ, 0, 0, 0); mapper->size = GetFileSize(mapper->hFile, 0); #endif @@ -100,8 +95,7 @@ PyImaging_MapperNew(const char* filename, int readonly) } static void -mapping_dealloc(ImagingMapperObject* mapper) -{ +mapping_dealloc(ImagingMapperObject *mapper) { #ifdef _WIN32 if (mapper->base != 0) { UnmapViewOfFile(mapper->base); @@ -121,10 +115,9 @@ mapping_dealloc(ImagingMapperObject* mapper) /* -------------------------------------------------------------------- */ /* standard file operations */ -static PyObject* -mapping_read(ImagingMapperObject* mapper, PyObject* args) -{ - PyObject* buf; +static PyObject * +mapping_read(ImagingMapperObject *mapper, PyObject *args) { + PyObject *buf; int size = -1; if (!PyArg_ParseTuple(args, "|i", &size)) { @@ -152,9 +145,8 @@ mapping_read(ImagingMapperObject* mapper, PyObject* args) return buf; } -static PyObject* -mapping_seek(ImagingMapperObject* mapper, PyObject* args) -{ +static PyObject * +mapping_seek(ImagingMapperObject *mapper, PyObject *args) { int offset; int whence = 0; if (!PyArg_ParseTuple(args, "i|i", &offset, &whence)) { @@ -183,27 +175,26 @@ mapping_seek(ImagingMapperObject* mapper, PyObject* args) /* -------------------------------------------------------------------- */ /* map entire image */ -extern PyObject*PyImagingNew(Imaging im); +extern PyObject * +PyImagingNew(Imaging im); static void -ImagingDestroyMap(Imaging im) -{ +ImagingDestroyMap(Imaging im) { return; /* nothing to do! */ } -static PyObject* -mapping_readimage(ImagingMapperObject* mapper, PyObject* args) -{ +static PyObject * +mapping_readimage(ImagingMapperObject *mapper, PyObject *args) { int y, size; Imaging im; - char* mode; + char *mode; int xsize; int ysize; int stride; int orientation; - if (!PyArg_ParseTuple(args, "s(ii)ii", &mode, &xsize, &ysize, - &stride, &orientation)) { + if (!PyArg_ParseTuple( + args, "s(ii)ii", &mode, &xsize, &ysize, &stride, &orientation)) { return NULL; } @@ -237,7 +228,7 @@ mapping_readimage(ImagingMapperObject* mapper, PyObject* args) } } else { for (y = 0; y < ysize; y++) { - im->image[ysize-y-1] = mapper->base + mapper->offset + y * stride; + im->image[ysize - y - 1] = mapper->base + mapper->offset + y * stride; } } @@ -258,48 +249,46 @@ static struct PyMethodDef methods[] = { }; static PyTypeObject ImagingMapperType = { - PyVarObject_HEAD_INIT(NULL, 0) - "ImagingMapper", /*tp_name*/ - sizeof(ImagingMapperObject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mapping_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + PyVarObject_HEAD_INIT(NULL, 0) "ImagingMapper", /*tp_name*/ + sizeof(ImagingMapperObject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)mapping_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; -PyObject* -PyImaging_Mapper(PyObject* self, PyObject* args) -{ - char* filename; +PyObject * +PyImaging_Mapper(PyObject *self, PyObject *args) { + char *filename; if (!PyArg_ParseTuple(args, "s", &filename)) { return NULL; } - return (PyObject*) PyImaging_MapperNew(filename, 1); + return (PyObject *)PyImaging_MapperNew(filename, 1); } /* -------------------------------------------------------------------- */ @@ -307,36 +296,43 @@ PyImaging_Mapper(PyObject* self, PyObject* args) typedef struct ImagingBufferInstance { struct ImagingMemoryInstance im; - PyObject* target; + PyObject *target; Py_buffer view; } ImagingBufferInstance; static void -mapping_destroy_buffer(Imaging im) -{ - ImagingBufferInstance* buffer = (ImagingBufferInstance*) im; +mapping_destroy_buffer(Imaging im) { + ImagingBufferInstance *buffer = (ImagingBufferInstance *)im; PyBuffer_Release(&buffer->view); Py_XDECREF(buffer->target); } -PyObject* -PyImaging_MapBuffer(PyObject* self, PyObject* args) -{ +PyObject * +PyImaging_MapBuffer(PyObject *self, PyObject *args) { Py_ssize_t y, size; Imaging im; - PyObject* target; + PyObject *target; Py_buffer view; - char* mode; - char* codec; + char *mode; + char *codec; Py_ssize_t offset; int xsize, ysize; int stride; int ystep; - if (!PyArg_ParseTuple(args, "O(ii)sn(sii)", &target, &xsize, &ysize, - &codec, &offset, &mode, &stride, &ystep)) { + if (!PyArg_ParseTuple( + args, + "O(ii)sn(sii)", + &target, + &xsize, + &ysize, + &codec, + &offset, + &mode, + &stride, + &ystep)) { return NULL; } @@ -360,7 +356,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) return NULL; } - size = (Py_ssize_t) ysize * stride; + size = (Py_ssize_t)ysize * stride; if (offset > PY_SSIZE_T_MAX - size) { PyErr_SetString(PyExc_MemoryError, "Integer overflow in offset"); @@ -383,8 +379,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) return NULL; } - im = ImagingNewPrologueSubtype( - mode, xsize, ysize, sizeof(ImagingBufferInstance)); + im = ImagingNewPrologueSubtype(mode, xsize, ysize, sizeof(ImagingBufferInstance)); if (!im) { PyBuffer_Release(&view); return NULL; @@ -393,20 +388,19 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args) /* setup file pointers */ if (ystep > 0) { for (y = 0; y < ysize; y++) { - im->image[y] = (char*)view.buf + offset + y * stride; + im->image[y] = (char *)view.buf + offset + y * stride; } } else { for (y = 0; y < ysize; y++) { - im->image[ysize-y-1] = (char*)view.buf + offset + y * stride; + im->image[ysize - y - 1] = (char *)view.buf + offset + y * stride; } } im->destroy = mapping_destroy_buffer; Py_INCREF(target); - ((ImagingBufferInstance*) im)->target = target; - ((ImagingBufferInstance*) im)->view = view; + ((ImagingBufferInstance *)im)->target = target; + ((ImagingBufferInstance *)im)->view = view; return PyImagingNew(im); } - diff --git a/src/outline.c b/src/outline.c index a109189e1..ba3e056cc 100644 --- a/src/outline.c +++ b/src/outline.c @@ -21,22 +21,19 @@ #include "libImaging/Imaging.h" - /* -------------------------------------------------------------------- */ /* Class */ typedef struct { - PyObject_HEAD - ImagingOutline outline; + PyObject_HEAD ImagingOutline outline; } OutlineObject; static PyTypeObject OutlineType; #define PyOutline_Check(op) (Py_TYPE(op) == &OutlineType) -static OutlineObject* -_outline_new(void) -{ +static OutlineObject * +_outline_new(void) { OutlineObject *self; if (PyType_Ready(&OutlineType) < 0) { @@ -54,43 +51,37 @@ _outline_new(void) } static void -_outline_dealloc(OutlineObject* self) -{ +_outline_dealloc(OutlineObject *self) { ImagingOutlineDelete(self->outline); PyObject_Del(self); } ImagingOutline -PyOutline_AsOutline(PyObject* outline) -{ +PyOutline_AsOutline(PyObject *outline) { if (PyOutline_Check(outline)) { - return ((OutlineObject*) outline)->outline; + return ((OutlineObject *)outline)->outline; } return NULL; } - /* -------------------------------------------------------------------- */ /* Factories */ -PyObject* -PyOutline_Create(PyObject* self, PyObject* args) -{ +PyObject * +PyOutline_Create(PyObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":outline")) { return NULL; } - return (PyObject*) _outline_new(); + return (PyObject *)_outline_new(); } - /* -------------------------------------------------------------------- */ /* Methods */ -static PyObject* -_outline_move(OutlineObject* self, PyObject* args) -{ +static PyObject * +_outline_move(OutlineObject *self, PyObject *args) { float x0, y0; if (!PyArg_ParseTuple(args, "ff", &x0, &y0)) { return NULL; @@ -102,9 +93,8 @@ _outline_move(OutlineObject* self, PyObject* args) return Py_None; } -static PyObject* -_outline_line(OutlineObject* self, PyObject* args) -{ +static PyObject * +_outline_line(OutlineObject *self, PyObject *args) { float x1, y1; if (!PyArg_ParseTuple(args, "ff", &x1, &y1)) { return NULL; @@ -116,9 +106,8 @@ _outline_line(OutlineObject* self, PyObject* args) return Py_None; } -static PyObject* -_outline_curve(OutlineObject* self, PyObject* args) -{ +static PyObject * +_outline_curve(OutlineObject *self, PyObject *args) { float x1, y1, x2, y2, x3, y3; if (!PyArg_ParseTuple(args, "ffffff", &x1, &y1, &x2, &y2, &x3, &y3)) { return NULL; @@ -130,9 +119,8 @@ _outline_curve(OutlineObject* self, PyObject* args) return Py_None; } -static PyObject* -_outline_close(OutlineObject* self, PyObject* args) -{ +static PyObject * +_outline_close(OutlineObject *self, PyObject *args) { if (!PyArg_ParseTuple(args, ":close")) { return NULL; } @@ -143,11 +131,10 @@ _outline_close(OutlineObject* self, PyObject* args) return Py_None; } -static PyObject* -_outline_transform(OutlineObject* self, PyObject* args) -{ +static PyObject * +_outline_transform(OutlineObject *self, PyObject *args) { double a[6]; - if (!PyArg_ParseTuple(args, "(dddddd)", a+0, a+1, a+2, a+3, a+4, a+5)) { + if (!PyArg_ParseTuple(args, "(dddddd)", a + 0, a + 1, a + 2, a + 3, a + 4, a + 5)) { return NULL; } @@ -167,35 +154,34 @@ static struct PyMethodDef _outline_methods[] = { }; static PyTypeObject OutlineType = { - PyVarObject_HEAD_INIT(NULL, 0) - "Outline", /*tp_name*/ - sizeof(OutlineObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "Outline", /*tp_name*/ + sizeof(OutlineObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)_outline_dealloc,/*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - _outline_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ + (destructor)_outline_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + _outline_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ }; diff --git a/src/path.c b/src/path.c index 62e7e15b5..8d1f68e84 100644 --- a/src/path.c +++ b/src/path.c @@ -25,37 +25,36 @@ * See the README file for information on usage and redistribution. */ - #include "Python.h" #include "libImaging/Imaging.h" #include /* compatibility wrappers (defined in _imaging.c) */ -extern int PyImaging_CheckBuffer(PyObject* buffer); -extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); +extern int +PyImaging_CheckBuffer(PyObject *buffer); +extern int +PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view); /* -------------------------------------------------------------------- */ /* Class */ /* -------------------------------------------------------------------- */ typedef struct { - PyObject_HEAD - Py_ssize_t count; + PyObject_HEAD Py_ssize_t count; double *xy; int index; /* temporary use, e.g. in decimate */ } PyPathObject; static PyTypeObject PyPathType; -static double* -alloc_array(Py_ssize_t count) -{ - double* xy; +static double * +alloc_array(Py_ssize_t count) { + double *xy; if (count < 0) { return ImagingError_MemoryError(); } - if ((unsigned long long)count > (SIZE_MAX / (2 * sizeof(double))) - 1 ) { + if ((unsigned long long)count > (SIZE_MAX / (2 * sizeof(double))) - 1) { return ImagingError_MemoryError(); } xy = malloc(2 * count * sizeof(double) + 1); @@ -65,14 +64,13 @@ alloc_array(Py_ssize_t count) return xy; } -static PyPathObject* -path_new(Py_ssize_t count, double* xy, int duplicate) -{ +static PyPathObject * +path_new(Py_ssize_t count, double *xy, int duplicate) { PyPathObject *path; if (duplicate) { /* duplicate path */ - double* p = alloc_array(count); + double *p = alloc_array(count); if (!p) { return NULL; } @@ -98,8 +96,7 @@ path_new(Py_ssize_t count, double* xy, int duplicate) } static void -path_dealloc(PyPathObject* path) -{ +path_dealloc(PyPathObject *path) { free(path->xy); PyObject_Del(path); } @@ -111,14 +108,13 @@ path_dealloc(PyPathObject* path) #define PyPath_Check(op) (Py_TYPE(op) == &PyPathType) Py_ssize_t -PyPath_Flatten(PyObject* data, double **pxy) -{ +PyPath_Flatten(PyObject *data, double **pxy) { Py_ssize_t i, j, n; double *xy; if (PyPath_Check(data)) { /* This was another path object. */ - PyPathObject *path = (PyPathObject*) data; + PyPathObject *path = (PyPathObject *)data; xy = alloc_array(path->count); if (!xy) { return -1; @@ -132,13 +128,13 @@ PyPath_Flatten(PyObject* data, double **pxy) /* Assume the buffer contains floats */ Py_buffer buffer; if (PyImaging_GetBuffer(data, &buffer) == 0) { - float *ptr = (float*) buffer.buf; + float *ptr = (float *)buffer.buf; n = buffer.len / (2 * sizeof(float)); xy = alloc_array(n); if (!xy) { return -1; } - for (i = 0; i < n+n; i++) { + for (i = 0; i < n + n; i++) { xy[i] = ptr[i]; } *pxy = xy; @@ -174,7 +170,7 @@ PyPath_Flatten(PyObject* data, double **pxy) if (PyFloat_Check(op)) { xy[j++] = PyFloat_AS_DOUBLE(op); } else if (PyLong_Check(op)) { - xy[j++] = (float) PyLong_AS_LONG(op); + xy[j++] = (float)PyLong_AS_LONG(op); } else if (PyNumber_Check(op)) { xy[j++] = PyFloat_AsDouble(op); } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { @@ -192,7 +188,7 @@ PyPath_Flatten(PyObject* data, double **pxy) if (PyFloat_Check(op)) { xy[j++] = PyFloat_AS_DOUBLE(op); } else if (PyLong_Check(op)) { - xy[j++] = (float) PyLong_AS_LONG(op); + xy[j++] = (float)PyLong_AS_LONG(op); } else if (PyNumber_Check(op)) { xy[j++] = PyFloat_AsDouble(op); } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { @@ -209,8 +205,7 @@ PyPath_Flatten(PyObject* data, double **pxy) PyObject *op = PySequence_GetItem(data, i); if (!op) { /* treat IndexError as end of sequence */ - if (PyErr_Occurred() && - PyErr_ExceptionMatches(PyExc_IndexError)) { + if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_IndexError)) { PyErr_Clear(); break; } else { @@ -221,7 +216,7 @@ PyPath_Flatten(PyObject* data, double **pxy) if (PyFloat_Check(op)) { xy[j++] = PyFloat_AS_DOUBLE(op); } else if (PyLong_Check(op)) { - xy[j++] = (float) PyLong_AS_LONG(op); + xy[j++] = (float)PyLong_AS_LONG(op); } else if (PyNumber_Check(op)) { xy[j++] = PyFloat_AsDouble(op); } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { @@ -243,23 +238,20 @@ PyPath_Flatten(PyObject* data, double **pxy) } *pxy = xy; - return j/2; + return j / 2; } - /* -------------------------------------------------------------------- */ /* Factories */ /* -------------------------------------------------------------------- */ -PyObject* -PyPath_Create(PyObject* self, PyObject* args) -{ - PyObject* data; +PyObject * +PyPath_Create(PyObject *self, PyObject *args) { + PyObject *data; Py_ssize_t count; double *xy; if (PyArg_ParseTuple(args, "n:Path", &count)) { - /* number of vertices */ xy = alloc_array(count); if (!xy) { @@ -267,7 +259,6 @@ PyPath_Create(PyObject* self, PyObject* args) } } else { - /* sequence or other path */ PyErr_Clear(); if (!PyArg_ParseTuple(args, "O", &data)) { @@ -280,17 +271,15 @@ PyPath_Create(PyObject* self, PyObject* args) } } - return (PyObject*) path_new(count, xy, 0); + return (PyObject *)path_new(count, xy, 0); } - /* -------------------------------------------------------------------- */ /* Methods */ /* -------------------------------------------------------------------- */ -static PyObject* -path_compact(PyPathObject* self, PyObject* args) -{ +static PyObject * +path_compact(PyPathObject *self, PyObject *args) { /* Simple-minded method to shorten path. A point is removed if the city block distance to the previous point is less than the given distance */ @@ -307,9 +296,10 @@ path_compact(PyPathObject* self, PyObject* args) /* remove bogus vertices */ for (i = j = 1; i < self->count; i++) { - if (fabs(xy[j+j-2]-xy[i+i]) + fabs(xy[j+j-1]-xy[i+i+1]) >= cityblock) { - xy[j+j] = xy[i+i]; - xy[j+j+1] = xy[i+i+1]; + if (fabs(xy[j + j - 2] - xy[i + i]) + fabs(xy[j + j - 1] - xy[i + i + 1]) >= + cityblock) { + xy[j + j] = xy[i + i]; + xy[j + j + 1] = xy[i + i + 1]; j++; } } @@ -324,9 +314,8 @@ path_compact(PyPathObject* self, PyObject* args) return Py_BuildValue("i", i); /* number of removed vertices */ } -static PyObject* -path_getbbox(PyPathObject* self, PyObject* args) -{ +static PyObject * +path_getbbox(PyPathObject *self, PyObject *args) { /* Find bounding box */ Py_ssize_t i; double *xy; @@ -342,26 +331,25 @@ path_getbbox(PyPathObject* self, PyObject* args) y0 = y1 = xy[1]; for (i = 1; i < self->count; i++) { - if (xy[i+i] < x0) { - x0 = xy[i+i]; + if (xy[i + i] < x0) { + x0 = xy[i + i]; } - if (xy[i+i] > x1) { - x1 = xy[i+i]; + if (xy[i + i] > x1) { + x1 = xy[i + i]; } - if (xy[i+i+1] < y0) { - y0 = xy[i+i+1]; + if (xy[i + i + 1] < y0) { + y0 = xy[i + i + 1]; } - if (xy[i+i+1] > y1) { - y1 = xy[i+i+1]; + if (xy[i + i + 1] > y1) { + y1 = xy[i + i + 1]; } } return Py_BuildValue("dddd", x0, y0, x1, y1); } -static PyObject* -path_getitem(PyPathObject* self, Py_ssize_t i) -{ +static PyObject * +path_getitem(PyPathObject *self, Py_ssize_t i) { if (i < 0) { i = self->count + i; } @@ -370,12 +358,11 @@ path_getitem(PyPathObject* self, Py_ssize_t i) return NULL; } - return Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); + return Py_BuildValue("dd", self->xy[i + i], self->xy[i + i + 1]); } -static PyObject* -path_getslice(PyPathObject* self, Py_ssize_t ilow, Py_ssize_t ihigh) -{ +static PyObject * +path_getslice(PyPathObject *self, Py_ssize_t ilow, Py_ssize_t ihigh) { /* adjust arguments */ if (ilow < 0) { ilow = 0; @@ -391,22 +378,20 @@ path_getslice(PyPathObject* self, Py_ssize_t ilow, Py_ssize_t ihigh) ihigh = self->count; } - return (PyObject*) path_new(ihigh - ilow, self->xy + ilow * 2, 1); + return (PyObject *)path_new(ihigh - ilow, self->xy + ilow * 2, 1); } static Py_ssize_t -path_len(PyPathObject* self) -{ +path_len(PyPathObject *self) { return self->count; } -static PyObject* -path_map(PyPathObject* self, PyObject* args) -{ +static PyObject * +path_map(PyPathObject *self, PyObject *args) { /* Map coordinate set through function */ Py_ssize_t i; double *xy; - PyObject* function; + PyObject *function; if (!PyArg_ParseTuple(args, "O:map", &function)) { return NULL; @@ -416,15 +401,15 @@ path_map(PyPathObject* self, PyObject* args) /* apply function to coordinate set */ for (i = 0; i < self->count; i++) { - double x = xy[i+i]; - double y = xy[i+i+1]; - PyObject* item = PyObject_CallFunction(function, "dd", x, y); + double x = xy[i + i]; + double y = xy[i + i + 1]; + PyObject *item = PyObject_CallFunction(function, "dd", x, y); if (!item || !PyArg_ParseTuple(item, "dd", &x, &y)) { Py_XDECREF(item); return NULL; } - xy[i+i] = x; - xy[i+i+1] = y; + xy[i + i] = x; + xy[i + i + 1] = y; Py_DECREF(item); } @@ -433,23 +418,20 @@ path_map(PyPathObject* self, PyObject* args) } static int -path_setitem(PyPathObject* self, Py_ssize_t i, PyObject* op) -{ - double* xy; +path_setitem(PyPathObject *self, Py_ssize_t i, PyObject *op) { + double *xy; if (i < 0 || i >= self->count) { - PyErr_SetString(PyExc_IndexError, - "path assignment index out of range"); + PyErr_SetString(PyExc_IndexError, "path assignment index out of range"); return -1; } if (op == NULL) { - PyErr_SetString(PyExc_TypeError, - "cannot delete from path"); + PyErr_SetString(PyExc_TypeError, "cannot delete from path"); return -1; } - xy = &self->xy[i+i]; + xy = &self->xy[i + i]; if (!PyArg_ParseTuple(op, "dd", &xy[0], &xy[1])) { return -1; @@ -458,9 +440,8 @@ path_setitem(PyPathObject* self, Py_ssize_t i, PyObject* op) return 0; } -static PyObject* -path_tolist(PyPathObject* self, PyObject* args) -{ +static PyObject * +path_tolist(PyPathObject *self, PyObject *args) { PyObject *list; Py_ssize_t i; @@ -470,9 +451,9 @@ path_tolist(PyPathObject* self, PyObject* args) } if (flat) { - list = PyList_New(self->count*2); - for (i = 0; i < self->count*2; i++) { - PyObject* item; + list = PyList_New(self->count * 2); + for (i = 0; i < self->count * 2; i++) { + PyObject *item; item = PyFloat_FromDouble(self->xy[i]); if (!item) { goto error; @@ -482,8 +463,8 @@ path_tolist(PyPathObject* self, PyObject* args) } else { list = PyList_New(self->count); for (i = 0; i < self->count; i++) { - PyObject* item; - item = Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); + PyObject *item; + item = Py_BuildValue("dd", self->xy[i + i], self->xy[i + i + 1]); if (!item) { goto error; } @@ -498,9 +479,8 @@ error: return NULL; } -static PyObject* -path_transform(PyPathObject* self, PyObject* args) -{ +static PyObject * +path_transform(PyPathObject *self, PyObject *args) { /* Apply affine transform to coordinate set */ Py_ssize_t i; double *xy; @@ -508,9 +488,8 @@ path_transform(PyPathObject* self, PyObject* args) double wrap = 0.0; - if (!PyArg_ParseTuple(args, "(dddddd)|d:transform", - &a, &b, &c, &d, &e, &f, - &wrap)) { + if (!PyArg_ParseTuple( + args, "(dddddd)|d:transform", &a, &b, &c, &d, &e, &f, &wrap)) { return NULL; } @@ -520,23 +499,23 @@ path_transform(PyPathObject* self, PyObject* args) if (b == 0.0 && d == 0.0) { /* scaling */ for (i = 0; i < self->count; i++) { - xy[i+i] = a*xy[i+i]+c; - xy[i+i+1] = e*xy[i+i+1]+f; + xy[i + i] = a * xy[i + i] + c; + xy[i + i + 1] = e * xy[i + i + 1] + f; } } else { /* affine transform */ for (i = 0; i < self->count; i++) { - double x = xy[i+i]; - double y = xy[i+i+1]; - xy[i+i] = a*x+b*y+c; - xy[i+i+1] = d*x+e*y+f; + double x = xy[i + i]; + double y = xy[i + i + 1]; + xy[i + i] = a * x + b * y + c; + xy[i + i + 1] = d * x + e * y + f; } } /* special treatment of geographical map data */ if (wrap != 0.0) { for (i = 0; i < self->count; i++) { - xy[i+i] = fmod(xy[i+i], wrap); + xy[i + i] = fmod(xy[i + i], wrap); } } @@ -553,19 +532,15 @@ static struct PyMethodDef methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject* -path_getattr_id(PyPathObject* self, void* closure) -{ - return Py_BuildValue("n", (Py_ssize_t) self->xy); +static PyObject * +path_getattr_id(PyPathObject *self, void *closure) { + return Py_BuildValue("n", (Py_ssize_t)self->xy); } -static struct PyGetSetDef getsetters[] = { - { "id", (getter) path_getattr_id }, - { NULL } -}; +static struct PyGetSetDef getsetters[] = {{"id", (getter)path_getattr_id}, {NULL}}; -static PyObject* -path_subscript(PyPathObject* self, PyObject* item) { +static PyObject * +path_subscript(PyPathObject *self, PyObject *item) { if (PyIndex_Check(item)) { Py_ssize_t i; i = PyNumber_AsSsize_t(item, PyExc_IndexError); @@ -584,71 +559,64 @@ path_subscript(PyPathObject* self, PyObject* item) { if (slicelength <= 0) { double *xy = alloc_array(0); - return (PyObject*) path_new(0, xy, 0); - } - else if (step == 1) { + return (PyObject *)path_new(0, xy, 0); + } else if (step == 1) { return path_getslice(self, start, stop); - } - else { + } else { PyErr_SetString(PyExc_TypeError, "slice steps not supported"); return NULL; } - } - else { - PyErr_Format(PyExc_TypeError, - "Path indices must be integers, not %.200s", - Py_TYPE(item)->tp_name); + } else { + PyErr_Format( + PyExc_TypeError, + "Path indices must be integers, not %.200s", + Py_TYPE(item)->tp_name); return NULL; } } static PySequenceMethods path_as_sequence = { - (lenfunc)path_len, /*sq_length*/ - (binaryfunc)0, /*sq_concat*/ - (ssizeargfunc)0, /*sq_repeat*/ - (ssizeargfunc)path_getitem, /*sq_item*/ - (ssizessizeargfunc)path_getslice, /*sq_slice*/ - (ssizeobjargproc)path_setitem, /*sq_ass_item*/ - (ssizessizeobjargproc)0, /*sq_ass_slice*/ + (lenfunc)path_len, /*sq_length*/ + (binaryfunc)0, /*sq_concat*/ + (ssizeargfunc)0, /*sq_repeat*/ + (ssizeargfunc)path_getitem, /*sq_item*/ + (ssizessizeargfunc)path_getslice, /*sq_slice*/ + (ssizeobjargproc)path_setitem, /*sq_ass_item*/ + (ssizessizeobjargproc)0, /*sq_ass_slice*/ }; static PyMappingMethods path_as_mapping = { - (lenfunc)path_len, - (binaryfunc)path_subscript, - NULL -}; + (lenfunc)path_len, (binaryfunc)path_subscript, NULL}; static PyTypeObject PyPathType = { - PyVarObject_HEAD_INIT(NULL, 0) - "Path", /*tp_name*/ - sizeof(PyPathObject), /*tp_size*/ - 0, /*tp_itemsize*/ + PyVarObject_HEAD_INIT(NULL, 0) "Path", /*tp_name*/ + sizeof(PyPathObject), /*tp_size*/ + 0, /*tp_itemsize*/ /* methods */ - (destructor)path_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - &path_as_sequence, /*tp_as_sequence */ - &path_as_mapping, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - getsetters, /*tp_getset*/ + (destructor)path_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + &path_as_sequence, /*tp_as_sequence */ + &path_as_mapping, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + methods, /*tp_methods*/ + 0, /*tp_members*/ + getsetters, /*tp_getset*/ }; - From 7f5dbb7c9b30429ca20e65416b6dee41e5762ee1 Mon Sep 17 00:00:00 2001 From: Uriel Martinez <57372467+UrielMaD@users.noreply.github.com> Date: Sat, 2 Jan 2021 21:57:24 -0600 Subject: [PATCH 219/750] Update src/PIL/Image.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/PIL/Image.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index df78fb809..b0629f4b6 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1321,8 +1321,8 @@ class Image: def getxmp(self): """ - Returns an object containing the xmp tags for a given image. - :returns: XMP tags in an object. + Returns a dictionary containing the xmp tags for a given image. + :returns: XMP tags in a dictionary. """ if self._xmp is None: From 097f7d0f56baecf35a63e29960666def35fb5925 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Wed, 16 Oct 2019 00:21:15 +0300 Subject: [PATCH 220/750] Stop decoding BC1 punchthrough alpha in BC2&3 --- src/libImaging/BcnDecode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index b6a4cbadc..611daba57 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -69,7 +69,7 @@ decode_565(UINT16 x) { } static void -decode_bc1_color(rgba *dst, const UINT8 *src) { +decode_bc1_color(rgba *dst, const UINT8 *src, int separate_alpha) { bc1_color col; rgba p[4]; int n, cw; @@ -150,13 +150,13 @@ decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { static void decode_bc1_block(rgba *col, const UINT8 *src) { - decode_bc1_color(col, src); + decode_bc1_color(col, src, 0); } static void decode_bc2_block(rgba *col, const UINT8 *src) { int n, bitI, byI, av; - decode_bc1_color(col, src + 8); + decode_bc1_color(col, src + 8, 1); for (n = 0; n < 16; n++) { bitI = n * 4; byI = bitI >> 3; @@ -168,7 +168,7 @@ decode_bc2_block(rgba *col, const UINT8 *src) { static void decode_bc3_block(rgba *col, const UINT8 *src) { - decode_bc1_color(col, src + 8); + decode_bc1_color(col, src + 8, 1); decode_bc3_alpha((char *)col, src, sizeof(col[0]), 3); } From ddd3a2b482a8316d81def53d14ded43368c49701 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Thu, 9 Jan 2020 05:06:48 +0200 Subject: [PATCH 221/750] Add tests for issue #4142 --- .../images/dxt5-colorblock-alpha-issue-4142.dds | Bin 0 -> 384 bytes Tests/test_file_dds.py | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 Tests/images/dxt5-colorblock-alpha-issue-4142.dds diff --git a/Tests/images/dxt5-colorblock-alpha-issue-4142.dds b/Tests/images/dxt5-colorblock-alpha-issue-4142.dds new file mode 100644 index 0000000000000000000000000000000000000000..905527eada42fe98ea900f9608411e61c58480ae GIT binary patch literal 384 zcmZ>930A0KU|?Vu;9y_@(jY7V#N+@4peB%hmxvHktopGSoD{W|w^wN8GQ}f~N8(>U z$ViTxy~#4_y%>nkxqt8b#Hhb}1GN=39gip;34OKpZgQB4dTzt~IgV!(_pDy^>wiYv z&hLAY*fSl^I35YTs=q2ddd8LeIal`p<&XTozv_Bctn$R?TV8Kc1j=jgUl*GlEirpf zY36j0`iAS*uck#6dpe$bYXvfI)vEvhQ$r_hW6YU-8))Ai28Pw#Ns+fXww2GF26E5( zSL;_LNB94{z0Bnc$UUpH)_;l*@3Za^cHicB#BtAh28LDfQKD~GM*j~2$**JXS{ENS f+rTb&_f?Sj>;M1%pAbIj!*iAI(?Rn4L&M_%){2PU literal 0 HcmV?d00001 diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 1cd7a1be7..5651c2e4d 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -190,6 +190,21 @@ def test_short_file(): short_file() +def test_dxt5_colorblock_alpha_issue_4142(): + """ Check that colorblocks are decoded correctly in DXT5""" + + with Image.open("Tests/images/dxt5-colorblock-alpha-issue-4142.dds") as im: + px = im.getpixel((0, 0)) + assert px[0] != 0 + assert px[1] != 0 + assert px[2] != 0 + + px = im.getpixel((1, 0)) + assert px[0] != 0 + assert px[1] != 0 + assert px[2] != 0 + + def test_unimplemented_pixel_format(): with pytest.raises(NotImplementedError): Image.open("Tests/images/unimplemented_pixel_format.dds") From b08c514ee76dd10f6c4f35ab87fd6f1b6bc77be3 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Thu, 9 Jan 2020 05:25:03 +0200 Subject: [PATCH 222/750] BcnDecode: add comment about BC2&3 color blocks --- src/libImaging/BcnDecode.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index 611daba57..5e8b456b8 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -84,7 +84,10 @@ decode_bc1_color(rgba *dst, const UINT8 *src, int separate_alpha) { r1 = p[1].r; g1 = p[1].g; b1 = p[1].b; - if (col.c0 > col.c1) { + + + /* NOTE: BC2 and BC3 reuse BC1 color blocks but always act like c0 > c1 */ + if (col.c0 > col.c1 || separate_alpha) { p[2].r = (2 * r0 + 1 * r1) / 3; p[2].g = (2 * g0 + 1 * g1) / 3; p[2].b = (2 * b0 + 1 * b1) / 3; From 930059814d16a33a2e83f15e45fdbbf338f02813 Mon Sep 17 00:00:00 2001 From: Esteban Gehring Date: Mon, 4 Jan 2021 13:42:15 +0100 Subject: [PATCH 223/750] docs: add alpha channel to supported hex color specifiers --- docs/reference/ImageColor.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index e32a77b54..9730bd28f 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -16,8 +16,17 @@ Color Names The ImageColor module supports the following string formats: -* Hexadecimal color specifiers, given as ``#rgb`` or ``#rrggbb``. For example, - ``#ff0000`` specifies pure red. +* Hexadecimal color specifiers, given as ``#rgb``, ``#rgba``, ``#rrggbb`` or ``#rrggbbaa``, + with the following placeholders: + - ``r``: red + - ``g``: green + - ``b``: blue + - ``a``: alpha / opacity (can be used in combination with ``mode="RGBA"`` in :py:mod:`~PIL.ImageDraw`) + + Examples: + - ``#ff0000`` specifies pure red. + - ``#ff0000aa`` specifies pure red with an opacity of 66.66% (aa = 170, opacity = 170/255). + * RGB functions, given as ``rgb(red, green, blue)`` where the color values are integers in the range 0 to 255. Alternatively, the color values can be given From e5e5761da4860d8284ca757ee828ff8ef0df720a Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 08:29:34 +0000 Subject: [PATCH 224/750] add raqm to thirdparty directory --- src/thirdparty/raqm/raqm-version.h | 44 + src/thirdparty/raqm/raqm.c | 2069 ++++++++++++++++++++++++++++ src/thirdparty/raqm/raqm.h | 185 +++ 3 files changed, 2298 insertions(+) create mode 100644 src/thirdparty/raqm/raqm-version.h create mode 100644 src/thirdparty/raqm/raqm.c create mode 100644 src/thirdparty/raqm/raqm.h diff --git a/src/thirdparty/raqm/raqm-version.h b/src/thirdparty/raqm/raqm-version.h new file mode 100644 index 000000000..4fd5c6842 --- /dev/null +++ b/src/thirdparty/raqm/raqm-version.h @@ -0,0 +1,44 @@ +/* + * Copyright © 2011 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef _RAQM_H_IN_ +#error "Include instead." +#endif + +#ifndef _RAQM_VERSION_H_ +#define _RAQM_VERSION_H_ + +#define RAQM_VERSION_MAJOR 0 +#define RAQM_VERSION_MINOR 7 +#define RAQM_VERSION_MICRO 1 + +#define RAQM_VERSION_STRING "0.7.1" + +#define RAQM_VERSION_ATLEAST(major,minor,micro) \ + ((major)*10000+(minor)*100+(micro) <= \ + RAQM_VERSION_MAJOR*10000+RAQM_VERSION_MINOR*100+RAQM_VERSION_MICRO) + +#endif /* _RAQM_VERSION_H_ */ diff --git a/src/thirdparty/raqm/raqm.c b/src/thirdparty/raqm/raqm.c new file mode 100644 index 000000000..27e59b5fc --- /dev/null +++ b/src/thirdparty/raqm/raqm.c @@ -0,0 +1,2069 @@ +/* + * Copyright © 2015 Information Technology Authority (ITA) + * Copyright © 2016 Khaled Hosny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#undef HAVE_CONFIG_H // Workaround for Fribidi 1.0.5 and earlier +#endif + +#include +#include + +#include +#include +#include + +#include "raqm.h" + +#if FRIBIDI_MAJOR_VERSION >= 1 +#define USE_FRIBIDI_EX_API +#endif + +/** + * SECTION:raqm + * @title: Raqm + * @short_description: A library for complex text layout + * @include: raqm.h + * + * Raqm is a light weight text layout library with strong emphasis on + * supporting languages and writing systems that require complex text layout. + * + * The main object in Raqm API is #raqm_t, it stores all the states of the + * input text, its properties, and the output of the layout process. + * + * To start, you create a #raqm_t object, add text and font(s) to it, run the + * layout process, and finally query about the output. For example: + * + * |[ + * #include "raqm.h" + * + * int + * main (int argc, char *argv[]) + * { + * const char *fontfile; + * const char *text; + * const char *direction; + * const char *language; + * int ret = 1; + * + * FT_Library library = NULL; + * FT_Face face = NULL; + * + * if (argc < 5) + * { + * printf ("Usage: %s FONT_FILE TEXT DIRECTION LANG\n", argv[0]); + * return 1; + * } + * + * fontfile = argv[1]; + * text = argv[2]; + * direction = argv[3]; + * language = argv[4]; + * + * if (FT_Init_FreeType (&library) == 0) + * { + * if (FT_New_Face (library, fontfile, 0, &face) == 0) + * { + * if (FT_Set_Char_Size (face, face->units_per_EM, 0, 0, 0) == 0) + * { + * raqm_t *rq = raqm_create (); + * if (rq != NULL) + * { + * raqm_direction_t dir = RAQM_DIRECTION_DEFAULT; + * + * if (strcmp (direction, "r") == 0) + * dir = RAQM_DIRECTION_RTL; + * else if (strcmp (direction, "l") == 0) + * dir = RAQM_DIRECTION_LTR; + * + * if (raqm_set_text_utf8 (rq, text, strlen (text)) && + * raqm_set_freetype_face (rq, face) && + * raqm_set_par_direction (rq, dir) && + * raqm_set_language (rq, language, 0, strlen (text)) && + * raqm_layout (rq)) + * { + * size_t count, i; + * raqm_glyph_t *glyphs = raqm_get_glyphs (rq, &count); + * + * ret = !(glyphs != NULL || count == 0); + * + * printf("glyph count: %zu\n", count); + * for (i = 0; i < count; i++) + * { + * printf ("gid#%d off: (%d, %d) adv: (%d, %d) idx: %d\n", + * glyphs[i].index, + * glyphs[i].x_offset, + * glyphs[i].y_offset, + * glyphs[i].x_advance, + * glyphs[i].y_advance, + * glyphs[i].cluster); + * } + * } + * + * raqm_destroy (rq); + * } + * } + * + * FT_Done_Face (face); + * } + * + * FT_Done_FreeType (library); + * } + * + * return ret; + * } + * ]| + * To compile this example: + * |[ + * cc -o test test.c `pkg-config --libs --cflags raqm` + * ]| + */ + +/* For enabling debug mode */ +/*#define RAQM_DEBUG 1*/ +#ifdef RAQM_DEBUG +#define RAQM_DBG(...) fprintf (stderr, __VA_ARGS__) +#else +#define RAQM_DBG(...) +#endif + +#ifdef RAQM_TESTING +# define RAQM_TEST(...) printf (__VA_ARGS__) +# define SCRIPT_TO_STRING(script) \ + char buff[5]; \ + hb_tag_to_string (hb_script_to_iso15924_tag (script), buff); \ + buff[4] = '\0'; +#else +# define RAQM_TEST(...) +#endif + +typedef enum { + RAQM_FLAG_NONE = 0, + RAQM_FLAG_UTF8 = 1 << 0 +} _raqm_flags_t; + +typedef struct { + FT_Face ftface; + hb_language_t lang; + hb_script_t script; +} _raqm_text_info; + +typedef struct _raqm_run raqm_run_t; + +struct _raqm { + int ref_count; + + uint32_t *text; + char *text_utf8; + size_t text_len; + + _raqm_text_info *text_info; + + raqm_direction_t base_dir; + raqm_direction_t resolved_dir; + + hb_feature_t *features; + size_t features_len; + + raqm_run_t *runs; + raqm_glyph_t *glyphs; + + _raqm_flags_t flags; + + int ft_loadflags; + int invisible_glyph; +}; + +struct _raqm_run { + int pos; + int len; + + hb_direction_t direction; + hb_script_t script; + hb_font_t *font; + hb_buffer_t *buffer; + + raqm_run_t *next; +}; + +static uint32_t +_raqm_u8_to_u32_index (raqm_t *rq, + uint32_t index); + +static bool +_raqm_init_text_info (raqm_t *rq) +{ + hb_language_t default_lang; + + if (rq->text_info) + return true; + + rq->text_info = malloc (sizeof (_raqm_text_info) * rq->text_len); + if (!rq->text_info) + return false; + + default_lang = hb_language_get_default (); + for (size_t i = 0; i < rq->text_len; i++) + { + rq->text_info[i].ftface = NULL; + rq->text_info[i].lang = default_lang; + rq->text_info[i].script = HB_SCRIPT_INVALID; + } + + return true; +} + +static void +_raqm_free_text_info (raqm_t *rq) +{ + if (!rq->text_info) + return; + + for (size_t i = 0; i < rq->text_len; i++) + { + if (rq->text_info[i].ftface) + FT_Done_Face (rq->text_info[i].ftface); + } + + free (rq->text_info); + rq->text_info = NULL; +} + +static bool +_raqm_compare_text_info (_raqm_text_info a, + _raqm_text_info b) +{ + if (a.ftface != b.ftface) + return false; + + if (a.lang != b.lang) + return false; + + if (a.script != b.script) + return false; + + return true; +} + +/** + * raqm_create: + * + * Creates a new #raqm_t with all its internal states initialized to their + * defaults. + * + * Return value: + * A newly allocated #raqm_t with a reference count of 1. The initial reference + * count should be released with raqm_destroy() when you are done using the + * #raqm_t. Returns %NULL in case of error. + * + * Since: 0.1 + */ +raqm_t * +raqm_create (void) +{ + raqm_t *rq; + + rq = malloc (sizeof (raqm_t)); + if (!rq) + return NULL; + + rq->ref_count = 1; + + rq->text = NULL; + rq->text_utf8 = NULL; + rq->text_len = 0; + + rq->text_info = NULL; + + rq->base_dir = RAQM_DIRECTION_DEFAULT; + rq->resolved_dir = RAQM_DIRECTION_DEFAULT; + + rq->features = NULL; + rq->features_len = 0; + + rq->runs = NULL; + rq->glyphs = NULL; + + rq->flags = RAQM_FLAG_NONE; + + rq->ft_loadflags = -1; + rq->invisible_glyph = 0; + + return rq; +} + +/** + * raqm_reference: + * @rq: a #raqm_t. + * + * Increases the reference count on @rq by one. This prevents @rq from being + * destroyed until a matching call to raqm_destroy() is made. + * + * Return value: + * The referenced #raqm_t. + * + * Since: 0.1 + */ +raqm_t * +raqm_reference (raqm_t *rq) +{ + if (rq) + rq->ref_count++; + + return rq; +} + +static void +_raqm_free_runs (raqm_t *rq) +{ + raqm_run_t *runs = rq->runs; + while (runs) + { + raqm_run_t *run = runs; + runs = runs->next; + + hb_buffer_destroy (run->buffer); + hb_font_destroy (run->font); + free (run); + } +} + +/** + * raqm_destroy: + * @rq: a #raqm_t. + * + * Decreases the reference count on @rq by one. If the result is zero, then @rq + * and all associated resources are freed. + * See cairo_reference(). + * + * Since: 0.1 + */ +void +raqm_destroy (raqm_t *rq) +{ + if (!rq || --rq->ref_count != 0) + return; + + free (rq->text); + free (rq->text_utf8); + _raqm_free_text_info (rq); + _raqm_free_runs (rq); + free (rq->glyphs); + free (rq); +} + +/** + * raqm_set_text: + * @rq: a #raqm_t. + * @text: a UTF-32 encoded text string. + * @len: the length of @text. + * + * Adds @text to @rq to be used for layout. It must be a valid UTF-32 text, any + * invalid character will be replaced with U+FFFD. The text should typically + * represent a full paragraph, since doing the layout of chunks of text + * separately can give improper output. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_set_text (raqm_t *rq, + const uint32_t *text, + size_t len) +{ + if (!rq || !text) + return false; + + rq->text_len = len; + + /* Empty string, don’t fail but do nothing */ + if (!len) + return true; + + free (rq->text); + + rq->text = malloc (sizeof (uint32_t) * rq->text_len); + if (!rq->text) + return false; + + _raqm_free_text_info (rq); + if (!_raqm_init_text_info (rq)) + return false; + + memcpy (rq->text, text, sizeof (uint32_t) * rq->text_len); + + return true; +} + +/** + * raqm_set_text_utf8: + * @rq: a #raqm_t. + * @text: a UTF-8 encoded text string. + * @len: the length of @text in UTF-8 bytes. + * + * Same as raqm_set_text(), but for text encoded in UTF-8 encoding. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_set_text_utf8 (raqm_t *rq, + const char *text, + size_t len) +{ + uint32_t *unicode; + size_t ulen; + bool ok; + + if (!rq || !text) + return false; + + /* Empty string, don’t fail but do nothing */ + if (!len) + { + rq->text_len = len; + return true; + } + + RAQM_TEST ("Text is: %s\n", text); + + rq->flags |= RAQM_FLAG_UTF8; + + rq->text_utf8 = malloc (sizeof (char) * len); + if (!rq->text_utf8) + return false; + + unicode = malloc (sizeof (uint32_t) * len); + if (!unicode) + return false; + + memcpy (rq->text_utf8, text, sizeof (char) * len); + + ulen = fribidi_charset_to_unicode (FRIBIDI_CHAR_SET_UTF8, + text, len, unicode); + + ok = raqm_set_text (rq, unicode, ulen); + + free (unicode); + return ok; +} + +/** + * raqm_set_par_direction: + * @rq: a #raqm_t. + * @dir: the direction of the paragraph. + * + * Sets the paragraph direction, also known as block direction in CSS. For + * horizontal text, this controls the overall direction in the Unicode + * Bidirectional Algorithm, so when the text is mainly right-to-left (with or + * without some left-to-right) text, then the base direction should be set to + * #RAQM_DIRECTION_RTL and vice versa. + * + * The default is #RAQM_DIRECTION_DEFAULT, which determines the paragraph + * direction based on the first character with strong bidi type (see [rule + * P2](http://unicode.org/reports/tr9/#P2) in Unicode Bidirectional Algorithm), + * which can be good enough for many cases but has problems when a mainly + * right-to-left paragraph starts with a left-to-right character and vice versa + * as the detected paragraph direction will be the wrong one, or when text does + * not contain any characters with string bidi types (e.g. only punctuation or + * numbers) as this will default to left-to-right paragraph direction. + * + * For vertical, top-to-bottom text, #RAQM_DIRECTION_TTB should be used. Raqm, + * however, provides limited vertical text support and does not handle rotated + * horizontal text in vertical text, instead everything is treated as vertical + * text. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_set_par_direction (raqm_t *rq, + raqm_direction_t dir) +{ + if (!rq) + return false; + + rq->base_dir = dir; + + return true; +} + +/** + * raqm_set_language: + * @rq: a #raqm_t. + * @lang: a BCP47 language code. + * @start: index of first character that should use @face. + * @len: number of characters using @face. + * + * Sets a [BCP47 language + * code](https://www.w3.org/International/articles/language-tags/) to be used + * for @len-number of characters staring at @start. The @start and @len are + * input string array indices (i.e. counting bytes in UTF-8 and scaler values + * in UTF-32). + * + * This method can be used repeatedly to set different languages for different + * parts of the text. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Stability: + * Unstable + * + * Since: 0.2 + */ +bool +raqm_set_language (raqm_t *rq, + const char *lang, + size_t start, + size_t len) +{ + hb_language_t language; + size_t end = start + len; + + if (!rq) + return false; + + if (!rq->text_len) + return true; + + if (rq->flags & RAQM_FLAG_UTF8) + { + start = _raqm_u8_to_u32_index (rq, start); + end = _raqm_u8_to_u32_index (rq, end); + } + + if (start >= rq->text_len || end > rq->text_len) + return false; + + if (!rq->text_info) + return false; + + language = hb_language_from_string (lang, -1); + for (size_t i = start; i < end; i++) + { + rq->text_info[i].lang = language; + } + + return true; +} + +/** + * raqm_add_font_feature: + * @rq: a #raqm_t. + * @feature: (transfer none): a font feature string. + * @len: length of @feature, -1 for %NULL-terminated. + * + * Adds a font feature to be used by the #raqm_t during text layout. This is + * usually used to turn on optional font features that are not enabled by + * default, for example `dlig` or `ss01`, but can be also used to turn off + * default font features. + * + * @feature is string representing a single font feature, in the syntax + * understood by hb_feature_from_string(). + * + * This function can be called repeatedly, new features will be appended to the + * end of the features list and can potentially override previous features. + * + * Return value: + * %true if parsing @feature succeeded, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_add_font_feature (raqm_t *rq, + const char *feature, + int len) +{ + hb_bool_t ok; + hb_feature_t fea; + + if (!rq) + return false; + + ok = hb_feature_from_string (feature, len, &fea); + if (ok) + { + rq->features_len++; + rq->features = realloc (rq->features, + sizeof (hb_feature_t) * (rq->features_len)); + if (!rq->features) + return false; + + rq->features[rq->features_len - 1] = fea; + } + + return ok; +} + +static hb_font_t * +_raqm_create_hb_font (raqm_t *rq, + FT_Face face) +{ + hb_font_t *font = hb_ft_font_create_referenced (face); + + if (rq->ft_loadflags >= 0) + hb_ft_font_set_load_flags (font, rq->ft_loadflags); + + return font; +} + +static bool +_raqm_set_freetype_face (raqm_t *rq, + FT_Face face, + size_t start, + size_t end) +{ + if (!rq) + return false; + + if (!rq->text_len) + return true; + + if (start >= rq->text_len || end > rq->text_len) + return false; + + if (!rq->text_info) + return false; + + for (size_t i = start; i < end; i++) + { + if (rq->text_info[i].ftface) + FT_Done_Face (rq->text_info[i].ftface); + rq->text_info[i].ftface = face; + FT_Reference_Face (face); + } + + return true; +} + +/** + * raqm_set_freetype_face: + * @rq: a #raqm_t. + * @face: an #FT_Face. + * + * Sets an #FT_Face to be used for all characters in @rq. + * + * See also raqm_set_freetype_face_range(). + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_set_freetype_face (raqm_t *rq, + FT_Face face) +{ + return _raqm_set_freetype_face (rq, face, 0, rq->text_len); +} + +/** + * raqm_set_freetype_face_range: + * @rq: a #raqm_t. + * @face: an #FT_Face. + * @start: index of first character that should use @face. + * @len: number of characters using @face. + * + * Sets an #FT_Face to be used for @len-number of characters staring at @start. + * The @start and @len are input string array indices (i.e. counting bytes in + * UTF-8 and scaler values in UTF-32). + * + * This method can be used repeatedly to set different faces for different + * parts of the text. It is the responsibility of the client to make sure that + * face ranges cover the whole text. + * + * See also raqm_set_freetype_face(). + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_set_freetype_face_range (raqm_t *rq, + FT_Face face, + size_t start, + size_t len) +{ + size_t end = start + len; + + if (!rq) + return false; + + if (!rq->text_len) + return true; + + if (rq->flags & RAQM_FLAG_UTF8) + { + start = _raqm_u8_to_u32_index (rq, start); + end = _raqm_u8_to_u32_index (rq, end); + } + + return _raqm_set_freetype_face (rq, face, start, end); +} + +/** + * raqm_set_freetype_load_flags: + * @rq: a #raqm_t. + * @flags: FreeType load flags. + * + * Sets the load flags passed to FreeType when loading glyphs, should be the + * same flags used by the client when rendering FreeType glyphs. + * + * This requires version of HarfBuzz that has hb_ft_font_set_load_flags(), for + * older version the flags will be ignored. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.3 + */ +bool +raqm_set_freetype_load_flags (raqm_t *rq, + int flags) +{ + if (!rq) + return false; + + rq->ft_loadflags = flags; + + return true; +} + +/** + * raqm_set_invisible_glyph: + * @rq: a #raqm_t. + * @gid: glyph id to use for invisible glyphs. + * + * Sets the glyph id to be used for invisible glyhphs. + * + * If @gid is negative, invisible glyphs will be suppressed from the output. + * This requires HarfBuzz 1.8.0 or later. If raqm is used with an earlier + * HarfBuzz version, the return value will be %false and the shaping behavior + * does not change. + * + * If @gid is zero, invisible glyphs will be rendered as space. + * This works on all versions of HarfBuzz. + * + * If @gid is a positive number, it will be used for invisible glyphs. + * This requires a version of HarfBuzz that has + * hb_buffer_set_invisible_glyph(). For older versions, the return value + * will be %false and the shaping behavior does not change. + * + * Return value: + * %true if no errors happened, %false otherwise. + * + * Since: 0.6 + */ +bool +raqm_set_invisible_glyph (raqm_t *rq, + int gid) +{ + if (!rq) + return false; + +#ifndef HAVE_HB_BUFFER_SET_INVISIBLE_GLYPH + if (gid > 0) + return false; +#endif + +#if !defined(HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) || \ + !HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES + if (gid < 0) + return false; +#endif + + rq->invisible_glyph = gid; + return true; +} + +static bool +_raqm_itemize (raqm_t *rq); + +static bool +_raqm_shape (raqm_t *rq); + +/** + * raqm_layout: + * @rq: a #raqm_t. + * + * Run the text layout process on @rq. This is the main Raqm function where the + * Unicode Bidirectional Text algorithm will be applied to the text in @rq, + * text shaping, and any other part of the layout process. + * + * Return value: + * %true if the layout process was successful, %false otherwise. + * + * Since: 0.1 + */ +bool +raqm_layout (raqm_t *rq) +{ + if (!rq) + return false; + + if (!rq->text_len) + return true; + + if (!rq->text_info) + return false; + + for (size_t i = 0; i < rq->text_len; i++) + { + if (!rq->text_info[i].ftface) + return false; + } + + if (!_raqm_itemize (rq)) + return false; + + if (!_raqm_shape (rq)) + return false; + + return true; +} + +static uint32_t +_raqm_u32_to_u8_index (raqm_t *rq, + uint32_t index); + +/** + * raqm_get_glyphs: + * @rq: a #raqm_t. + * @length: (out): output array length. + * + * Gets the final result of Raqm layout process, an array of #raqm_glyph_t + * containing the glyph indices in the font, their positions and other possible + * information. + * + * Return value: (transfer none): + * An array of #raqm_glyph_t, or %NULL in case of error. This is owned by @rq + * and must not be freed. + * + * Since: 0.1 + */ +raqm_glyph_t * +raqm_get_glyphs (raqm_t *rq, + size_t *length) +{ + size_t count = 0; + + if (!rq || !rq->runs || !length) + { + if (length) + *length = 0; + return NULL; + } + + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + count += hb_buffer_get_length (run->buffer); + + *length = count; + + if (rq->glyphs) + free (rq->glyphs); + + rq->glyphs = malloc (sizeof (raqm_glyph_t) * count); + if (!rq->glyphs) + { + *length = 0; + return NULL; + } + + RAQM_TEST ("Glyph information:\n"); + + count = 0; + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + { + size_t len; + hb_glyph_info_t *info; + hb_glyph_position_t *position; + + len = hb_buffer_get_length (run->buffer); + info = hb_buffer_get_glyph_infos (run->buffer, NULL); + position = hb_buffer_get_glyph_positions (run->buffer, NULL); + + for (size_t i = 0; i < len; i++) + { + rq->glyphs[count + i].index = info[i].codepoint; + rq->glyphs[count + i].cluster = info[i].cluster; + rq->glyphs[count + i].x_advance = position[i].x_advance; + rq->glyphs[count + i].y_advance = position[i].y_advance; + rq->glyphs[count + i].x_offset = position[i].x_offset; + rq->glyphs[count + i].y_offset = position[i].y_offset; + rq->glyphs[count + i].ftface = rq->text_info[info[i].cluster].ftface; + + RAQM_TEST ("glyph [%d]\tx_offset: %d\ty_offset: %d\tx_advance: %d\tfont: %s\n", + rq->glyphs[count + i].index, rq->glyphs[count + i].x_offset, + rq->glyphs[count + i].y_offset, rq->glyphs[count + i].x_advance, + rq->glyphs[count + i].ftface->family_name); + } + + count += len; + } + + if (rq->flags & RAQM_FLAG_UTF8) + { +#ifdef RAQM_TESTING + RAQM_TEST ("\nUTF-32 clusters:"); + for (size_t i = 0; i < count; i++) + RAQM_TEST (" %02d", rq->glyphs[i].cluster); + RAQM_TEST ("\n"); +#endif + + for (size_t i = 0; i < count; i++) + rq->glyphs[i].cluster = _raqm_u32_to_u8_index (rq, + rq->glyphs[i].cluster); + +#ifdef RAQM_TESTING + RAQM_TEST ("UTF-8 clusters: "); + for (size_t i = 0; i < count; i++) + RAQM_TEST (" %02d", rq->glyphs[i].cluster); + RAQM_TEST ("\n"); +#endif + } + return rq->glyphs; +} + +static bool +_raqm_resolve_scripts (raqm_t *rq); + +static hb_direction_t +_raqm_hb_dir (raqm_t *rq, FriBidiLevel level) +{ + hb_direction_t dir = HB_DIRECTION_LTR; + + if (rq->base_dir == RAQM_DIRECTION_TTB) + dir = HB_DIRECTION_TTB; + else if (FRIBIDI_LEVEL_IS_RTL (level)) + dir = HB_DIRECTION_RTL; + + return dir; +} + +typedef struct { + size_t pos; + size_t len; + FriBidiLevel level; +} _raqm_bidi_run; + +static void +_raqm_reverse_run (_raqm_bidi_run *run, const size_t len) +{ + assert (run); + + for (size_t i = 0; i < len / 2; i++) + { + _raqm_bidi_run temp = run[i]; + run[i] = run[len - 1 - i]; + run[len - 1 - i] = temp; + } +} + +static _raqm_bidi_run * +_raqm_reorder_runs (const FriBidiCharType *types, + const size_t len, + const FriBidiParType base_dir, + /* input and output */ + FriBidiLevel *levels, + /* output */ + size_t *run_count) +{ + FriBidiLevel level; + FriBidiLevel last_level = -1; + FriBidiLevel max_level = 0; + size_t run_start = 0; + size_t run_index = 0; + _raqm_bidi_run *runs = NULL; + size_t count = 0; + + if (len == 0) + { + *run_count = 0; + return NULL; + } + + assert (types); + assert (levels); + + /* L1. Reset the embedding levels of some chars: + 4. any sequence of white space characters at the end of the line. */ + for (int i = len - 1; + i >= 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (types[i]); i--) + { + levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir); + } + + /* Find max_level of the line. We don't reuse the paragraph + * max_level, both for a cleaner API, and that the line max_level + * may be far less than paragraph max_level. */ + for (int i = len - 1; i >= 0; i--) + { + if (levels[i] > max_level) + max_level = levels[i]; + } + + for (size_t i = 0; i < len; i++) + { + if (levels[i] != last_level) + count++; + + last_level = levels[i]; + } + + runs = malloc (sizeof (_raqm_bidi_run) * count); + + while (run_start < len) + { + size_t run_end = run_start; + while (run_end < len && levels[run_start] == levels[run_end]) + { + run_end++; + } + + runs[run_index].pos = run_start; + runs[run_index].level = levels[run_start]; + runs[run_index].len = run_end - run_start; + run_start = run_end; + run_index++; + } + + /* L2. Reorder. */ + for (level = max_level; level > 0; level--) + { + for (int i = count - 1; i >= 0; i--) + { + if (runs[i].level >= level) + { + int end = i; + for (i--; (i >= 0 && runs[i].level >= level); i--) + ; + _raqm_reverse_run (runs + i + 1, end - i); + } + } + } + + *run_count = count; + return runs; +} + +static bool +_raqm_itemize (raqm_t *rq) +{ + FriBidiParType par_type = FRIBIDI_PAR_ON; + FriBidiCharType *types; +#ifdef USE_FRIBIDI_EX_API + FriBidiBracketType *btypes; +#endif + FriBidiLevel *levels; + _raqm_bidi_run *runs = NULL; + raqm_run_t *last; + int max_level; + size_t run_count; + bool ok = true; + +#ifdef RAQM_TESTING + switch (rq->base_dir) + { + case RAQM_DIRECTION_RTL: + RAQM_TEST ("Direction is: RTL\n\n"); + break; + case RAQM_DIRECTION_LTR: + RAQM_TEST ("Direction is: LTR\n\n"); + break; + case RAQM_DIRECTION_TTB: + RAQM_TEST ("Direction is: TTB\n\n"); + break; + case RAQM_DIRECTION_DEFAULT: + default: + RAQM_TEST ("Direction is: DEFAULT\n\n"); + break; + } +#endif + + types = calloc (rq->text_len, sizeof (FriBidiCharType)); +#ifdef USE_FRIBIDI_EX_API + btypes = calloc (rq->text_len, sizeof (FriBidiBracketType)); +#endif + levels = calloc (rq->text_len, sizeof (FriBidiLevel)); + if (!types || !levels +#ifdef USE_FRIBIDI_EX_API + || !btypes +#endif + ) + { + ok = false; + goto done; + } + + if (rq->base_dir == RAQM_DIRECTION_RTL) + par_type = FRIBIDI_PAR_RTL; + else if (rq->base_dir == RAQM_DIRECTION_LTR) + par_type = FRIBIDI_PAR_LTR; + + if (rq->base_dir == RAQM_DIRECTION_TTB) + { + /* Treat every thing as LTR in vertical text */ + max_level = 1; + memset (types, FRIBIDI_TYPE_LTR, rq->text_len); + memset (levels, 0, rq->text_len); + rq->resolved_dir = RAQM_DIRECTION_LTR; + } + else + { + fribidi_get_bidi_types (rq->text, rq->text_len, types); +#ifdef USE_FRIBIDI_EX_API + fribidi_get_bracket_types (rq->text, rq->text_len, types, btypes); + max_level = fribidi_get_par_embedding_levels_ex (types, btypes, + rq->text_len, &par_type, + levels); +#else + max_level = fribidi_get_par_embedding_levels (types, rq->text_len, + &par_type, levels); +#endif + + if (par_type == FRIBIDI_PAR_LTR) + rq->resolved_dir = RAQM_DIRECTION_LTR; + else + rq->resolved_dir = RAQM_DIRECTION_RTL; + } + + if (max_level == 0) + { + ok = false; + goto done; + } + + if (!_raqm_resolve_scripts (rq)) + { + ok = false; + goto done; + } + + /* Get the number of bidi runs */ + runs = _raqm_reorder_runs (types, rq->text_len, par_type, levels, &run_count); + if (!runs) + { + ok = false; + goto done; + } + +#ifdef RAQM_TESTING + RAQM_TEST ("Number of runs before script itemization: %zu\n\n", run_count); + + RAQM_TEST ("Fribidi Runs:\n"); + for (size_t i = 0; i < run_count; i++) + { + RAQM_TEST ("run[%zu]:\t start: %zu\tlength: %zu\tlevel: %d\n", + i, runs[i].pos, runs[i].len, runs[i].level); + } + RAQM_TEST ("\n"); +#endif + + last = NULL; + for (size_t i = 0; i < run_count; i++) + { + raqm_run_t *run = calloc (1, sizeof (raqm_run_t)); + if (!run) + { + ok = false; + goto done; + } + + if (!rq->runs) + rq->runs = run; + + if (last) + last->next = run; + + run->direction = _raqm_hb_dir (rq, runs[i].level); + + if (HB_DIRECTION_IS_BACKWARD (run->direction)) + { + run->pos = runs[i].pos + runs[i].len - 1; + run->script = rq->text_info[run->pos].script; + run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); + for (int j = runs[i].len - 1; j >= 0; j--) + { + _raqm_text_info info = rq->text_info[runs[i].pos + j]; + if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) + { + raqm_run_t *newrun = calloc (1, sizeof (raqm_run_t)); + if (!newrun) + { + ok = false; + goto done; + } + newrun->pos = runs[i].pos + j; + newrun->len = 1; + newrun->direction = _raqm_hb_dir (rq, runs[i].level); + newrun->script = info.script; + newrun->font = _raqm_create_hb_font (rq, info.ftface); + run->next = newrun; + run = newrun; + } + else + { + run->len++; + run->pos = runs[i].pos + j; + } + } + } + else + { + run->pos = runs[i].pos; + run->script = rq->text_info[run->pos].script; + run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); + for (size_t j = 0; j < runs[i].len; j++) + { + _raqm_text_info info = rq->text_info[runs[i].pos + j]; + if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) + { + raqm_run_t *newrun = calloc (1, sizeof (raqm_run_t)); + if (!newrun) + { + ok = false; + goto done; + } + newrun->pos = runs[i].pos + j; + newrun->len = 1; + newrun->direction = _raqm_hb_dir (rq, runs[i].level); + newrun->script = info.script; + newrun->font = _raqm_create_hb_font (rq, info.ftface); + run->next = newrun; + run = newrun; + } + else + run->len++; + } + } + + last = run; + last->next = NULL; + } + +#ifdef RAQM_TESTING + run_count = 0; + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + run_count++; + RAQM_TEST ("Number of runs after script itemization: %zu\n\n", run_count); + + run_count = 0; + RAQM_TEST ("Final Runs:\n"); + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + { + SCRIPT_TO_STRING (run->script); + RAQM_TEST ("run[%zu]:\t start: %d\tlength: %d\tdirection: %s\tscript: %s\tfont: %s\n", + run_count++, run->pos, run->len, + hb_direction_to_string (run->direction), buff, + rq->text_info[run->pos].ftface->family_name); + } + RAQM_TEST ("\n"); +#endif + +done: + free (runs); + free (types); +#ifdef USE_FRIBIDI_EX_API + free (btypes); +#endif + free (levels); + + return ok; +} + +/* Stack to handle script detection */ +typedef struct { + size_t capacity; + size_t size; + int *pair_index; + hb_script_t *script; +} _raqm_stack_t; + +/* Special paired characters for script detection */ +static size_t paired_len = 34; +static const FriBidiChar paired_chars[] = +{ + 0x0028, 0x0029, /* ascii paired punctuation */ + 0x003c, 0x003e, + 0x005b, 0x005d, + 0x007b, 0x007d, + 0x00ab, 0x00bb, /* guillemets */ + 0x2018, 0x2019, /* general punctuation */ + 0x201c, 0x201d, + 0x2039, 0x203a, + 0x3008, 0x3009, /* chinese paired punctuation */ + 0x300a, 0x300b, + 0x300c, 0x300d, + 0x300e, 0x300f, + 0x3010, 0x3011, + 0x3014, 0x3015, + 0x3016, 0x3017, + 0x3018, 0x3019, + 0x301a, 0x301b +}; + +static void +_raqm_stack_free (_raqm_stack_t *stack) +{ + free (stack->script); + free (stack->pair_index); + free (stack); +} + +/* Stack handling functions */ +static _raqm_stack_t * +_raqm_stack_new (size_t max) +{ + _raqm_stack_t *stack; + stack = calloc (1, sizeof (_raqm_stack_t)); + if (!stack) + return NULL; + + stack->script = malloc (sizeof (hb_script_t) * max); + if (!stack->script) + { + _raqm_stack_free (stack); + return NULL; + } + + stack->pair_index = malloc (sizeof (int) * max); + if (!stack->pair_index) + { + _raqm_stack_free (stack); + return NULL; + } + + stack->size = 0; + stack->capacity = max; + + return stack; +} + +static bool +_raqm_stack_pop (_raqm_stack_t *stack) +{ + if (!stack->size) + { + RAQM_DBG ("Stack is Empty\n"); + return false; + } + + stack->size--; + + return true; +} + +static hb_script_t +_raqm_stack_top (_raqm_stack_t *stack) +{ + if (!stack->size) + { + RAQM_DBG ("Stack is Empty\n"); + return HB_SCRIPT_INVALID; /* XXX: check this */ + } + + return stack->script[stack->size]; +} + +static bool +_raqm_stack_push (_raqm_stack_t *stack, + hb_script_t script, + int pair_index) +{ + if (stack->size == stack->capacity) + { + RAQM_DBG ("Stack is Full\n"); + return false; + } + + stack->size++; + stack->script[stack->size] = script; + stack->pair_index[stack->size] = pair_index; + + return true; +} + +static int +_get_pair_index (const FriBidiChar ch) +{ + int lower = 0; + int upper = paired_len - 1; + + while (lower <= upper) + { + int mid = (lower + upper) / 2; + if (ch < paired_chars[mid]) + upper = mid - 1; + else if (ch > paired_chars[mid]) + lower = mid + 1; + else + return mid; + } + + return -1; +} + +#define STACK_IS_EMPTY(script) ((script)->size <= 0) +#define IS_OPEN(pair_index) (((pair_index) & 1) == 0) + +/* Resolve the script for each character in the input string, if the character + * script is common or inherited it takes the script of the character before it + * except paired characters which we try to make them use the same script. We + * then split the BiDi runs, if necessary, on script boundaries. + */ +static bool +_raqm_resolve_scripts (raqm_t *rq) +{ + int last_script_index = -1; + int last_set_index = -1; + hb_script_t last_script = HB_SCRIPT_INVALID; + _raqm_stack_t *stack = NULL; + hb_unicode_funcs_t* unicode_funcs = hb_unicode_funcs_get_default (); + + for (size_t i = 0; i < rq->text_len; ++i) + rq->text_info[i].script = hb_unicode_script (unicode_funcs, rq->text[i]); + +#ifdef RAQM_TESTING + RAQM_TEST ("Before script detection:\n"); + for (size_t i = 0; i < rq->text_len; ++i) + { + SCRIPT_TO_STRING (rq->text_info[i].script); + RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); + } + RAQM_TEST ("\n"); +#endif + + stack = _raqm_stack_new (rq->text_len); + if (!stack) + return false; + + for (int i = 0; i < (int) rq->text_len; i++) + { + if (rq->text_info[i].script == HB_SCRIPT_COMMON && last_script_index != -1) + { + int pair_index = _get_pair_index (rq->text[i]); + if (pair_index >= 0) + { + if (IS_OPEN (pair_index)) + { + /* is a paired character */ + rq->text_info[i].script = last_script; + last_set_index = i; + _raqm_stack_push (stack, rq->text_info[i].script, pair_index); + } + else + { + /* is a close paired character */ + /* find matching opening (by getting the last even index for current + * odd index) */ + while (!STACK_IS_EMPTY (stack) && + stack->pair_index[stack->size] != (pair_index & ~1)) + { + _raqm_stack_pop (stack); + } + if (!STACK_IS_EMPTY (stack)) + { + rq->text_info[i].script = _raqm_stack_top (stack); + last_script = rq->text_info[i].script; + last_set_index = i; + } + else + { + rq->text_info[i].script = last_script; + last_set_index = i; + } + } + } + else + { + rq->text_info[i].script = last_script; + last_set_index = i; + } + } + else if (rq->text_info[i].script == HB_SCRIPT_INHERITED && + last_script_index != -1) + { + rq->text_info[i].script = last_script; + last_set_index = i; + } + else + { + for (int j = last_set_index + 1; j < i; ++j) + rq->text_info[j].script = rq->text_info[i].script; + last_script = rq->text_info[i].script; + last_script_index = i; + last_set_index = i; + } + } + + /* Loop backwards and change any remaining Common or Inherit characters to + * take the script if the next character. + * https://github.com/HOST-Oman/libraqm/issues/95 + */ + for (int i = rq->text_len - 2; i >= 0; --i) + { + if (rq->text_info[i].script == HB_SCRIPT_INHERITED || + rq->text_info[i].script == HB_SCRIPT_COMMON) + rq->text_info[i].script = rq->text_info[i + 1].script; + } + +#ifdef RAQM_TESTING + RAQM_TEST ("After script detection:\n"); + for (size_t i = 0; i < rq->text_len; ++i) + { + SCRIPT_TO_STRING (rq->text_info[i].script); + RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); + } + RAQM_TEST ("\n"); +#endif + + _raqm_stack_free (stack); + + return true; +} + +static bool +_raqm_shape (raqm_t *rq) +{ + hb_buffer_flags_t hb_buffer_flags = HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT; + +#if defined(HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) && \ + HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES + if (rq->invisible_glyph < 0) + hb_buffer_flags |= HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES; +#endif + + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + { + run->buffer = hb_buffer_create (); + + hb_buffer_add_utf32 (run->buffer, rq->text, rq->text_len, + run->pos, run->len); + hb_buffer_set_script (run->buffer, run->script); + hb_buffer_set_language (run->buffer, rq->text_info[run->pos].lang); + hb_buffer_set_direction (run->buffer, run->direction); + hb_buffer_set_flags (run->buffer, hb_buffer_flags); + +#ifdef HAVE_HB_BUFFER_SET_INVISIBLE_GLYPH + if (rq->invisible_glyph > 0) + hb_buffer_set_invisible_glyph (run->buffer, rq->invisible_glyph); +#endif + + hb_shape_full (run->font, run->buffer, rq->features, rq->features_len, + NULL); + } + + return true; +} + +/* Convert index from UTF-32 to UTF-8 */ +static uint32_t +_raqm_u32_to_u8_index (raqm_t *rq, + uint32_t index) +{ + FriBidiStrIndex length; + char *output = malloc ((sizeof (char) * 4 * index) + 1); + + length = fribidi_unicode_to_charset (FRIBIDI_CHAR_SET_UTF8, + rq->text, + index, + output); + + free (output); + return length; +} + +/* Convert index from UTF-8 to UTF-32 */ +static uint32_t +_raqm_u8_to_u32_index (raqm_t *rq, + uint32_t index) +{ + FriBidiStrIndex length; + uint32_t *output = malloc (sizeof (uint32_t) * (index + 1)); + + length = fribidi_charset_to_unicode (FRIBIDI_CHAR_SET_UTF8, + rq->text_utf8, + index, + output); + + free (output); + return length; +} + +static bool +_raqm_allowed_grapheme_boundary (hb_codepoint_t l_char, + hb_codepoint_t r_char); + +static bool +_raqm_in_hangul_syllable (hb_codepoint_t ch); + +/** + * raqm_index_to_position: + * @rq: a #raqm_t. + * @index: (inout): character index. + * @x: (out): output x position. + * @y: (out): output y position. + * + * Calculates the cursor position after the character at @index. If the character + * is right-to-left, then the cursor will be at the left of it, whereas if the + * character is left-to-right, then the cursor will be at the right of it. + * + * Return value: + * %true if the process was successful, %false otherwise. + * + * Since: 0.2 + */ +bool +raqm_index_to_position (raqm_t *rq, + size_t *index, + int *x, + int *y) +{ + /* We don't currently support multiline, so y is always 0 */ + *y = 0; + *x = 0; + + if (rq == NULL) + return false; + + if (rq->flags & RAQM_FLAG_UTF8) + *index = _raqm_u8_to_u32_index (rq, *index); + + if (*index >= rq->text_len) + return false; + + RAQM_TEST ("\n"); + + while (*index < rq->text_len) + { + if (_raqm_allowed_grapheme_boundary (rq->text[*index], rq->text[*index + 1])) + break; + + ++*index; + } + + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + { + size_t len; + hb_glyph_info_t *info; + hb_glyph_position_t *position; + len = hb_buffer_get_length (run->buffer); + info = hb_buffer_get_glyph_infos (run->buffer, NULL); + position = hb_buffer_get_glyph_positions (run->buffer, NULL); + + for (size_t i = 0; i < len; i++) + { + uint32_t curr_cluster = info[i].cluster; + uint32_t next_cluster = curr_cluster; + *x += position[i].x_advance; + + if (run->direction == HB_DIRECTION_LTR) + { + for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) + next_cluster = info[j].cluster; + } + else + { + for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; + j--) + next_cluster = info[j].cluster; + } + + if (next_cluster == curr_cluster) + next_cluster = run->pos + run->len; + + if (*index < next_cluster && *index >= curr_cluster) + { + if (run->direction == HB_DIRECTION_RTL) + *x -= position[i].x_advance; + *index = curr_cluster; + goto found; + } + } + } + +found: + if (rq->flags & RAQM_FLAG_UTF8) + *index = _raqm_u32_to_u8_index (rq, *index); + RAQM_TEST ("The position is %d at index %zu\n",*x ,*index); + return true; +} + +/** + * raqm_position_to_index: + * @rq: a #raqm_t. + * @x: x position. + * @y: y position. + * @index: (out): output character index. + * + * Returns the @index of the character at @x and @y position within text. + * If the position is outside the text, the last character is chosen as + * @index. + * + * Return value: + * %true if the process was successful, %false in case of error. + * + * Since: 0.2 + */ +bool +raqm_position_to_index (raqm_t *rq, + int x, + int y, + size_t *index) +{ + int delta_x = 0, current_x = 0; + (void)y; + + if (rq == NULL) + return false; + + if (x < 0) /* Get leftmost index */ + { + if (rq->resolved_dir == RAQM_DIRECTION_RTL) + *index = rq->text_len; + else + *index = 0; + return true; + } + + RAQM_TEST ("\n"); + + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + { + size_t len; + hb_glyph_info_t *info; + hb_glyph_position_t *position; + len = hb_buffer_get_length (run->buffer); + info = hb_buffer_get_glyph_infos (run->buffer, NULL); + position = hb_buffer_get_glyph_positions (run->buffer, NULL); + + for (size_t i = 0; i < len; i++) + { + delta_x = position[i].x_advance; + if (x < (current_x + delta_x)) + { + bool before = false; + if (run->direction == HB_DIRECTION_LTR) + before = (x < current_x + (delta_x / 2)); + else + before = (x > current_x + (delta_x / 2)); + + if (before) + *index = info[i].cluster; + else + { + uint32_t curr_cluster = info[i].cluster; + uint32_t next_cluster = curr_cluster; + if (run->direction == HB_DIRECTION_LTR) + for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) + next_cluster = info[j].cluster; + else + for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; + j--) + next_cluster = info[j].cluster; + + if (next_cluster == curr_cluster) + next_cluster = run->pos + run->len; + + *index = next_cluster; + } + if (_raqm_allowed_grapheme_boundary (rq->text[*index],rq->text[*index + 1])) + { + RAQM_TEST ("The start-index is %zu at position %d \n", *index, x); + return true; + } + + while (*index < (unsigned)run->pos + run->len) + { + if (_raqm_allowed_grapheme_boundary (rq->text[*index], + rq->text[*index + 1])) + { + *index += 1; + break; + } + *index += 1; + } + RAQM_TEST ("The start-index is %zu at position %d \n", *index, x); + return true; + } + else + current_x += delta_x; + } + } + + /* Get rightmost index*/ + if (rq->resolved_dir == RAQM_DIRECTION_RTL) + *index = 0; + else + *index = rq->text_len; + + RAQM_TEST ("The start-index is %zu at position %d \n", *index, x); + + return true; +} + +typedef enum +{ + RAQM_GRAPHEM_CR, + RAQM_GRAPHEM_LF, + RAQM_GRAPHEM_CONTROL, + RAQM_GRAPHEM_EXTEND, + RAQM_GRAPHEM_REGIONAL_INDICATOR, + RAQM_GRAPHEM_PREPEND, + RAQM_GRAPHEM_SPACING_MARK, + RAQM_GRAPHEM_HANGUL_SYLLABLE, + RAQM_GRAPHEM_OTHER +} _raqm_grapheme_t; + +static _raqm_grapheme_t +_raqm_get_grapheme_break (hb_codepoint_t ch, + hb_unicode_general_category_t category); + +static bool +_raqm_allowed_grapheme_boundary (hb_codepoint_t l_char, + hb_codepoint_t r_char) +{ + hb_unicode_general_category_t l_category; + hb_unicode_general_category_t r_category; + _raqm_grapheme_t l_grapheme, r_grapheme; + hb_unicode_funcs_t* unicode_funcs = hb_unicode_funcs_get_default (); + + l_category = hb_unicode_general_category (unicode_funcs, l_char); + r_category = hb_unicode_general_category (unicode_funcs, r_char); + l_grapheme = _raqm_get_grapheme_break (l_char, l_category); + r_grapheme = _raqm_get_grapheme_break (r_char, r_category); + + if (l_grapheme == RAQM_GRAPHEM_CR && r_grapheme == RAQM_GRAPHEM_LF) + return false; /*Do not break between a CR and LF GB3*/ + if (l_grapheme == RAQM_GRAPHEM_CONTROL || l_grapheme == RAQM_GRAPHEM_CR || + l_grapheme == RAQM_GRAPHEM_LF || r_grapheme == RAQM_GRAPHEM_CONTROL || + r_grapheme == RAQM_GRAPHEM_CR || r_grapheme == RAQM_GRAPHEM_LF) + return true; /*Break before and after CONTROL GB4, GB5*/ + if (r_grapheme == RAQM_GRAPHEM_HANGUL_SYLLABLE) + return false; /*Do not break Hangul syllable sequences. GB6, GB7, GB8*/ + if (l_grapheme == RAQM_GRAPHEM_REGIONAL_INDICATOR && + r_grapheme == RAQM_GRAPHEM_REGIONAL_INDICATOR) + return false; /*Do not break between regional indicator symbols. GB8a*/ + if (r_grapheme == RAQM_GRAPHEM_EXTEND) + return false; /*Do not break before extending characters. GB9*/ + /*Do not break before SpacingMarks, or after Prepend characters.GB9a, GB9b*/ + if (l_grapheme == RAQM_GRAPHEM_PREPEND) + return false; + if (r_grapheme == RAQM_GRAPHEM_SPACING_MARK) + return false; + return true; /*Otherwise, break everywhere. GB1, GB2, GB10*/ +} + +static _raqm_grapheme_t +_raqm_get_grapheme_break (hb_codepoint_t ch, + hb_unicode_general_category_t category) +{ + _raqm_grapheme_t gb_type; + + gb_type = RAQM_GRAPHEM_OTHER; + switch ((int)category) + { + case HB_UNICODE_GENERAL_CATEGORY_FORMAT: + if (ch == 0x200C || ch == 0x200D) + gb_type = RAQM_GRAPHEM_EXTEND; + else + gb_type = RAQM_GRAPHEM_CONTROL; + break; + + case HB_UNICODE_GENERAL_CATEGORY_CONTROL: + if (ch == 0x000D) + gb_type = RAQM_GRAPHEM_CR; + else if (ch == 0x000A) + gb_type = RAQM_GRAPHEM_LF; + else + gb_type = RAQM_GRAPHEM_CONTROL; + break; + + case HB_UNICODE_GENERAL_CATEGORY_SURROGATE: + case HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR: + case HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR: + case HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED: + if ((ch >= 0xFFF0 && ch <= 0xFFF8) || + (ch >= 0xE0000 && ch <= 0xE0FFF)) + gb_type = RAQM_GRAPHEM_CONTROL; + break; + + case HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK: + case HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK: + case HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK: + if (ch != 0x102B && ch != 0x102C && ch != 0x1038 && + (ch < 0x1062 || ch > 0x1064) && (ch < 0x1067 || ch > 0x106D) && + ch != 0x1083 && (ch < 0x1087 || ch > 0x108C) && ch != 0x108F && + (ch < 0x109A || ch > 0x109C) && ch != 0x1A61 && ch != 0x1A63 && + ch != 0x1A64 && ch != 0xAA7B && ch != 0xAA70 && ch != 0x11720 && + ch != 0x11721) /**/ + gb_type = RAQM_GRAPHEM_SPACING_MARK; + + else if (ch == 0x09BE || ch == 0x09D7 || + ch == 0x0B3E || ch == 0x0B57 || ch == 0x0BBE || ch == 0x0BD7 || + ch == 0x0CC2 || ch == 0x0CD5 || ch == 0x0CD6 || + ch == 0x0D3E || ch == 0x0D57 || ch == 0x0DCF || ch == 0x0DDF || + ch == 0x1D165 || (ch >= 0x1D16E && ch <= 0x1D172)) + gb_type = RAQM_GRAPHEM_EXTEND; + break; + + case HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER: + if (ch == 0x0E33 || ch == 0x0EB3) + gb_type = RAQM_GRAPHEM_SPACING_MARK; + break; + + case HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL: + if (ch >= 0x1F1E6 && ch <= 0x1F1FF) + gb_type = RAQM_GRAPHEM_REGIONAL_INDICATOR; + break; + + default: + gb_type = RAQM_GRAPHEM_OTHER; + break; + } + + if (_raqm_in_hangul_syllable (ch)) + gb_type = RAQM_GRAPHEM_HANGUL_SYLLABLE; + + return gb_type; +} + +static bool +_raqm_in_hangul_syllable (hb_codepoint_t ch) +{ + (void)ch; + return false; +} + +/** + * raqm_version: + * @major: (out): Library major version component. + * @minor: (out): Library minor version component. + * @micro: (out): Library micro version component. + * + * Returns library version as three integer components. + * + * Since: 0.7 + **/ +void +raqm_version (unsigned int *major, + unsigned int *minor, + unsigned int *micro) +{ + *major = RAQM_VERSION_MAJOR; + *minor = RAQM_VERSION_MINOR; + *micro = RAQM_VERSION_MICRO; +} + +/** + * raqm_version_string: + * + * Returns library version as a string with three components. + * + * Return value: library version string. + * + * Since: 0.7 + **/ +const char * +raqm_version_string (void) +{ + return RAQM_VERSION_STRING; +} + +/** + * raqm_version_atleast: + * @major: Library major version component. + * @minor: Library minor version component. + * @micro: Library micro version component. + * + * Checks if library version is less than or equal the specified version. + * + * Return value: + * %true if library version is less than or equal the specfied version, %false + * otherwise. + * + * Since: 0.7 + **/ +bool +raqm_version_atleast (unsigned int major, + unsigned int minor, + unsigned int micro) +{ + return RAQM_VERSION_ATLEAST (major, minor, micro); +} + +/** + * RAQM_VERSION_ATLEAST: + * @major: Library major version component. + * @minor: Library minor version component. + * @micro: Library micro version component. + * + * Checks if library version is less than or equal the specified version. + * + * Return value: + * %true if library version is less than or equal the specfied version, %false + * otherwise. + * + * Since: 0.7 + **/ + +/** + * RAQM_VERSION_STRING: + * + * Library version as a string with three components. + * + * Since: 0.7 + **/ + +/** + * RAQM_VERSION_MAJOR: + * + * Library major version component. + * + * Since: 0.7 + **/ + +/** + * RAQM_VERSION_MINOR: + * + * Library minor version component. + * + * Since: 0.7 + **/ + +/** + * RAQM_VERSION_MICRO: + * + * Library micro version component. + * + * Since: 0.7 + **/ diff --git a/src/thirdparty/raqm/raqm.h b/src/thirdparty/raqm/raqm.h new file mode 100644 index 000000000..1a33fe8ba --- /dev/null +++ b/src/thirdparty/raqm/raqm.h @@ -0,0 +1,185 @@ +/* + * Copyright © 2015 Information Technology Authority (ITA) + * Copyright © 2016 Khaled Hosny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#ifndef _RAQM_H_ +#define _RAQM_H_ +#define _RAQM_H_IN_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include FT_FREETYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "raqm-version.h" + +/** + * raqm_t: + * + * This is the main object holding all state of the currently processed text as + * well as its output. + * + * Since: 0.1 + */ +typedef struct _raqm raqm_t; + +/** + * raqm_direction_t: + * @RAQM_DIRECTION_DEFAULT: Detect paragraph direction automatically. + * @RAQM_DIRECTION_RTL: Paragraph is mainly right-to-left text. + * @RAQM_DIRECTION_LTR: Paragraph is mainly left-to-right text. + * @RAQM_DIRECTION_TTB: Paragraph is mainly vertical top-to-bottom text. + * + * Base paragraph direction, see raqm_set_par_direction(). + * + * Since: 0.1 + */ +typedef enum +{ + RAQM_DIRECTION_DEFAULT, + RAQM_DIRECTION_RTL, + RAQM_DIRECTION_LTR, + RAQM_DIRECTION_TTB +} raqm_direction_t; + +/** + * raqm_glyph_t: + * @index: the index of the glyph in the font file. + * @x_advance: the glyph advance width in horizontal text. + * @y_advance: the glyph advance width in vertical text. + * @x_offset: the horizontal movement of the glyph from the current point. + * @y_offset: the vertical movement of the glyph from the current point. + * @cluster: the index of original character in input text. + * @ftface: the @FT_Face of the glyph. + * + * The structure that holds information about output glyphs, returned from + * raqm_get_glyphs(). + */ +typedef struct raqm_glyph_t { + unsigned int index; + int x_advance; + int y_advance; + int x_offset; + int y_offset; + uint32_t cluster; + FT_Face ftface; +} raqm_glyph_t; + +raqm_t * +raqm_create (void); + +raqm_t * +raqm_reference (raqm_t *rq); + +void +raqm_destroy (raqm_t *rq); + +bool +raqm_set_text (raqm_t *rq, + const uint32_t *text, + size_t len); + +bool +raqm_set_text_utf8 (raqm_t *rq, + const char *text, + size_t len); + +bool +raqm_set_par_direction (raqm_t *rq, + raqm_direction_t dir); + +bool +raqm_set_language (raqm_t *rq, + const char *lang, + size_t start, + size_t len); + +bool +raqm_add_font_feature (raqm_t *rq, + const char *feature, + int len); + +bool +raqm_set_freetype_face (raqm_t *rq, + FT_Face face); + +bool +raqm_set_freetype_face_range (raqm_t *rq, + FT_Face face, + size_t start, + size_t len); + +bool +raqm_set_freetype_load_flags (raqm_t *rq, + int flags); + +bool +raqm_set_invisible_glyph (raqm_t *rq, + int gid); + +bool +raqm_layout (raqm_t *rq); + +raqm_glyph_t * +raqm_get_glyphs (raqm_t *rq, + size_t *length); + +bool +raqm_index_to_position (raqm_t *rq, + size_t *index, + int *x, + int *y); + +bool +raqm_position_to_index (raqm_t *rq, + int x, + int y, + size_t *index); + +void +raqm_version (unsigned int *major, + unsigned int *minor, + unsigned int *micro); + +const char * +raqm_version_string (void); + +bool +raqm_version_atleast (unsigned int major, + unsigned int minor, + unsigned int micro); + + +#ifdef __cplusplus +} +#endif +#undef _RAQM_H_IN_ +#endif /* _RAQM_H_ */ From 8bc1ff35b4d87003e54d7f8cdcbc687ad3a62762 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 11:21:42 +0000 Subject: [PATCH 225/750] use FriBiDi shim in Raqm --- setup.py | 16 +- src/_imagingft.c | 225 ++++++-------------------- src/libImaging/raqm.h | 156 ------------------ src/thirdparty/fribidi-shim/fribidi.c | 68 ++++++++ src/thirdparty/fribidi-shim/fribidi.h | 104 ++++++++++++ src/thirdparty/raqm/raqm.c | 7 +- winbuild/build_prepare.py | 20 +-- winbuild/fribidi.cmake | 4 +- 8 files changed, 243 insertions(+), 357 deletions(-) delete mode 100644 src/libImaging/raqm.h create mode 100644 src/thirdparty/fribidi-shim/fribidi.c create mode 100644 src/thirdparty/fribidi-shim/fribidi.h diff --git a/setup.py b/setup.py index cbc2641c5..3e0ec5576 100755 --- a/setup.py +++ b/setup.py @@ -267,6 +267,7 @@ class pil_build_ext(build_ext): "jpeg", "tiff", "freetype", + "harfbuzz", "lcms", "webp", "webpmux", @@ -656,6 +657,12 @@ class pil_build_ext(build_ext): if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) + if feature.want("harfbuzz"): + _dbg("Looking for harfbuzz") + if _find_include_file(self, "hb-version.h"): + if _find_library_file(self, "harfbuzz"): + feature.harfbuzz = "harfbuzz" + if feature.want("lcms"): _dbg("Looking for lcms") if _find_include_file(self, "lcms2.h"): @@ -850,7 +857,14 @@ for src_file in _LIB_IMAGING: files.append(os.path.join("src/libImaging", src_file + ".c")) ext_modules = [ Extension("PIL._imaging", files), - Extension("PIL._imagingft", ["src/_imagingft.c"]), + Extension( + "PIL._imagingft", + [ + "src/_imagingft.c", + "src/thirdparty/raqm/raqm.c", + "src/thirdparty/fribidi-shim/fribidi.c", + ], + ), Extension("PIL._imagingcms", ["src/_imagingcms.c"]), Extension("PIL._webp", ["src/_webp.c"]), Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]), diff --git a/src/_imagingft.c b/src/_imagingft.c index d73c6c2d5..4a4084e9f 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -35,10 +35,6 @@ #define KEEP_PY_UNICODE -#ifndef _WIN32 -#include -#endif - #if !defined(FT_LOAD_TARGET_MONO) #define FT_LOAD_TARGET_MONO FT_LOAD_MONOCHROME #endif @@ -56,7 +52,8 @@ } \ ; -#include "libImaging/raqm.h" +#include "thirdparty/raqm/raqm.h" +#include "thirdparty/fribidi-shim/fribidi.h" #define LAYOUT_FALLBACK 0 #define LAYOUT_RAQM 1 @@ -86,42 +83,6 @@ typedef struct { static PyTypeObject Font_Type; -typedef const char *(*t_raqm_version_string)(void); -typedef bool (*t_raqm_version_atleast)( - unsigned int major, unsigned int minor, unsigned int micro); -typedef raqm_t *(*t_raqm_create)(void); -typedef int (*t_raqm_set_text)(raqm_t *rq, const uint32_t *text, size_t len); -typedef bool (*t_raqm_set_text_utf8)(raqm_t *rq, const char *text, size_t len); -typedef bool (*t_raqm_set_par_direction)(raqm_t *rq, raqm_direction_t dir); -typedef bool (*t_raqm_set_language)( - raqm_t *rq, const char *lang, size_t start, size_t len); -typedef bool (*t_raqm_add_font_feature)(raqm_t *rq, const char *feature, int len); -typedef bool (*t_raqm_set_freetype_face)(raqm_t *rq, FT_Face face); -typedef bool (*t_raqm_layout)(raqm_t *rq); -typedef raqm_glyph_t *(*t_raqm_get_glyphs)(raqm_t *rq, size_t *length); -typedef raqm_glyph_t_01 *(*t_raqm_get_glyphs_01)(raqm_t *rq, size_t *length); -typedef void (*t_raqm_destroy)(raqm_t *rq); - -typedef struct { - void *raqm; - int version; - t_raqm_version_string version_string; - t_raqm_version_atleast version_atleast; - t_raqm_create create; - t_raqm_set_text set_text; - t_raqm_set_text_utf8 set_text_utf8; - t_raqm_set_par_direction set_par_direction; - t_raqm_set_language set_language; - t_raqm_add_font_feature add_font_feature; - t_raqm_set_freetype_face set_freetype_face; - t_raqm_layout layout; - t_raqm_get_glyphs get_glyphs; - t_raqm_get_glyphs_01 get_glyphs_01; - t_raqm_destroy destroy; -} p_raqm_func; - -static p_raqm_func p_raqm; - /* round a 26.6 pixel coordinate to the nearest integer */ #define PIXEL(x) ((((x) + 32) & -64) >> 6) @@ -142,101 +103,7 @@ geterror(int code) { static int setraqm(void) { - /* set the static function pointers for dynamic raqm linking */ - p_raqm.raqm = NULL; - - /* Microsoft needs a totally different system */ -#ifndef _WIN32 - p_raqm.raqm = dlopen("libraqm.so.0", RTLD_LAZY); - if (!p_raqm.raqm) { - p_raqm.raqm = dlopen("libraqm.dylib", RTLD_LAZY); - } -#else - p_raqm.raqm = LoadLibrary("libraqm"); - /* MSYS */ - if (!p_raqm.raqm) { - p_raqm.raqm = LoadLibrary("libraqm-0"); - } -#endif - - if (!p_raqm.raqm) { - return 1; - } - -#ifndef _WIN32 - p_raqm.version_string = - (t_raqm_version_string)dlsym(p_raqm.raqm, "raqm_version_string"); - p_raqm.version_atleast = - (t_raqm_version_atleast)dlsym(p_raqm.raqm, "raqm_version_atleast"); - p_raqm.create = (t_raqm_create)dlsym(p_raqm.raqm, "raqm_create"); - p_raqm.set_text = (t_raqm_set_text)dlsym(p_raqm.raqm, "raqm_set_text"); - p_raqm.set_text_utf8 = - (t_raqm_set_text_utf8)dlsym(p_raqm.raqm, "raqm_set_text_utf8"); - p_raqm.set_par_direction = - (t_raqm_set_par_direction)dlsym(p_raqm.raqm, "raqm_set_par_direction"); - p_raqm.set_language = (t_raqm_set_language)dlsym(p_raqm.raqm, "raqm_set_language"); - p_raqm.add_font_feature = - (t_raqm_add_font_feature)dlsym(p_raqm.raqm, "raqm_add_font_feature"); - p_raqm.set_freetype_face = - (t_raqm_set_freetype_face)dlsym(p_raqm.raqm, "raqm_set_freetype_face"); - p_raqm.layout = (t_raqm_layout)dlsym(p_raqm.raqm, "raqm_layout"); - p_raqm.destroy = (t_raqm_destroy)dlsym(p_raqm.raqm, "raqm_destroy"); - if (dlsym(p_raqm.raqm, "raqm_index_to_position")) { - p_raqm.get_glyphs = (t_raqm_get_glyphs)dlsym(p_raqm.raqm, "raqm_get_glyphs"); - p_raqm.version = 2; - } else { - p_raqm.version = 1; - p_raqm.get_glyphs_01 = - (t_raqm_get_glyphs_01)dlsym(p_raqm.raqm, "raqm_get_glyphs"); - } - if (dlerror() || - !(p_raqm.create && p_raqm.set_text && p_raqm.set_text_utf8 && - p_raqm.set_par_direction && p_raqm.set_language && p_raqm.add_font_feature && - p_raqm.set_freetype_face && p_raqm.layout && - (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && p_raqm.destroy)) { - dlclose(p_raqm.raqm); - p_raqm.raqm = NULL; - return 2; - } -#else - p_raqm.version_string = - (t_raqm_version_string)GetProcAddress(p_raqm.raqm, "raqm_version_string"); - p_raqm.version_atleast = - (t_raqm_version_atleast)GetProcAddress(p_raqm.raqm, "raqm_version_atleast"); - p_raqm.create = (t_raqm_create)GetProcAddress(p_raqm.raqm, "raqm_create"); - p_raqm.set_text = (t_raqm_set_text)GetProcAddress(p_raqm.raqm, "raqm_set_text"); - p_raqm.set_text_utf8 = - (t_raqm_set_text_utf8)GetProcAddress(p_raqm.raqm, "raqm_set_text_utf8"); - p_raqm.set_par_direction = - (t_raqm_set_par_direction)GetProcAddress(p_raqm.raqm, "raqm_set_par_direction"); - p_raqm.set_language = - (t_raqm_set_language)GetProcAddress(p_raqm.raqm, "raqm_set_language"); - p_raqm.add_font_feature = - (t_raqm_add_font_feature)GetProcAddress(p_raqm.raqm, "raqm_add_font_feature"); - p_raqm.set_freetype_face = - (t_raqm_set_freetype_face)GetProcAddress(p_raqm.raqm, "raqm_set_freetype_face"); - p_raqm.layout = (t_raqm_layout)GetProcAddress(p_raqm.raqm, "raqm_layout"); - p_raqm.destroy = (t_raqm_destroy)GetProcAddress(p_raqm.raqm, "raqm_destroy"); - if (GetProcAddress(p_raqm.raqm, "raqm_index_to_position")) { - p_raqm.get_glyphs = - (t_raqm_get_glyphs)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); - p_raqm.version = 2; - } else { - p_raqm.version = 1; - p_raqm.get_glyphs_01 = - (t_raqm_get_glyphs_01)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); - } - if (!(p_raqm.create && p_raqm.set_text && p_raqm.set_text_utf8 && - p_raqm.set_par_direction && p_raqm.set_language && p_raqm.add_font_feature && - p_raqm.set_freetype_face && p_raqm.layout && - (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && p_raqm.destroy)) { - FreeLibrary(p_raqm.raqm); - p_raqm.raqm = NULL; - return 2; - } -#endif - - return 0; + return load_fribidi(); } static PyObject * @@ -359,10 +226,10 @@ text_layout_raqm( size_t i = 0, count = 0, start = 0; raqm_t *rq; raqm_glyph_t *glyphs = NULL; - raqm_glyph_t_01 *glyphs_01 = NULL; +// raqm_glyph_t_01 *glyphs_01 = NULL; raqm_direction_t direction; - rq = (*p_raqm.create)(); + rq = raqm_create(); if (rq == NULL) { PyErr_SetString(PyExc_ValueError, "raqm_create() failed."); goto failed; @@ -376,14 +243,14 @@ text_layout_raqm( and raqm fails with empty strings */ goto failed; } - int set_text = (*p_raqm.set_text)(rq, text, size); + int set_text = raqm_set_text(rq, text, size); PyMem_Free(text); if (!set_text) { PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); goto failed; } if (lang) { - if (!(*p_raqm.set_language)(rq, lang, start, size)) { + if (!raqm_set_language(rq, lang, start, size)) { PyErr_SetString(PyExc_ValueError, "raqm_set_language() failed"); goto failed; } @@ -401,12 +268,12 @@ text_layout_raqm( direction = RAQM_DIRECTION_LTR; } else if (strcmp(dir, "ttb") == 0) { direction = RAQM_DIRECTION_TTB; - if (p_raqm.version_atleast == NULL || !(*p_raqm.version_atleast)(0, 7, 0)) { - PyErr_SetString( - PyExc_ValueError, - "libraqm 0.7 or greater required for 'ttb' direction"); - goto failed; - } +// if (p_raqm.version_atleast == NULL || !(*p_raqm.version_atleast)(0, 7, 0)) { +// PyErr_SetString( +// PyExc_ValueError, +// "libraqm 0.7 or greater required for 'ttb' direction"); +// goto failed; +// } } else { PyErr_SetString( PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); @@ -414,7 +281,7 @@ text_layout_raqm( } } - if (!(*p_raqm.set_par_direction)(rq, direction)) { + if (!raqm_set_par_direction(rq, direction)) { PyErr_SetString(PyExc_ValueError, "raqm_set_par_direction() failed"); goto failed; } @@ -446,38 +313,38 @@ text_layout_raqm( feature = PyBytes_AS_STRING(bytes); size = PyBytes_GET_SIZE(bytes); } - if (!(*p_raqm.add_font_feature)(rq, feature, size)) { + if (!raqm_add_font_feature(rq, feature, size)) { PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); goto failed; } } } - if (!(*p_raqm.set_freetype_face)(rq, self->face)) { + if (!raqm_set_freetype_face(rq, self->face)) { PyErr_SetString(PyExc_RuntimeError, "raqm_set_freetype_face() failed."); goto failed; } - if (!(*p_raqm.layout)(rq)) { + if (!raqm_layout(rq)) { PyErr_SetString(PyExc_RuntimeError, "raqm_layout() failed."); goto failed; } - if (p_raqm.version == 1) { - glyphs_01 = (*p_raqm.get_glyphs_01)(rq, &count); - if (glyphs_01 == NULL) { - PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); - count = 0; - goto failed; - } - } else { /* version == 2 */ - glyphs = (*p_raqm.get_glyphs)(rq, &count); +// if (p_raqm.version == 1) { +// glyphs_01 = raqm_get_glyphs_01(rq, &count); +// if (glyphs_01 == NULL) { +// PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); +// count = 0; +// goto failed; +// } +// } else { /* version == 2 */ + glyphs = raqm_get_glyphs(rq, &count); if (glyphs == NULL) { PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); count = 0; goto failed; } - } +// } (*glyph_info) = PyMem_New(GlyphInfo, count); if ((*glyph_info) == NULL) { @@ -486,16 +353,16 @@ text_layout_raqm( goto failed; } - if (p_raqm.version == 1) { - for (i = 0; i < count; i++) { - (*glyph_info)[i].index = glyphs_01[i].index; - (*glyph_info)[i].x_offset = glyphs_01[i].x_offset; - (*glyph_info)[i].x_advance = glyphs_01[i].x_advance; - (*glyph_info)[i].y_offset = glyphs_01[i].y_offset; - (*glyph_info)[i].y_advance = glyphs_01[i].y_advance; - (*glyph_info)[i].cluster = glyphs_01[i].cluster; - } - } else { +// if (p_raqm.version == 1) { +// for (i = 0; i < count; i++) { +// (*glyph_info)[i].index = glyphs_01[i].index; +// (*glyph_info)[i].x_offset = glyphs_01[i].x_offset; +// (*glyph_info)[i].x_advance = glyphs_01[i].x_advance; +// (*glyph_info)[i].y_offset = glyphs_01[i].y_offset; +// (*glyph_info)[i].y_advance = glyphs_01[i].y_advance; +// (*glyph_info)[i].cluster = glyphs_01[i].cluster; +// } +// } else { for (i = 0; i < count; i++) { (*glyph_info)[i].index = glyphs[i].index; (*glyph_info)[i].x_offset = glyphs[i].x_offset; @@ -504,10 +371,10 @@ text_layout_raqm( (*glyph_info)[i].y_advance = glyphs[i].y_advance; (*glyph_info)[i].cluster = glyphs[i].cluster; } - } +// } failed: - (*p_raqm.destroy)(rq); + raqm_destroy(rq); return count; } @@ -607,9 +474,9 @@ text_layout( int color) { size_t count; - if (p_raqm.raqm && self->layout_engine == LAYOUT_RAQM) { + if (p_fribidi && self->layout_engine == LAYOUT_RAQM) { count = text_layout_raqm( - string, self, dir, features, lang, glyph_info, mask, color); + string, self, dir, features, lang, glyph_info, mask, color); } else { count = text_layout_fallback( string, self, dir, features, lang, glyph_info, mask, color); @@ -1491,12 +1358,14 @@ setup_module(PyObject *m) { PyDict_SetItemString(d, "freetype2_version", v); setraqm(); - v = PyBool_FromLong(!!p_raqm.raqm); + v = PyBool_FromLong(!!p_fribidi); PyDict_SetItemString(d, "HAVE_RAQM", v); - if (p_raqm.version_string) { +// if (p_raqm.version_string) { PyDict_SetItemString( - d, "raqm_version", PyUnicode_FromString(p_raqm.version_string())); - } + d, "raqm_version", PyUnicode_FromString(raqm_version_string())); +// }; + + PyDict_SetItemString(d, "HAVE_FRIBIDI", v); return 0; } diff --git a/src/libImaging/raqm.h b/src/libImaging/raqm.h deleted file mode 100644 index 5f865853a..000000000 --- a/src/libImaging/raqm.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright © 2015 Information Technology Authority (ITA) - * Copyright © 2016 Khaled Hosny - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - */ - -#ifndef _RAQM_H_ -#define _RAQM_H_ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef bool -typedef int bool; -#endif -#ifndef uint32_t -typedef UINT32 uint32_t; -#endif -#include -#include FT_FREETYPE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * raqm_t: - * - * This is the main object holding all state of the currently processed text as - * well as its output. - * - * Since: 0.1 - */ -typedef struct _raqm raqm_t; - -/** - * raqm_direction_t: - * @RAQM_DIRECTION_DEFAULT: Detect paragraph direction automatically. - * @RAQM_DIRECTION_RTL: Paragraph is mainly right-to-left text. - * @RAQM_DIRECTION_LTR: Paragraph is mainly left-to-right text. - * @RAQM_DIRECTION_TTB: Paragraph is mainly vertical top-to-bottom text. - * - * Base paragraph direction, see raqm_set_par_direction(). - * - * Since: 0.1 - */ -typedef enum { - RAQM_DIRECTION_DEFAULT, - RAQM_DIRECTION_RTL, - RAQM_DIRECTION_LTR, - RAQM_DIRECTION_TTB -} raqm_direction_t; - -/** - * raqm_glyph_t: - * @index: the index of the glyph in the font file. - * @x_advance: the glyph advance width in horizontal text. - * @y_advance: the glyph advance width in vertical text. - * @x_offset: the horizontal movement of the glyph from the current point. - * @y_offset: the vertical movement of the glyph from the current point. - * @cluster: the index of original character in input text. - * @ftface: the @FT_Face of the glyph. - * - * The structure that holds information about output glyphs, returned from - * raqm_get_glyphs(). - */ -typedef struct raqm_glyph_t { - unsigned int index; - int x_advance; - int y_advance; - int x_offset; - int y_offset; - uint32_t cluster; - FT_Face ftface; -} raqm_glyph_t; - -/** - * version 0.1 of the raqm_glyph_t structure - */ -typedef struct raqm_glyph_t_01 { - unsigned int index; - int x_advance; - int y_advance; - int x_offset; - int y_offset; - uint32_t cluster; -} raqm_glyph_t_01; - -raqm_t * -raqm_create(void); - -raqm_t * -raqm_reference(raqm_t *rq); - -void -raqm_destroy(raqm_t *rq); - -bool -raqm_set_text(raqm_t *rq, const uint32_t *text, size_t len); - -bool -raqm_set_text_utf8(raqm_t *rq, const char *text, size_t len); - -bool -raqm_set_par_direction(raqm_t *rq, raqm_direction_t dir); - -bool -raqm_set_language(raqm_t *rq, const char *lang, size_t start, size_t len); - -bool -raqm_add_font_feature(raqm_t *rq, const char *feature, int len); - -bool -raqm_set_freetype_face(raqm_t *rq, FT_Face face); - -bool -raqm_set_freetype_face_range(raqm_t *rq, FT_Face face, size_t start, size_t len); - -bool -raqm_set_freetype_load_flags(raqm_t *rq, int flags); - -bool -raqm_layout(raqm_t *rq); - -raqm_glyph_t * -raqm_get_glyphs(raqm_t *rq, size_t *length); - -bool -raqm_index_to_position(raqm_t *rq, size_t *index, int *x, int *y); - -bool -raqm_position_to_index(raqm_t *rq, int x, int y, size_t *index); - -#ifdef __cplusplus -} -#endif -#endif /* _RAQM_H_ */ diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c new file mode 100644 index 000000000..64ff7e115 --- /dev/null +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -0,0 +1,68 @@ + +#ifndef _WIN32 +#include +#else +#define WIN32_LEAN_AND_MEAN +#include +#endif + +#define FRIBIDI_SHIM_IMPLEMENTATION + +#include "fribidi.h" + +int load_fribidi(void) { + int error = 0; + + p_fribidi = NULL; + + /* Microsoft needs a totally different system */ +#ifndef _WIN32 + p_fribidi = dlopen("libfribidi.so.1", RTLD_LAZY); + if (!p_fribidi) { + p_fribidi = dlopen("libfribidi.dylib", RTLD_LAZY); + } +#else + p_fribidi = LoadLibrary("fribidi"); + /* MSYS2 */ + if (!p_fribidi) { + p_fribidi = LoadLibrary("libfribidi-1"); + } +#endif + + if (!p_fribidi) { + return 1; + } + +#ifndef _WIN32 +#define LOAD_FUNCTION(func) \ + func = (t_##func)dlsym(p_fribidi, #func); \ + error = error || (func == NULL); +#else +#define LOAD_FUNCTION(func) \ + func = (t_##func)GetProcAddress(p_fribidi, #func); \ + error = error || (func == NULL); +#endif + + LOAD_FUNCTION(fribidi_get_bidi_types); + LOAD_FUNCTION(fribidi_get_bracket_types); + LOAD_FUNCTION(fribidi_get_par_embedding_levels_ex); +// LOAD_FUNCTION(fribidi_get_par_embedding_levels); + LOAD_FUNCTION(fribidi_unicode_to_charset); + LOAD_FUNCTION(fribidi_charset_to_unicode); + +#ifndef _WIN32 + if (dlerror() || error) { + dlclose(p_fribidi); + p_fribidi = NULL; + return 2; + } +#else + if (error) { + FreeLibrary(p_fribidi); + p_fribidi = NULL; + return 2; + } +#endif + + return 0; +} diff --git a/src/thirdparty/fribidi-shim/fribidi.h b/src/thirdparty/fribidi-shim/fribidi.h new file mode 100644 index 000000000..c79bb170a --- /dev/null +++ b/src/thirdparty/fribidi-shim/fribidi.h @@ -0,0 +1,104 @@ + +/* fribidi-types.h */ + +# if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \ + defined (_sgi) || defined (__sun) || defined (sun) || \ + defined (__digital__) || defined (__HP_cc) +# include +# elif defined (_AIX) +# include +# else +# include +# endif + +typedef uint32_t FriBidiChar; +typedef int FriBidiStrIndex; + +typedef FriBidiChar FriBidiBracketType; + + + +/* fribidi-char-sets.h */ + +typedef enum +{ + _FRIBIDI_CHAR_SET_NOT_FOUND, + FRIBIDI_CHAR_SET_UTF8, + FRIBIDI_CHAR_SET_CAP_RTL, + FRIBIDI_CHAR_SET_ISO8859_6, + FRIBIDI_CHAR_SET_ISO8859_8, + FRIBIDI_CHAR_SET_CP1255, + FRIBIDI_CHAR_SET_CP1256, + _FRIBIDI_CHAR_SETS_NUM_PLUS_ONE +} +FriBidiCharSet; + + + +/* fribidi-bidi-types.h */ + +typedef signed char FriBidiLevel; + +#define FRIBIDI_TYPE_LTR_VAL 0x00000110L +#define FRIBIDI_TYPE_RTL_VAL 0x00000111L +#define FRIBIDI_TYPE_ON_VAL 0x00000040L + +typedef uint32_t FriBidiCharType; +#define FRIBIDI_TYPE_LTR FRIBIDI_TYPE_LTR_VAL + +typedef uint32_t FriBidiParType; +#define FRIBIDI_PAR_LTR FRIBIDI_TYPE_LTR_VAL +#define FRIBIDI_PAR_RTL FRIBIDI_TYPE_RTL_VAL +#define FRIBIDI_PAR_ON FRIBIDI_TYPE_ON_VAL + +#define FRIBIDI_LEVEL_IS_RTL(lev) ((lev) & 1) +#define FRIBIDI_DIR_TO_LEVEL(dir) ((FriBidiLevel) (FRIBIDI_IS_RTL(dir) ? 1 : 0)) +#define FRIBIDI_IS_RTL(p) ((p) & 0x00000001L) +#define FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS(p) ((p) & 0x00901000L) + + + +/* functions */ + +#ifdef FRIBIDI_SHIM_IMPLEMENTATION +#define FRIBIDI_ENTRY +#else +#define FRIBIDI_ENTRY extern +#endif + +#define FRIBIDI_FUNC(ret, name, ...) \ + typedef ret (*t_##name) (__VA_ARGS__); \ + FRIBIDI_ENTRY t_##name name; + +FRIBIDI_FUNC(void, fribidi_get_bidi_types, + const FriBidiChar *, const FriBidiStrIndex, FriBidiCharType *); + +FRIBIDI_FUNC(void, fribidi_get_bracket_types, + const FriBidiChar *, const FriBidiStrIndex, const FriBidiCharType *, + FriBidiBracketType *); + +FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels_ex, + const FriBidiCharType *, const FriBidiBracketType *, const FriBidiStrIndex, + FriBidiParType *, FriBidiLevel *); + +//FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels, +// const FriBidiCharType *, const FriBidiStrIndex, FriBidiParType *, +// FriBidiLevel *); + +FRIBIDI_FUNC(FriBidiStrIndex, fribidi_unicode_to_charset, + FriBidiCharSet, const FriBidiChar *, FriBidiStrIndex, char *); + +FRIBIDI_FUNC(FriBidiStrIndex, fribidi_charset_to_unicode, + FriBidiCharSet, const char *, FriBidiStrIndex, FriBidiChar *); + +#undef FRIBIDI_FUNC + + + +/* shim */ + +FRIBIDI_ENTRY void *p_fribidi; + +FRIBIDI_ENTRY int load_fribidi(void); + +#undef FRIBIDI_ENTRY diff --git a/src/thirdparty/raqm/raqm.c b/src/thirdparty/raqm/raqm.c index 27e59b5fc..c796f645e 100644 --- a/src/thirdparty/raqm/raqm.c +++ b/src/thirdparty/raqm/raqm.c @@ -30,15 +30,16 @@ #include #include -#include +#include "../fribidi-shim/fribidi.h" + #include #include #include "raqm.h" -#if FRIBIDI_MAJOR_VERSION >= 1 +//#if FRIBIDI_MAJOR_VERSION >= 1 #define USE_FRIBIDI_EX_API -#endif +//#endif /** * SECTION:raqm diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 2531d5504..fd63f4f1e 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -296,21 +296,7 @@ deps = { cmd_nmake(target="clean"), cmd_nmake(target="fribidi"), ], - "headers": [r"lib\*.h"], - "libs": [r"*.lib"], - }, - "libraqm": { - "url": "https://github.com/HOST-Oman/libraqm/archive/v0.7.1.zip", - "filename": "libraqm-0.7.1.zip", - "dir": "libraqm-0.7.1", - "build": [ - cmd_copy(r"{winbuild_dir}\raqm.cmake", r"CMakeLists.txt"), - cmd_cmake(), - cmd_nmake(target="clean"), - cmd_nmake(target="libraqm"), - ], - "headers": [r"src\*.h"], - "bins": [r"libraqm.dll"], + "bins": [r"*.dll"], }, } @@ -511,8 +497,8 @@ if __name__ == "__main__": verbose = True elif arg == "--no-imagequant": disabled += ["libimagequant"] - elif arg == "--no-raqm": - disabled += ["fribidi", "libraqm"] + elif arg == "--no-raqm" or arg == "--no-fribidi": + disabled += ["fribidi"] elif arg.startswith("--depends="): depends_dir = arg[10:] elif arg.startswith("--python="): diff --git a/winbuild/fribidi.cmake b/winbuild/fribidi.cmake index 47ab2c329..acb614bfa 100644 --- a/winbuild/fribidi.cmake +++ b/winbuild/fribidi.cmake @@ -93,10 +93,10 @@ fribidi_tab(brackets-type unidata/BidiBrackets.txt) file(GLOB FRIBIDI_SOURCES lib/*.c) file(GLOB FRIBIDI_HEADERS lib/*.h) -add_library(fribidi STATIC +add_library(fribidi SHARED ${FRIBIDI_SOURCES} ${FRIBIDI_HEADERS} ${FRIBIDI_SOURCES_GENERATED}) fribidi_definitions(fribidi) target_compile_definitions(fribidi - PUBLIC -DFRIBIDI_LIB_STATIC) + PUBLIC "-DFRIBIDI_ENTRY=__declspec(dllexport)") From 9e5fc136b90e86a4cfbd437455cbe60e4aeeba4c Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 11:23:45 +0000 Subject: [PATCH 226/750] add Raqm license and readme --- src/thirdparty/raqm/AUTHORS | 9 ++++ src/thirdparty/raqm/COPYING | 22 +++++++++ src/thirdparty/raqm/NEWS | 89 +++++++++++++++++++++++++++++++++++++ src/thirdparty/raqm/README | 85 +++++++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 src/thirdparty/raqm/AUTHORS create mode 100644 src/thirdparty/raqm/COPYING create mode 100644 src/thirdparty/raqm/NEWS create mode 100644 src/thirdparty/raqm/README diff --git a/src/thirdparty/raqm/AUTHORS b/src/thirdparty/raqm/AUTHORS new file mode 100644 index 000000000..bd5c3ac6b --- /dev/null +++ b/src/thirdparty/raqm/AUTHORS @@ -0,0 +1,9 @@ +Abderraouf Adjal +Ali Yousuf +Anood Almuharbi +Asma Albahanta +Fahad Alsaidi +Ibtisam Almabsali +Khaled Hosny +Mazoon Almaamari +Shamsa Alqassabi diff --git a/src/thirdparty/raqm/COPYING b/src/thirdparty/raqm/COPYING new file mode 100644 index 000000000..196511ef6 --- /dev/null +++ b/src/thirdparty/raqm/COPYING @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright © 2015 Information Technology Authority (ITA) +Copyright © 2016 Khaled Hosny + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/thirdparty/raqm/NEWS b/src/thirdparty/raqm/NEWS new file mode 100644 index 000000000..29c9ae0e5 --- /dev/null +++ b/src/thirdparty/raqm/NEWS @@ -0,0 +1,89 @@ +Overview of changes leading to 0.7.1 +Sunday, November 22, 2020 +==================================== + +Require HarfBuzz >= 2.0.0 + +Build and documentation fixes. + +Overview of changes leading to 0.7.0 +Monday, May 27, 2019 +==================================== + +New API: + * raqm_version + * raqm_version_string + * raqm_version_atleast + * RAQM_VERSION_MAJOR + * RAQM_VERSION_MICRO + * RAQM_VERSION_MINOR + * RAQM_VERSION_STRING + * RAQM_VERSION_ATLEAST + +Overview of changes leading to 0.6.0 +Sunday, May 5, 2019 +==================================== + +Fix TTB direction regression from the previous release. + +Correctly detect script of Common and Inherite characters at start of text. + +Undef HAVE_CONFIG_H workaround, for older versions of Fribidi. + +Drop test suite dependency on GLib. + +Port test runner to Python instead of shell script. + +New API: +* raqm_set_invisible_glyph() + +Overview of changes leading to 0.5.0 +Saturday, February 24, 2018 +==================================== + +Use FriBiDi 1.x API when available. + +Overview of changes leading to 0.4.0 +Sunday, January 21, 2018 +==================================== + +Set begin-of-text and end-of-text HarfBuzz buffer flags. + +Dynamically allocate memory instead of using stack allocation for input text. + +Accept zero length text and do nothing instead of treating it as error. + +Overview of changes leading to 0.3.0 +Monday, August 21, 2017 +==================================== + +Fix stack corruption on MSVC. + +New API: +* raqm_set_freetype_load_flags + +Overview of changes leading to 0.2.0 +Wednesday, August 25, 2016 +==================================== + +Fix building with MSVC due to lacking C99 support. + +Make multiple fonts support actually work. Start and length now respect the +input encoding. + +New API: +* raqm_index_to_position +* raqm_position_to_index +* raqm_set_language + +Overview of changes leading to 0.1.1 +Sunday, May 1, 2016 +==================================== + +Fix make check on 32-bit systems. + +Overview of changes leading to 0.1.0 +Wednesday, January 20, 2016 +==================================== + +First release. diff --git a/src/thirdparty/raqm/README b/src/thirdparty/raqm/README new file mode 100644 index 000000000..7940bf3b6 --- /dev/null +++ b/src/thirdparty/raqm/README @@ -0,0 +1,85 @@ +Raqm +==== + +[![Linux & macOS build](https://travis-ci.org/HOST-Oman/libraqm.svg?branch=master)](https://travis-ci.org/HOST-Oman/libraqm) +[![Windows build](https://img.shields.io/appveyor/ci/HOSTOman/libraqm/master.svg)](https://ci.appveyor.com/project/HOSTOman/libraqm) + +Raqm is a small library that encapsulates the logic for complex text layout and +provides a convenient API. + +It currently provides bidirectional text support (using [FriBiDi][1]), shaping +(using [HarfBuzz][2]), and proper script itemization. As a result, +Raqm can support most writing systems covered by Unicode. + +The documentation can be accessed on the web at: +> http://host-oman.github.io/libraqm/ + +Raqm (Arabic: رَقْم) is writing, also number or digit and the Arabic word for +digital (رَقَمِيّ) shares the same root, so it is a play on “digital writing”. + +Building +-------- + +Raqm depends on the following libraries: +* [FreeType][3] +* [HarfBuzz][2] +* [FriBiDi][1] + +To build the documentation you will also need: +* [GTK-Doc][4] + +To install dependencies on Fedora: + + sudo dnf install freetype-devel harfbuzz-devel fribidi-devel gtk-doc + +To install dependencies on Ubuntu: + + sudo apt-get install libfreetype6-dev libharfbuzz-dev libfribidi-dev \ + gtk-doc-tools + +On Mac OS X you can use Homebrew: + + brew install freetype harfbuzz fribidi gtk-doc + export XML_CATALOG_FILES="/usr/local/etc/xml/catalog" # for the docs + +Once you have the source code and the dependencies, you can proceed to build. +To do that, run the customary sequence of commands in the source code +directory: + + $ ./configure + $ make + $ make install + +To build the documentation, pass `--enable-gtk-doc` to the `configure` script. + +To run the tests: + + $ make check + +Contributing +------------ + +Once you have made a change that you are happy with, contribute it back, we’ll +be happy to integrate it! Just fork the repository and make a pull request. + +Projects using Raqm +------------------- + +1. [ImageMagick](https://github.com/ImageMagick/ImageMagick) +2. [LibGD](https://github.com/libgd/libgd) +3. [FontView](https://github.com/googlei18n/fontview) +4. [Pillow](https://github.com/python-pillow) +5. [mplcairo](https://github.com/anntzer/mplcairo) + +The following projects have patches to support complex text layout using Raqm: + +2. SDL_ttf: https://bugzilla.libsdl.org/show_bug.cgi?id=3211 +3. Pygame: https://bitbucket.org/pygame/pygame/pull-requests/52 +4. Blender: https://developer.blender.org/D1809 + + + +[1]: http://fribidi.org +[2]: http://harfbuzz.org +[3]: https://www.freetype.org +[4]: https://www.gtk.org/gtk-doc From 5cd688fc82e875de25979af800642f905cb92cb3 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 14:01:16 +0000 Subject: [PATCH 227/750] add option to statically link fribidi, version info --- setup.py | 94 ++++++++++++++++++++++----- src/PIL/features.py | 7 ++ src/_imagingft.c | 74 ++++++++++++++++----- src/thirdparty/fribidi-shim/fribidi.c | 6 +- src/thirdparty/fribidi-shim/fribidi.h | 5 ++ src/thirdparty/raqm/raqm.c | 8 ++- 6 files changed, 157 insertions(+), 37 deletions(-) diff --git a/setup.py b/setup.py index 3e0ec5576..0afc6330c 100755 --- a/setup.py +++ b/setup.py @@ -267,7 +267,7 @@ class pil_build_ext(build_ext): "jpeg", "tiff", "freetype", - "harfbuzz", + "raqm", "lcms", "webp", "webpmux", @@ -277,6 +277,7 @@ class pil_build_ext(build_ext): ] required = {"jpeg", "zlib"} + system = set() def __init__(self): for f in self.features: @@ -288,6 +289,9 @@ class pil_build_ext(build_ext): def want(self, feat): return getattr(self, feat) is None + def want_system(self, feat): + return feat in self.system + def __iter__(self): yield from self.features @@ -297,6 +301,10 @@ class pil_build_ext(build_ext): build_ext.user_options + [(f"disable-{x}", None, f"Disable support for {x}") for x in feature] + [(f"enable-{x}", None, f"Enable support for {x}") for x in feature] + + [ + (f"system-{x}", None, f"Use system version of {x}") + for x in ("raqm", "fribidi") + ] + [ ("disable-platform-guessing", None, "Disable platform guessing on Linux"), ("debug", None, "Debug logging"), @@ -311,6 +319,8 @@ class pil_build_ext(build_ext): for x in self.feature: setattr(self, f"disable_{x}", None) setattr(self, f"enable_{x}", None) + for x in ("raqm", "fribidi"): + setattr(self, f"system_{x}", None) def finalize_options(self): build_ext.finalize_options(self) @@ -335,18 +345,40 @@ class pil_build_ext(build_ext): raise ValueError( f"Conflicting options: --enable-{x} and --disable-{x}" ) + if x == "freetype": + _dbg("--disable-freetype implies --disable-raqm") + if getattr(self, "enable_raqm"): + raise ValueError( + "Conflicting options: --enable-raqm and --disable-freetype" + ) + setattr(self, "disable_raqm", True) if getattr(self, f"enable_{x}"): _dbg("Requiring %s", x) self.feature.required.add(x) + if x == "raqm": + _dbg("--enable-raqm implies --enable-freetype") + self.feature.required.add("freetype") + for x in ("raqm", "fribidi"): + if getattr(self, f"system_{x}"): + if getattr(self, f"disable_raqm"): + raise ValueError( + f"Conflicting options: --system-{x} and --disable-raqm" + ) + if x == "fribidi" and getattr(self, f"system_raqm"): + raise ValueError( + f"Conflicting options: --system-{x} and --system-raqm" + ) + _dbg("Using system version of %s", x) + self.feature.system.add(x) - def _update_extension(self, name, libraries, define_macros=None, include_dirs=None): + def _update_extension(self, name, libraries, define_macros=None, sources=None): for extension in self.extensions: if extension.name == name: extension.libraries += libraries if define_macros is not None: extension.define_macros += define_macros - if include_dirs is not None: - extension.include_dirs += include_dirs + if sources is not None: + extension.sources += sources break def _remove_extension(self, name): @@ -657,11 +689,27 @@ class pil_build_ext(build_ext): if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) - if feature.want("harfbuzz"): - _dbg("Looking for harfbuzz") - if _find_include_file(self, "hb-version.h"): - if _find_library_file(self, "harfbuzz"): - feature.harfbuzz = "harfbuzz" + if feature.want("raqm"): + if feature.want_system("raqm"): # want system Raqm + _dbg("Looking for Raqm") + if _find_include_file(self, "raqm.h"): + if _find_library_file(self, "raqm"): + feature.harfbuzz = "raqm" + elif _find_library_file(self, "libraqm"): + feature.harfbuzz = "libraqm" + else: # want to build Raqm + _dbg("Looking for HarfBuzz") + if _find_include_file(self, "hb.h"): + if _find_library_file(self, "harfbuzz"): + feature.harfbuzz = "harfbuzz" + if feature.harfbuzz: + if feature.want_system("fribidi"): # want system FriBiDi + _dbg("Looking for FriBiDi") + if _find_include_file(self, "fribidi.h"): + if _find_library_file(self, "fribidi"): + feature.harfbuzz = "fribidi" + else: # want to build FriBiDi shim + feature.raqm = True if feature.want("lcms"): _dbg("Looking for lcms") @@ -758,9 +806,25 @@ class pil_build_ext(build_ext): # additional libraries if feature.freetype: + srcs = [] libs = ["freetype"] defs = [] - self._update_extension("PIL._imagingft", libs, defs) + if feature.raqm: + if feature.want_system("raqm"): # using system Raqm + defs.append(("HAVE_RAQM", None)) + defs.append(("HAVE_RAQM_SYSTEM", None)) + libs.append(feature.raqm) + else: # building Raqm + defs.append(("HAVE_RAQM", None)) + srcs.append("src/thirdparty/raqm/raqm.c") + libs.append(feature.harfbuzz) + if feature.want_system("fribidi"): # using system FriBiDi + defs.append(("HAVE_FRIBIDI_SYSTEM", None)) + libs.append(feature.fribidi) + else: # building our FriBiDi shim + srcs.append("src/thirdparty/fribidi-shim/fribidi.c") + self._update_extension("PIL._imagingft", libs, defs, srcs) + else: self._remove_extension("PIL._imagingft") @@ -814,6 +878,7 @@ class pil_build_ext(build_ext): (feature.imagequant, "LIBIMAGEQUANT"), (feature.tiff, "LIBTIFF"), (feature.freetype, "FREETYPE2"), + (feature.raqm, "RAQM (Text shaping)"), # TODO!!! (feature.lcms, "LITTLECMS2"), (feature.webp, "WEBP"), (feature.webpmux, "WEBPMUX"), @@ -857,14 +922,7 @@ for src_file in _LIB_IMAGING: files.append(os.path.join("src/libImaging", src_file + ".c")) ext_modules = [ Extension("PIL._imaging", files), - Extension( - "PIL._imagingft", - [ - "src/_imagingft.c", - "src/thirdparty/raqm/raqm.c", - "src/thirdparty/fribidi-shim/fribidi.c", - ], - ), + Extension("PIL._imagingft", ["src/_imagingft.c"]), Extension("PIL._imagingcms", ["src/_imagingcms.c"]), Extension("PIL._webp", ["src/_webp.c"]), Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]), diff --git a/src/PIL/features.py b/src/PIL/features.py index da0ca557c..85459063b 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -118,6 +118,8 @@ features = { "webp_mux": ("PIL._webp", "HAVE_WEBPMUX", None), "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY", None), "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), + "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), + "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), "xcb": ("PIL._imaging", "HAVE_XCB", None), @@ -274,6 +276,11 @@ def pilinfo(out=None, supported_formats=True): # this check is also in src/_imagingcms.c:setup_module() version_static = tuple(int(x) for x in v.split(".")) < (2, 7) t = "compiled for" if version_static else "loaded" + if name == "raqm": + for f in ("fribidi", "harfbuzz"): + v2 = version_feature(f) + if v2 is not None: + v += f", {f} {v2}" print("---", feature, "support ok,", t, v, file=out) else: print("---", feature, "support ok", file=out) diff --git a/src/_imagingft.c b/src/_imagingft.c index 4a4084e9f..fd5530642 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -52,8 +52,21 @@ } \ ; -#include "thirdparty/raqm/raqm.h" -#include "thirdparty/fribidi-shim/fribidi.h" +#ifdef HAVE_RAQM +# ifdef HAVE_RAQM_SYSTEM +# include +# else +# include "thirdparty/raqm/raqm.h" +# ifdef HAVE_FRIBIDI_SYSTEM +# include +# else +# include "thirdparty/fribidi-shim/fribidi.h" +# include +# endif +# endif +#endif + +static int have_raqm = 0; #define LAYOUT_FALLBACK 0 #define LAYOUT_RAQM 1 @@ -101,11 +114,6 @@ geterror(int code) { return NULL; } -static int -setraqm(void) { - return load_fribidi(); -} - static PyObject * getfont(PyObject *self_, PyObject *args, PyObject *kw) { /* create a font object from a file name and a size (in pixels) */ @@ -474,7 +482,7 @@ text_layout( int color) { size_t count; - if (p_fribidi && self->layout_engine == LAYOUT_RAQM) { + if (have_raqm && self->layout_engine == LAYOUT_RAQM) { count = text_layout_raqm( string, self, dir, features, lang, glyph_info, mask, color); } else { @@ -1357,15 +1365,51 @@ setup_module(PyObject *m) { v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch); PyDict_SetItemString(d, "freetype2_version", v); - setraqm(); - v = PyBool_FromLong(!!p_fribidi); - PyDict_SetItemString(d, "HAVE_RAQM", v); -// if (p_raqm.version_string) { - PyDict_SetItemString( - d, "raqm_version", PyUnicode_FromString(raqm_version_string())); -// }; +#ifdef HAVE_RAQM +#ifdef HAVE_FRIBIDI_SYSTEM + have_raqm = 1; +#else + load_fribidi(); + have_raqm = !!p_fribidi; +#endif +#else + have_raqm = 0; +#endif + /* if we have Raqm, we have all three (but possibly no version info) */ + v = PyBool_FromLong(have_raqm); + PyDict_SetItemString(d, "HAVE_RAQM", v); PyDict_SetItemString(d, "HAVE_FRIBIDI", v); + PyDict_SetItemString(d, "HAVE_HARFBUZZ", v); + if (have_raqm) { + const char *a, *b; +#ifdef RAQM_VERSION_MAJOR + v = PyUnicode_FromString(raqm_version_string()); +#else + v = Py_None; +#endif + PyDict_SetItemString(d, "raqm_version", v); + +#ifdef FRIBIDI_MAJOR_VERSION + a = strchr(fribidi_version_info, '1'); + b = strchr(fribidi_version_info, '\n'); + if (a && b) { + v = PyUnicode_FromStringAndSize(a, b - a); + } else { + v = Py_None; + } +#else + v = Py_None; +#endif + PyDict_SetItemString(d, "fribidi_version", v); + +#ifdef HB_VERSION_STRING + v = PyUnicode_FromString(hb_version_string()); +#else + v = Py_None; +#endif + PyDict_SetItemString(d, "harfbuzz_version", v); + } return 0; } diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index 64ff7e115..77a55b502 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -51,13 +51,15 @@ int load_fribidi(void) { LOAD_FUNCTION(fribidi_charset_to_unicode); #ifndef _WIN32 - if (dlerror() || error) { + fribidi_version_info = *(const char**)dlsym(p_fribidi, "fribidi_version_info"); + if (dlerror() || error || (fribidi_version_info == NULL)) { dlclose(p_fribidi); p_fribidi = NULL; return 2; } #else - if (error) { + fribidi_version_info = *(const char**)GetProcAddress(p_fribidi, "fribidi_version_info"); + if (error || (fribidi_version_info == NULL)) { FreeLibrary(p_fribidi); p_fribidi = NULL; return 2; diff --git a/src/thirdparty/fribidi-shim/fribidi.h b/src/thirdparty/fribidi-shim/fribidi.h index c79bb170a..b7c6064bc 100644 --- a/src/thirdparty/fribidi-shim/fribidi.h +++ b/src/thirdparty/fribidi-shim/fribidi.h @@ -1,4 +1,6 @@ +#define FRIBIDI_MAJOR_VERSION 1 + /* fribidi-types.h */ # if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \ @@ -93,6 +95,9 @@ FRIBIDI_FUNC(FriBidiStrIndex, fribidi_charset_to_unicode, #undef FRIBIDI_FUNC +/* constant, not a function */ +FRIBIDI_ENTRY const char *fribidi_version_info; + /* shim */ diff --git a/src/thirdparty/raqm/raqm.c b/src/thirdparty/raqm/raqm.c index c796f645e..5a0b2078e 100644 --- a/src/thirdparty/raqm/raqm.c +++ b/src/thirdparty/raqm/raqm.c @@ -30,16 +30,20 @@ #include #include +#ifdef HAVE_FRIBIDI_SYSTEM +#include +#else #include "../fribidi-shim/fribidi.h" +#endif #include #include #include "raqm.h" -//#if FRIBIDI_MAJOR_VERSION >= 1 +#if FRIBIDI_MAJOR_VERSION >= 1 #define USE_FRIBIDI_EX_API -//#endif +#endif /** * SECTION:raqm From d4403bec46a22d0b8cb8a8fde816519effbc4f2a Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 14:02:21 +0000 Subject: [PATCH 228/750] GHA: fix windows build for dynamic fribidi --- .github/workflows/test-windows.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index db1675135..c5aa133cb 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -137,14 +137,11 @@ jobs: if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_harfbuzz.cmd" + # Raqm dependencies - name: Build dependencies / FriBidi if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_fribidi.cmd" - - name: Build dependencies / Raqm - if: steps.build-cache.outputs.cache-hit != 'true' - run: "& winbuild\\build\\build_dep_libraqm.cmd" - # trim ~150MB x 9 - name: Optimize build cache if: steps.build-cache.outputs.cache-hit != 'true' From 3386a9ce0272d92c1c1c20037c60022aa4e09ea4 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 15:18:43 +0000 Subject: [PATCH 229/750] replace tabs in thirdparty libs --- src/thirdparty/fribidi-shim/fribidi.h | 2 +- src/thirdparty/raqm/raqm-version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/thirdparty/fribidi-shim/fribidi.h b/src/thirdparty/fribidi-shim/fribidi.h index b7c6064bc..aa446fbef 100644 --- a/src/thirdparty/fribidi-shim/fribidi.h +++ b/src/thirdparty/fribidi-shim/fribidi.h @@ -43,7 +43,7 @@ typedef signed char FriBidiLevel; #define FRIBIDI_TYPE_LTR_VAL 0x00000110L #define FRIBIDI_TYPE_RTL_VAL 0x00000111L -#define FRIBIDI_TYPE_ON_VAL 0x00000040L +#define FRIBIDI_TYPE_ON_VAL 0x00000040L typedef uint32_t FriBidiCharType; #define FRIBIDI_TYPE_LTR FRIBIDI_TYPE_LTR_VAL diff --git a/src/thirdparty/raqm/raqm-version.h b/src/thirdparty/raqm/raqm-version.h index 4fd5c6842..94b25ada7 100644 --- a/src/thirdparty/raqm/raqm-version.h +++ b/src/thirdparty/raqm/raqm-version.h @@ -38,7 +38,7 @@ #define RAQM_VERSION_STRING "0.7.1" #define RAQM_VERSION_ATLEAST(major,minor,micro) \ - ((major)*10000+(minor)*100+(micro) <= \ - RAQM_VERSION_MAJOR*10000+RAQM_VERSION_MINOR*100+RAQM_VERSION_MICRO) + ((major)*10000+(minor)*100+(micro) <= \ + RAQM_VERSION_MAJOR*10000+RAQM_VERSION_MINOR*100+RAQM_VERSION_MICRO) #endif /* _RAQM_VERSION_H_ */ From be0d0a3a4895aeef5504a78440cd08dbee16f99c Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 16:27:12 +0000 Subject: [PATCH 230/750] fix finding raqm deps --- setup.py | 38 ++++++++++++++++++++++----- src/_imagingft.c | 12 ++++++--- src/thirdparty/fribidi-shim/fribidi.c | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index 0afc6330c..7275dc6ed 100755 --- a/setup.py +++ b/setup.py @@ -123,7 +123,7 @@ _LIB_IMAGING = ( "codec_fd", ) -DEBUG = False +DEBUG = True class DependencyException(Exception): @@ -228,6 +228,19 @@ def _find_library_file(self, library): return ret +def _find_include_dir(self, dirname, include): + for directory in self.compiler.include_dirs: + _dbg("Checking for include file %s in %s", (include, directory)) + if os.path.isfile(os.path.join(directory, include)): + _dbg("Found %s in %s", (include, directory)) + return True + subdir = os.path.join(directory, dirname) + _dbg("Checking for include file %s in %s", (include, subdir)) + if os.path.isfile(os.path.join(subdir, include)): + _dbg("Found %s in %s", (include, subdir)) + return subdir + + def _cmd_exists(cmd): return any( os.access(os.path.join(path, cmd), os.X_OK) @@ -689,25 +702,36 @@ class pil_build_ext(build_ext): if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) - if feature.want("raqm"): + if feature.freetype and feature.want("raqm"): if feature.want_system("raqm"): # want system Raqm _dbg("Looking for Raqm") if _find_include_file(self, "raqm.h"): if _find_library_file(self, "raqm"): - feature.harfbuzz = "raqm" + feature.raqm = "raqm" elif _find_library_file(self, "libraqm"): - feature.harfbuzz = "libraqm" + feature.raqm = "libraqm" else: # want to build Raqm _dbg("Looking for HarfBuzz") - if _find_include_file(self, "hb.h"): + feature.harfbuzz = None + hb_dir = _find_include_dir(self, "harfbuzz", "hb.h") + if hb_dir: + if isinstance(hb_dir, str): + _add_directory(self.compiler.include_dirs, hb_dir, 0) if _find_library_file(self, "harfbuzz"): feature.harfbuzz = "harfbuzz" if feature.harfbuzz: if feature.want_system("fribidi"): # want system FriBiDi _dbg("Looking for FriBiDi") - if _find_include_file(self, "fribidi.h"): + feature.fribidi = None + fribidi_dir = _find_include_dir(self, "fribidi", "fribidi.h") + if fribidi_dir: + if isinstance(fribidi_dir, str): + _add_directory( + self.compiler.include_dirs, fribidi_dir, 0 + ) if _find_library_file(self, "fribidi"): - feature.harfbuzz = "fribidi" + feature.fribidi = "fribidi" + feature.raqm = True else: # want to build FriBiDi shim feature.raqm = True diff --git a/src/_imagingft.c b/src/_imagingft.c index fd5530642..b2cf76ce7 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -221,6 +221,8 @@ font_getchar(PyObject *string, int index, FT_ULong *char_out) { return 0; } +#ifdef HAVE_RAQM + static size_t text_layout_raqm( PyObject *string, @@ -386,6 +388,8 @@ failed: return count; } +#endif + static size_t text_layout_fallback( PyObject *string, @@ -481,11 +485,13 @@ text_layout( int mask, int color) { size_t count; - +#ifdef HAVE_RAQM if (have_raqm && self->layout_engine == LAYOUT_RAQM) { count = text_layout_raqm( string, self, dir, features, lang, glyph_info, mask, color); - } else { + } else +#endif + { count = text_layout_fallback( string, self, dir, features, lang, glyph_info, mask, color); } @@ -1366,7 +1372,7 @@ setup_module(PyObject *m) { PyDict_SetItemString(d, "freetype2_version", v); #ifdef HAVE_RAQM -#ifdef HAVE_FRIBIDI_SYSTEM +#if defined(HAVE_RAQM_SYSTEM) || defined(HAVE_FRIBIDI_SYSTEM) have_raqm = 1; #else load_fribidi(); diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index 77a55b502..c83159e29 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -25,7 +25,7 @@ int load_fribidi(void) { p_fribidi = LoadLibrary("fribidi"); /* MSYS2 */ if (!p_fribidi) { - p_fribidi = LoadLibrary("libfribidi-1"); + p_fribidi = LoadLibrary("libfribidi-0"); } #endif From 834c2e5e5dea378caf5603f58f0dcd476112cf6f Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 16:29:43 +0000 Subject: [PATCH 231/750] lint --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 7275dc6ed..cb4ec2da8 100755 --- a/setup.py +++ b/setup.py @@ -373,11 +373,11 @@ class pil_build_ext(build_ext): self.feature.required.add("freetype") for x in ("raqm", "fribidi"): if getattr(self, f"system_{x}"): - if getattr(self, f"disable_raqm"): + if getattr(self, "disable_raqm"): raise ValueError( f"Conflicting options: --system-{x} and --disable-raqm" ) - if x == "fribidi" and getattr(self, f"system_raqm"): + if x == "fribidi" and getattr(self, "system_raqm"): raise ValueError( f"Conflicting options: --system-{x} and --system-raqm" ) From c3fce854f2e227e37036b96980ae00934db483a2 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 16:32:37 +0000 Subject: [PATCH 232/750] avoid NULL in fribidi shim --- src/thirdparty/fribidi-shim/fribidi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index c83159e29..f23741ecd 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -13,7 +13,7 @@ int load_fribidi(void) { int error = 0; - p_fribidi = NULL; + p_fribidi = 0; /* Microsoft needs a totally different system */ #ifndef _WIN32 @@ -36,11 +36,11 @@ int load_fribidi(void) { #ifndef _WIN32 #define LOAD_FUNCTION(func) \ func = (t_##func)dlsym(p_fribidi, #func); \ - error = error || (func == NULL); + error = error || (func == 0); #else #define LOAD_FUNCTION(func) \ func = (t_##func)GetProcAddress(p_fribidi, #func); \ - error = error || (func == NULL); + error = error || (func == 0); #endif LOAD_FUNCTION(fribidi_get_bidi_types); @@ -52,16 +52,16 @@ int load_fribidi(void) { #ifndef _WIN32 fribidi_version_info = *(const char**)dlsym(p_fribidi, "fribidi_version_info"); - if (dlerror() || error || (fribidi_version_info == NULL)) { + if (dlerror() || error || (fribidi_version_info == 0)) { dlclose(p_fribidi); - p_fribidi = NULL; + p_fribidi = 0; return 2; } #else fribidi_version_info = *(const char**)GetProcAddress(p_fribidi, "fribidi_version_info"); - if (error || (fribidi_version_info == NULL)) { + if (error || (fribidi_version_info == 0)) { FreeLibrary(p_fribidi); - p_fribidi = NULL; + p_fribidi = 0; return 2; } #endif From f2b2d53ca82ea2ca882329d382d2812bf7818485 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 18:01:49 +0000 Subject: [PATCH 233/750] raqm: avoid declaring variables in for statement for C89 compatibility --- src/thirdparty/raqm/raqm.c | 127 +++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/src/thirdparty/raqm/raqm.c b/src/thirdparty/raqm/raqm.c index 5a0b2078e..96523ffb9 100644 --- a/src/thirdparty/raqm/raqm.c +++ b/src/thirdparty/raqm/raqm.c @@ -220,6 +220,7 @@ static bool _raqm_init_text_info (raqm_t *rq) { hb_language_t default_lang; + size_t i; if (rq->text_info) return true; @@ -229,7 +230,7 @@ _raqm_init_text_info (raqm_t *rq) return false; default_lang = hb_language_get_default (); - for (size_t i = 0; i < rq->text_len; i++) + for (i = 0; i < rq->text_len; i++) { rq->text_info[i].ftface = NULL; rq->text_info[i].lang = default_lang; @@ -242,10 +243,12 @@ _raqm_init_text_info (raqm_t *rq) static void _raqm_free_text_info (raqm_t *rq) { + size_t i; + if (!rq->text_info) return; - for (size_t i = 0; i < rq->text_len; i++) + for (i = 0; i < rq->text_len; i++) { if (rq->text_info[i].ftface) FT_Done_Face (rq->text_info[i].ftface); @@ -551,6 +554,7 @@ raqm_set_language (raqm_t *rq, size_t len) { hb_language_t language; + size_t i; size_t end = start + len; if (!rq) @@ -572,7 +576,7 @@ raqm_set_language (raqm_t *rq, return false; language = hb_language_from_string (lang, -1); - for (size_t i = start; i < end; i++) + for (i = start; i < end; i++) { rq->text_info[i].lang = language; } @@ -646,6 +650,8 @@ _raqm_set_freetype_face (raqm_t *rq, size_t start, size_t end) { + size_t i; + if (!rq) return false; @@ -658,7 +664,7 @@ _raqm_set_freetype_face (raqm_t *rq, if (!rq->text_info) return false; - for (size_t i = start; i < end; i++) + for (i = start; i < end; i++) { if (rq->text_info[i].ftface) FT_Done_Face (rq->text_info[i].ftface); @@ -832,6 +838,8 @@ _raqm_shape (raqm_t *rq); bool raqm_layout (raqm_t *rq) { + size_t i; + if (!rq) return false; @@ -841,7 +849,7 @@ raqm_layout (raqm_t *rq) if (!rq->text_info) return false; - for (size_t i = 0; i < rq->text_len; i++) + for (i = 0; i < rq->text_len; i++) { if (!rq->text_info[i].ftface) return false; @@ -879,6 +887,9 @@ raqm_glyph_t * raqm_get_glyphs (raqm_t *rq, size_t *length) { + size_t i; + raqm_run_t *run; + size_t count = 0; if (!rq || !rq->runs || !length) @@ -888,7 +899,7 @@ raqm_get_glyphs (raqm_t *rq, return NULL; } - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) count += hb_buffer_get_length (run->buffer); *length = count; @@ -906,7 +917,7 @@ raqm_get_glyphs (raqm_t *rq, RAQM_TEST ("Glyph information:\n"); count = 0; - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -916,7 +927,7 @@ raqm_get_glyphs (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (size_t i = 0; i < len; i++) + for (i = 0; i < len; i++) { rq->glyphs[count + i].index = info[i].codepoint; rq->glyphs[count + i].cluster = info[i].cluster; @@ -939,18 +950,18 @@ raqm_get_glyphs (raqm_t *rq, { #ifdef RAQM_TESTING RAQM_TEST ("\nUTF-32 clusters:"); - for (size_t i = 0; i < count; i++) + for (i = 0; i < count; i++) RAQM_TEST (" %02d", rq->glyphs[i].cluster); RAQM_TEST ("\n"); #endif - for (size_t i = 0; i < count; i++) + for (i = 0; i < count; i++) rq->glyphs[i].cluster = _raqm_u32_to_u8_index (rq, rq->glyphs[i].cluster); #ifdef RAQM_TESTING RAQM_TEST ("UTF-8 clusters: "); - for (size_t i = 0; i < count; i++) + for (i = 0; i < count; i++) RAQM_TEST (" %02d", rq->glyphs[i].cluster); RAQM_TEST ("\n"); #endif @@ -983,9 +994,11 @@ typedef struct { static void _raqm_reverse_run (_raqm_bidi_run *run, const size_t len) { + size_t i; + assert (run); - for (size_t i = 0; i < len / 2; i++) + for (i = 0; i < len / 2; i++) { _raqm_bidi_run temp = run[i]; run[i] = run[len - 1 - i]; @@ -1002,6 +1015,7 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* output */ size_t *run_count) { + size_t i; FriBidiLevel level; FriBidiLevel last_level = -1; FriBidiLevel max_level = 0; @@ -1021,8 +1035,7 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* L1. Reset the embedding levels of some chars: 4. any sequence of white space characters at the end of the line. */ - for (int i = len - 1; - i >= 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (types[i]); i--) + for (i = len; i-- > 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (types[i]); ) { levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir); } @@ -1030,13 +1043,13 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* Find max_level of the line. We don't reuse the paragraph * max_level, both for a cleaner API, and that the line max_level * may be far less than paragraph max_level. */ - for (int i = len - 1; i >= 0; i--) + for (i = len; i-- > 0; ) { if (levels[i] > max_level) max_level = levels[i]; } - for (size_t i = 0; i < len; i++) + for (i = 0; i < len; i++) { if (levels[i] != last_level) count++; @@ -1064,14 +1077,16 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* L2. Reorder. */ for (level = max_level; level > 0; level--) { - for (int i = count - 1; i >= 0; i--) + for (i = count; i-- > 0; ) { if (runs[i].level >= level) { int end = i; - for (i--; (i >= 0 && runs[i].level >= level); i--) + for (; (i > 0 && runs[i - 1].level >= level); i--) ; - _raqm_reverse_run (runs + i + 1, end - i); + _raqm_reverse_run (runs + i, end - i + 1); + if (i-- == 0) + break; } } } @@ -1083,6 +1098,8 @@ _raqm_reorder_runs (const FriBidiCharType *types, static bool _raqm_itemize (raqm_t *rq) { + size_t i, j; + raqm_run_t *run; FriBidiParType par_type = FRIBIDI_PAR_ON; FriBidiCharType *types; #ifdef USE_FRIBIDI_EX_API @@ -1185,7 +1202,7 @@ _raqm_itemize (raqm_t *rq) RAQM_TEST ("Number of runs before script itemization: %zu\n\n", run_count); RAQM_TEST ("Fribidi Runs:\n"); - for (size_t i = 0; i < run_count; i++) + for (i = 0; i < run_count; i++) { RAQM_TEST ("run[%zu]:\t start: %zu\tlength: %zu\tlevel: %d\n", i, runs[i].pos, runs[i].len, runs[i].level); @@ -1194,7 +1211,7 @@ _raqm_itemize (raqm_t *rq) #endif last = NULL; - for (size_t i = 0; i < run_count; i++) + for (i = 0; i < run_count; i++) { raqm_run_t *run = calloc (1, sizeof (raqm_run_t)); if (!run) @@ -1216,7 +1233,7 @@ _raqm_itemize (raqm_t *rq) run->pos = runs[i].pos + runs[i].len - 1; run->script = rq->text_info[run->pos].script; run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); - for (int j = runs[i].len - 1; j >= 0; j--) + for (j = runs[i].len; j-- > 0; ) { _raqm_text_info info = rq->text_info[runs[i].pos + j]; if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) @@ -1247,7 +1264,7 @@ _raqm_itemize (raqm_t *rq) run->pos = runs[i].pos; run->script = rq->text_info[run->pos].script; run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); - for (size_t j = 0; j < runs[i].len; j++) + for (j = 0; j < runs[i].len; j++) { _raqm_text_info info = rq->text_info[runs[i].pos + j]; if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) @@ -1277,13 +1294,13 @@ _raqm_itemize (raqm_t *rq) #ifdef RAQM_TESTING run_count = 0; - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) run_count++; RAQM_TEST ("Number of runs after script itemization: %zu\n\n", run_count); run_count = 0; RAQM_TEST ("Final Runs:\n"); - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) { SCRIPT_TO_STRING (run->script); RAQM_TEST ("run[%zu]:\t start: %d\tlength: %d\tdirection: %s\tscript: %s\tfont: %s\n", @@ -1448,18 +1465,19 @@ _get_pair_index (const FriBidiChar ch) static bool _raqm_resolve_scripts (raqm_t *rq) { - int last_script_index = -1; - int last_set_index = -1; + size_t i, j; + size_t next_script_index = 0; + size_t next_set_index = 0; hb_script_t last_script = HB_SCRIPT_INVALID; _raqm_stack_t *stack = NULL; hb_unicode_funcs_t* unicode_funcs = hb_unicode_funcs_get_default (); - for (size_t i = 0; i < rq->text_len; ++i) + for (i = 0; i < rq->text_len; ++i) rq->text_info[i].script = hb_unicode_script (unicode_funcs, rq->text[i]); #ifdef RAQM_TESTING RAQM_TEST ("Before script detection:\n"); - for (size_t i = 0; i < rq->text_len; ++i) + for (i = 0; i < rq->text_len; ++i) { SCRIPT_TO_STRING (rq->text_info[i].script); RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); @@ -1471,9 +1489,9 @@ _raqm_resolve_scripts (raqm_t *rq) if (!stack) return false; - for (int i = 0; i < (int) rq->text_len; i++) + for (i = 0; i < rq->text_len; i++) { - if (rq->text_info[i].script == HB_SCRIPT_COMMON && last_script_index != -1) + if (rq->text_info[i].script == HB_SCRIPT_COMMON && next_script_index != 0) { int pair_index = _get_pair_index (rq->text[i]); if (pair_index >= 0) @@ -1482,7 +1500,7 @@ _raqm_resolve_scripts (raqm_t *rq) { /* is a paired character */ rq->text_info[i].script = last_script; - last_set_index = i; + next_set_index = i + 1; _raqm_stack_push (stack, rq->text_info[i].script, pair_index); } else @@ -1499,34 +1517,34 @@ _raqm_resolve_scripts (raqm_t *rq) { rq->text_info[i].script = _raqm_stack_top (stack); last_script = rq->text_info[i].script; - last_set_index = i; + next_set_index = i + 1; } else { rq->text_info[i].script = last_script; - last_set_index = i; + next_set_index = i + 1; } } } else { rq->text_info[i].script = last_script; - last_set_index = i; + next_set_index = i + 1; } } else if (rq->text_info[i].script == HB_SCRIPT_INHERITED && - last_script_index != -1) + next_script_index != 0) { rq->text_info[i].script = last_script; - last_set_index = i; + next_set_index = i + 1; } else { - for (int j = last_set_index + 1; j < i; ++j) + for (j = next_set_index; j < i; ++j) rq->text_info[j].script = rq->text_info[i].script; last_script = rq->text_info[i].script; - last_script_index = i; - last_set_index = i; + next_script_index = i + 1; + next_set_index = i + 1; } } @@ -1534,7 +1552,7 @@ _raqm_resolve_scripts (raqm_t *rq) * take the script if the next character. * https://github.com/HOST-Oman/libraqm/issues/95 */ - for (int i = rq->text_len - 2; i >= 0; --i) + for (i = rq->text_len - 1; i-- > 0; ) { if (rq->text_info[i].script == HB_SCRIPT_INHERITED || rq->text_info[i].script == HB_SCRIPT_COMMON) @@ -1543,7 +1561,7 @@ _raqm_resolve_scripts (raqm_t *rq) #ifdef RAQM_TESTING RAQM_TEST ("After script detection:\n"); - for (size_t i = 0; i < rq->text_len; ++i) + for (i = 0; i < rq->text_len; ++i) { SCRIPT_TO_STRING (rq->text_info[i].script); RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); @@ -1559,6 +1577,7 @@ _raqm_resolve_scripts (raqm_t *rq) static bool _raqm_shape (raqm_t *rq) { + raqm_run_t *run; hb_buffer_flags_t hb_buffer_flags = HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT; #if defined(HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) && \ @@ -1567,7 +1586,7 @@ _raqm_shape (raqm_t *rq) hb_buffer_flags |= HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES; #endif - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) { run->buffer = hb_buffer_create (); @@ -1653,6 +1672,8 @@ raqm_index_to_position (raqm_t *rq, int *x, int *y) { + size_t i, j; + raqm_run_t *run; /* We don't currently support multiline, so y is always 0 */ *y = 0; *x = 0; @@ -1676,7 +1697,7 @@ raqm_index_to_position (raqm_t *rq, ++*index; } - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -1685,7 +1706,7 @@ raqm_index_to_position (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (size_t i = 0; i < len; i++) + for (i = 0; i < len; i++) { uint32_t curr_cluster = info[i].cluster; uint32_t next_cluster = curr_cluster; @@ -1693,13 +1714,12 @@ raqm_index_to_position (raqm_t *rq, if (run->direction == HB_DIRECTION_LTR) { - for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) + for (j = i + 1; j < len && next_cluster == curr_cluster; j++) next_cluster = info[j].cluster; } else { - for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; - j--) + for (j = i; i != 0 && j-- > 0 && next_cluster == curr_cluster; ) next_cluster = info[j].cluster; } @@ -1745,6 +1765,8 @@ raqm_position_to_index (raqm_t *rq, int y, size_t *index) { + size_t i, j; + raqm_run_t *run; int delta_x = 0, current_x = 0; (void)y; @@ -1762,7 +1784,7 @@ raqm_position_to_index (raqm_t *rq, RAQM_TEST ("\n"); - for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) + for (run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -1771,7 +1793,7 @@ raqm_position_to_index (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (size_t i = 0; i < len; i++) + for (i = 0; i < len; i++) { delta_x = position[i].x_advance; if (x < (current_x + delta_x)) @@ -1789,11 +1811,10 @@ raqm_position_to_index (raqm_t *rq, uint32_t curr_cluster = info[i].cluster; uint32_t next_cluster = curr_cluster; if (run->direction == HB_DIRECTION_LTR) - for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) + for (j = i + 1; j < len && next_cluster == curr_cluster; j++) next_cluster = info[j].cluster; else - for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; - j--) + for (j = i; i != 0 && j-- > 0 && next_cluster == curr_cluster; ) next_cluster = info[j].cluster; if (next_cluster == curr_cluster) From b4a57d6fc5c96749430dd244fa4ce4f7104ab311 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 18:05:50 +0000 Subject: [PATCH 234/750] support FriBiDi<1.0 --- src/thirdparty/fribidi-shim/fribidi.c | 46 ++++++++++++++++++++------- src/thirdparty/fribidi-shim/fribidi.h | 6 ++-- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index f23741ecd..20364ea24 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -10,6 +10,20 @@ #include "fribidi.h" + +/* ..._ex adds bracket_types param, ignore and call legacy function */ +FriBidiLevel fribidi_get_par_embedding_levels_ex_compat( + const FriBidiCharType *bidi_types, + const FriBidiBracketType *bracket_types, + const FriBidiStrIndex len, + FriBidiParType *pbase_dir, + FriBidiLevel *embedding_levels) +{ + return fribidi_get_par_embedding_levels( + bidi_types, len, pbase_dir, embedding_levels); +} + + int load_fribidi(void) { int error = 0; @@ -17,11 +31,22 @@ int load_fribidi(void) { /* Microsoft needs a totally different system */ #ifndef _WIN32 - p_fribidi = dlopen("libfribidi.so.1", RTLD_LAZY); +#define LOAD_FUNCTION(func) \ + func = (t_##func)dlsym(p_fribidi, #func); \ + error = error || (func == 0); + + p_fribidi = dlopen("libfribidi.so", RTLD_LAZY); + if (!p_fribidi) { + p_fribidi = dlopen("libfribidi.so.0", RTLD_LAZY); + } if (!p_fribidi) { p_fribidi = dlopen("libfribidi.dylib", RTLD_LAZY); } #else +#define LOAD_FUNCTION(func) \ + func = (t_##func)GetProcAddress(p_fribidi, #func); \ + error = error || (func == 0); + p_fribidi = LoadLibrary("fribidi"); /* MSYS2 */ if (!p_fribidi) { @@ -33,20 +58,17 @@ int load_fribidi(void) { return 1; } -#ifndef _WIN32 -#define LOAD_FUNCTION(func) \ - func = (t_##func)dlsym(p_fribidi, #func); \ - error = error || (func == 0); -#else -#define LOAD_FUNCTION(func) \ - func = (t_##func)GetProcAddress(p_fribidi, #func); \ - error = error || (func == 0); -#endif + /* load ..._ex first to preserve error variable */ + LOAD_FUNCTION(fribidi_get_par_embedding_levels_ex); + if (error) { + /* using FriBiDi 0.x, emulate ..._ex function */ + fribidi_get_par_embedding_levels_ex = &fribidi_get_par_embedding_levels_ex_compat; + error = 0; + } LOAD_FUNCTION(fribidi_get_bidi_types); LOAD_FUNCTION(fribidi_get_bracket_types); - LOAD_FUNCTION(fribidi_get_par_embedding_levels_ex); -// LOAD_FUNCTION(fribidi_get_par_embedding_levels); + LOAD_FUNCTION(fribidi_get_par_embedding_levels); LOAD_FUNCTION(fribidi_unicode_to_charset); LOAD_FUNCTION(fribidi_charset_to_unicode); diff --git a/src/thirdparty/fribidi-shim/fribidi.h b/src/thirdparty/fribidi-shim/fribidi.h index aa446fbef..0f0cdac21 100644 --- a/src/thirdparty/fribidi-shim/fribidi.h +++ b/src/thirdparty/fribidi-shim/fribidi.h @@ -83,9 +83,9 @@ FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels_ex, const FriBidiCharType *, const FriBidiBracketType *, const FriBidiStrIndex, FriBidiParType *, FriBidiLevel *); -//FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels, -// const FriBidiCharType *, const FriBidiStrIndex, FriBidiParType *, -// FriBidiLevel *); +FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels, + const FriBidiCharType *, const FriBidiStrIndex, FriBidiParType *, + FriBidiLevel *); FRIBIDI_FUNC(FriBidiStrIndex, fribidi_unicode_to_charset, FriBidiCharSet, const FriBidiChar *, FriBidiStrIndex, char *); From 9c178435fba30f820a1dcd7845313609466c925a Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 19:10:37 +0000 Subject: [PATCH 235/750] raqm: fix FriBiDi<1 support --- src/_imagingft.c | 4 ++-- src/thirdparty/fribidi-shim/fribidi.c | 23 +++++++++++++------ src/thirdparty/fribidi-shim/fribidi.h | 32 ++++++++++++++------------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index b2cf76ce7..0995abab3 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -1397,10 +1397,10 @@ setup_module(PyObject *m) { PyDict_SetItemString(d, "raqm_version", v); #ifdef FRIBIDI_MAJOR_VERSION - a = strchr(fribidi_version_info, '1'); + a = strchr(fribidi_version_info, ')'); b = strchr(fribidi_version_info, '\n'); if (a && b) { - v = PyUnicode_FromStringAndSize(a, b - a); + v = PyUnicode_FromStringAndSize(a + 2, b - a - 2); } else { v = Py_None; } diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index 20364ea24..55e2a6ab3 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -11,7 +11,7 @@ #include "fribidi.h" -/* ..._ex adds bracket_types param, ignore and call legacy function */ +/* FriBiDi>=1.0.0 adds bracket_types param, ignore and call legacy function */ FriBidiLevel fribidi_get_par_embedding_levels_ex_compat( const FriBidiCharType *bidi_types, const FriBidiBracketType *bracket_types, @@ -23,6 +23,14 @@ FriBidiLevel fribidi_get_par_embedding_levels_ex_compat( bidi_types, len, pbase_dir, embedding_levels); } +/* FriBiDi>=1.0.0 gets bracket types here, ignore */ +void fribidi_get_bracket_types_compat( + const FriBidiChar *str, + const FriBidiStrIndex len, + const FriBidiCharType *types, + FriBidiBracketType *btypes) +{ /* no-op*/ } + int load_fribidi(void) { int error = 0; @@ -58,19 +66,20 @@ int load_fribidi(void) { return 1; } - /* load ..._ex first to preserve error variable */ + /* load FriBiDi>=1.0.0 functions first, use error to detect version */ LOAD_FUNCTION(fribidi_get_par_embedding_levels_ex); + LOAD_FUNCTION(fribidi_get_bracket_types); if (error) { - /* using FriBiDi 0.x, emulate ..._ex function */ - fribidi_get_par_embedding_levels_ex = &fribidi_get_par_embedding_levels_ex_compat; + /* using FriBiDi<1.0.0, ignore new parameters */ error = 0; + fribidi_get_par_embedding_levels_ex = &fribidi_get_par_embedding_levels_ex_compat; + fribidi_get_bracket_types = &fribidi_get_bracket_types_compat; } - LOAD_FUNCTION(fribidi_get_bidi_types); - LOAD_FUNCTION(fribidi_get_bracket_types); - LOAD_FUNCTION(fribidi_get_par_embedding_levels); LOAD_FUNCTION(fribidi_unicode_to_charset); LOAD_FUNCTION(fribidi_charset_to_unicode); + LOAD_FUNCTION(fribidi_get_bidi_types); + LOAD_FUNCTION(fribidi_get_par_embedding_levels); #ifndef _WIN32 fribidi_version_info = *(const char**)dlsym(p_fribidi, "fribidi_version_info"); diff --git a/src/thirdparty/fribidi-shim/fribidi.h b/src/thirdparty/fribidi-shim/fribidi.h index 0f0cdac21..7712a5b22 100644 --- a/src/thirdparty/fribidi-shim/fribidi.h +++ b/src/thirdparty/fribidi-shim/fribidi.h @@ -72,27 +72,29 @@ typedef uint32_t FriBidiParType; typedef ret (*t_##name) (__VA_ARGS__); \ FRIBIDI_ENTRY t_##name name; -FRIBIDI_FUNC(void, fribidi_get_bidi_types, - const FriBidiChar *, const FriBidiStrIndex, FriBidiCharType *); - -FRIBIDI_FUNC(void, fribidi_get_bracket_types, - const FriBidiChar *, const FriBidiStrIndex, const FriBidiCharType *, - FriBidiBracketType *); - -FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels_ex, - const FriBidiCharType *, const FriBidiBracketType *, const FriBidiStrIndex, - FriBidiParType *, FriBidiLevel *); - -FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels, - const FriBidiCharType *, const FriBidiStrIndex, FriBidiParType *, - FriBidiLevel *); - FRIBIDI_FUNC(FriBidiStrIndex, fribidi_unicode_to_charset, FriBidiCharSet, const FriBidiChar *, FriBidiStrIndex, char *); FRIBIDI_FUNC(FriBidiStrIndex, fribidi_charset_to_unicode, FriBidiCharSet, const char *, FriBidiStrIndex, FriBidiChar *); +FRIBIDI_FUNC(void, fribidi_get_bidi_types, + const FriBidiChar *, const FriBidiStrIndex, FriBidiCharType *); + +FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels, + const FriBidiCharType *, const FriBidiStrIndex, FriBidiParType *, + FriBidiLevel *); + +/* FriBiDi>=1.0.0 */ +FRIBIDI_FUNC(FriBidiLevel, fribidi_get_par_embedding_levels_ex, + const FriBidiCharType *, const FriBidiBracketType *, const FriBidiStrIndex, + FriBidiParType *, FriBidiLevel *); + +/* FriBiDi>=1.0.0 */ +FRIBIDI_FUNC(void, fribidi_get_bracket_types, + const FriBidiChar *, const FriBidiStrIndex, const FriBidiCharType *, + FriBidiBracketType *); + #undef FRIBIDI_FUNC /* constant, not a function */ From db0dad909e53ac2f25e4badab4d2aad464c49a68 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 25 Nov 2020 19:33:33 +0000 Subject: [PATCH 236/750] test --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index cb4ec2da8..031cf5e4e 100755 --- a/setup.py +++ b/setup.py @@ -29,6 +29,8 @@ def get_version(): NAME = "Pillow" PILLOW_VERSION = get_version() FREETYPE_ROOT = None +HARFBUZZ_ROOT = None +FRIBIDI_ROOT = None IMAGEQUANT_ROOT = None JPEG2K_ROOT = None JPEG_ROOT = None @@ -417,6 +419,8 @@ class pil_build_ext(build_ext): TIFF_ROOT=("libtiff-5", "libtiff-4"), ZLIB_ROOT="zlib", FREETYPE_ROOT="freetype2", + HARFBUZZ_ROOT="harfbuzz", + FRIBIDI_ROOT="fribidi", LCMS_ROOT="lcms2", IMAGEQUANT_ROOT="libimagequant", ).items(): From 8c02e3803b995fe0e0d8db2ea4a59c394130d611 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 2 Jan 2021 12:37:21 +0100 Subject: [PATCH 237/750] Revert "raqm: avoid declaring variables in for statement for C89 compatibility" This reverts commit b3cfe73854e74bc25a88f53b177713bfb63812e4. --- src/thirdparty/raqm/raqm.c | 127 ++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 74 deletions(-) diff --git a/src/thirdparty/raqm/raqm.c b/src/thirdparty/raqm/raqm.c index 96523ffb9..5a0b2078e 100644 --- a/src/thirdparty/raqm/raqm.c +++ b/src/thirdparty/raqm/raqm.c @@ -220,7 +220,6 @@ static bool _raqm_init_text_info (raqm_t *rq) { hb_language_t default_lang; - size_t i; if (rq->text_info) return true; @@ -230,7 +229,7 @@ _raqm_init_text_info (raqm_t *rq) return false; default_lang = hb_language_get_default (); - for (i = 0; i < rq->text_len; i++) + for (size_t i = 0; i < rq->text_len; i++) { rq->text_info[i].ftface = NULL; rq->text_info[i].lang = default_lang; @@ -243,12 +242,10 @@ _raqm_init_text_info (raqm_t *rq) static void _raqm_free_text_info (raqm_t *rq) { - size_t i; - if (!rq->text_info) return; - for (i = 0; i < rq->text_len; i++) + for (size_t i = 0; i < rq->text_len; i++) { if (rq->text_info[i].ftface) FT_Done_Face (rq->text_info[i].ftface); @@ -554,7 +551,6 @@ raqm_set_language (raqm_t *rq, size_t len) { hb_language_t language; - size_t i; size_t end = start + len; if (!rq) @@ -576,7 +572,7 @@ raqm_set_language (raqm_t *rq, return false; language = hb_language_from_string (lang, -1); - for (i = start; i < end; i++) + for (size_t i = start; i < end; i++) { rq->text_info[i].lang = language; } @@ -650,8 +646,6 @@ _raqm_set_freetype_face (raqm_t *rq, size_t start, size_t end) { - size_t i; - if (!rq) return false; @@ -664,7 +658,7 @@ _raqm_set_freetype_face (raqm_t *rq, if (!rq->text_info) return false; - for (i = start; i < end; i++) + for (size_t i = start; i < end; i++) { if (rq->text_info[i].ftface) FT_Done_Face (rq->text_info[i].ftface); @@ -838,8 +832,6 @@ _raqm_shape (raqm_t *rq); bool raqm_layout (raqm_t *rq) { - size_t i; - if (!rq) return false; @@ -849,7 +841,7 @@ raqm_layout (raqm_t *rq) if (!rq->text_info) return false; - for (i = 0; i < rq->text_len; i++) + for (size_t i = 0; i < rq->text_len; i++) { if (!rq->text_info[i].ftface) return false; @@ -887,9 +879,6 @@ raqm_glyph_t * raqm_get_glyphs (raqm_t *rq, size_t *length) { - size_t i; - raqm_run_t *run; - size_t count = 0; if (!rq || !rq->runs || !length) @@ -899,7 +888,7 @@ raqm_get_glyphs (raqm_t *rq, return NULL; } - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) count += hb_buffer_get_length (run->buffer); *length = count; @@ -917,7 +906,7 @@ raqm_get_glyphs (raqm_t *rq, RAQM_TEST ("Glyph information:\n"); count = 0; - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -927,7 +916,7 @@ raqm_get_glyphs (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (i = 0; i < len; i++) + for (size_t i = 0; i < len; i++) { rq->glyphs[count + i].index = info[i].codepoint; rq->glyphs[count + i].cluster = info[i].cluster; @@ -950,18 +939,18 @@ raqm_get_glyphs (raqm_t *rq, { #ifdef RAQM_TESTING RAQM_TEST ("\nUTF-32 clusters:"); - for (i = 0; i < count; i++) + for (size_t i = 0; i < count; i++) RAQM_TEST (" %02d", rq->glyphs[i].cluster); RAQM_TEST ("\n"); #endif - for (i = 0; i < count; i++) + for (size_t i = 0; i < count; i++) rq->glyphs[i].cluster = _raqm_u32_to_u8_index (rq, rq->glyphs[i].cluster); #ifdef RAQM_TESTING RAQM_TEST ("UTF-8 clusters: "); - for (i = 0; i < count; i++) + for (size_t i = 0; i < count; i++) RAQM_TEST (" %02d", rq->glyphs[i].cluster); RAQM_TEST ("\n"); #endif @@ -994,11 +983,9 @@ typedef struct { static void _raqm_reverse_run (_raqm_bidi_run *run, const size_t len) { - size_t i; - assert (run); - for (i = 0; i < len / 2; i++) + for (size_t i = 0; i < len / 2; i++) { _raqm_bidi_run temp = run[i]; run[i] = run[len - 1 - i]; @@ -1015,7 +1002,6 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* output */ size_t *run_count) { - size_t i; FriBidiLevel level; FriBidiLevel last_level = -1; FriBidiLevel max_level = 0; @@ -1035,7 +1021,8 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* L1. Reset the embedding levels of some chars: 4. any sequence of white space characters at the end of the line. */ - for (i = len; i-- > 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (types[i]); ) + for (int i = len - 1; + i >= 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (types[i]); i--) { levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir); } @@ -1043,13 +1030,13 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* Find max_level of the line. We don't reuse the paragraph * max_level, both for a cleaner API, and that the line max_level * may be far less than paragraph max_level. */ - for (i = len; i-- > 0; ) + for (int i = len - 1; i >= 0; i--) { if (levels[i] > max_level) max_level = levels[i]; } - for (i = 0; i < len; i++) + for (size_t i = 0; i < len; i++) { if (levels[i] != last_level) count++; @@ -1077,16 +1064,14 @@ _raqm_reorder_runs (const FriBidiCharType *types, /* L2. Reorder. */ for (level = max_level; level > 0; level--) { - for (i = count; i-- > 0; ) + for (int i = count - 1; i >= 0; i--) { if (runs[i].level >= level) { int end = i; - for (; (i > 0 && runs[i - 1].level >= level); i--) + for (i--; (i >= 0 && runs[i].level >= level); i--) ; - _raqm_reverse_run (runs + i, end - i + 1); - if (i-- == 0) - break; + _raqm_reverse_run (runs + i + 1, end - i); } } } @@ -1098,8 +1083,6 @@ _raqm_reorder_runs (const FriBidiCharType *types, static bool _raqm_itemize (raqm_t *rq) { - size_t i, j; - raqm_run_t *run; FriBidiParType par_type = FRIBIDI_PAR_ON; FriBidiCharType *types; #ifdef USE_FRIBIDI_EX_API @@ -1202,7 +1185,7 @@ _raqm_itemize (raqm_t *rq) RAQM_TEST ("Number of runs before script itemization: %zu\n\n", run_count); RAQM_TEST ("Fribidi Runs:\n"); - for (i = 0; i < run_count; i++) + for (size_t i = 0; i < run_count; i++) { RAQM_TEST ("run[%zu]:\t start: %zu\tlength: %zu\tlevel: %d\n", i, runs[i].pos, runs[i].len, runs[i].level); @@ -1211,7 +1194,7 @@ _raqm_itemize (raqm_t *rq) #endif last = NULL; - for (i = 0; i < run_count; i++) + for (size_t i = 0; i < run_count; i++) { raqm_run_t *run = calloc (1, sizeof (raqm_run_t)); if (!run) @@ -1233,7 +1216,7 @@ _raqm_itemize (raqm_t *rq) run->pos = runs[i].pos + runs[i].len - 1; run->script = rq->text_info[run->pos].script; run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); - for (j = runs[i].len; j-- > 0; ) + for (int j = runs[i].len - 1; j >= 0; j--) { _raqm_text_info info = rq->text_info[runs[i].pos + j]; if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) @@ -1264,7 +1247,7 @@ _raqm_itemize (raqm_t *rq) run->pos = runs[i].pos; run->script = rq->text_info[run->pos].script; run->font = _raqm_create_hb_font (rq, rq->text_info[run->pos].ftface); - for (j = 0; j < runs[i].len; j++) + for (size_t j = 0; j < runs[i].len; j++) { _raqm_text_info info = rq->text_info[runs[i].pos + j]; if (!_raqm_compare_text_info (rq->text_info[run->pos], info)) @@ -1294,13 +1277,13 @@ _raqm_itemize (raqm_t *rq) #ifdef RAQM_TESTING run_count = 0; - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) run_count++; RAQM_TEST ("Number of runs after script itemization: %zu\n\n", run_count); run_count = 0; RAQM_TEST ("Final Runs:\n"); - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) { SCRIPT_TO_STRING (run->script); RAQM_TEST ("run[%zu]:\t start: %d\tlength: %d\tdirection: %s\tscript: %s\tfont: %s\n", @@ -1465,19 +1448,18 @@ _get_pair_index (const FriBidiChar ch) static bool _raqm_resolve_scripts (raqm_t *rq) { - size_t i, j; - size_t next_script_index = 0; - size_t next_set_index = 0; + int last_script_index = -1; + int last_set_index = -1; hb_script_t last_script = HB_SCRIPT_INVALID; _raqm_stack_t *stack = NULL; hb_unicode_funcs_t* unicode_funcs = hb_unicode_funcs_get_default (); - for (i = 0; i < rq->text_len; ++i) + for (size_t i = 0; i < rq->text_len; ++i) rq->text_info[i].script = hb_unicode_script (unicode_funcs, rq->text[i]); #ifdef RAQM_TESTING RAQM_TEST ("Before script detection:\n"); - for (i = 0; i < rq->text_len; ++i) + for (size_t i = 0; i < rq->text_len; ++i) { SCRIPT_TO_STRING (rq->text_info[i].script); RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); @@ -1489,9 +1471,9 @@ _raqm_resolve_scripts (raqm_t *rq) if (!stack) return false; - for (i = 0; i < rq->text_len; i++) + for (int i = 0; i < (int) rq->text_len; i++) { - if (rq->text_info[i].script == HB_SCRIPT_COMMON && next_script_index != 0) + if (rq->text_info[i].script == HB_SCRIPT_COMMON && last_script_index != -1) { int pair_index = _get_pair_index (rq->text[i]); if (pair_index >= 0) @@ -1500,7 +1482,7 @@ _raqm_resolve_scripts (raqm_t *rq) { /* is a paired character */ rq->text_info[i].script = last_script; - next_set_index = i + 1; + last_set_index = i; _raqm_stack_push (stack, rq->text_info[i].script, pair_index); } else @@ -1517,34 +1499,34 @@ _raqm_resolve_scripts (raqm_t *rq) { rq->text_info[i].script = _raqm_stack_top (stack); last_script = rq->text_info[i].script; - next_set_index = i + 1; + last_set_index = i; } else { rq->text_info[i].script = last_script; - next_set_index = i + 1; + last_set_index = i; } } } else { rq->text_info[i].script = last_script; - next_set_index = i + 1; + last_set_index = i; } } else if (rq->text_info[i].script == HB_SCRIPT_INHERITED && - next_script_index != 0) + last_script_index != -1) { rq->text_info[i].script = last_script; - next_set_index = i + 1; + last_set_index = i; } else { - for (j = next_set_index; j < i; ++j) + for (int j = last_set_index + 1; j < i; ++j) rq->text_info[j].script = rq->text_info[i].script; last_script = rq->text_info[i].script; - next_script_index = i + 1; - next_set_index = i + 1; + last_script_index = i; + last_set_index = i; } } @@ -1552,7 +1534,7 @@ _raqm_resolve_scripts (raqm_t *rq) * take the script if the next character. * https://github.com/HOST-Oman/libraqm/issues/95 */ - for (i = rq->text_len - 1; i-- > 0; ) + for (int i = rq->text_len - 2; i >= 0; --i) { if (rq->text_info[i].script == HB_SCRIPT_INHERITED || rq->text_info[i].script == HB_SCRIPT_COMMON) @@ -1561,7 +1543,7 @@ _raqm_resolve_scripts (raqm_t *rq) #ifdef RAQM_TESTING RAQM_TEST ("After script detection:\n"); - for (i = 0; i < rq->text_len; ++i) + for (size_t i = 0; i < rq->text_len; ++i) { SCRIPT_TO_STRING (rq->text_info[i].script); RAQM_TEST ("script for ch[%zu]\t%s\n", i, buff); @@ -1577,7 +1559,6 @@ _raqm_resolve_scripts (raqm_t *rq) static bool _raqm_shape (raqm_t *rq) { - raqm_run_t *run; hb_buffer_flags_t hb_buffer_flags = HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT; #if defined(HAVE_DECL_HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) && \ @@ -1586,7 +1567,7 @@ _raqm_shape (raqm_t *rq) hb_buffer_flags |= HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES; #endif - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) { run->buffer = hb_buffer_create (); @@ -1672,8 +1653,6 @@ raqm_index_to_position (raqm_t *rq, int *x, int *y) { - size_t i, j; - raqm_run_t *run; /* We don't currently support multiline, so y is always 0 */ *y = 0; *x = 0; @@ -1697,7 +1676,7 @@ raqm_index_to_position (raqm_t *rq, ++*index; } - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -1706,7 +1685,7 @@ raqm_index_to_position (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (i = 0; i < len; i++) + for (size_t i = 0; i < len; i++) { uint32_t curr_cluster = info[i].cluster; uint32_t next_cluster = curr_cluster; @@ -1714,12 +1693,13 @@ raqm_index_to_position (raqm_t *rq, if (run->direction == HB_DIRECTION_LTR) { - for (j = i + 1; j < len && next_cluster == curr_cluster; j++) + for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) next_cluster = info[j].cluster; } else { - for (j = i; i != 0 && j-- > 0 && next_cluster == curr_cluster; ) + for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; + j--) next_cluster = info[j].cluster; } @@ -1765,8 +1745,6 @@ raqm_position_to_index (raqm_t *rq, int y, size_t *index) { - size_t i, j; - raqm_run_t *run; int delta_x = 0, current_x = 0; (void)y; @@ -1784,7 +1762,7 @@ raqm_position_to_index (raqm_t *rq, RAQM_TEST ("\n"); - for (run = rq->runs; run != NULL; run = run->next) + for (raqm_run_t *run = rq->runs; run != NULL; run = run->next) { size_t len; hb_glyph_info_t *info; @@ -1793,7 +1771,7 @@ raqm_position_to_index (raqm_t *rq, info = hb_buffer_get_glyph_infos (run->buffer, NULL); position = hb_buffer_get_glyph_positions (run->buffer, NULL); - for (i = 0; i < len; i++) + for (size_t i = 0; i < len; i++) { delta_x = position[i].x_advance; if (x < (current_x + delta_x)) @@ -1811,10 +1789,11 @@ raqm_position_to_index (raqm_t *rq, uint32_t curr_cluster = info[i].cluster; uint32_t next_cluster = curr_cluster; if (run->direction == HB_DIRECTION_LTR) - for (j = i + 1; j < len && next_cluster == curr_cluster; j++) + for (size_t j = i + 1; j < len && next_cluster == curr_cluster; j++) next_cluster = info[j].cluster; else - for (j = i; i != 0 && j-- > 0 && next_cluster == curr_cluster; ) + for (int j = i - 1; i != 0 && j >= 0 && next_cluster == curr_cluster; + j--) next_cluster = info[j].cluster; if (next_cluster == curr_cluster) From 43bde01623d6db01435b8a821160ac48d9b722b0 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 2 Jan 2021 12:47:08 +0100 Subject: [PATCH 238/750] disable Raqm/FriBiDi vendoring by default, except in Windows tests --- setup.py | 22 +++++++++++----------- winbuild/build_prepare.py | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/setup.py b/setup.py index 031cf5e4e..65fc7c47f 100755 --- a/setup.py +++ b/setup.py @@ -125,7 +125,7 @@ _LIB_IMAGING = ( "codec_fd", ) -DEBUG = True +DEBUG = False class DependencyException(Exception): @@ -292,7 +292,7 @@ class pil_build_ext(build_ext): ] required = {"jpeg", "zlib"} - system = set() + vendor = set() def __init__(self): for f in self.features: @@ -305,7 +305,7 @@ class pil_build_ext(build_ext): return getattr(self, feat) is None def want_system(self, feat): - return feat in self.system + return feat not in self.vendor def __iter__(self): yield from self.features @@ -317,7 +317,7 @@ class pil_build_ext(build_ext): + [(f"disable-{x}", None, f"Disable support for {x}") for x in feature] + [(f"enable-{x}", None, f"Enable support for {x}") for x in feature] + [ - (f"system-{x}", None, f"Use system version of {x}") + (f"_vendor-{x}", None, f"Use vendored version of {x}") for x in ("raqm", "fribidi") ] + [ @@ -335,7 +335,7 @@ class pil_build_ext(build_ext): setattr(self, f"disable_{x}", None) setattr(self, f"enable_{x}", None) for x in ("raqm", "fribidi"): - setattr(self, f"system_{x}", None) + setattr(self, f"_vendor_{x}", None) def finalize_options(self): build_ext.finalize_options(self) @@ -374,17 +374,17 @@ class pil_build_ext(build_ext): _dbg("--enable-raqm implies --enable-freetype") self.feature.required.add("freetype") for x in ("raqm", "fribidi"): - if getattr(self, f"system_{x}"): + if getattr(self, f"_vendor_{x}"): if getattr(self, "disable_raqm"): raise ValueError( - f"Conflicting options: --system-{x} and --disable-raqm" + f"Conflicting options: --_vendor-{x} and --disable-raqm" ) - if x == "fribidi" and getattr(self, "system_raqm"): + if x == "fribidi" and not getattr(self, "_vendor_raqm"): raise ValueError( - f"Conflicting options: --system-{x} and --system-raqm" + f"Conflicting options: --_vendor-{x} and not --_vendor-raqm" ) - _dbg("Using system version of %s", x) - self.feature.system.add(x) + _dbg("Using vendored version of %s", x) + self.feature.vendor.add(x) def _update_extension(self, name, libraries, define_macros=None, sources=None): for extension in self.extensions: diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index fd63f4f1e..100f07e90 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -472,7 +472,7 @@ def build_pillow(): cmd_set("DISTUTILS_USE_SDK", "1"), # use same compiler to build Pillow cmd_set("MSSdk", "1"), # for PyPy3.6 cmd_set("py_vcruntime_redist", "true"), # use /MD, not /MT - r'"{python_dir}\{python_exe}" setup.py build_ext %*', + r'"{python_dir}\{python_exe}" setup.py build_ext --_vendor-raqm --_vendor-fribidi %*', ] write_script("build_pillow.cmd", lines) From 0488a2761ac3ccc6cc65f910a8254b0e0677b0c9 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 2 Jan 2021 12:51:45 +0100 Subject: [PATCH 239/750] can't use underscore prefix for distutils options --- setup.py | 12 ++++++------ winbuild/build_prepare.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 65fc7c47f..fbf869ffb 100755 --- a/setup.py +++ b/setup.py @@ -317,7 +317,7 @@ class pil_build_ext(build_ext): + [(f"disable-{x}", None, f"Disable support for {x}") for x in feature] + [(f"enable-{x}", None, f"Enable support for {x}") for x in feature] + [ - (f"_vendor-{x}", None, f"Use vendored version of {x}") + (f"vendor-{x}", None, f"Use vendored version of {x}") for x in ("raqm", "fribidi") ] + [ @@ -335,7 +335,7 @@ class pil_build_ext(build_ext): setattr(self, f"disable_{x}", None) setattr(self, f"enable_{x}", None) for x in ("raqm", "fribidi"): - setattr(self, f"_vendor_{x}", None) + setattr(self, f"vendor_{x}", None) def finalize_options(self): build_ext.finalize_options(self) @@ -374,14 +374,14 @@ class pil_build_ext(build_ext): _dbg("--enable-raqm implies --enable-freetype") self.feature.required.add("freetype") for x in ("raqm", "fribidi"): - if getattr(self, f"_vendor_{x}"): + if getattr(self, f"vendor_{x}"): if getattr(self, "disable_raqm"): raise ValueError( - f"Conflicting options: --_vendor-{x} and --disable-raqm" + f"Conflicting options: --vendor-{x} and --disable-raqm" ) - if x == "fribidi" and not getattr(self, "_vendor_raqm"): + if x == "fribidi" and not getattr(self, "vendor_raqm"): raise ValueError( - f"Conflicting options: --_vendor-{x} and not --_vendor-raqm" + f"Conflicting options: --vendor-{x} and not --vendor-raqm" ) _dbg("Using vendored version of %s", x) self.feature.vendor.add(x) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 100f07e90..dc372f36b 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -472,7 +472,7 @@ def build_pillow(): cmd_set("DISTUTILS_USE_SDK", "1"), # use same compiler to build Pillow cmd_set("MSSdk", "1"), # for PyPy3.6 cmd_set("py_vcruntime_redist", "true"), # use /MD, not /MT - r'"{python_dir}\{python_exe}" setup.py build_ext --_vendor-raqm --_vendor-fribidi %*', + r'"{python_dir}\{python_exe}" setup.py build_ext --vendor-raqm --vendor-fribidi %*', ] write_script("build_pillow.cmd", lines) From aae94110d76acedf7d4fb12bb45cc77df06027e2 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 2 Jan 2021 13:08:38 +0100 Subject: [PATCH 240/750] lint --- winbuild/build_prepare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index dc372f36b..3b1a15eac 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -472,7 +472,7 @@ def build_pillow(): cmd_set("DISTUTILS_USE_SDK", "1"), # use same compiler to build Pillow cmd_set("MSSdk", "1"), # for PyPy3.6 cmd_set("py_vcruntime_redist", "true"), # use /MD, not /MT - r'"{python_dir}\{python_exe}" setup.py build_ext --vendor-raqm --vendor-fribidi %*', + r'"{python_dir}\{python_exe}" setup.py build_ext --vendor-raqm --vendor-fribidi %*', # noqa: E501 ] write_script("build_pillow.cmd", lines) From a9f31ffee36913df0e1e6fa8af2c4f3e46555e39 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 6 Jan 2021 10:59:03 +0100 Subject: [PATCH 241/750] use python3 in .ci/test.sh --- .ci/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/test.sh b/.ci/test.sh index 5a19ec9b4..0f681fe30 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -2,4 +2,4 @@ set -e -python -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests +python3 -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests From 2e5d7dd38715d08a6da721c1f28c3e50be6442ed Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 6 Jan 2021 22:42:31 +1100 Subject: [PATCH 242/750] Use python3 --- .github/workflows/lint.yml | 6 +++--- .github/workflows/test-docker.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3c658293e..bddeb6150 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -34,12 +34,12 @@ jobs: python-version: 3.8 - name: Build system information - run: python .github/workflows/system-info.py + run: python3 .github/workflows/system-info.py - name: Install dependencies run: | - python -m pip install -U pip - python -m pip install -U tox + python3 -m pip install -U pip + python3 -m pip install -U tox - name: Lint run: tox -e lint diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index eb173c359..2ecc27460 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -41,7 +41,7 @@ jobs: - uses: actions/checkout@v2 - name: Build system information - run: python .github/workflows/system-info.py + run: python3 .github/workflows/system-info.py - name: Set up QEMU if: "matrix.qemu-arch" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d127916ea..4064a0589 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -58,7 +58,7 @@ jobs: ${{ matrix.os }}-${{ matrix.python-version }}- - name: Build system information - run: python .github/workflows/system-info.py + run: python3 .github/workflows/system-info.py - name: Install Linux dependencies if: startsWith(matrix.os, 'ubuntu') From ffbaa6523d7b567e0be07aeb0e5c9620a375ac24 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 7 Jan 2021 12:51:34 +0100 Subject: [PATCH 243/750] Internal support for oss-fuzz testing --- Tests/oss-fuzz/fuzz_pillow.py | 45 +++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Tests/oss-fuzz/fuzz_pillow.py diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py new file mode 100644 index 000000000..585f53486 --- /dev/null +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -0,0 +1,45 @@ +#!/usr/bin/python3 + +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import atheris_no_libfuzzer as atheris +import sys +import os +import io +import warnings +from PIL import Image, ImageFile, ImageFilter + +def TestOneInput(data): + try: + with Image.open(io.BytesIO(data)) as im: + im.rotate(45) + im.filter(ImageFilter.DETAIL) + im.save(io.BytesIO(), "BMP") + except Exception: + # We're catching all exceptions because Pillow's exceptions are + # directly inheriting from Exception. + return + return + +def main(): + ImageFile.LOAD_TRUNCATED_IMAGES = True + warnings.filterwarnings("ignore") + warnings.simplefilter('error', Image.DecompressionBombWarning) + atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) + atheris.Fuzz() + +if __name__ == "__main__": + main() + diff --git a/setup.py b/setup.py index cbc2641c5..41e8a4630 100755 --- a/setup.py +++ b/setup.py @@ -840,7 +840,7 @@ class pil_build_ext(build_ext): def debug_build(): - return hasattr(sys, "gettotalrefcount") + return hasattr(sys, "gettotalrefcount") or os.environ.get("LIB_FUZZING_ENGINE", None) files = ["src/_imaging.c"] From 37a7c601cc8ec34439d026d07fa19a6049b53bf7 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 7 Jan 2021 13:07:28 +0100 Subject: [PATCH 244/750] uglify --- Tests/oss-fuzz/fuzz_pillow.py | 20 ++++++++++++-------- setup.py | 4 +++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py index 585f53486..b2b2ba65a 100644 --- a/Tests/oss-fuzz/fuzz_pillow.py +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -14,32 +14,36 @@ # See the License for the specific language governing permissions and # limitations under the License. -import atheris_no_libfuzzer as atheris -import sys -import os import io +import os +import sys import warnings + +import atheris_no_libfuzzer as atheris + from PIL import Image, ImageFile, ImageFilter + def TestOneInput(data): try: with Image.open(io.BytesIO(data)) as im: - im.rotate(45) - im.filter(ImageFilter.DETAIL) - im.save(io.BytesIO(), "BMP") + im.rotate(45) + im.filter(ImageFilter.DETAIL) + im.save(io.BytesIO(), "BMP") except Exception: # We're catching all exceptions because Pillow's exceptions are # directly inheriting from Exception. return return + def main(): ImageFile.LOAD_TRUNCATED_IMAGES = True warnings.filterwarnings("ignore") - warnings.simplefilter('error', Image.DecompressionBombWarning) + warnings.simplefilter("error", Image.DecompressionBombWarning) atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) atheris.Fuzz() + if __name__ == "__main__": main() - diff --git a/setup.py b/setup.py index 41e8a4630..dd1772ae0 100755 --- a/setup.py +++ b/setup.py @@ -840,7 +840,9 @@ class pil_build_ext(build_ext): def debug_build(): - return hasattr(sys, "gettotalrefcount") or os.environ.get("LIB_FUZZING_ENGINE", None) + return hasattr(sys, "gettotalrefcount") or os.environ.get( + "LIB_FUZZING_ENGINE", None + ) files = ["src/_imaging.c"] From eaeaa181dd0b414d85597d15c28a87197db837b3 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 7 Jan 2021 23:18:24 +1100 Subject: [PATCH 245/750] Removed unused import --- Tests/oss-fuzz/fuzz_pillow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py index b2b2ba65a..894068f63 100644 --- a/Tests/oss-fuzz/fuzz_pillow.py +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -15,7 +15,6 @@ # limitations under the License. import io -import os import sys import warnings From 497f9e27642f6ce421ed3f7cf7038cfa12ef4af2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Jan 2021 00:06:18 +1100 Subject: [PATCH 246/750] Fixed unexpected indentation [ci skip] --- docs/reference/ImageColor.rst | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index 9730bd28f..457f166b4 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -16,16 +16,20 @@ Color Names The ImageColor module supports the following string formats: -* Hexadecimal color specifiers, given as ``#rgb``, ``#rgba``, ``#rrggbb`` or ``#rrggbbaa``, - with the following placeholders: - - ``r``: red - - ``g``: green - - ``b``: blue - - ``a``: alpha / opacity (can be used in combination with ``mode="RGBA"`` in :py:mod:`~PIL.ImageDraw`) - +* Hexadecimal color specifiers, given as ``#rgb``, ``#rgba``, ``#rrggbb`` or + ``#rrggbbaa``, with the following placeholders: + + - ``r`` red + - ``g`` green + - ``b`` blue + - ``a`` alpha / opacity (can be used in combination with ``mode="RGBA"`` in + :py:mod:`~PIL.ImageDraw`) + Examples: - - ``#ff0000`` specifies pure red. - - ``#ff0000aa`` specifies pure red with an opacity of 66.66% (aa = 170, opacity = 170/255). + + - ``#ff0000`` specifies pure red. + - ``#ff0000aa`` specifies pure red with an opacity of 66.66% (aa = 170, opacity = + 170/255). * RGB functions, given as ``rgb(red, green, blue)`` where the color values are From 59ed81f8387b1491890aa20482e2f1776ecf9970 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 28 Dec 2020 13:48:46 +0100 Subject: [PATCH 247/750] Add pytest configuration for patching around an unknown valgrind mark --- Tests/conftest.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Tests/conftest.py b/Tests/conftest.py index 082f2f7c3..1b2fffdc5 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -10,3 +10,18 @@ def pytest_report_header(config): return out.getvalue() except Exception as e: return f"pytest_report_header failed: {e}" + +def pytest_configure(config): + # We're marking some tests to ignore valgrind errors and XFAIL them. + # Ensure that the mark is defined even in cases where pytest-valgrind isn't installed + + import pytest + import warnings + + with warnings.catch_warnings(): + warnings.simplefilter("error") + try: + getattr(pytest.mark, "valgrind_known_error") + except: + config.addinivalue_line("markers", + "valgrind_known_error: Tests that have known issues with valgrind") From bd384873243b095cfd057c7ec1a2d617923d152d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 28 Dec 2020 13:49:12 +0100 Subject: [PATCH 248/750] Ignore this test in valgrind -- the metadata values don't make logical sense. --- Tests/test_file_libtiff.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 7d3e10c24..473671ce1 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -185,6 +185,7 @@ class TestFileLibTiff(LibTiffTestCase): for field in requested_fields: assert field in reloaded, f"{field} not in metadata" + @pytest.mark.valgrind_known_error(reason="Known Invalid Metadata") def test_additional_metadata(self, tmp_path): # these should not crash. Seriously dummy data, most of it doesn't make # any sense, so we're running up against limits where we're asking From d35995f945398d9c7cdefcae24d7fea889916116 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Dec 2020 14:41:22 +1100 Subject: [PATCH 249/750] Lint fixes --- Tests/conftest.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index 1b2fffdc5..7da77aa9f 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -11,17 +11,22 @@ def pytest_report_header(config): except Exception as e: return f"pytest_report_header failed: {e}" + def pytest_configure(config): # We're marking some tests to ignore valgrind errors and XFAIL them. - # Ensure that the mark is defined even in cases where pytest-valgrind isn't installed + # Ensure that the mark is defined + # even in cases where pytest-valgrind isn't installed + + import warnings import pytest - import warnings with warnings.catch_warnings(): warnings.simplefilter("error") try: getattr(pytest.mark, "valgrind_known_error") except: - config.addinivalue_line("markers", - "valgrind_known_error: Tests that have known issues with valgrind") + config.addinivalue_line( + "markers", + "valgrind_known_error: Tests that have known issues with valgrind", + ) From 59ee809f135b45a7cfa08303260dcf009ddb13c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 31 Dec 2020 09:38:40 +1100 Subject: [PATCH 250/750] Updated capitalisation Co-authored-by: Hugo van Kemenade --- Tests/test_file_libtiff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 473671ce1..9d4956034 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -185,7 +185,7 @@ class TestFileLibTiff(LibTiffTestCase): for field in requested_fields: assert field in reloaded, f"{field} not in metadata" - @pytest.mark.valgrind_known_error(reason="Known Invalid Metadata") + @pytest.mark.valgrind_known_error(reason="Known invalid metadata") def test_additional_metadata(self, tmp_path): # these should not crash. Seriously dummy data, most of it doesn't make # any sense, so we're running up against limits where we're asking From a58ff327d41307f8810b42311e8560fc3fc08495 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 Dec 2020 09:46:16 +1100 Subject: [PATCH 251/750] Moved imports to top of file --- Tests/conftest.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index 7da77aa9f..e0f3ded1d 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -1,4 +1,7 @@ import io +import warnings + +import pytest def pytest_report_header(config): @@ -17,10 +20,6 @@ def pytest_configure(config): # Ensure that the mark is defined # even in cases where pytest-valgrind isn't installed - import warnings - - import pytest - with warnings.catch_warnings(): warnings.simplefilter("error") try: From 1d7c8e03d076188524b2d686c9afca6f2c1cc3bc Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 7 Jan 2021 14:50:25 +0100 Subject: [PATCH 252/750] known failing tests from valgrind -- uninitialized values --- Tests/test_file_eps.py | 2 +- Tests/test_file_jpeg.py | 6 ++++++ Tests/test_file_libtiff.py | 5 +++++ Tests/test_file_pdf.py | 2 +- Tests/test_file_png.py | 1 + Tests/test_file_webp_metadata.py | 8 ++++---- Tests/test_image.py | 1 + Tests/test_image_resample.py | 2 ++ Tests/test_image_thumbnail.py | 2 +- 9 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index f585a0669..1d76f5917 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -58,7 +58,7 @@ def test_invalid_file(): with pytest.raises(SyntaxError): EpsImagePlugin.EpsImageFile(invalid_file) - +@pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available") def test_cmyk(): with Image.open("Tests/images/pil_sample_cmyk.eps") as cmyk_image: diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index ff469d15c..435ecbaa7 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -114,6 +114,7 @@ class TestFileJpeg: assert test(100, 200) == (100, 200) assert test(0) is None # square pixels + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_icc(self, tmp_path): # Test ICC support with Image.open("Tests/images/rgb.jpg") as im1: @@ -153,6 +154,7 @@ class TestFileJpeg: test(ImageFile.MAXBLOCK + 1) # full buffer block plus one byte test(ImageFile.MAXBLOCK * 4 + 3) # large block + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_large_icc_meta(self, tmp_path): # https://github.com/python-pillow/Pillow/issues/148 # Sometimes the meta data on the icc_profile block is bigger than @@ -419,6 +421,7 @@ class TestFileJpeg: with Image.open(filename): pass + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_truncated_jpeg_should_read_all_the_data(self): filename = "Tests/images/truncated_jpeg.jpg" ImageFile.LOAD_TRUNCATED_IMAGES = True @@ -437,6 +440,7 @@ class TestFileJpeg: with pytest.raises(OSError): im.load() + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_qtables(self, tmp_path): def _n_qtables_helper(n, test_file): with Image.open(test_file) as im: @@ -720,6 +724,7 @@ class TestFileJpeg: # OSError for unidentified image. assert im.info.get("dpi") == (72, 72) + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_exif_x_resolution(self, tmp_path): with Image.open("Tests/images/flower.jpg") as im: exif = im.getexif() @@ -750,6 +755,7 @@ class TestFileJpeg: # Act / Assert assert im._getexif()[306] == "2017:03:13 23:03:09" + @pytest.mark.valgrind_known_error(reason="Backtrace in Python Core") def test_photoshop(self): with Image.open("Tests/images/photoshop-200dpi.jpg") as im: assert im.info["photoshop"][0x03ED] == { diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 9d4956034..accc9596f 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -815,12 +815,14 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) + @pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) + @pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" @@ -832,12 +834,14 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) + @pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/flower2.jpg") + @pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" @@ -865,6 +869,7 @@ class TestFileLibTiff(LibTiffTestCase): assert_image_similar(base_im, im, 0.7) + @pytest.mark.valgrind_known_error(reason="Backtrace in Python Core") def test_sampleformat_not_corrupted(self): # Assert that a TIFF image with SampleFormat=UINT tag is not corrupted # when saving to a new file. diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 3e23beae7..536b93166 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -84,7 +84,7 @@ def test_unsupported_mode(tmp_path): with pytest.raises(ValueError): im.save(outfile) - +@pytest.mark.valgrind_known_error(reason="Known Failing") def test_save_all(tmp_path): # Single frame image helper_save_as_pdf(tmp_path, "RGB", save_all=True) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 9028aaf23..4cd4515ae 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -654,6 +654,7 @@ class TestFilePng: exif = reloaded._getexif() assert exif[274] == 1 + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_exif_from_jpg(self, tmp_path): with Image.open("Tests/images/pil_sample_rgb.jpg") as im: test_file = str(tmp_path / "temp.png") diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index a2a05f96b..290dc0362 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -1,5 +1,5 @@ from io import BytesIO - +import pytest from PIL import Image from .helper import skip_unless_feature @@ -38,7 +38,7 @@ def test_read_exif_metadata_without_prefix(): exif = im.getexif() assert exif[305] == "Adobe Photoshop CS6 (Macintosh)" - +@pytest.mark.valgrind_known_error(reason="Known Failing") def test_write_exif_metadata(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() @@ -70,7 +70,7 @@ def test_read_icc_profile(): assert icc == expected_icc - +@pytest.mark.valgrind_known_error(reason="Known Failing") def test_write_icc_metadata(): file_path = "Tests/images/flower2.jpg" test_buffer = BytesIO() @@ -87,7 +87,7 @@ def test_write_icc_metadata(): if webp_icc_profile: assert webp_icc_profile == expected_icc_profile, "Webp ICC didn't match" - +@pytest.mark.valgrind_known_error(reason="Known Failing") def test_read_no_exif(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() diff --git a/Tests/test_image.py b/Tests/test_image.py index f2a1917e8..ade9d03c9 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -652,6 +652,7 @@ class TestImage: assert not fp.closed + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_exif_jpeg(self, tmp_path): with Image.open("Tests/images/exif-72dpi-int.jpg") as im: # Little endian exif = im.getexif() diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index ef4ca4101..69449198e 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -455,6 +455,7 @@ class TestCoreResampleBox: tiled.paste(tile, (x0, y0)) return tiled + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_tiles(self): with Image.open("Tests/images/flower.jpg") as im: assert im.size == (480, 360) @@ -465,6 +466,7 @@ class TestCoreResampleBox: tiled = self.resize_tiled(im, dst_size, *tiles) assert_image_similar(reference, tiled, 0.01) + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_subsample(self): # This test shows advantages of the subpixel resizing # after supersampling (e.g. during JPEG decoding). diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py index c42310c32..d6d03577d 100644 --- a/Tests/test_image_thumbnail.py +++ b/Tests/test_image_thumbnail.py @@ -87,7 +87,7 @@ def test_no_resize(): im.thumbnail((64, 64)) assert im.size == (64, 64) - +@pytest.mark.valgrind_known_error(reason="Known Failing") def test_DCT_scaling_edges(): # Make an image with red borders and size (N * 8) + 1 to cross DCT grid im = Image.new("RGB", (257, 257), "red") From a6fa139f62a1e59dddfe3c742af4f372ab73e374 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 7 Jan 2021 14:57:49 +0100 Subject: [PATCH 253/750] useless reptile --- Tests/test_file_eps.py | 1 + Tests/test_file_pdf.py | 1 + Tests/test_file_webp_metadata.py | 5 +++++ Tests/test_image_thumbnail.py | 1 + 4 files changed, 8 insertions(+) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 1d76f5917..1e56498ba 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -58,6 +58,7 @@ def test_invalid_file(): with pytest.raises(SyntaxError): EpsImagePlugin.EpsImageFile(invalid_file) + @pytest.mark.valgrind_known_error(reason="Known Failing") @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available") def test_cmyk(): diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 536b93166..e5bba483a 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -84,6 +84,7 @@ def test_unsupported_mode(tmp_path): with pytest.raises(ValueError): im.save(outfile) + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_save_all(tmp_path): # Single frame image diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index 290dc0362..cb133e2c5 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -1,5 +1,7 @@ from io import BytesIO + import pytest + from PIL import Image from .helper import skip_unless_feature @@ -38,6 +40,7 @@ def test_read_exif_metadata_without_prefix(): exif = im.getexif() assert exif[305] == "Adobe Photoshop CS6 (Macintosh)" + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_write_exif_metadata(): file_path = "Tests/images/flower.jpg" @@ -70,6 +73,7 @@ def test_read_icc_profile(): assert icc == expected_icc + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_write_icc_metadata(): file_path = "Tests/images/flower2.jpg" @@ -87,6 +91,7 @@ def test_write_icc_metadata(): if webp_icc_profile: assert webp_icc_profile == expected_icc_profile, "Webp ICC didn't match" + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_read_no_exif(): file_path = "Tests/images/flower.jpg" diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py index d6d03577d..6911ce460 100644 --- a/Tests/test_image_thumbnail.py +++ b/Tests/test_image_thumbnail.py @@ -87,6 +87,7 @@ def test_no_resize(): im.thumbnail((64, 64)) assert im.size == (64, 64) + @pytest.mark.valgrind_known_error(reason="Known Failing") def test_DCT_scaling_edges(): # Make an image with red borders and size (N * 8) + 1 to cross DCT grid From 1d0149c369c077635b76c7b535854ce3b7151208 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 7 Jan 2021 15:26:23 +0100 Subject: [PATCH 254/750] feck8 --- Tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index e0f3ded1d..6f9945204 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -24,7 +24,7 @@ def pytest_configure(config): warnings.simplefilter("error") try: getattr(pytest.mark, "valgrind_known_error") - except: + except Exception: config.addinivalue_line( "markers", "valgrind_known_error: Tests that have known issues with valgrind", From 2bbb82a0191ea4a47661ca2463d7fcbfd6c72215 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 12:13:00 +1100 Subject: [PATCH 255/750] Added import test --- .ci/test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/test.sh b/.ci/test.sh index 0f681fe30..9d2c123da 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -2,4 +2,6 @@ set -e +python3 -c "from PIL import Image" + python3 -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests From cf190a3c2f166cf0a7dd004fee4b242ea29bf1f4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 11:33:26 +1100 Subject: [PATCH 256/750] PyModule_AddObject fix for Python 3.10 --- src/_imaging.c | 21 +++++++++++++++------ src/_webp.c | 14 ++++++++++---- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index a8741f6ad..01dd22486 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -4134,8 +4134,9 @@ setup_module(PyObject *m) { } #endif + PyObject *have_libjpegturbo; #ifdef LIBJPEG_TURBO_VERSION - PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_True); + have_libjpegturbo = Py_True; #define tostr1(a) #a #define tostr(a) tostr1(a) PyDict_SetItemString( @@ -4143,19 +4144,24 @@ setup_module(PyObject *m) { #undef tostr #undef tostr1 #else - PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_False); + have_libjpegturbo = Py_False; #endif + Py_INCREF(have_libjpegturbo); + PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", have_libjpegturbo); + PyObject *have_libimagequant; #ifdef HAVE_LIBIMAGEQUANT - PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_True); + have_libimagequant = Py_True; { extern const char *ImagingImageQuantVersion(void); PyDict_SetItemString( d, "imagequant_version", PyUnicode_FromString(ImagingImageQuantVersion())); } #else - PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_False); + have_libimagequant = Py_False; #endif + Py_INCREF(have_libimagequant); + PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", have_libimagequant); #ifdef HAVE_LIBZ /* zip encoding strategies */ @@ -4189,11 +4195,14 @@ setup_module(PyObject *m) { } #endif + PyObject *have_xcb; #ifdef HAVE_XCB - PyModule_AddObject(m, "HAVE_XCB", Py_True); + have_xcb = Py_True; #else - PyModule_AddObject(m, "HAVE_XCB", Py_False); + have_xcb = Py_False; #endif + Py_INCREF(have_xcb); + PyModule_AddObject(m, "HAVE_XCB", have_xcb); PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(version)); diff --git a/src/_webp.c b/src/_webp.c index c7875fa36..4d51d99df 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -920,20 +920,26 @@ static PyMethodDef webpMethods[] = { void addMuxFlagToModule(PyObject *m) { + PyObject *have_webpmux; #ifdef HAVE_WEBPMUX - PyModule_AddObject(m, "HAVE_WEBPMUX", Py_True); + have_webpmux = Py_True; #else - PyModule_AddObject(m, "HAVE_WEBPMUX", Py_False); + have_webpmux = Py_False; #endif + Py_INCREF(have_webpmux); + PyModule_AddObject(m, "HAVE_WEBPMUX", have_webpmux); } void addAnimFlagToModule(PyObject *m) { + PyObject *have_webpanim; #ifdef HAVE_WEBPANIM - PyModule_AddObject(m, "HAVE_WEBPANIM", Py_True); + have_webpanim = Py_True; #else - PyModule_AddObject(m, "HAVE_WEBPANIM", Py_False); + have_webpanim = Py_False; #endif + Py_INCREF(have_webpanim); + PyModule_AddObject(m, "HAVE_WEBPANIM", have_webpanim); } void From cda2a2479e05f9d4f750315eb2c19e2011048de6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 21:00:56 +1100 Subject: [PATCH 257/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index b358c18c4..9693e2f4a 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -465,9 +465,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 11.0 Big Sur | 3.8, 3.9 | 8.0.1 |arm | +| macOS 11.0 Big Sur | 3.8, 3.9 | 8.1.0 |arm | | +------------------------------+--------------------------------+-----------------------+ -| | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | +| | 3.6, 3.7, 3.8, 3.9 | 8.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | | +------------------------------+--------------------------------+ + From a6fc7a5320e534c8037b7bb3f5fcee15dfe23a88 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 21:14:02 +1100 Subject: [PATCH 258/750] Changed example image file name [ci skip] --- docs/reference/Image.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 8d63c173b..f0a368479 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -22,7 +22,7 @@ Windows). .. code-block:: python from PIL import Image - im = Image.open("bride.jpg") + im = Image.open("hopper.jpg") im.rotate(45).show() Create thumbnails From 4eccadced48fa1399ee2e3a2afcebbf8b57e5d5f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 21:30:16 +1100 Subject: [PATCH 259/750] Document that getcolors() returns colors in the image mode [ci skip] --- src/PIL/Image.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index e2540a2b2..db1c70239 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1243,6 +1243,10 @@ class Image: """ Returns a list of colors used in this image. + The colors will be in the image's mode. For example, an RGB image will + return a tuple of (red, green, blue) color values, and a P image will + return the index of the color in the palette. + :param maxcolors: Maximum number of colors. If this number is exceeded, this method returns None. The default limit is 256 colors. From f9c283468d99dd3a3337315a9b6b4a4ece165c67 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jan 2021 23:04:32 +1100 Subject: [PATCH 260/750] Added import test --- .appveyor.yml | 1 + .github/workflows/test-windows.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index a77033ec1..4fa0abbbf 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -45,6 +45,7 @@ test_script: - cd c:\pillow - '%PYTHON%\%EXECUTABLE% -m pip install pytest pytest-cov' - c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\%EXECUTABLE% +- '%PYTHON%\%EXECUTABLE% -c "from PIL import Image"' - '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests' #- '%PYTHON%\%EXECUTABLE% test-installed.py -v -s %TEST_OPTIONS%' TODO TEST_OPTIONS with pytest? diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index db1675135..12c288374 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -273,6 +273,7 @@ jobs: - name: Test Pillow run: | python3 selftest.py --installed + python3 -c "from PIL import Image" python3 -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests - name: Upload coverage From 3775d3639827f1c41271bdfa8d5537331854bd66 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 9 Jan 2021 16:41:13 +0100 Subject: [PATCH 261/750] Do fuzzing linking in setup.py options, rather than post-hoc manually linking --- setup.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index dd1772ae0..17b08a427 100755 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ JPEG_ROOT = None LCMS_ROOT = None TIFF_ROOT = None ZLIB_ROOT = None - +FUZZING_BUILD = 'LIB_FUZZING_ENGINE' in os.environ if sys.platform == "win32" and sys.version_info >= (3, 10): import atexit @@ -346,6 +346,9 @@ class pil_build_ext(build_ext): extension.define_macros += define_macros if include_dirs is not None: extension.include_dirs += include_dirs + if FUZZING_BUILD: + extension.language = "c++" + extension.extra_link_args = ["--stdlib=libc++"] break def _remove_extension(self, name): @@ -840,9 +843,7 @@ class pil_build_ext(build_ext): def debug_build(): - return hasattr(sys, "gettotalrefcount") or os.environ.get( - "LIB_FUZZING_ENGINE", None - ) + return hasattr(sys, "gettotalrefcount") or FUZZING_BUILD files = ["src/_imaging.c"] From 77bf0aa67365edbdc74d300b2aa306b28aa86b22 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 9 Jan 2021 17:00:27 +0100 Subject: [PATCH 262/750] lint off --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 17b08a427..10992779e 100755 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ JPEG_ROOT = None LCMS_ROOT = None TIFF_ROOT = None ZLIB_ROOT = None -FUZZING_BUILD = 'LIB_FUZZING_ENGINE' in os.environ +FUZZING_BUILD = "LIB_FUZZING_ENGINE" in os.environ if sys.platform == "win32" and sys.version_info >= (3, 10): import atexit From eb2a0622a35e48e3f18a96589d9f13f2a01a742e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 Jan 2021 08:26:45 +1100 Subject: [PATCH 263/750] Removed broken link --- selftest.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/selftest.py b/selftest.py index a9a02ef71..7e08d183b 100755 --- a/selftest.py +++ b/selftest.py @@ -147,9 +147,7 @@ def testimage(): ('F', (128, 128)) PIL can do many other things, but I'll leave that for another - day. If you're curious, check the handbook, available from: - - http://www.pythonware.com + day. Cheers /F """ From bdbf1694fc00838fb9e9606b75cb65fb2d129d25 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 Jan 2021 21:31:25 +1100 Subject: [PATCH 264/750] Allow PixelAccess to use Python __int__ when parsing x and y --- Tests/test_image_access.py | 12 ++++++++++++ src/_imaging.c | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index e86dc8530..5fa0e2cbf 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -23,6 +23,11 @@ else: except ImportError: cffi = None +try: + import numpy +except ImportError: + numpy = None + class AccessTest: # initial value @@ -109,6 +114,13 @@ class TestImagePutPixel(AccessTest): assert_image_equal(im1, im2) + @pytest.mark.skipif(numpy is None, reason="NumPy not installed") + def test_numpy(self): + im = hopper() + pix = im.load() + + assert pix[numpy.int32(1), numpy.int32(2)] == (18, 20, 59) + class TestImageGetPixel(AccessTest): @staticmethod diff --git a/src/_imaging.c b/src/_imaging.c index 01dd22486..3072dcb21 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -1109,7 +1109,12 @@ _getxy(PyObject *xy, int *x, int *y) { } else if (PyFloat_Check(value)) { *x = (int)PyFloat_AS_DOUBLE(value); } else { - goto badval; + PyObject *int_value = PyObject_CallMethod(value, "__int__", NULL); + if (int_value != NULL && PyLong_Check(int_value)) { + *x = PyLong_AS_LONG(int_value); + } else { + goto badval; + } } value = PyTuple_GET_ITEM(xy, 1); @@ -1118,7 +1123,12 @@ _getxy(PyObject *xy, int *x, int *y) { } else if (PyFloat_Check(value)) { *y = (int)PyFloat_AS_DOUBLE(value); } else { - goto badval; + PyObject *int_value = PyObject_CallMethod(value, "__int__", NULL); + if (int_value != NULL && PyLong_Check(int_value)) { + *y = PyLong_AS_LONG(int_value); + } else { + goto badval; + } } return 0; From 7b4b356fc087068fee3316e569b3d3e7ada731f0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 14 Jan 2021 22:09:11 +1100 Subject: [PATCH 265/750] Test for incorrect PixelAccess arguments --- Tests/test_image_access.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 5fa0e2cbf..78d04946e 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -71,6 +71,10 @@ class TestImagePutPixel(AccessTest): pix1 = im1.load() pix2 = im2.load() + for x, y in ((0, "0"), ("0", 0)): + with pytest.raises(TypeError): + pix1[x, y] + for y in range(im1.size[1]): for x in range(im1.size[0]): pix2[x, y] = pix1[x, y] From 6f236284b077fbeec709c2a6ce0d00cbba3b1372 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 20 Jan 2021 20:43:00 +1100 Subject: [PATCH 266/750] Corrected CVE number --- src/PIL/PcxImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index a24d44b42..3874e5436 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -111,7 +111,7 @@ class PcxImageFile(ImageFile.ImageFile): self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] # don't trust the passed in stride. Calculate for ourselves. - # CVE-2020-35655 + # CVE-2020-35653 stride = (self._size[0] * bits + 7) // 8 stride += stride % 2 From ac31061f221d4dab40ae36d61f1b09e76c20d484 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 21 Jan 2021 19:29:11 +1100 Subject: [PATCH 267/750] Handle PCX images with an odd stride --- Tests/images/odd_stride.pcx | Bin 0 -> 14313 bytes Tests/test_file_pcx.py | 8 ++++++++ src/PIL/PcxImagePlugin.py | 13 +++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Tests/images/odd_stride.pcx diff --git a/Tests/images/odd_stride.pcx b/Tests/images/odd_stride.pcx new file mode 100644 index 0000000000000000000000000000000000000000..ee0c2eecaebe5a629ccfab523971c347a878ae79 GIT binary patch literal 14313 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 670c03b95..61e33a57b 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -44,6 +44,14 @@ def test_odd(tmp_path): _roundtrip(tmp_path, hopper(mode).resize((511, 511))) +def test_odd_read(): + # Reading an image with an odd stride, making it malformed + with Image.open("Tests/images/odd_stride.pcx") as im: + im.load() + + assert im.size == (371, 150) + + def test_pil184(): # Check reading of files where xmin/xmax is not zero. diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 3874e5436..d2e166bdd 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -66,13 +66,13 @@ class PcxImageFile(ImageFile.ImageFile): version = s[1] bits = s[3] planes = s[65] - ignored_stride = i16(s, 66) + provided_stride = i16(s, 66) logger.debug( "PCX version %s, bits %s, planes %s, stride %s", version, bits, planes, - ignored_stride, + provided_stride, ) self.info["dpi"] = i16(s, 12), i16(s, 14) @@ -110,10 +110,15 @@ class PcxImageFile(ImageFile.ImageFile): self.mode = mode self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - # don't trust the passed in stride. Calculate for ourselves. + # Don't trust the passed in stride. + # Calculate the approximate position for ourselves. # CVE-2020-35653 stride = (self._size[0] * bits + 7) // 8 - stride += stride % 2 + + # While the specification states that this must be even, + # not all images follow this + if provided_stride != stride: + stride += stride % 2 bbox = (0, 0) + self.size logger.debug("size: %sx%s", *self.size) From b39977e1c2fca2aef8c28d31522136a11a9be59e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 21 Jan 2021 21:33:35 +1100 Subject: [PATCH 268/750] Document license for several fonts --- .../DejaVuSans-24-1-stripped.ttf | Bin .../DejaVuSans-24-2-stripped.ttf | Bin .../DejaVuSans-24-4-stripped.ttf | Bin .../DejaVuSans-24-8-stripped.ttf | Bin Tests/fonts/{ => DejaVuSans}/DejaVuSans.ttf | Bin Tests/fonts/DejaVuSans/LICENSE.txt | 40 ++++++++++++++++++ Tests/fonts/LICENSE.txt | 3 +- Tests/test_imagefont.py | 12 +++--- Tests/test_imagefontctl.py | 2 +- 9 files changed, 50 insertions(+), 7 deletions(-) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-1-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-2-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-4-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans-24-8-stripped.ttf (100%) rename Tests/fonts/{ => DejaVuSans}/DejaVuSans.ttf (100%) create mode 100644 Tests/fonts/DejaVuSans/LICENSE.txt diff --git a/Tests/fonts/DejaVuSans-24-1-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-1-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-1-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-1-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-2-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-2-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-2-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-2-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-4-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-4-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-4-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-4-stripped.ttf diff --git a/Tests/fonts/DejaVuSans-24-8-stripped.ttf b/Tests/fonts/DejaVuSans/DejaVuSans-24-8-stripped.ttf similarity index 100% rename from Tests/fonts/DejaVuSans-24-8-stripped.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans-24-8-stripped.ttf diff --git a/Tests/fonts/DejaVuSans.ttf b/Tests/fonts/DejaVuSans/DejaVuSans.ttf similarity index 100% rename from Tests/fonts/DejaVuSans.ttf rename to Tests/fonts/DejaVuSans/DejaVuSans.ttf diff --git a/Tests/fonts/DejaVuSans/LICENSE.txt b/Tests/fonts/DejaVuSans/LICENSE.txt new file mode 100644 index 000000000..30516578f --- /dev/null +++ b/Tests/fonts/DejaVuSans/LICENSE.txt @@ -0,0 +1,40 @@ +DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. + +DejaVu Fonts — License +Fonts are © Bitstream (see below). DejaVu changes are in public domain. Explanation of copyright is on Gnome page on Bitstream Vera fonts. Glyphs imported from Arev fonts are © Tavmjung Bah (see below) + +Bitstream Vera Fonts Copyright +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. + +Arev Fonts Copyright +Original text + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. \ No newline at end of file diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index 06eaa9a4e..88a28de59 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -15,8 +15,9 @@ FreeMono.ttf is licensed under GPLv3, with the GPL font exception. OpenSansCondensed-LightItalic.tt, from https://fonts.google.com/specimen/Open+Sans, under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) -DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. +KhmerOSBattambang-Regular.ttf is licensed under LGPL-2.1 or later. +FreeMono.ttf is licensed under GPLv3. 10x20-ISO8859-1.pcf, from https://packages.ubuntu.com/xenial/xfonts-base diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0c219fed1..2a2349e3b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -52,7 +52,7 @@ class TestImageFont: ttf_copy = ttf.font_variant(size=FONT_SIZE + 1) assert ttf_copy.size == FONT_SIZE + 1 - second_font_path = "Tests/fonts/DejaVuSans.ttf" + second_font_path = "Tests/fonts/DejaVuSans/DejaVuSans.ttf" ttf_copy = ttf.font_variant(font=second_font_path) assert ttf_copy.path == second_font_path @@ -156,8 +156,8 @@ class TestImageFont: ("text", "L", "FreeMono.ttf", 15, 36, 36), ("text", "1", "FreeMono.ttf", 15, 36, 36), # issue 4177 - ("rrr", "L", "DejaVuSans.ttf", 18, 21, 22.21875), - ("rrr", "1", "DejaVuSans.ttf", 18, 24, 22.21875), + ("rrr", "L", "DejaVuSans/DejaVuSans.ttf", 18, 21, 22.21875), + ("rrr", "1", "DejaVuSans/DejaVuSans.ttf", 18, 24, 22.21875), # test 'l' not including extra margin # using exact value 2047 / 64 for raqm, checked with debugger ("ill", "L", "OpenSansCondensed-LightItalic.ttf", 63, 33, 31.984375), @@ -855,7 +855,7 @@ class TestImageFont: layout_name = ["basic", "raqm"][self.LAYOUT_ENGINE] target = f"Tests/images/bitmap_font_{bpp}_{layout_name}.png" font = ImageFont.truetype( - f"Tests/fonts/DejaVuSans-24-{bpp}-stripped.ttf", + f"Tests/fonts/DejaVuSans/DejaVuSans-24-{bpp}-stripped.ttf", 24, layout_engine=self.LAYOUT_ENGINE, ) @@ -963,7 +963,9 @@ def test_render_mono_size(): im = Image.new("P", (100, 30), "white") draw = ImageDraw.Draw(im) ttf = ImageFont.truetype( - "Tests/fonts/DejaVuSans.ttf", 18, layout_engine=ImageFont.LAYOUT_BASIC + "Tests/fonts/DejaVuSans/DejaVuSans.ttf", + 18, + layout_engine=ImageFont.LAYOUT_BASIC, ) draw.text((10, 10), "r" * 10, "black", ttf) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 82e2b4ebc..a80aca2fb 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -10,7 +10,7 @@ from .helper import ( ) FONT_SIZE = 20 -FONT_PATH = "Tests/fonts/DejaVuSans.ttf" +FONT_PATH = "Tests/fonts/DejaVuSans/DejaVuSans.ttf" pytestmark = skip_unless_feature("raqm") From baaa298e00dd4b2ab39c264c8c8b15cd011b8b32 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 21 Jan 2021 23:32:07 +1100 Subject: [PATCH 269/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6296c09c7..7e6244d59 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,18 @@ Changelog (Pillow) ================== +8.2.0 (unreleased) +------------------ + +- Support for ignoring tests when running valgrind #5150 + [wiredfool, radarhere, hugovk] + +- PyModule_AddObject fix for Python 3.10 #5194 + [radarhere] + +- OSS-Fuzz support #5189 + [wiredfool, radarhere] + 8.1.0 (2020-01-02) ------------------ From e6ff82b9abc05945bac182bcf73fb71b377435f9 Mon Sep 17 00:00:00 2001 From: Mark Laagland Date: Sun, 24 Jan 2021 22:43:31 +0100 Subject: [PATCH 270/750] Small fix for convert documentation of Image.py [ci skip] --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index db1c70239..2adb8e536 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -878,7 +878,7 @@ class Image: The default method of converting a greyscale ("L") or "RGB" image into a bilevel (mode "1") image uses Floyd-Steinberg dither to approximate the original image luminosity levels. If - dither is :data:`NONE`, all values larger than 128 are set to 255 (white), + dither is :data:`NONE`, all values larger than 127 are set to 255 (white), all other values to 0 (black). To use other thresholds, use the :py:meth:`~PIL.Image.Image.point` method. From cf98f178ad2bb55261a8ea41003ada97e520d306 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 26 Jan 2021 08:01:26 +1100 Subject: [PATCH 271/750] Added tk version --- src/PIL/_tkinter_finder.py | 3 +++ src/PIL/features.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PIL/_tkinter_finder.py b/src/PIL/_tkinter_finder.py index 7018a1b79..746359535 100644 --- a/src/PIL/_tkinter_finder.py +++ b/src/PIL/_tkinter_finder.py @@ -1,9 +1,12 @@ """ Find compiled module linking to Tcl / Tk libraries """ import sys +import tkinter from tkinter import _tkinter as tk if hasattr(sys, "pypy_find_executable"): TKINTER_LIB = tk.tklib_cffi.__file__ else: TKINTER_LIB = tk.__file__ + +tk_version = str(tkinter.TkVersion) diff --git a/src/PIL/features.py b/src/PIL/features.py index da0ca557c..ad0047287 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -9,7 +9,7 @@ from . import Image modules = { "pil": ("PIL._imaging", "PILLOW_VERSION"), - "tkinter": ("PIL._tkinter_finder", None), + "tkinter": ("PIL._tkinter_finder", "tk_version"), "freetype2": ("PIL._imagingft", "freetype2_version"), "littlecms2": ("PIL._imagingcms", "littlecms_version"), "webp": ("PIL._webp", "webpdecoder_version"), From aa742fd8a446868e2720c91a5bf634f238beded5 Mon Sep 17 00:00:00 2001 From: nulano Date: Mon, 25 Jan 2021 22:13:33 +0100 Subject: [PATCH 272/750] Document availability of tk version number. [ci skip] --- docs/reference/features.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/features.rst b/docs/reference/features.rst index dd218fa0e..0a6381098 100644 --- a/docs/reference/features.rst +++ b/docs/reference/features.rst @@ -17,7 +17,7 @@ Modules Support for the following modules can be checked: * ``pil``: The Pillow core module, required for all functionality. -* ``tkinter``: Tkinter support. Version number not available. +* ``tkinter``: Tkinter support. * ``freetype2``: FreeType font support via :py:func:`PIL.ImageFont.truetype`. * ``littlecms2``: LittleCMS 2 support via :py:mod:`PIL.ImageCms`. * ``webp``: WebP image support. From c9740ab7e3e812796fe7228e3f1ff17672e6f9ae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 26 Jan 2021 18:14:28 +1100 Subject: [PATCH 273/750] Deprecate Tk/Tcl 8.4, to be removed in Pillow 10 (2023-01-02) --- docs/deprecations.rst | 8 ++++++++ docs/releasenotes/8.2.0.rst | 40 +++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + src/PIL/_tkinter_finder.py | 8 ++++++++ 4 files changed, 57 insertions(+) create mode 100644 docs/releasenotes/8.2.0.rst diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 44aa2a795..fd2f5620e 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -25,6 +25,14 @@ vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). .. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ +Tk/Tcl 8.4 +~~~~~~~~~~ + +.. deprecated:: 8.2.0 + +Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +when Tk/Tcl 8.5 will be the minimum supported. + Image.show command parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst new file mode 100644 index 000000000..8ddbc7f54 --- /dev/null +++ b/docs/releasenotes/8.2.0.rst @@ -0,0 +1,40 @@ +8.2.0 +----- + +Deprecations +============ + +Tk/Tcl 8.4 +^^^^^^^^^^ + +Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +when Tk/Tcl 8.5 will be the minimum supported. + +API Changes +=========== + +TODO +^^^^ + +TODO + +API Additions +============= + +TODO +^^^^ + +TODO + +Security +======== + +TODO + +Other Changes +============= + +TODO +^^^^ + +TODO diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index cd73de814..0930768e7 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -14,6 +14,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 8.2.0 8.1.0 8.0.1 8.0.0 diff --git a/src/PIL/_tkinter_finder.py b/src/PIL/_tkinter_finder.py index 746359535..58aeffbfb 100644 --- a/src/PIL/_tkinter_finder.py +++ b/src/PIL/_tkinter_finder.py @@ -2,6 +2,7 @@ """ import sys import tkinter +import warnings from tkinter import _tkinter as tk if hasattr(sys, "pypy_find_executable"): @@ -10,3 +11,10 @@ else: TKINTER_LIB = tk.__file__ tk_version = str(tkinter.TkVersion) +if tk_version == "8.4": + warnings.warn( + "Support for Tk/Tcl 8.4 is deprecated and will be removed" + " in Pillow 10 (2023-01-02). Please upgrade to Tk/Tcl 8.5 " + "or newer.", + DeprecationWarning, + ) From d79c656fe75c5de2916b9889a726c33b11dab020 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 27 Jan 2021 17:58:02 +1100 Subject: [PATCH 274/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7e6244d59..81d27a39f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Added tk version to pilinfo #5226 + [radarhere, nulano] + - Support for ignoring tests when running valgrind #5150 [wiredfool, radarhere, hugovk] From 62628b96382fe4615f3dba4a488383fa615394f5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 Jan 2021 23:01:26 +1100 Subject: [PATCH 275/750] Install pytest and pytest-cov using pip rather than pacman --- .github/workflows/test-windows.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 12c288374..f3bb85f32 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -249,8 +249,6 @@ jobs: ${{ matrix.package }}-python3-olefile \ ${{ matrix.package }}-python3-pip \ ${{ matrix.package }}-python3-pyqt5 \ - ${{ matrix.package }}-python3-pytest \ - ${{ matrix.package }}-python3-pytest-cov \ ${{ matrix.package }}-python3-setuptools \ ${{ matrix.package }}-freetype \ ${{ matrix.package }}-ghostscript \ @@ -263,7 +261,7 @@ jobs: ${{ matrix.package }}-openjpeg2 \ subversion - python3 -m pip install pyroma + python3 -m pip install pyroma pytest pytest-cov pushd depends && ./install_extra_test_images.sh && popd From 54cc834445e25dde13873da4588d1bd73b9011a5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 Jan 2021 22:48:58 +1100 Subject: [PATCH 276/750] Removed specific setuptools version --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 4fa0abbbf..4e2ca1071 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -32,7 +32,7 @@ install: c:\pillow\winbuild\build\build_dep_all.cmd $host.SetShouldExit(0) - path C:\pillow\winbuild\build\bin;%PATH% -- '%PYTHON%\%EXECUTABLE% -m pip install -U "setuptools>=49.3.2"' +- '%PYTHON%\%EXECUTABLE% -m pip install -U setuptools' build_script: - ps: | From b57e4fa8d2a213fca46429a73922500475b1dc5a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 Jan 2021 21:55:26 +1100 Subject: [PATCH 277/750] Corrected syntax [ci skip] --- docs/releasenotes/versioning.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/versioning.rst b/docs/releasenotes/versioning.rst index 1653bff3c..a8c9fc998 100644 --- a/docs/releasenotes/versioning.rst +++ b/docs/releasenotes/versioning.rst @@ -3,7 +3,7 @@ Versioning ========== -Pillow follows [Semantic Versioning](https://semver.org/): +Pillow follows `Semantic Versioning `_: Given a version number MAJOR.MINOR.PATCH, increment the: From eb7e5d2797bca180977706e3c56b8445a34c94b5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 Jan 2021 20:57:24 +1100 Subject: [PATCH 278/750] Moved test that requires libtiff --- Tests/test_file_libtiff.py | 9 +++++++++ Tests/test_file_tiff.py | 10 +--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index accc9596f..5fe10bea9 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -9,6 +9,7 @@ from ctypes import c_float import pytest from PIL import Image, ImageFilter, TiffImagePlugin, TiffTags, features +from PIL.TiffImagePlugin import SUBIFD from .helper import ( assert_image_equal, @@ -324,6 +325,14 @@ class TestFileLibTiff(LibTiffTestCase): ) TiffImagePlugin.WRITE_LIBTIFF = False + def test_subifd(self, tmp_path): + outfile = str(tmp_path / "temp.tif") + with Image.open("Tests/images/g4_orientation_6.tif") as im: + im.tag_v2[SUBIFD] = 10000 + + # Should not segfault + im.save(outfile) + def test_xmlpacket_tag(self, tmp_path): TiffImagePlugin.WRITE_LIBTIFF = True diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bb1bbda3e..f644ef887 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -4,7 +4,7 @@ from io import BytesIO import pytest from PIL import Image, TiffImagePlugin -from PIL.TiffImagePlugin import RESOLUTION_UNIT, SUBIFD, X_RESOLUTION, Y_RESOLUTION +from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION from .helper import ( assert_image_equal, @@ -161,14 +161,6 @@ class TestFileTiff: reloaded.load() assert (round(dpi), round(dpi)) == reloaded.info["dpi"] - def test_subifd(self, tmp_path): - outfile = str(tmp_path / "temp.tif") - with Image.open("Tests/images/g4_orientation_6.tif") as im: - im.tag_v2[SUBIFD] = 10000 - - # Should not segfault - im.save(outfile) - def test_save_setting_missing_resolution(self): b = BytesIO() Image.open("Tests/images/10ct_32bit_128.tiff").save( From c43440cfd01935a025b82cb4d205f13e2e4794d7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 28 Jan 2021 08:02:42 +1100 Subject: [PATCH 279/750] Updated libimagequant to 2.14.0 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index ed438f904..e204ea9ad 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.13.1 +archive=libimagequant-2.14.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 9693e2f4a..d92a6eb8b 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -177,7 +177,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.13.1** + * Pillow has been tested with libimagequant **2.6-2.14** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From f2f92d22d180ddcecab5bf9c0a4c0151c04d0980 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 25 Jan 2021 21:10:49 +1100 Subject: [PATCH 280/750] Do not use "use built-in mapper WIN32 only" --- src/PIL/ImageFile.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index f2a55cb54..f58de95bd 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -192,24 +192,14 @@ class ImageFile(Image.Image): and args[0] in Image._MAPMODES ): try: - if hasattr(Image.core, "map"): - # use built-in mapper WIN32 only - self.map = Image.core.map(self.filename) - self.map.seek(offset) - self.im = self.map.readimage( - self.mode, self.size, args[1], args[2] - ) - else: - # use mmap, if possible - import mmap + # use mmap, if possible + import mmap - with open(self.filename) as fp: - self.map = mmap.mmap( - fp.fileno(), 0, access=mmap.ACCESS_READ - ) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, offset, args - ) + with open(self.filename) as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) readonly = 1 # After trashing self.im, # we might need to reload the palette data. From 685e95118250e764ff50e6ed29d5ed96fc873b4a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 25 Jan 2021 21:13:07 +1100 Subject: [PATCH 281/750] Removed unused C code --- src/_imaging.c | 5 - src/map.c | 260 ------------------------------------------------- 2 files changed, 265 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 01dd22486..a5b12d325 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3973,8 +3973,6 @@ PyPath_Create(ImagingObject *self, PyObject *args); extern PyObject * PyOutline_Create(ImagingObject *self, PyObject *args); -extern PyObject * -PyImaging_Mapper(PyObject *self, PyObject *args); extern PyObject * PyImaging_MapBuffer(PyObject *self, PyObject *args); @@ -4030,9 +4028,6 @@ static PyMethodDef functions[] = { /* Memory mapping */ #ifdef WITH_MAPPING -#ifdef _WIN32 - {"map", (PyCFunction)PyImaging_Mapper, 1}, -#endif {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, #endif diff --git a/src/map.c b/src/map.c index 2636a684b..c298bd148 100644 --- a/src/map.c +++ b/src/map.c @@ -28,269 +28,9 @@ PyImaging_CheckBuffer(PyObject *buffer); extern int PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view); -/* -------------------------------------------------------------------- */ -/* Standard mapper */ - -typedef struct { - PyObject_HEAD char *base; - int size; - int offset; -#ifdef _WIN32 - HANDLE hFile; - HANDLE hMap; -#endif -} ImagingMapperObject; - -static PyTypeObject ImagingMapperType; - -ImagingMapperObject * -PyImaging_MapperNew(const char *filename, int readonly) { - ImagingMapperObject *mapper; - - if (PyType_Ready(&ImagingMapperType) < 0) { - return NULL; - } - - mapper = PyObject_New(ImagingMapperObject, &ImagingMapperType); - if (mapper == NULL) { - return NULL; - } - - mapper->base = NULL; - mapper->size = mapper->offset = 0; - -#ifdef _WIN32 - mapper->hFile = (HANDLE)-1; - mapper->hMap = (HANDLE)-1; - - /* FIXME: currently supports readonly mappings only */ - mapper->hFile = CreateFile( - filename, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (mapper->hFile == (HANDLE)-1) { - PyErr_SetString(PyExc_OSError, "cannot open file"); - Py_DECREF(mapper); - return NULL; - } - - mapper->hMap = CreateFileMapping(mapper->hFile, NULL, PAGE_READONLY, 0, 0, NULL); - if (mapper->hMap == (HANDLE)-1) { - CloseHandle(mapper->hFile); - PyErr_SetString(PyExc_OSError, "cannot map file"); - Py_DECREF(mapper); - return NULL; - } - - mapper->base = (char *)MapViewOfFile(mapper->hMap, FILE_MAP_READ, 0, 0, 0); - - mapper->size = GetFileSize(mapper->hFile, 0); -#endif - - return mapper; -} - -static void -mapping_dealloc(ImagingMapperObject *mapper) { -#ifdef _WIN32 - if (mapper->base != 0) { - UnmapViewOfFile(mapper->base); - } - if (mapper->hMap != (HANDLE)-1) { - CloseHandle(mapper->hMap); - } - if (mapper->hFile != (HANDLE)-1) { - CloseHandle(mapper->hFile); - } - mapper->base = 0; - mapper->hMap = mapper->hFile = (HANDLE)-1; -#endif - PyObject_Del(mapper); -} - -/* -------------------------------------------------------------------- */ -/* standard file operations */ - -static PyObject * -mapping_read(ImagingMapperObject *mapper, PyObject *args) { - PyObject *buf; - - int size = -1; - if (!PyArg_ParseTuple(args, "|i", &size)) { - return NULL; - } - - /* check size */ - if (size < 0 || mapper->offset + size > mapper->size) { - size = mapper->size - mapper->offset; - } - if (size < 0) { - size = 0; - } - - buf = PyBytes_FromStringAndSize(NULL, size); - if (!buf) { - return NULL; - } - - if (size > 0) { - memcpy(PyBytes_AsString(buf), mapper->base + mapper->offset, size); - mapper->offset += size; - } - - return buf; -} - -static PyObject * -mapping_seek(ImagingMapperObject *mapper, PyObject *args) { - int offset; - int whence = 0; - if (!PyArg_ParseTuple(args, "i|i", &offset, &whence)) { - return NULL; - } - - switch (whence) { - case 0: /* SEEK_SET */ - mapper->offset = offset; - break; - case 1: /* SEEK_CUR */ - mapper->offset += offset; - break; - case 2: /* SEEK_END */ - mapper->offset = mapper->size + offset; - break; - default: - /* FIXME: raise ValueError? */ - break; - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* -------------------------------------------------------------------- */ -/* map entire image */ - extern PyObject * PyImagingNew(Imaging im); -static void -ImagingDestroyMap(Imaging im) { - return; /* nothing to do! */ -} - -static PyObject * -mapping_readimage(ImagingMapperObject *mapper, PyObject *args) { - int y, size; - Imaging im; - - char *mode; - int xsize; - int ysize; - int stride; - int orientation; - if (!PyArg_ParseTuple( - args, "s(ii)ii", &mode, &xsize, &ysize, &stride, &orientation)) { - return NULL; - } - - if (stride <= 0) { - /* FIXME: maybe we should call ImagingNewPrologue instead */ - if (!strcmp(mode, "L") || !strcmp(mode, "P")) { - stride = xsize; - } else if (!strcmp(mode, "I;16") || !strcmp(mode, "I;16B")) { - stride = xsize * 2; - } else { - stride = xsize * 4; - } - } - - size = ysize * stride; - - if (mapper->offset + size > mapper->size) { - PyErr_SetString(PyExc_OSError, "image file truncated"); - return NULL; - } - - im = ImagingNewPrologue(mode, xsize, ysize); - if (!im) { - return NULL; - } - - /* setup file pointers */ - if (orientation > 0) { - for (y = 0; y < ysize; y++) { - im->image[y] = mapper->base + mapper->offset + y * stride; - } - } else { - for (y = 0; y < ysize; y++) { - im->image[ysize - y - 1] = mapper->base + mapper->offset + y * stride; - } - } - - im->destroy = ImagingDestroyMap; - - mapper->offset += size; - - return PyImagingNew(im); -} - -static struct PyMethodDef methods[] = { - /* standard file interface */ - {"read", (PyCFunction)mapping_read, 1}, - {"seek", (PyCFunction)mapping_seek, 1}, - /* extensions */ - {"readimage", (PyCFunction)mapping_readimage, 1}, - {NULL, NULL} /* sentinel */ -}; - -static PyTypeObject ImagingMapperType = { - PyVarObject_HEAD_INIT(NULL, 0) "ImagingMapper", /*tp_name*/ - sizeof(ImagingMapperObject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mapping_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number */ - 0, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ -}; - -PyObject * -PyImaging_Mapper(PyObject *self, PyObject *args) { - char *filename; - if (!PyArg_ParseTuple(args, "s", &filename)) { - return NULL; - } - - return (PyObject *)PyImaging_MapperNew(filename, 1); -} - /* -------------------------------------------------------------------- */ /* Buffer mapper */ From e4b9f88de4378ae622b54998b186e93e68fab4c7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jan 2021 12:59:45 +1100 Subject: [PATCH 282/750] Updated test now that Win32 uses map_buffer --- Tests/test_map.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Tests/test_map.py b/Tests/test_map.py index 2b65fb3f9..9131e6b7d 100644 --- a/Tests/test_map.py +++ b/Tests/test_map.py @@ -4,10 +4,6 @@ import pytest from PIL import Image -from .helper import is_win32 - -pytestmark = pytest.mark.skipif(is_win32(), reason="Win32 does not call map_buffer") - def test_overflow(): # There is the potential to overflow comparisons in map.c From 11cb3fba9c93275d78f4339973560938fc07bd9e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jan 2021 13:01:42 +1100 Subject: [PATCH 283/750] Added test --- Tests/test_map.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tests/test_map.py b/Tests/test_map.py index 9131e6b7d..752c5f268 100644 --- a/Tests/test_map.py +++ b/Tests/test_map.py @@ -23,6 +23,13 @@ def test_overflow(): Image.MAX_IMAGE_PIXELS = max_pixels +def test_tobytes(): + # Previously raised an access violation on Windows + with Image.open("Tests/images/l2rgb_read.bmp") as im: + with pytest.raises((ValueError, MemoryError, OSError)): + im.tobytes() + + @pytest.mark.skipif(sys.maxsize <= 2 ** 32, reason="Requires 64-bit system") def test_ysize(): numpy = pytest.importorskip("numpy", reason="NumPy not installed") From 9561098ed4a8be1214359e0b83ef6d311e3cb9cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jan 2021 21:45:39 +1100 Subject: [PATCH 284/750] Updated libwebp to 1.2.0 --- depends/install_webp.sh | 2 +- winbuild/build_prepare.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 9b1882c43..568cb2df9 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,7 +1,7 @@ #!/bin/bash # install webp -archive=libwebp-1.1.0 +archive=libwebp-1.2.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 2531d5504..ead64edd2 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -154,9 +154,9 @@ deps = { # "bins": [r"libtiff\*.dll"], }, "libwebp": { - "url": "http://downloads.webmproject.org/releases/webp/libwebp-1.1.0.tar.gz", - "filename": "libwebp-1.1.0.tar.gz", - "dir": "libwebp-1.1.0", + "url": "http://downloads.webmproject.org/releases/webp/libwebp-1.2.0.tar.gz", + "filename": "libwebp-1.2.0.tar.gz", + "dir": "libwebp-1.2.0", "build": [ cmd_rmdir(r"output\release-static"), # clean cmd_nmake( From c10bf8d9a75fca3938e7d223b67bccda407dd168 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 31 Jan 2021 13:14:14 +1100 Subject: [PATCH 285/750] Improved docstring [ci skip] --- src/PIL/Image.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 2adb8e536..e6d3adcf7 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -586,10 +586,10 @@ class Image: This operation will destroy the image core and release its memory. The image data will be unusable afterward. - This function is only required to close images that have not - had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See - :ref:`file-handling` for more information. + This function is required to close images that have multiple frames or + have not had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for + more information. """ try: if hasattr(self, "_close__fp"): From 63f21609c041dbdbc05a00b80c8b2190a516bbe5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Feb 2021 23:39:53 +1100 Subject: [PATCH 286/750] Added context manager --- Tests/test_file_png.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 4cd4515ae..289c09767 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -571,8 +571,8 @@ class TestFilePng: assert len(chunks) == 3 def test_read_private_chunks(self): - im = Image.open("Tests/images/exif.png") - assert im.private_chunks == [(b"orNT", b"\x01")] + with Image.open("Tests/images/exif.png") as im: + assert im.private_chunks == [(b"orNT", b"\x01")] def test_roundtrip_private_chunk(self): # Check private chunk roundtripping From c377d8ca88d2618e603bcb43a180dee9611ad6c1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 Feb 2021 15:15:33 +1100 Subject: [PATCH 287/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 81d27a39f..4ad7bb8d3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Deprecate Tk/Tcl 8.4, to be removed in Pillow 10 (2023-01-02) #5216 + [radarhere] + - Added tk version to pilinfo #5226 [radarhere, nulano] From 0c1675a14390f19cef56e4d8cc1ab93d7ed74c95 Mon Sep 17 00:00:00 2001 From: Piolie Date: Thu, 4 Feb 2021 22:47:53 -0300 Subject: [PATCH 288/750] Make `formats` parameter in `Image.open` accept aNy cAsE --- Tests/test_image.py | 2 +- src/PIL/Image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index ade9d03c9..cff5832cf 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -94,7 +94,7 @@ class TestImage: with pytest.raises(TypeError): Image.open(PNGFILE, formats=123) - for formats in [["JPEG"], ("JPEG",)]: + for formats in [["jPeG"], ("JpEg",)]: with pytest.raises(UnidentifiedImageError): Image.open(PNGFILE, formats=formats) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index e6d3adcf7..da0d95bed 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2925,7 +2925,7 @@ def open(fp, mode="r", formats=None): if i not in OPEN: init() try: - factory, accept = OPEN[i] + factory, accept = OPEN[i.upper()] result = not accept or accept(prefix) if type(result) in [str, bytes]: accept_warnings.append(result) From 587e073dacdf13c94766974bd446644237887182 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 5 Feb 2021 20:28:34 +1100 Subject: [PATCH 289/750] Moved case transformation before initialization check --- src/PIL/Image.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index da0d95bed..01fe7ed1b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2922,10 +2922,11 @@ def open(fp, mode="r", formats=None): def _open_core(fp, filename, prefix, formats): for i in formats: + i = i.upper() if i not in OPEN: init() try: - factory, accept = OPEN[i.upper()] + factory, accept = OPEN[i] result = not accept or accept(prefix) if type(result) in [str, bytes]: accept_warnings.append(result) From 4a9a999dbb0cb6b211ca2aa6d901039ac059943e Mon Sep 17 00:00:00 2001 From: Piolie Date: Fri, 5 Feb 2021 12:21:27 -0300 Subject: [PATCH 290/750] Update Tests/test_image.py Keep the original test cases; add the most likely non-uppercase versions. Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index cff5832cf..3c2d128ee 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -94,7 +94,7 @@ class TestImage: with pytest.raises(TypeError): Image.open(PNGFILE, formats=123) - for formats in [["jPeG"], ("JpEg",)]: + for formats in [["JPEG"], ("JPEG",), ["jpeg"], ["Jpeg"], ["jPeG"], ["JpEg"]]: with pytest.raises(UnidentifiedImageError): Image.open(PNGFILE, formats=formats) From e5c41c3c84681fd8aed245c3988a40fd1e1bdea4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 7 Feb 2021 06:57:03 +1100 Subject: [PATCH 291/750] Updated lcms2 to 2.12 --- docs/installation.rst | 2 +- winbuild/build_prepare.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index d92a6eb8b..4610d87d8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -159,7 +159,7 @@ Many of Pillow's features require external libraries: * **littlecms** provides color management * Pillow version 2.2.1 and below uses liblcms1, Pillow 2.3.0 and - above uses liblcms2. Tested with **1.19** and **2.7-2.11**. + above uses liblcms2. Tested with **1.19** and **2.7-2.12**. * **libwebp** provides the WebP format. diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index ead64edd2..2f7c858bc 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -219,9 +219,9 @@ deps = { # "bins": [r"objs\{msbuild_arch}\Release\freetype.dll"], }, "lcms2": { - "url": SF_MIRROR + "/project/lcms/lcms/2.11/lcms2-2.11.tar.gz", - "filename": "lcms2-2.11.tar.gz", - "dir": "lcms2-2.11", + "url": SF_MIRROR + "/project/lcms/lcms/2.12/lcms2-2.12.tar.gz", + "filename": "lcms2-2.12.tar.gz", + "dir": "lcms2-2.12", "patch": { r"Projects\VC2017\lcms2_static\lcms2_static.vcxproj": { # default is /MD for x86 and /MT for x64, we need /MD always From 62737fb470ecf4ff5909b14c27ceb9f442dbc1e2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Feb 2021 18:20:11 +1100 Subject: [PATCH 292/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4ad7bb8d3..ecc0d9ea4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Changed Image.open formats parameter to be case-insensitive #5250 + [Piolie, radarhere] + - Deprecate Tk/Tcl 8.4, to be removed in Pillow 10 (2023-01-02) #5216 [radarhere] From a5d8d1e163f117d4fb619eadacfc424eed8e7eec Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Feb 2021 22:00:48 +1100 Subject: [PATCH 293/750] Removed outdated documentation [ci skip] --- docs/reference/limits.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/reference/limits.rst b/docs/reference/limits.rst index 79dc66e67..a71b514b5 100644 --- a/docs/reference/limits.rst +++ b/docs/reference/limits.rst @@ -25,13 +25,6 @@ Internal Limits is smaller than 2GB, as calculated by ``y*stride`` (so 2Gpx for 'L' images, and .5Gpx for 'RGB' -* Any call to internal python size functions for buffers or strings - are currently returned as int32, not py_ssize_t. This limits the - maximum buffer to 2GB for operations like frombytes and frombuffer. - -* This also limits the size of buffers converted using a - decoder. (decode.c:127) - Format Size Limits ================== From 441d75aa284998926279bb2f4b6e7878ba5d87bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Feb 2021 19:14:57 +1100 Subject: [PATCH 294/750] Updated docstring --- src/PIL/ImageColor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 909117449..51df44040 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -24,8 +24,8 @@ from . import Image def getrgb(color): """ - Convert a color string to an RGB tuple. If the string cannot be parsed, - this function raises a :py:exc:`ValueError` exception. + Convert a color string to an RGB or RGBA tuple. If the string cannot be + parsed, this function raises a :py:exc:`ValueError` exception. .. versionadded:: 1.1.4 From e4a8783e8864cddb885fdda85d01e771f2135493 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Feb 2021 19:44:51 +1100 Subject: [PATCH 295/750] Changed example value to avoid using "a" --- docs/reference/ImageColor.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index 457f166b4..23b46b06c 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -28,8 +28,8 @@ The ImageColor module supports the following string formats: Examples: - ``#ff0000`` specifies pure red. - - ``#ff0000aa`` specifies pure red with an opacity of 66.66% (aa = 170, opacity = - 170/255). + - ``#ff0000cc`` specifies pure red with an opacity of 80% (cc = 204, opacity = + 204/255). * RGB functions, given as ``rgb(red, green, blue)`` where the color values are From 6c0af0fdfbea899e3e6a6beb3a7f94e4fedc0003 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Feb 2021 19:46:07 +1100 Subject: [PATCH 296/750] Removed ImageDraw reference --- docs/reference/ImageColor.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index 23b46b06c..95ed17438 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -22,8 +22,7 @@ The ImageColor module supports the following string formats: - ``r`` red - ``g`` green - ``b`` blue - - ``a`` alpha / opacity (can be used in combination with ``mode="RGBA"`` in - :py:mod:`~PIL.ImageDraw`) + - ``a`` alpha / opacity Examples: From e64d62e568b4674dd91d7b330fc83060d4cd31fb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Feb 2021 19:47:40 +1100 Subject: [PATCH 297/750] Adjusted formatting [ci skip] --- docs/reference/ImageColor.rst | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index 95ed17438..20237eccf 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -17,19 +17,10 @@ Color Names The ImageColor module supports the following string formats: * Hexadecimal color specifiers, given as ``#rgb``, ``#rgba``, ``#rrggbb`` or - ``#rrggbbaa``, with the following placeholders: - - - ``r`` red - - ``g`` green - - ``b`` blue - - ``a`` alpha / opacity - - Examples: - - - ``#ff0000`` specifies pure red. - - ``#ff0000cc`` specifies pure red with an opacity of 80% (cc = 204, opacity = - 204/255). - + ``#rrggbbaa``, where ``r`` is red, ``g`` is green, ``b`` is blue and ``a`` is + alpha (also called 'opacity'). For example, ``#ff0000`` specifies pure red, + and ``#ff0000cc`` specifies red with 80% opacity (``cc`` is 204 in decimal + form, and 204 / 255 = 0.8). * RGB functions, given as ``rgb(red, green, blue)`` where the color values are integers in the range 0 to 255. Alternatively, the color values can be given From 57d6e8ca433b4d6bc39beb9e6d7829b4e0368a35 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Feb 2021 21:12:30 +1100 Subject: [PATCH 298/750] Added PyQt6 support --- Tests/test_imageqt.py | 4 +++- Tests/test_qt_image_qapplication.py | 4 +++- src/PIL/ImageQt.py | 20 +++++++++++++------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index cf4aba982..404849cb9 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -14,7 +14,9 @@ def test_rgb(): # typedef QRgb # An ARGB quadruplet on the format #AARRGGBB, # equivalent to an unsigned int. - if ImageQt.qt_version == "side6": + if ImageQt.qt_version == "6": + from PyQt6.QtGui import qRgb + elif ImageQt.qt_version == "side6": from PySide6.QtGui import qRgb elif ImageQt.qt_version == "5": from PyQt5.QtGui import qRgb diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index 06bd27c00..a3d5620d3 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -7,7 +7,9 @@ from .helper import assert_image_equal, hopper if ImageQt.qt_is_installed: from PIL.ImageQt import QPixmap - if ImageQt.qt_version == "side6": + if ImageQt.qt_version == "6": + from PyQt6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget + elif ImageQt.qt_version == "side6": from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "5": from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 64f07be11..f9586f743 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -23,6 +23,7 @@ from . import Image from ._util import isPath qt_versions = [ + ["6", "PyQt6"], ["side6", "PySide6"], ["5", "PyQt5"], ["side2", "PySide2"], @@ -32,7 +33,10 @@ qt_versions = [ qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) for qt_version, qt_module in qt_versions: try: - if qt_module == "PySide6": + if qt_module == "PyQt6": + from PyQt6.QtCore import QBuffer, QIODevice + from PyQt6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PySide6": from PySide6.QtCore import QBuffer, QIODevice from PySide6.QtGui import QImage, QPixmap, qRgba elif qt_module == "PyQt5": @@ -63,7 +67,8 @@ def fromqimage(im): (given either as Python string or a PyQt string object) """ buffer = QBuffer() - buffer.open(QIODevice.ReadWrite) + qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice + buffer.open(qt_openmode.ReadWrite) # preserve alpha channel with png # otherwise ppm is more friendly with Image.open if im.hasAlphaChannel(): @@ -132,25 +137,26 @@ def _toqclass_helper(im): if isPath(im): im = Image.open(im) + qt_format = QImage.Format if qt_version == "6" else QImage if im.mode == "1": - format = QImage.Format_Mono + format = qt_format.Format_Mono elif im.mode == "L": - format = QImage.Format_Indexed8 + format = qt_format.Format_Indexed8 colortable = [] for i in range(256): colortable.append(rgb(i, i, i)) elif im.mode == "P": - format = QImage.Format_Indexed8 + format = qt_format.Format_Indexed8 colortable = [] palette = im.getpalette() for i in range(0, len(palette), 3): colortable.append(rgb(*palette[i : i + 3])) elif im.mode == "RGB": data = im.tobytes("raw", "BGRX") - format = QImage.Format_RGB32 + format = qt_format.Format_RGB32 elif im.mode == "RGBA": data = im.tobytes("raw", "BGRA") - format = QImage.Format_ARGB32 + format = qt_format.Format_ARGB32 else: raise ValueError(f"unsupported image mode {repr(im.mode)}") From 01be7000814ad4032aff74eb659ca8fa8a5b4164 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Feb 2021 23:37:55 +1100 Subject: [PATCH 299/750] Fixed asserting that no warnings were raised --- Tests/test_bmp_reference.py | 4 ++-- Tests/test_file_dcx.py | 8 ++++---- Tests/test_file_fli.py | 8 ++++---- Tests/test_file_gif.py | 8 ++++---- Tests/test_file_icns.py | 4 +++- Tests/test_file_im.py | 8 ++++---- Tests/test_file_mpo.py | 8 ++++---- Tests/test_file_png.py | 4 +++- Tests/test_file_psd.py | 8 ++++---- Tests/test_file_spider.py | 8 ++++---- Tests/test_file_tar.py | 8 ++++---- Tests/test_file_tiff.py | 8 ++++---- Tests/test_file_webp.py | 4 +++- Tests/test_image.py | 4 +++- Tests/test_numpy.py | 4 +++- 15 files changed, 53 insertions(+), 43 deletions(-) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 19602c1e7..46fe1750f 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -20,7 +20,7 @@ def test_bad(): either""" for f in get_files("b"): - def open(f): + with pytest.warns(None) as record: try: with Image.open(f) as im: im.load() @@ -28,7 +28,7 @@ def test_bad(): pass # Assert that there is no unclosed file warning - pytest.warns(None, open, f) + assert len(record) == 0 def test_questionable(): diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index 818d6ed5e..ec399d3ae 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -31,20 +31,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(TEST_FILE) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(TEST_FILE) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_invalid_file(): diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 16b3dc59a..43ae9b0e0 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -38,20 +38,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(static_test_file) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(static_test_file) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_tell(): diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index cf3a65e18..adbc8c6aa 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -38,20 +38,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(TEST_GIF) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(TEST_GIF) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_invalid_file(): diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index a3d502d42..04d17ccf5 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -19,7 +19,9 @@ def test_sanity(): with Image.open(TEST_FILE) as im: # Assert that there is no unclosed file warning - pytest.warns(None, im.load) + with pytest.warns(None) as record: + im.load() + assert len(record) == 0 assert im.mode == "RGBA" assert im.size == (1024, 1024) diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index afea82359..b736c3aa6 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -35,20 +35,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(TEST_IM) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(TEST_IM) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_tell(): diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 791efcc3f..ad11c3d5d 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -41,20 +41,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(test_files[0]) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(test_files[0]) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_app(): diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 289c09767..16b461f30 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -324,7 +324,9 @@ class TestFilePng: with Image.open(TEST_PNG_FILE) as im: # Assert that there is no unclosed file warning - pytest.warns(None, im.verify) + with pytest.warns(None) as record: + im.verify() + assert len(record) == 0 with Image.open(TEST_PNG_FILE) as im: im.load() diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 8bb45630e..eb2d94cd2 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -29,20 +29,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(test_file) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(test_file) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_invalid_file(): diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 9cdb451c9..c7ed91f0d 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -28,20 +28,20 @@ def test_unclosed_file(): def test_closed_file(): - def open(): + with pytest.warns(None) as record: im = Image.open(TEST_FILE) im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(): - def open(): + with pytest.warns(None) as record: with Image.open(TEST_FILE) as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_save(tmp_path): diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index 02001e5b1..39356c9ee 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -31,16 +31,16 @@ def test_unclosed_file(): def test_close(): - def open(): + with pytest.warns(None) as record: tar = TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg") tar.close() - pytest.warns(None, open) + assert len(record) == 0 def test_contextmanager(): - def open(): + with pytest.warns(None) as record: with TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg"): pass - pytest.warns(None, open) + assert len(record) == 0 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f644ef887..f378666ad 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -59,19 +59,19 @@ class TestFileTiff: pytest.warns(ResourceWarning, open) def test_closed_file(self): - def open(): + with pytest.warns(None) as record: im = Image.open("Tests/images/multipage.tiff") im.load() im.close() - pytest.warns(None, open) + assert len(record) == 0 def test_context_manager(self): - def open(): + with pytest.warns(None) as record: with Image.open("Tests/images/multipage.tiff") as im: im.load() - pytest.warns(None, open) + assert len(record) == 0 def test_mac_tiff(self): # Read RGBa images from macOS [@PIL136] diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 11fbd9fd5..56c163aab 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -145,7 +145,9 @@ class TestFileWebp: file_path = "Tests/images/hopper.webp" with Image.open(file_path) as image: temp_file = str(tmp_path / "temp.webp") - pytest.warns(None, image.save, temp_file) + with pytest.warns(None) as record: + image.save(temp_file) + assert len(record) == 0 def test_file_pointer_could_be_reused(self): file_path = "Tests/images/hopper.webp" diff --git a/Tests/test_image.py b/Tests/test_image.py index 3c2d128ee..13ab8b7bf 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -636,7 +636,9 @@ class TestImage: # Act/Assert with Image.open(test_file) as im: - pytest.warns(None, im.save, temp_file) + with pytest.warns(None) as record: + im.save(temp_file) + assert len(record) == 0 def test_load_on_nonexclusive_multiframe(self): with open("Tests/images/frozenpond.mpo", "rb") as fp: diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index da367fa46..42c7a9281 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -234,4 +234,6 @@ def test_no_resource_warning_for_numpy_array(): with Image.open(test_file) as im: # Act/Assert - pytest.warns(None, lambda: array(im)) + with pytest.warns(None) as record: + array(im) + assert len(record) == 0 From 98eaef5bc746958c8d04b365a480159572af846c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 08:09:31 +1100 Subject: [PATCH 300/750] Added release notes for PyQt6 [ci skip] --- docs/releasenotes/8.2.0.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 8ddbc7f54..28d39ca46 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -34,7 +34,8 @@ TODO Other Changes ============= -TODO -^^^^ +PyQt6 +^^^^^ -TODO +Support has been added for PyQt6. If it is installed, it will be used instead of +PySide6, PyQt5 or PySide2. From 4a0569e97f1c276e7550caf891abcfecbd125a6d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 13:48:31 +1100 Subject: [PATCH 301/750] Changed zero length assertions to falsy --- Tests/test_bmp_reference.py | 2 +- Tests/test_file_dcx.py | 4 ++-- Tests/test_file_fli.py | 4 ++-- Tests/test_file_gif.py | 4 ++-- Tests/test_file_icns.py | 2 +- Tests/test_file_im.py | 4 ++-- Tests/test_file_jpeg.py | 2 +- Tests/test_file_mpo.py | 4 ++-- Tests/test_file_png.py | 2 +- Tests/test_file_psd.py | 4 ++-- Tests/test_file_spider.py | 4 ++-- Tests/test_file_tar.py | 4 ++-- Tests/test_file_tiff.py | 4 ++-- Tests/test_file_webp.py | 2 +- Tests/test_image.py | 2 +- Tests/test_numpy.py | 2 +- 16 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 46fe1750f..99e16391a 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -28,7 +28,7 @@ def test_bad(): pass # Assert that there is no unclosed file warning - assert len(record) == 0 + assert not record def test_questionable(): diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index ec399d3ae..58d5cbf1a 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -36,7 +36,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -44,7 +44,7 @@ def test_context_manager(): with Image.open(TEST_FILE) as im: im.load() - assert len(record) == 0 + assert not record def test_invalid_file(): diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 43ae9b0e0..1d02b5195 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -43,7 +43,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -51,7 +51,7 @@ def test_context_manager(): with Image.open(static_test_file) as im: im.load() - assert len(record) == 0 + assert not record def test_tell(): diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index adbc8c6aa..f3414647f 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -43,7 +43,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -51,7 +51,7 @@ def test_context_manager(): with Image.open(TEST_GIF) as im: im.load() - assert len(record) == 0 + assert not record def test_invalid_file(): diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 04d17ccf5..37898d0bd 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -21,7 +21,7 @@ def test_sanity(): # Assert that there is no unclosed file warning with pytest.warns(None) as record: im.load() - assert len(record) == 0 + assert not record assert im.mode == "RGBA" assert im.size == (1024, 1024) diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index b736c3aa6..f1d75465d 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -40,7 +40,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -48,7 +48,7 @@ def test_context_manager(): with Image.open(TEST_IM) as im: im.load() - assert len(record) == 0 + assert not record def test_tell(): diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 435ecbaa7..eff0c0eb1 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -733,7 +733,7 @@ class TestFileJpeg: out = str(tmp_path / "out.jpg") with pytest.warns(None) as record: im.save(out, exif=exif) - assert len(record) == 0 + assert not record with Image.open(out) as reloaded: assert reloaded.getexif()[282] == 180 diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index ad11c3d5d..c5756649e 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -46,7 +46,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -54,7 +54,7 @@ def test_context_manager(): with Image.open(test_files[0]) as im: im.load() - assert len(record) == 0 + assert not record def test_app(): diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 16b461f30..26181fb8a 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -326,7 +326,7 @@ class TestFilePng: # Assert that there is no unclosed file warning with pytest.warns(None) as record: im.verify() - assert len(record) == 0 + assert not record with Image.open(TEST_PNG_FILE) as im: im.load() diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index eb2d94cd2..37d807c51 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -34,7 +34,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -42,7 +42,7 @@ def test_context_manager(): with Image.open(test_file) as im: im.load() - assert len(record) == 0 + assert not record def test_invalid_file(): diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index c7ed91f0d..dc90201cf 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -33,7 +33,7 @@ def test_closed_file(): im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(): @@ -41,7 +41,7 @@ def test_context_manager(): with Image.open(TEST_FILE) as im: im.load() - assert len(record) == 0 + assert not record def test_save(tmp_path): diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index 39356c9ee..b38727fb9 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -35,7 +35,7 @@ def test_close(): tar = TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg") tar.close() - assert len(record) == 0 + assert not record def test_contextmanager(): @@ -43,4 +43,4 @@ def test_contextmanager(): with TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg"): pass - assert len(record) == 0 + assert not record diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f378666ad..f0dc6ea2d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -64,14 +64,14 @@ class TestFileTiff: im.load() im.close() - assert len(record) == 0 + assert not record def test_context_manager(self): with pytest.warns(None) as record: with Image.open("Tests/images/multipage.tiff") as im: im.load() - assert len(record) == 0 + assert not record def test_mac_tiff(self): # Read RGBa images from macOS [@PIL136] diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 56c163aab..c4fd08437 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -147,7 +147,7 @@ class TestFileWebp: temp_file = str(tmp_path / "temp.webp") with pytest.warns(None) as record: image.save(temp_file) - assert len(record) == 0 + assert not record def test_file_pointer_could_be_reused(self): file_path = "Tests/images/hopper.webp" diff --git a/Tests/test_image.py b/Tests/test_image.py index 13ab8b7bf..41cafaccb 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -638,7 +638,7 @@ class TestImage: with Image.open(test_file) as im: with pytest.warns(None) as record: im.save(temp_file) - assert len(record) == 0 + assert not record def test_load_on_nonexclusive_multiframe(self): with open("Tests/images/frozenpond.mpo", "rb") as fp: diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 42c7a9281..550d02eea 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -236,4 +236,4 @@ def test_no_resource_warning_for_numpy_array(): # Act/Assert with pytest.warns(None) as record: array(im) - assert len(record) == 0 + assert not record From 1722b8de2f35ea80e4008bb999c89e2061c01dd1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 18:10:26 +1100 Subject: [PATCH 302/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ecc0d9ea4..b4d6b5348 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Added PyQt6 support #5258 + [radarhere] + - Changed Image.open formats parameter to be case-insensitive #5250 [Piolie, radarhere] From 83542c42bf6ffeb944f965d811ad68074d5d2a19 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 21:43:54 +1100 Subject: [PATCH 303/750] Added context managers --- Tests/check_icns_dos.py | 3 ++- Tests/check_j2k_dos.py | 5 ++++- Tests/test_decompression_bomb.py | 9 ++++++--- Tests/test_file_dds.py | 9 ++++++--- Tests/test_file_fpx.py | 3 ++- Tests/test_file_jpeg.py | 3 ++- Tests/test_file_jpeg2k.py | 3 ++- Tests/test_file_png.py | 6 ++++-- Tests/test_file_ppm.py | 6 ++++-- Tests/test_file_psd.py | 3 ++- Tests/test_file_spider.py | 3 ++- Tests/test_file_tiff.py | 11 ++++++----- Tests/test_file_webp.py | 3 ++- Tests/test_image.py | 15 ++++++++++----- Tests/test_imagewin_pointers.py | 3 ++- 15 files changed, 56 insertions(+), 29 deletions(-) diff --git a/Tests/check_icns_dos.py b/Tests/check_icns_dos.py index 3f4fb6518..a34bee45c 100644 --- a/Tests/check_icns_dos.py +++ b/Tests/check_icns_dos.py @@ -5,4 +5,5 @@ from io import BytesIO from PIL import Image -Image.open(BytesIO(b"icns\x00\x00\x00\x10hang\x00\x00\x00\x00")) +with Image.open(BytesIO(b"icns\x00\x00\x00\x10hang\x00\x00\x00\x00")): + pass diff --git a/Tests/check_j2k_dos.py b/Tests/check_j2k_dos.py index 273c18585..71dcea4f3 100644 --- a/Tests/check_j2k_dos.py +++ b/Tests/check_j2k_dos.py @@ -5,4 +5,7 @@ from io import BytesIO from PIL import Image -Image.open(BytesIO(b"\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang")) +with Image.open( + BytesIO(b"\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang") +): + pass diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 7671cdc09..80ab92666 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -54,15 +54,18 @@ class TestDecompressionBomb: def test_exception_ico(self): with pytest.raises(Image.DecompressionBombError): - Image.open("Tests/images/decompression_bomb.ico") + with Image.open("Tests/images/decompression_bomb.ico"): + pass def test_exception_gif(self): with pytest.raises(Image.DecompressionBombError): - Image.open("Tests/images/decompression_bomb.gif") + with Image.open("Tests/images/decompression_bomb.gif"): + pass def test_exception_bmp(self): with pytest.raises(Image.DecompressionBombError): - Image.open("Tests/images/bmp/b/reallybig.bmp") + with Image.open("Tests/images/bmp/b/reallybig.bmp"): + pass class TestDecompressionCrop: diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 1cd7a1be7..5e2e841fd 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -123,7 +123,8 @@ def test_dx10_r8g8b8a8_unorm_srgb(): def test_unimplemented_dxgi_format(): with pytest.raises(NotImplementedError): - Image.open("Tests/images/unimplemented_dxgi_format.dds") + with Image.open("Tests/images/unimplemented_dxgi_format.dds"): + pass def test_uncompressed_rgb(): @@ -170,7 +171,8 @@ def test_short_header(): img_file = f.read() def short_header(): - Image.open(BytesIO(img_file[:119])) + with Image.open(BytesIO(img_file[:119])): + pass with pytest.raises(OSError): short_header() @@ -192,4 +194,5 @@ def test_short_file(): def test_unimplemented_pixel_format(): with pytest.raises(NotImplementedError): - Image.open("Tests/images/unimplemented_pixel_format.dds") + with Image.open("Tests/images/unimplemented_pixel_format.dds"): + pass diff --git a/Tests/test_file_fpx.py b/Tests/test_file_fpx.py index c3cc37ddf..818565f88 100644 --- a/Tests/test_file_fpx.py +++ b/Tests/test_file_fpx.py @@ -21,4 +21,5 @@ def test_invalid_file(): def test_fpx_invalid_number_of_bands(): with pytest.raises(OSError, match="Invalid number of bands"): - Image.open("Tests/images/input_bw_five_bands.fpx") + with Image.open("Tests/images/input_bw_five_bands.fpx"): + pass diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 435ecbaa7..5862d7eba 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -798,7 +798,8 @@ class TestFileJpeg: buffer.read = read with pytest.raises(UnidentifiedImageError): - Image.open(buffer) + with Image.open(buffer): + pass # Assert the entire file has not been read assert 0 < buffer.max_pos < size diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index c9e37f8b0..e22cff087 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -219,7 +219,8 @@ def test_16bit_jp2_roundtrips(): def test_unbound_local(): # prepatch, a malformed jp2 file could cause an UnboundLocalError exception. with pytest.raises(OSError): - Image.open("Tests/images/unbound_variable.jp2") + with Image.open("Tests/images/unbound_variable.jp2"): + pass def test_parser_feed(): diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 289c09767..76eac58f8 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -106,7 +106,8 @@ class TestFilePng: test_file = "Tests/images/broken.png" with pytest.raises(OSError): - Image.open(test_file) + with Image.open(test_file): + pass def test_bad_text(self): # Make sure PIL can read malformed tEXt chunks (@PIL152) @@ -464,7 +465,8 @@ class TestFilePng: pngfile = BytesIO(data) with pytest.raises(OSError): - Image.open(pngfile) + with Image.open(pngfile): + pass def test_trns_rgb(self): # Check writing and reading of tRNS chunks for RGB images. diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index e7c3fb06f..c7be5d780 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -56,7 +56,8 @@ def test_truncated_file(tmp_path): f.write("P6") with pytest.raises(ValueError): - Image.open(path) + with Image.open(path): + pass def test_neg_ppm(): @@ -66,7 +67,8 @@ def test_neg_ppm(): # sizes. with pytest.raises(OSError): - Image.open("Tests/images/negative_size.ppm") + with Image.open("Tests/images/negative_size.ppm"): + pass def test_mimetypes(tmp_path): diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 8bb45630e..8028636b9 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -128,4 +128,5 @@ def test_combined_larger_than_size(): # If we instead take the 'size' of the extra data field as the source of truth, # then the seek can't be negative with pytest.raises(OSError): - Image.open("Tests/images/combined_larger_than_size.psd") + with Image.open("Tests/images/combined_larger_than_size.psd"): + pass diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 9cdb451c9..b2d815d2e 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -136,7 +136,8 @@ def test_invalid_file(): invalid_file = "Tests/images/invalid.spider" with pytest.raises(OSError): - Image.open(invalid_file) + with Image.open(invalid_file): + pass def test_nonstack_file(): diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f644ef887..945f245cc 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -163,9 +163,8 @@ class TestFileTiff: def test_save_setting_missing_resolution(self): b = BytesIO() - Image.open("Tests/images/10ct_32bit_128.tiff").save( - b, format="tiff", resolution=123.45 - ) + with Image.open("Tests/images/10ct_32bit_128.tiff") as im: + im.save(b, format="tiff", resolution=123.45) with Image.open(b) as im: assert float(im.tag_v2[X_RESOLUTION]) == 123.45 assert float(im.tag_v2[Y_RESOLUTION]) == 123.45 @@ -248,7 +247,8 @@ class TestFileTiff: def test_unknown_pixel_mode(self): with pytest.raises(OSError): - Image.open("Tests/images/hopper_unknown_pixel_mode.tif") + with Image.open("Tests/images/hopper_unknown_pixel_mode.tif"): + pass def test_n_frames(self): for path, n_frames in [ @@ -605,7 +605,8 @@ class TestFileTiff: def test_string_dimension(self): # Assert that an error is raised if one of the dimensions is a string with pytest.raises(ValueError): - Image.open("Tests/images/string_dimension.tiff") + with Image.open("Tests/images/string_dimension.tiff"): + pass @pytest.mark.skipif(not is_win32(), reason="Windows only") diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 11fbd9fd5..7cc46ef69 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -165,7 +165,8 @@ class TestFileWebp: # Save as GIF out_gif = str(tmp_path / "temp.gif") - Image.open(out_webp).save(out_gif) + with Image.open(out_webp) as im: + im.save(out_gif) with Image.open(out_gif) as reread: reread_value = reread.convert("RGB").getpixel((1, 1)) diff --git a/Tests/test_image.py b/Tests/test_image.py index 3c2d128ee..c15c580e9 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -92,11 +92,13 @@ class TestImage: JPGFILE = "Tests/images/hopper.jpg" with pytest.raises(TypeError): - Image.open(PNGFILE, formats=123) + with Image.open(PNGFILE, formats=123): + pass for formats in [["JPEG"], ("JPEG",), ["jpeg"], ["Jpeg"], ["jPeG"], ["JpEg"]]: with pytest.raises(UnidentifiedImageError): - Image.open(PNGFILE, formats=formats) + with Image.open(PNGFILE, formats=formats): + pass with Image.open(JPGFILE, formats=formats) as im: assert im.mode == "RGB" @@ -120,15 +122,18 @@ class TestImage: im = io.BytesIO(b"") with pytest.raises(UnidentifiedImageError): - Image.open(im) + with Image.open(im): + pass def test_bad_mode(self): with pytest.raises(ValueError): - Image.open("filename", "bad mode") + with Image.open("filename", "bad mode"): + pass def test_stringio(self): with pytest.raises(ValueError): - Image.open(io.StringIO()) + with Image.open(io.StringIO()): + pass def test_pathlib(self, tmp_path): from PIL.Image import Path diff --git a/Tests/test_imagewin_pointers.py b/Tests/test_imagewin_pointers.py index a5cac96e4..c51a66089 100644 --- a/Tests/test_imagewin_pointers.py +++ b/Tests/test_imagewin_pointers.py @@ -110,4 +110,5 @@ if is_win32(): DeleteObject(dib) DeleteDC(hdc) - Image.open(BytesIO(bitmap)).save(opath) + with Image.open(BytesIO(bitmap)) as im: + im.save(opath) From c8ca4b909a6dde144257f13f9b1c5381f4ac89ef Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 13 Feb 2021 11:32:52 +1100 Subject: [PATCH 304/750] Added braces --- src/libImaging/GifEncode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index 14fd07cdd..e9064b3f5 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -169,7 +169,8 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { ptr = buf; - for (;;) switch (state->state) { + for (;;) { + switch (state->state) { case INIT: case ENCODE: @@ -319,4 +320,5 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { state->state = ENCODE; break; } + } } From a1b4b026ffdb3196f0e06a32abbb9bc04a986a4a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Feb 2021 07:58:16 +1100 Subject: [PATCH 305/750] Added pragma no cover --- Tests/test_file_dds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 5e2e841fd..37869288f 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -172,7 +172,7 @@ def test_short_header(): def short_header(): with Image.open(BytesIO(img_file[:119])): - pass + pass # pragma: no cover with pytest.raises(OSError): short_header() From 223b05a2eace5159b4ee21108182b2a91e2d7587 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 16 Feb 2021 22:33:17 +1100 Subject: [PATCH 306/750] Corrected docstring --- src/PIL/ImageQt.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index f9586f743..74ca3166c 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -63,8 +63,7 @@ def rgb(r, g, b, a=255): def fromqimage(im): """ - :param im: A PIL Image object, or a file name - (given either as Python string or a PyQt string object) + :param im: QImage or PIL ImageQt object """ buffer = QBuffer() qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice From 2bbf31929fe954a1a64dda06e4a3f864b4c51e1d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 16 Feb 2021 22:36:32 +1100 Subject: [PATCH 307/750] Added PyQt6 and PySide 6 to list of modules [ci skip] --- docs/reference/ImageQt.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/ImageQt.rst b/docs/reference/ImageQt.rst index 34d4cef51..66f5880a3 100644 --- a/docs/reference/ImageQt.rst +++ b/docs/reference/ImageQt.rst @@ -4,8 +4,8 @@ :py:mod:`~PIL.ImageQt` Module ============================= -The :py:mod:`~PIL.ImageQt` module contains support for creating PyQt5 or PySide2 QImage -objects from PIL images. +The :py:mod:`~PIL.ImageQt` module contains support for creating PyQt6, PySide6, PyQt5 +or PySide2 QImage objects from PIL images. .. versionadded:: 1.1.6 @@ -14,7 +14,7 @@ objects from PIL images. Creates an :py:class:`~PIL.ImageQt.ImageQt` object from a PIL :py:class:`~PIL.Image.Image` object. This class is a subclass of QtGui.QImage, which means that you can pass the resulting objects directly - to PyQt5/PySide2 API functions and methods. + to PyQt6/PySide6/PyQt5/PySide2 API functions and methods. This operation is currently supported for mode 1, L, P, RGB, and RGBA images. To handle other modes, you need to convert the image first. From 79b17e4b1a756ba5f3e2c06c301c1034f52c0cbd Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 27 Dec 2020 18:09:35 +0100 Subject: [PATCH 308/750] Add CIFuzz Github Action --- .github/workflows/cifuzz.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/cifuzz.yml diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml new file mode 100644 index 000000000..d7f2a5bad --- /dev/null +++ b/.github/workflows/cifuzz.yml @@ -0,0 +1,24 @@ +name: CIFuzz +on: [push,pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'pillow' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'pillow' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts From a12aa59e8beb4cda1c1599f6eb8471df872b8340 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 20 Feb 2021 12:44:49 +0100 Subject: [PATCH 309/750] Add language parameter ref: https://github.com/google/oss-fuzz/pull/5222 --- .github/workflows/cifuzz.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index d7f2a5bad..04fc152a0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -9,12 +9,14 @@ jobs: uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master with: oss-fuzz-project-name: 'pillow' + language: python dry-run: false - name: Run Fuzzers uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'pillow' fuzz-seconds: 600 + language: python dry-run: false - name: Upload Crash uses: actions/upload-artifact@v1 From a5c251029c62b3fcd8ae508c8e7b758f46835843 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Feb 2021 22:15:56 +1100 Subject: [PATCH 310/750] Replaced various instances of assert_image_equal with assert_image_equal_tofile --- Tests/test_file_blp.py | 11 +- Tests/test_file_bmp.py | 8 +- Tests/test_file_dds.py | 43 +++---- Tests/test_file_fli.py | 5 +- Tests/test_file_ftex.py | 5 +- Tests/test_file_gbr.py | 8 +- Tests/test_file_gif.py | 7 +- Tests/test_file_ico.py | 5 +- Tests/test_file_im.py | 5 +- Tests/test_file_jpeg.py | 4 +- Tests/test_file_libtiff.py | 19 +-- Tests/test_file_mcidas.py | 5 +- Tests/test_file_msp.py | 5 +- Tests/test_file_ppm.py | 11 +- Tests/test_file_sgi.py | 27 ++--- Tests/test_file_spider.py | 5 +- Tests/test_file_sun.py | 10 +- Tests/test_file_tiff.py | 3 +- Tests/test_font_pcf.py | 9 +- Tests/test_font_pcf_charsets.py | 9 +- Tests/test_image.py | 4 +- Tests/test_image_rotate.py | 13 ++- Tests/test_imagedraw.py | 199 +++++++++++++++----------------- Tests/test_imagedraw2.py | 9 +- Tests/test_imagefont.py | 13 +-- Tests/test_imagemorph.py | 5 +- Tests/test_imagepalette.py | 5 +- Tests/test_qt_image_toqimage.py | 7 +- 28 files changed, 207 insertions(+), 252 deletions(-) diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index 94c469c7f..864607301 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -1,21 +1,18 @@ from PIL import Image -from .helper import assert_image_equal +from .helper import assert_image_equal_tofile def test_load_blp2_raw(): with Image.open("Tests/images/blp/blp2_raw.blp") as im: - with Image.open("Tests/images/blp/blp2_raw.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/blp/blp2_raw.png") def test_load_blp2_dxt1(): with Image.open("Tests/images/blp/blp2_dxt1.blp") as im: - with Image.open("Tests/images/blp/blp2_dxt1.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/blp/blp2_dxt1.png") def test_load_blp2_dxt1a(): with Image.open("Tests/images/blp/blp2_dxt1a.blp") as im: - with Image.open("Tests/images/blp/blp2_dxt1a.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/blp/blp2_dxt1a.png") diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index e2381df1e..d5fe2a4dd 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -4,7 +4,7 @@ import pytest from PIL import BmpImagePlugin, Image -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper def test_sanity(tmp_path): @@ -111,8 +111,7 @@ def test_load_dib(): assert im.format == "DIB" assert im.get_format_mimetype() == "image/bmp" - with Image.open("Tests/images/clipboard_target.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/clipboard_target.png") def test_save_dib(tmp_path): @@ -136,5 +135,4 @@ def test_rgba_bitfields(): b, g, r = im.split()[1:] im = Image.merge("RGB", (r, g, b)) - with Image.open("Tests/images/bmp/q/rgb32bf-xbgr.bmp") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/bmp/q/rgb32bf-xbgr.bmp") diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 37869288f..682cd048b 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -5,7 +5,7 @@ import pytest from PIL import DdsImagePlugin, Image -from .helper import assert_image_equal +from .helper import assert_image_equal, assert_image_equal_tofile TEST_FILE_DXT1 = "Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds" TEST_FILE_DXT3 = "Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds" @@ -41,22 +41,20 @@ def test_sanity_dxt5(): assert im.mode == "RGBA" assert im.size == (256, 256) - with Image.open(TEST_FILE_DXT5.replace(".dds", ".png")) as target: - assert_image_equal(target, im) + assert_image_equal_tofile(im, TEST_FILE_DXT5.replace(".dds", ".png")) def test_sanity_dxt3(): """Check DXT3 images can be opened""" - with Image.open(TEST_FILE_DXT3.replace(".dds", ".png")) as target: - with Image.open(TEST_FILE_DXT3) as im: - im.load() + with Image.open(TEST_FILE_DXT3) as im: + im.load() - assert im.format == "DDS" - assert im.mode == "RGBA" - assert im.size == (256, 256) + assert im.format == "DDS" + assert im.mode == "RGBA" + assert im.size == (256, 256) - assert_image_equal(target, im) + assert_image_equal_tofile(im, TEST_FILE_DXT3.replace(".dds", ".png")) def test_dx10_bc7(): @@ -69,8 +67,7 @@ def test_dx10_bc7(): assert im.mode == "RGBA" assert im.size == (256, 256) - with Image.open(TEST_FILE_DX10_BC7.replace(".dds", ".png")) as target: - assert_image_equal(target, im) + assert_image_equal_tofile(im, TEST_FILE_DX10_BC7.replace(".dds", ".png")) def test_dx10_bc7_unorm_srgb(): @@ -84,10 +81,9 @@ def test_dx10_bc7_unorm_srgb(): assert im.size == (16, 16) assert im.info["gamma"] == 1 / 2.2 - with Image.open( - TEST_FILE_DX10_BC7_UNORM_SRGB.replace(".dds", ".png") - ) as target: - assert_image_equal(target, im) + assert_image_equal_tofile( + im, TEST_FILE_DX10_BC7_UNORM_SRGB.replace(".dds", ".png") + ) def test_dx10_r8g8b8a8(): @@ -100,8 +96,7 @@ def test_dx10_r8g8b8a8(): assert im.mode == "RGBA" assert im.size == (256, 256) - with Image.open(TEST_FILE_DX10_R8G8B8A8.replace(".dds", ".png")) as target: - assert_image_equal(target, im) + assert_image_equal_tofile(im, TEST_FILE_DX10_R8G8B8A8.replace(".dds", ".png")) def test_dx10_r8g8b8a8_unorm_srgb(): @@ -115,10 +110,9 @@ def test_dx10_r8g8b8a8_unorm_srgb(): assert im.size == (16, 16) assert im.info["gamma"] == 1 / 2.2 - with Image.open( - TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB.replace(".dds", ".png") - ) as target: - assert_image_equal(target, im) + assert_image_equal_tofile( + im, TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB.replace(".dds", ".png") + ) def test_unimplemented_dxgi_format(): @@ -137,8 +131,9 @@ def test_uncompressed_rgb(): assert im.mode == "RGBA" assert im.size == (800, 600) - with Image.open(TEST_FILE_UNCOMPRESSED_RGB.replace(".dds", ".png")) as target: - assert_image_equal(target, im) + assert_image_equal_tofile( + im, TEST_FILE_UNCOMPRESSED_RGB.replace(".dds", ".png") + ) def test__validate_true(): diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 1d02b5195..0d9748a95 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -2,7 +2,7 @@ import pytest from PIL import FliImagePlugin, Image -from .helper import assert_image_equal, is_pypy +from .helper import assert_image_equal_tofile, is_pypy # created as an export of a palette image from Gimp2.6 # save as...-> hopper.fli, default options. @@ -122,5 +122,4 @@ def test_seek(): with Image.open(animated_test_file) as im: im.seek(50) - with Image.open("Tests/images/a_fli.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/a_fli.png") diff --git a/Tests/test_file_ftex.py b/Tests/test_file_ftex.py index 9b4375cd4..f76fd895a 100644 --- a/Tests/test_file_ftex.py +++ b/Tests/test_file_ftex.py @@ -1,12 +1,11 @@ from PIL import Image -from .helper import assert_image_equal, assert_image_similar +from .helper import assert_image_equal_tofile, assert_image_similar def test_load_raw(): with Image.open("Tests/images/ftex_uncompressed.ftu") as im: - with Image.open("Tests/images/ftex_uncompressed.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/ftex_uncompressed.png") def test_load_dxt1(): diff --git a/Tests/test_file_gbr.py b/Tests/test_file_gbr.py index 760f12e4d..8d7fcf147 100644 --- a/Tests/test_file_gbr.py +++ b/Tests/test_file_gbr.py @@ -2,7 +2,7 @@ import pytest from PIL import GbrImagePlugin, Image -from .helper import assert_image_equal +from .helper import assert_image_equal_tofile def test_invalid_file(): @@ -14,13 +14,11 @@ def test_invalid_file(): def test_gbr_file(): with Image.open("Tests/images/gbr.gbr") as im: - with Image.open("Tests/images/gbr.png") as target: - assert_image_equal(target, im) + assert_image_equal_tofile(im, "Tests/images/gbr.png") def test_multiple_load_operations(): with Image.open("Tests/images/gbr.gbr") as im: im.load() im.load() - with Image.open("Tests/images/gbr.png") as target: - assert_image_equal(target, im) + assert_image_equal_tofile(im, "Tests/images/gbr.png") diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index f3414647f..1b2314d51 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -6,6 +6,7 @@ from PIL import GifImagePlugin, Image, ImageDraw, ImagePalette, features from .helper import ( assert_image_equal, + assert_image_equal_tofile, assert_image_similar, hopper, is_pypy, @@ -317,8 +318,7 @@ def test_dispose_none_load_end(): with Image.open("Tests/images/dispose_none_load_end.gif") as img: img.seek(1) - with Image.open("Tests/images/dispose_none_load_end_second.gif") as expected: - assert_image_equal(img, expected) + assert_image_equal_tofile(img, "Tests/images/dispose_none_load_end_second.gif") def test_dispose_background(): @@ -629,8 +629,7 @@ def test_comment_over_255(tmp_path): def test_zero_comment_subblocks(): with Image.open("Tests/images/hopper_zero_comment_subblocks.gif") as im: - with Image.open(TEST_GIF) as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, TEST_GIF) def test_version(tmp_path): diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 940001a21..5ace0c55e 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -4,7 +4,7 @@ import pytest from PIL import IcoImagePlugin, Image, ImageDraw -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper TEST_ICO_FILE = "Tests/images/hopper.ico" @@ -120,5 +120,4 @@ def test_draw_reloaded(tmp_path): with Image.open(outfile) as im: im.save("Tests/images/hopper_draw.ico") - with Image.open("Tests/images/hopper_draw.ico") as reloaded: - assert_image_equal(im, reloaded) + assert_image_equal_tofile(im, "Tests/images/hopper_draw.ico") diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index f1d75465d..9d25a4d1a 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -4,7 +4,7 @@ import pytest from PIL import Image, ImImagePlugin -from .helper import assert_image_equal, hopper, is_pypy +from .helper import assert_image_equal_tofile, hopper, is_pypy # sample im TEST_IM = "Tests/images/hopper.im" @@ -86,8 +86,7 @@ def test_roundtrip(tmp_path): out = str(tmp_path / "temp.im") im = hopper(mode) im.save(out) - with Image.open(out) as reread: - assert_image_equal(reread, im) + assert_image_equal_tofile(im, out) for mode in ["RGB", "P", "PA"]: roundtrip(mode) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index cbbab970f..0dabd98f8 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -17,6 +17,7 @@ from PIL import ( from .helper import ( assert_image, assert_image_equal, + assert_image_equal_tofile, assert_image_similar, cjpeg_available, djpeg_available, @@ -767,8 +768,7 @@ class TestFileJpeg: # Test that the image can still load, even with broken Photoshop data # This image had the APP13 length hexedited to be smaller - with Image.open("Tests/images/photoshop-200dpi-broken.jpg") as im_broken: - assert_image_equal(im_broken, im) + assert_image_equal_tofile(im, "Tests/images/photoshop-200dpi-broken.jpg") # This image does not contain a Photoshop header string with Image.open("Tests/images/app13.jpg") as im: diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 5fe10bea9..c1eb7fb74 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -99,15 +99,13 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_eq_png(self): """ Checking that we're actually getting the data that we expect""" with Image.open("Tests/images/hopper_bw_500.png") as png: - with Image.open("Tests/images/hopper_g4_500.tif") as g4: - assert_image_equal(g4, png) + assert_image_equal_tofile(png, "Tests/images/hopper_g4_500.tif") # see https://github.com/python-pillow/Pillow/issues/279 def test_g4_fillorder_eq_png(self): """ Checking that we're actually getting the data that we expect""" - with Image.open("Tests/images/g4-fillorder-test.png") as png: - with Image.open("Tests/images/g4-fillorder-test.tif") as g4: - assert_image_equal(g4, png) + with Image.open("Tests/images/g4-fillorder-test.tif") as g4: + assert_image_equal_tofile(g4, "Tests/images/g4-fillorder-test.png") def test_g4_write(self, tmp_path): """Checking to see that the saved image is the same as what we wrote""" @@ -437,10 +435,7 @@ class TestFileLibTiff(LibTiffTestCase): im = im.filter(ImageFilter.GaussianBlur(4)) im.save(out, compression="tiff_adobe_deflate") - with Image.open(out) as im2: - im2.load() - - assert_image_equal(im, im2) + assert_image_equal_tofile(im, out) def test_compressions(self, tmp_path): # Test various tiff compressions and assert similar image content but reduced @@ -453,8 +448,7 @@ class TestFileLibTiff(LibTiffTestCase): for compression in ("packbits", "tiff_lzw"): im.save(out, compression=compression) size_compressed = os.path.getsize(out) - with Image.open(out) as im2: - assert_image_equal(im, im2) + assert_image_equal_tofile(im, out) im.save(out, compression="jpeg") size_jpeg = os.path.getsize(out) @@ -498,8 +492,7 @@ class TestFileLibTiff(LibTiffTestCase): out = str(tmp_path / "temp.tif") im.save(out, compression="tiff_adobe_deflate") - with Image.open(out) as im2: - assert_image_equal(im, im2) + assert_image_equal_tofile(im, out) def test_palette_save(self, tmp_path): im = hopper("P") diff --git a/Tests/test_file_mcidas.py b/Tests/test_file_mcidas.py index 88c8f8f4f..41f22cf0c 100644 --- a/Tests/test_file_mcidas.py +++ b/Tests/test_file_mcidas.py @@ -2,7 +2,7 @@ import pytest from PIL import Image, McIdasImagePlugin -from .helper import assert_image_equal +from .helper import assert_image_equal_tofile def test_invalid_file(): @@ -27,5 +27,4 @@ def test_valid_file(): assert im.format == "MCIDAS" assert im.mode == "I" assert im.size == (1800, 400) - with Image.open(saved_file) as im2: - assert_image_equal(im, im2) + assert_image_equal_tofile(im, saved_file) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index 293b856b0..50d7c590b 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -4,7 +4,7 @@ import pytest from PIL import Image, MspImagePlugin -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper TEST_FILE = "Tests/images/hopper.msp" EXTRA_DIR = "Tests/images/picins" @@ -52,8 +52,7 @@ def test_open_windows_v1(): def _assert_file_image_equal(source_path, target_path): with Image.open(source_path) as im: - with Image.open(target_path) as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, target_path) @pytest.mark.skipif( diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index c7be5d780..0ccfb5e88 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -2,7 +2,7 @@ import pytest from PIL import Image -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import assert_image_equal_tofile, assert_image_similar, hopper # sample ppm stream TEST_FILE = "Tests/images/hopper.ppm" @@ -24,8 +24,7 @@ def test_16bit_pgm(): assert im.size == (20, 100) assert im.get_format_mimetype() == "image/x-portable-graymap" - with Image.open("Tests/images/16_bit_binary_pgm.png") as tgt: - assert_image_equal(im, tgt) + assert_image_equal_tofile(im, "Tests/images/16_bit_binary_pgm.png") def test_16bit_pgm_write(tmp_path): @@ -35,8 +34,7 @@ def test_16bit_pgm_write(tmp_path): f = str(tmp_path / "temp.pgm") im.save(f, "PPM") - with Image.open(f) as reloaded: - assert_image_equal(im, reloaded) + assert_image_equal_tofile(im, f) def test_pnm(tmp_path): @@ -46,8 +44,7 @@ def test_pnm(tmp_path): f = str(tmp_path / "temp.pnm") im.save(f) - with Image.open(f) as reloaded: - assert_image_equal(im, reloaded) + assert_image_equal_tofile(im, f) def test_truncated_file(tmp_path): diff --git a/Tests/test_file_sgi.py b/Tests/test_file_sgi.py index a197fa775..0210dd4f1 100644 --- a/Tests/test_file_sgi.py +++ b/Tests/test_file_sgi.py @@ -2,7 +2,12 @@ import pytest from PIL import Image, SgiImagePlugin -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import ( + assert_image_equal, + assert_image_equal_tofile, + assert_image_similar, + hopper, +) def test_rgb(): @@ -16,10 +21,7 @@ def test_rgb(): def test_rgb16(): - test_file = "Tests/images/hopper16.rgb" - - with Image.open(test_file) as im: - assert_image_equal(im, hopper()) + assert_image_equal_tofile(hopper(), "Tests/images/hopper16.rgb") def test_l(): @@ -38,8 +40,7 @@ def test_rgba(): test_file = "Tests/images/transparent.sgi" with Image.open(test_file) as im: - with Image.open("Tests/images/transparent.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/transparent.png") assert im.get_format_mimetype() == "image/sgi" @@ -49,16 +50,14 @@ def test_rle(): test_file = "Tests/images/hopper.sgi" with Image.open(test_file) as im: - with Image.open("Tests/images/hopper.rgb") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/hopper.rgb") def test_rle16(): test_file = "Tests/images/tv16.sgi" with Image.open(test_file) as im: - with Image.open("Tests/images/tv.rgb") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/tv.rgb") def test_invalid_file(): @@ -72,8 +71,7 @@ def test_write(tmp_path): def roundtrip(img): out = str(tmp_path / "temp.sgi") img.save(out, format="sgi") - with Image.open(out) as reloaded: - assert_image_equal(img, reloaded) + assert_image_equal_tofile(img, out) for mode in ("L", "RGB", "RGBA"): roundtrip(hopper(mode)) @@ -89,8 +87,7 @@ def test_write16(tmp_path): out = str(tmp_path / "temp.sgi") im.save(out, format="sgi", bpc=2) - with Image.open(out) as reloaded: - assert_image_equal(im, reloaded) + assert_image_equal_tofile(im, out) def test_unsupported_mode(tmp_path): diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 3f7b8d1d5..3c93160f1 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -5,7 +5,7 @@ import pytest from PIL import Image, ImageSequence, SpiderImagePlugin -from .helper import assert_image_equal, hopper, is_pypy +from .helper import assert_image_equal_tofile, hopper, is_pypy TEST_FILE = "Tests/images/hopper.spider" @@ -160,5 +160,4 @@ def test_odd_size(): im.save(data, format="SPIDER") data.seek(0) - with Image.open(data) as im2: - assert_image_equal(im, im2) + assert_image_equal_tofile(im, data) diff --git a/Tests/test_file_sun.py b/Tests/test_file_sun.py index 8421106a2..05c78c316 100644 --- a/Tests/test_file_sun.py +++ b/Tests/test_file_sun.py @@ -4,7 +4,7 @@ import pytest from PIL import Image, SunImagePlugin -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import assert_image_equal_tofile, assert_image_similar, hopper EXTRA_DIR = "Tests/images/sunraster" @@ -29,8 +29,7 @@ def test_sanity(): def test_im1(): with Image.open("Tests/images/sunraster.im1") as im: - with Image.open("Tests/images/sunraster.im1.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/sunraster.im1.png") @pytest.mark.skipif( @@ -46,7 +45,4 @@ def test_others(): with Image.open(path) as im: im.load() assert isinstance(im, SunImagePlugin.SunImageFile) - target_path = f"{os.path.splitext(path)[0]}.png" - # im.save(target_file) - with Image.open(target_path) as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, f"{os.path.splitext(path)[0]}.png") diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 5744b92b5..f09117ca7 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -483,8 +483,7 @@ class TestFileTiff: tmpfile = str(tmp_path / "temp.tif") im.save(tmpfile) - with Image.open(tmpfile) as reloaded: - assert_image_equal(im, reloaded) + assert_image_equal_tofile(im, tmpfile) def test_strip_raw(self): infile = "Tests/images/tiff_strip_raw.tif" diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 4db73e56e..4814a8561 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -4,7 +4,11 @@ import pytest from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile -from .helper import assert_image_equal, assert_image_similar, skip_unless_feature +from .helper import ( + assert_image_equal_tofile, + assert_image_similar, + skip_unless_feature, +) fontname = "Tests/fonts/10x20-ISO8859-1.pcf" @@ -33,8 +37,7 @@ def save_font(request, tmp_path): font.save(tempname) with Image.open(tempname.replace(".pil", ".pbm")) as loaded: - with Image.open("Tests/fonts/10x20.pbm") as target: - assert_image_equal(loaded, target) + assert_image_equal_tofile(loaded, "Tests/fonts/10x20.pbm") with open(tempname, "rb") as f_loaded: with open("Tests/fonts/10x20.pil", "rb") as f_target: diff --git a/Tests/test_font_pcf_charsets.py b/Tests/test_font_pcf_charsets.py index d7d1bf200..4ada6b51b 100644 --- a/Tests/test_font_pcf_charsets.py +++ b/Tests/test_font_pcf_charsets.py @@ -2,7 +2,11 @@ import os from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile -from .helper import assert_image_equal, assert_image_similar, skip_unless_feature +from .helper import ( + assert_image_equal_tofile, + assert_image_similar, + skip_unless_feature, +) fontname = "Tests/fonts/ter-x20b.pcf" @@ -47,8 +51,7 @@ def save_font(request, tmp_path, encoding): font.save(tempname) with Image.open(tempname.replace(".pil", ".pbm")) as loaded: - with Image.open(f"Tests/fonts/ter-x20b-{encoding}.pbm") as target: - assert_image_equal(loaded, target) + assert_image_equal_tofile(loaded, f"Tests/fonts/ter-x20b-{encoding}.pbm") with open(tempname, "rb") as f_loaded: with open(f"Tests/fonts/ter-x20b-{encoding}.pil", "rb") as f_target: diff --git a/Tests/test_image.py b/Tests/test_image.py index af2370857..e9780b846 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -10,6 +10,7 @@ from PIL import Image, ImageDraw, ImagePalette, ImageShow, UnidentifiedImageErro from .helper import ( assert_image_equal, + assert_image_equal_tofile, assert_image_similar, assert_not_all_same, hopper, @@ -413,8 +414,7 @@ class TestImage: # Assert assert im.size == (512, 512) - with Image.open("Tests/images/effect_mandelbrot.png") as im2: - assert_image_equal(im, im2) + assert_image_equal_tofile(im, "Tests/images/effect_mandelbrot.png") def test_effect_mandelbrot_bad_arguments(self): # Arrange diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index a41d850bb..79ed79042 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -1,6 +1,11 @@ from PIL import Image -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import ( + assert_image_equal, + assert_image_equal_tofile, + assert_image_similar, + hopper, +) def rotate(im, mode, angle, center=None, translate=None): @@ -113,15 +118,13 @@ def test_center(): def test_rotate_no_fill(): im = Image.new("RGB", (100, 100), "green") im = im.rotate(45) - with Image.open("Tests/images/rotate_45_no_fill.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/rotate_45_no_fill.png") def test_rotate_with_fill(): im = Image.new("RGB", (100, 100), "green") im = im.rotate(45, fillcolor="white") - with Image.open("Tests/images/rotate_45_with_fill.png") as target: - assert_image_equal(im, target) + assert_image_equal_tofile(im, "Tests/images/rotate_45_with_fill.png") def test_alpha_rotate_no_fill(): diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index a87c1f2be..9c95ed255 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -6,6 +6,7 @@ from PIL import Image, ImageColor, ImageDraw, ImageFont from .helper import ( assert_image_equal, + assert_image_equal_tofile, assert_image_similar_tofile, hopper, skip_unless_feature, @@ -96,7 +97,7 @@ def test_arc_end_le_start(): draw.arc(BBOX1, start=start, end=end) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_arc_end_le_start.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_arc_end_le_start.png") def test_arc_no_loops(): @@ -174,7 +175,7 @@ def test_arc_high(): draw.arc([110, 10, 189, 189], 20, 150, width=20, fill="white") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_arc_high.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_arc_high.png") def test_bitmap(): @@ -188,7 +189,7 @@ def test_bitmap(): draw.bitmap((10, 10), small) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_bitmap.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_bitmap.png") def helper_chord(mode, bbox, start, end): @@ -247,8 +248,7 @@ def test_chord_zero_width(): draw.chord(BBOX1, 10, 260, fill="red", outline="yellow", width=0) # Assert - with Image.open("Tests/images/imagedraw_chord_zero_width.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/imagedraw_chord_zero_width.png") def test_chord_too_fat(): @@ -260,7 +260,7 @@ def test_chord_too_fat(): draw.chord([-150, -150, 99, 99], 15, 60, width=10, fill="white", outline="red") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_chord_too_fat.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_chord_too_fat.png") def helper_ellipse(mode, bbox): @@ -367,8 +367,7 @@ def test_ellipse_zero_width(): draw.ellipse(BBOX1, fill="green", outline="blue", width=0) # Assert - with Image.open("Tests/images/imagedraw_ellipse_zero_width.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/imagedraw_ellipse_zero_width.png") def ellipse_various_sizes_helper(filled): @@ -395,17 +394,15 @@ def ellipse_various_sizes_helper(filled): def test_ellipse_various_sizes(): im = ellipse_various_sizes_helper(False) - with Image.open("Tests/images/imagedraw_ellipse_various_sizes.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/imagedraw_ellipse_various_sizes.png") def test_ellipse_various_sizes_filled(): im = ellipse_various_sizes_helper(True) - with Image.open( - "Tests/images/imagedraw_ellipse_various_sizes_filled.png" - ) as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile( + im, "Tests/images/imagedraw_ellipse_various_sizes_filled.png" + ) def helper_line(points): @@ -417,7 +414,7 @@ def helper_line(points): draw.line(points, fill="yellow", width=2) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_line.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png") def test_line1(): @@ -446,7 +443,7 @@ def test_shape1(): draw.shape(s, fill=1) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_shape1.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_shape1.png") def test_shape2(): @@ -467,7 +464,7 @@ def test_shape2(): draw.shape(s, outline="blue") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_shape2.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_shape2.png") def helper_pieslice(bbox, start, end): @@ -526,8 +523,7 @@ def test_pieslice_zero_width(): draw.pieslice(BBOX1, 10, 260, fill="white", outline="blue", width=0) # Assert - with Image.open("Tests/images/imagedraw_pieslice_zero_width.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/imagedraw_pieslice_zero_width.png") def test_pieslice_wide(): @@ -539,7 +535,7 @@ def test_pieslice_wide(): draw.pieslice([0, 0, 199, 99], 190, 170, width=10, fill="white", outline="red") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_pieslice_wide.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_pieslice_wide.png") def helper_point(points): @@ -551,7 +547,7 @@ def helper_point(points): draw.point(points, fill="yellow") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_point.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_point.png") def test_point1(): @@ -571,7 +567,7 @@ def helper_polygon(points): draw.polygon(points, fill="red", outline="blue") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_polygon.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon.png") def test_polygon1(): @@ -595,7 +591,7 @@ def test_polygon_kite(): draw.polygon(KITE_POINTS, fill="blue", outline="yellow") # Assert - assert_image_equal(im, Image.open(expected)) + assert_image_equal_tofile(im, expected) def test_polygon_1px_high(): @@ -609,7 +605,7 @@ def test_polygon_1px_high(): draw.polygon([(0, 1), (0, 1), (2, 1), (2, 1)], "#f00") # Assert - assert_image_equal(im, Image.open(expected)) + assert_image_equal_tofile(im, expected) def helper_rectangle(bbox): @@ -621,7 +617,7 @@ def helper_rectangle(bbox): draw.rectangle(bbox, fill="black", outline="green") # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_rectangle.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle.png") def test_rectangle1(): @@ -656,7 +652,7 @@ def test_rectangle_width(): draw.rectangle(BBOX1, outline="green", width=5) # Assert - assert_image_equal(im, Image.open(expected)) + assert_image_equal_tofile(im, expected) def test_rectangle_width_fill(): @@ -669,7 +665,7 @@ def test_rectangle_width_fill(): draw.rectangle(BBOX1, fill="blue", outline="green", width=5) # Assert - assert_image_equal(im, Image.open(expected)) + assert_image_equal_tofile(im, expected) def test_rectangle_zero_width(): @@ -681,8 +677,7 @@ def test_rectangle_zero_width(): draw.rectangle(BBOX1, fill="blue", outline="green", width=0) # Assert - with Image.open("Tests/images/imagedraw_rectangle_zero_width.png") as expected: - assert_image_equal(im, expected) + assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle_zero_width.png") def test_rectangle_I16(): @@ -694,9 +689,7 @@ def test_rectangle_I16(): draw.rectangle(BBOX1, fill="black", outline="green") # Assert - assert_image_equal( - im.convert("I"), Image.open("Tests/images/imagedraw_rectangle_I.png") - ) + assert_image_equal_tofile(im.convert("I"), "Tests/images/imagedraw_rectangle_I.png") def test_floodfill(): @@ -749,7 +742,7 @@ def test_floodfill_border(): ) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_floodfill2.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_floodfill2.png") def test_floodfill_thresh(): @@ -765,7 +758,7 @@ def test_floodfill_thresh(): ImageDraw.floodfill(im, centre_point, ImageColor.getrgb("red"), thresh=30) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_floodfill2.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_floodfill2.png") def test_floodfill_not_negative(): @@ -782,9 +775,7 @@ def test_floodfill_not_negative(): ImageDraw.floodfill(im, (int(W / 4), int(H / 4)), ImageColor.getrgb("red")) # Assert - assert_image_equal( - im, Image.open("Tests/images/imagedraw_floodfill_not_negative.png") - ) + assert_image_equal_tofile(im, "Tests/images/imagedraw_floodfill_not_negative.png") def create_base_image_draw( @@ -816,32 +807,29 @@ def test_square(): def test_triangle_right(): - with Image.open(os.path.join(IMAGES_PATH, "triangle_right.png")) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.polygon([(3, 5), (17, 5), (10, 12)], BLACK) - assert_image_equal(img, expected, "triangle right failed") + img, draw = create_base_image_draw((20, 20)) + draw.polygon([(3, 5), (17, 5), (10, 12)], BLACK) + assert_image_equal_tofile( + img, os.path.join(IMAGES_PATH, "triangle_right.png"), "triangle right failed" + ) def test_line_horizontal(): - with Image.open( - os.path.join(IMAGES_PATH, "line_horizontal_w2px_normal.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 14, 5), BLACK, 2) - assert_image_equal( - img, expected, "line straight horizontal normal 2px wide failed" - ) - with Image.open( - os.path.join(IMAGES_PATH, "line_horizontal_w2px_inverted.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((14, 5, 5, 5), BLACK, 2) - assert_image_equal( - img, expected, "line straight horizontal inverted 2px wide failed" - ) + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 14, 5), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_horizontal_w2px_normal.png"), + "line straight horizontal normal 2px wide failed", + ) + + img, draw = create_base_image_draw((20, 20)) + draw.line((14, 5, 5, 5), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_horizontal_w2px_inverted.png"), + "line straight horizontal inverted 2px wide failed", + ) with Image.open(os.path.join(IMAGES_PATH, "line_horizontal_w3px.png")) as expected: expected.load() img, draw = create_base_image_draw((20, 20)) @@ -854,45 +842,43 @@ def test_line_horizontal(): assert_image_equal( img, expected, "line straight horizontal inverted 3px wide failed" ) - with Image.open( - os.path.join(IMAGES_PATH, "line_horizontal_w101px.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((200, 110)) - draw.line((5, 55, 195, 55), BLACK, 101) - assert_image_equal(img, expected, "line straight horizontal 101px wide failed") + + img, draw = create_base_image_draw((200, 110)) + draw.line((5, 55, 195, 55), BLACK, 101) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_horizontal_w101px.png"), + "line straight horizontal 101px wide failed", + ) def test_line_h_s1_w2(): pytest.skip("failing") - with Image.open( - os.path.join(IMAGES_PATH, "line_horizontal_slope1px_w2px.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 14, 6), BLACK, 2) - assert_image_equal(img, expected, "line horizontal 1px slope 2px wide failed") + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 14, 6), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_horizontal_slope1px_w2px.png"), + "line horizontal 1px slope 2px wide failed", + ) def test_line_vertical(): - with Image.open( - os.path.join(IMAGES_PATH, "line_vertical_w2px_normal.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 5, 14), BLACK, 2) - assert_image_equal( - img, expected, "line straight vertical normal 2px wide failed" - ) - with Image.open( - os.path.join(IMAGES_PATH, "line_vertical_w2px_inverted.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 14, 5, 5), BLACK, 2) - assert_image_equal( - img, expected, "line straight vertical inverted 2px wide failed" - ) + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 5, 14), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_vertical_w2px_normal.png"), + "line straight vertical normal 2px wide failed", + ) + + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 14, 5, 5), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_vertical_w2px_inverted.png"), + "line straight vertical inverted 2px wide failed", + ) with Image.open(os.path.join(IMAGES_PATH, "line_vertical_w3px.png")) as expected: expected.load() img, draw = create_base_image_draw((20, 20)) @@ -905,18 +891,21 @@ def test_line_vertical(): assert_image_equal( img, expected, "line straight vertical inverted 3px wide failed" ) - with Image.open(os.path.join(IMAGES_PATH, "line_vertical_w101px.png")) as expected: - expected.load() - img, draw = create_base_image_draw((110, 200)) - draw.line((55, 5, 55, 195), BLACK, 101) - assert_image_equal(img, expected, "line straight vertical 101px wide failed") - with Image.open( - os.path.join(IMAGES_PATH, "line_vertical_slope1px_w2px.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 6, 14), BLACK, 2) - assert_image_equal(img, expected, "line vertical 1px slope 2px wide failed") + img, draw = create_base_image_draw((110, 200)) + draw.line((55, 5, 55, 195), BLACK, 101) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_vertical_w101px.png"), + "line straight vertical 101px wide failed", + ) + + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 6, 14), BLACK, 2) + assert_image_equal_tofile( + img, + os.path.join(IMAGES_PATH, "line_vertical_slope1px_w2px.png"), + "line vertical 1px slope 2px wide failed", + ) def test_line_oblique_45(): @@ -1185,7 +1174,7 @@ def test_draw_regular_polygon(n_sides, rotation, polygon_name): draw = ImageDraw.Draw(im) bounding_circle = ((W // 2, H // 2), 25) draw.regular_polygon(bounding_circle, n_sides, rotation=rotation, fill="red") - assert_image_equal(im, Image.open(filename)) + assert_image_equal_tofile(im, filename) @pytest.mark.parametrize( diff --git a/Tests/test_imagedraw2.py b/Tests/test_imagedraw2.py index b78dfe85b..2023ba332 100644 --- a/Tests/test_imagedraw2.py +++ b/Tests/test_imagedraw2.py @@ -4,6 +4,7 @@ from PIL import Image, ImageDraw, ImageDraw2 from .helper import ( assert_image_equal, + assert_image_equal_tofile, assert_image_similar, hopper, skip_unless_feature, @@ -95,7 +96,7 @@ def helper_line(points): draw.line(points, pen) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_line.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png") def test_line1_pen(): @@ -118,7 +119,7 @@ def test_line_pen_as_brush(): draw.line(POINTS1, pen, brush) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_line.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png") def helper_polygon(points): @@ -132,7 +133,7 @@ def helper_polygon(points): draw.polygon(points, pen, brush) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_polygon.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon.png") def test_polygon1(): @@ -154,7 +155,7 @@ def helper_rectangle(bbox): draw.rectangle(bbox, pen, brush) # Assert - assert_image_equal(im, Image.open("Tests/images/imagedraw_rectangle.png")) + assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle.png") def test_rectangle1(): diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0c219fed1..b67adc60f 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -423,15 +423,12 @@ class TestImageFont: im = Image.new(mode="RGB", size=(300, 100)) draw = ImageDraw.Draw(im) - target = "Tests/images/default_font.png" - with Image.open(target) as target_img: + # Act + default_font = ImageFont.load_default() + draw.text((10, 10), txt, font=default_font) - # Act - default_font = ImageFont.load_default() - draw.text((10, 10), txt, font=default_font) - - # Assert - assert_image_equal(im, target_img) + # Assert + assert_image_equal_tofile(im, "Tests/images/default_font.png") def test_getsize_empty(self): # issue #2614 diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index 087c39e01..eb41d2d08 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -3,7 +3,7 @@ import pytest from PIL import Image, ImageMorph, _imagingmorph -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal_tofile, hopper def string_to_img(image_string): @@ -57,8 +57,7 @@ def assert_img_equal_img_string(A, Bstring): def test_str_to_img(): - with Image.open("Tests/images/morph_a.png") as im: - assert_image_equal(A, im) + assert_image_equal_tofile(A, "Tests/images/morph_a.png") def create_lut(): diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index a2b0d2b02..0ea2472a9 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -2,7 +2,7 @@ import pytest from PIL import Image, ImagePalette -from .helper import assert_image_equal +from .helper import assert_image_equal_tofile def test_sanity(): @@ -141,8 +141,7 @@ def test_2bit_palette(tmp_path): img.putpalette(b"\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF") # RGB img.save(outfile, format="PNG") - with Image.open(outfile) as reloaded: - assert_image_equal(img, reloaded) + assert_image_equal_tofile(img, outfile) def test_invalid_palette(): diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index 1a2bfd71e..2a6b29abe 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -1,8 +1,8 @@ import pytest -from PIL import Image, ImageQt +from PIL import ImageQt -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper pytestmark = pytest.mark.skipif( not ImageQt.qt_is_installed, reason="Qt bindings are not installed" @@ -40,5 +40,4 @@ def test_sanity(tmp_path): data.save(tempfile) # Check that it actually worked. - with Image.open(tempfile) as reloaded: - assert_image_equal(reloaded, src) + assert_image_equal_tofile(src, tempfile) From 3495b319bdb381319421aba17931ca9b584654ac Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Feb 2021 22:22:29 +1100 Subject: [PATCH 311/750] Replaced various instances of assert_image_similar with assert_image_similar_tofile --- Tests/test_file_eps.py | 12 ++++-- Tests/test_file_icns.py | 5 +-- Tests/test_file_jpeg.py | 5 ++- Tests/test_file_jpeg2k.py | 17 +++----- Tests/test_file_libtiff.py | 6 +-- Tests/test_file_webp_alpha.py | 10 +++-- Tests/test_file_wmf.py | 13 ++---- Tests/test_font_pcf.py | 8 ++-- Tests/test_font_pcf_charsets.py | 5 +-- Tests/test_image.py | 8 ++-- Tests/test_imagecms.py | 11 +++-- Tests/test_imagedraw2.py | 10 ++--- Tests/test_imagefont.py | 76 ++++++++++++--------------------- Tests/test_imagefontctl.py | 53 ++++++++--------------- Tests/test_imageops.py | 8 ++-- 15 files changed, 105 insertions(+), 142 deletions(-) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 1e56498ba..ea91375da 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -4,7 +4,12 @@ import pytest from PIL import EpsImagePlugin, Image, features -from .helper import assert_image_similar, hopper, skip_unless_feature +from .helper import ( + assert_image_similar, + assert_image_similar_tofile, + hopper, + skip_unless_feature, +) HAS_GHOSTSCRIPT = EpsImagePlugin.has_ghostscript() @@ -72,8 +77,9 @@ def test_cmyk(): assert cmyk_image.mode == "RGB" if features.check("jpg"): - with Image.open("Tests/images/pil_sample_rgb.jpg") as target: - assert_image_similar(cmyk_image, target, 10) + assert_image_similar_tofile( + cmyk_image, "Tests/images/pil_sample_rgb.jpg", 10 + ) @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available") diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 37898d0bd..fef2329bc 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -5,7 +5,7 @@ import pytest from PIL import IcnsImagePlugin, Image, features -from .helper import assert_image_equal, assert_image_similar +from .helper import assert_image_equal, assert_image_similar_tofile # sample icon file TEST_FILE = "Tests/images/pillow.icns" @@ -49,8 +49,7 @@ def test_save_append_images(tmp_path): with Image.open(TEST_FILE) as im: im.save(temp_file, append_images=[provided_im]) - with Image.open(temp_file) as reread: - assert_image_similar(reread, im, 1) + assert_image_similar_tofile(im, temp_file, 1) with Image.open(temp_file) as reread: reread.size = (16, 16, 2) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 0dabd98f8..740f9fa4d 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -19,6 +19,7 @@ from .helper import ( assert_image_equal, assert_image_equal_tofile, assert_image_similar, + assert_image_similar_tofile, cjpeg_available, djpeg_available, hopper, @@ -578,7 +579,7 @@ class TestFileJpeg: def test_load_djpeg(self): with Image.open(TEST_FILE) as img: img.load_djpeg() - assert_image_similar(img, Image.open(TEST_FILE), 5) + assert_image_similar_tofile(img, TEST_FILE, 5) @pytest.mark.skipif(not cjpeg_available(), reason="cjpeg not available") def test_save_cjpeg(self, tmp_path): @@ -586,7 +587,7 @@ class TestFileJpeg: tempfile = str(tmp_path / "temp.jpg") JpegImagePlugin._save_cjpeg(img, 0, tempfile) # Default save quality is 75%, so a tiny bit of difference is alright - assert_image_similar(img, Image.open(tempfile), 17) + assert_image_similar_tofile(img, tempfile, 17) def test_no_duplicate_0x1001_tag(self): # Arrange diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index e22cff087..13ae09af5 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -8,6 +8,7 @@ from PIL import Image, ImageFile, Jpeg2KImagePlugin, features from .helper import ( assert_image_equal, assert_image_similar, + assert_image_similar_tofile, is_big_endian, skip_unless_feature, ) @@ -62,9 +63,7 @@ def test_invalid_file(): def test_bytesio(): with open("Tests/images/test-card-lossless.jp2", "rb") as f: data = BytesIO(f.read()) - with Image.open(data) as im: - im.load() - assert_image_similar(im, test_card, 1.0e-3) + assert_image_similar_tofile(test_card, data, 1.0e-3) # These two test pre-written JPEG 2000 files that were not written with @@ -80,9 +79,9 @@ def test_lossless(tmp_path): def test_lossy_tiled(): - with Image.open("Tests/images/test-card-lossy-tiled.jp2") as im: - im.load() - assert_image_similar(im, test_card, 2.0) + assert_image_similar_tofile( + test_card, "Tests/images/test-card-lossy-tiled.jp2", 2.0 + ) def test_lossless_rt(): @@ -193,15 +192,13 @@ def test_16bit_monochrome_has_correct_mode(): @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_16bit_monochrome_jp2_like_tiff(): with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: - with Image.open("Tests/images/16bit.cropped.jp2") as jp2: - assert_image_similar(jp2, tiff_16bit, 1e-3) + assert_image_similar_tofile(tiff_16bit, "Tests/images/16bit.cropped.jp2", 1e-3) @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_16bit_monochrome_j2k_like_tiff(): with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: - with Image.open("Tests/images/16bit.cropped.j2k") as j2k: - assert_image_similar(j2k, tiff_16bit, 1e-3) + assert_image_similar_tofile(tiff_16bit, "Tests/images/16bit.cropped.j2k", 1e-3) def test_16bit_j2k_roundtrips(): diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c1eb7fb74..7a5a5b462 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -457,8 +457,7 @@ class TestFileLibTiff(LibTiffTestCase): im.save(out, compression="jpeg", quality=30) size_jpeg_30 = os.path.getsize(out) - with Image.open(out) as im3: - assert_image_similar(im2, im3, 30) + assert_image_similar_tofile(im2, out, 30) assert size_raw > size_compressed assert size_compressed > size_jpeg @@ -642,8 +641,7 @@ class TestFileLibTiff(LibTiffTestCase): pilim.save(buffer_io, format="tiff", compression=compression) buffer_io.seek(0) - with Image.open(buffer_io) as pilim_load: - assert_image_similar(pilim, pilim_load, 0) + assert_image_similar_tofile(pilim, buffer_io, 0) save_bytesio() save_bytesio("raw") diff --git a/Tests/test_file_webp_alpha.py b/Tests/test_file_webp_alpha.py index 362edac1a..dc82fb742 100644 --- a/Tests/test_file_webp_alpha.py +++ b/Tests/test_file_webp_alpha.py @@ -2,7 +2,12 @@ import pytest from PIL import Image -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import ( + assert_image_equal, + assert_image_similar, + assert_image_similar_tofile, + hopper, +) _webp = pytest.importorskip("PIL._webp", reason="WebP support not installed") @@ -29,8 +34,7 @@ def test_read_rgba(): image.tobytes() - with Image.open("Tests/images/transparent.png") as target: - assert_image_similar(image, target, 20.0) + assert_image_similar_tofile(image, "Tests/images/transparent.png", 20.0) def test_write_lossless_rgb(tmp_path): diff --git a/Tests/test_file_wmf.py b/Tests/test_file_wmf.py index d18225680..bf9d105e5 100644 --- a/Tests/test_file_wmf.py +++ b/Tests/test_file_wmf.py @@ -2,7 +2,7 @@ import pytest from PIL import Image, WmfImagePlugin -from .helper import assert_image_similar, hopper +from .helper import assert_image_similar_tofile, hopper def test_load_raw(): @@ -13,9 +13,7 @@ def test_load_raw(): # Currently, support for WMF/EMF is Windows-only im.load() # Compare to reference rendering - with Image.open("Tests/images/drawing_emf_ref.png") as imref: - imref.load() - assert_image_similar(im, imref, 0) + assert_image_similar_tofile(im, "Tests/images/drawing_emf_ref.png", 0) # Test basic WMF open and rendering with Image.open("Tests/images/drawing.wmf") as im: @@ -23,9 +21,7 @@ def test_load_raw(): # Currently, support for WMF/EMF is Windows-only im.load() # Compare to reference rendering - with Image.open("Tests/images/drawing_wmf_ref.png") as imref: - imref.load() - assert_image_similar(im, imref, 2.0) + assert_image_similar_tofile(im, "Tests/images/drawing_wmf_ref.png", 2.0) def test_register_handler(tmp_path): @@ -66,8 +62,7 @@ def test_load_set_dpi(): im.load(144) assert im.size == (164, 164) - with Image.open("Tests/images/drawing_wmf_ref_144.png") as expected: - assert_image_similar(im, expected, 2.1) + assert_image_similar_tofile(im, "Tests/images/drawing_wmf_ref_144.png", 2.1) def test_save(tmp_path): diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 4814a8561..288848f26 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -6,7 +6,7 @@ from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile from .helper import ( assert_image_equal_tofile, - assert_image_similar, + assert_image_similar_tofile, skip_unless_feature, ) @@ -61,8 +61,7 @@ def test_draw(request, tmp_path): im = Image.new("L", (130, 30), "white") draw = ImageDraw.Draw(im) draw.text((0, 0), message, "black", font=font) - with Image.open("Tests/images/test_draw_pbm_target.png") as target: - assert_image_similar(im, target, 0) + assert_image_similar_tofile(im, "Tests/images/test_draw_pbm_target.png", 0) def test_textsize(request, tmp_path): @@ -83,8 +82,7 @@ def _test_high_characters(request, tmp_path, message): im = Image.new("L", (750, 30), "white") draw = ImageDraw.Draw(im) draw.text((0, 0), message, "black", font=font) - with Image.open("Tests/images/high_ascii_chars.png") as target: - assert_image_similar(im, target, 0) + assert_image_similar_tofile(im, "Tests/images/high_ascii_chars.png", 0) def test_high_characters(request, tmp_path): diff --git a/Tests/test_font_pcf_charsets.py b/Tests/test_font_pcf_charsets.py index 4ada6b51b..a1036fd28 100644 --- a/Tests/test_font_pcf_charsets.py +++ b/Tests/test_font_pcf_charsets.py @@ -4,7 +4,7 @@ from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile from .helper import ( assert_image_equal_tofile, - assert_image_similar, + assert_image_similar_tofile, skip_unless_feature, ) @@ -82,8 +82,7 @@ def _test_draw(request, tmp_path, encoding): draw = ImageDraw.Draw(im) message = charsets[encoding]["message"].encode(encoding) draw.text((0, 0), message, "black", font=font) - with Image.open(charsets[encoding]["image1"]) as target: - assert_image_similar(im, target, 0) + assert_image_similar_tofile(im, charsets[encoding]["image1"], 0) def test_draw_iso8859_1(request, tmp_path): diff --git a/Tests/test_image.py b/Tests/test_image.py index e9780b846..73cf7bf83 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -11,7 +11,7 @@ from PIL import Image, ImageDraw, ImagePalette, ImageShow, UnidentifiedImageErro from .helper import ( assert_image_equal, assert_image_equal_tofile, - assert_image_similar, + assert_image_similar_tofile, assert_not_all_same, hopper, is_win32, @@ -172,8 +172,7 @@ class TestImage: with tempfile.TemporaryFile() as fp: im.save(fp, "JPEG") fp.seek(0) - with Image.open(fp) as reloaded: - assert_image_similar(im, reloaded, 20) + assert_image_similar_tofile(im, fp, 20) def test_unknown_extension(self, tmp_path): im = hopper() @@ -456,8 +455,7 @@ class TestImage: # Assert assert im.size == (128, 128) - with Image.open("Tests/images/effect_spread.png") as im3: - assert_image_similar(im2, im3, 110) + assert_image_similar_tofile(im2, "Tests/images/effect_spread.png", 110) def test_effect_spread_zero(self): # Arrange diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 9fab41746..99f3b4e03 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -8,7 +8,13 @@ import pytest from PIL import Image, ImageMode, features -from .helper import assert_image, assert_image_equal, assert_image_similar, hopper +from .helper import ( + assert_image, + assert_image_equal, + assert_image_similar, + assert_image_similar_tofile, + hopper, +) try: from PIL import ImageCms @@ -240,8 +246,7 @@ def test_lab_color(): # i.save('temp.lab.tif') # visually verified vs PS. - with Image.open("Tests/images/hopper.Lab.tif") as target: - assert_image_similar(i, target, 3.5) + assert_image_similar_tofile(i, "Tests/images/hopper.Lab.tif", 3.5) def test_lab_srgb(): diff --git a/Tests/test_imagedraw2.py b/Tests/test_imagedraw2.py index 2023ba332..3a70176ce 100644 --- a/Tests/test_imagedraw2.py +++ b/Tests/test_imagedraw2.py @@ -5,7 +5,7 @@ from PIL import Image, ImageDraw, ImageDraw2 from .helper import ( assert_image_equal, assert_image_equal_tofile, - assert_image_similar, + assert_image_similar_tofile, hopper, skip_unless_feature, ) @@ -62,7 +62,7 @@ def helper_ellipse(mode, bbox): draw.ellipse(bbox, pen, brush) # Assert - assert_image_similar(im, Image.open(expected), 1) + assert_image_similar_tofile(im, expected, 1) def test_ellipse1(): @@ -83,7 +83,7 @@ def test_ellipse_edge(): draw.ellipse(((0, 0), (W - 1, H - 1)), brush) # Assert - assert_image_similar(im, Image.open("Tests/images/imagedraw_ellipse_edge.png"), 1) + assert_image_similar_tofile(im, "Tests/images/imagedraw_ellipse_edge.png", 1) def helper_line(points): @@ -179,7 +179,7 @@ def test_big_rectangle(): draw.rectangle(bbox, brush) # Assert - assert_image_similar(im, Image.open(expected), 1) + assert_image_similar_tofile(im, expected, 1) @skip_unless_feature("freetype2") @@ -194,7 +194,7 @@ def test_text(): draw.text((5, 5), "ImageDraw2", font) # Assert - assert_image_similar(im, Image.open(expected), 13) + assert_image_similar_tofile(im, expected, 13) @skip_unless_feature("freetype2") diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index b67adc60f..5d611a27f 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -13,7 +13,6 @@ from PIL import Image, ImageDraw, ImageFont, features from .helper import ( assert_image_equal, assert_image_equal_tofile, - assert_image_similar, assert_image_similar_tofile, is_win32, skip_unless_feature, @@ -130,8 +129,7 @@ class TestImageFont: draw.text((10, 10), txt, font=ttf) target = "Tests/images/transparent_background_text.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 4.09) + assert_image_similar_tofile(im, target, 4.09) def test_textsize_equal(self): im = Image.new(mode="RGB", size=(300, 100)) @@ -143,11 +141,10 @@ class TestImageFont: draw.text((10, 10), txt, font=ttf) draw.rectangle((10, 10, 10 + size[0], 10 + size[1])) - target = "Tests/images/rectangle_surrounding_text.png" - with Image.open(target) as target_img: - - # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, 2.5) + # Epsilon ~.5 fails with FreeType 2.7 + assert_image_similar_tofile( + im, "Tests/images/rectangle_surrounding_text.png", 2.5 + ) @pytest.mark.parametrize( "text, mode, font, size, length_basic, length_raqm", @@ -191,13 +188,10 @@ class TestImageFont: draw.text((0, y), line, font=ttf) y += line_spacing - target = "Tests/images/multiline_text.png" - with Image.open(target) as target_img: - - # some versions of freetype have different horizontal spacing. - # setting a tight epsilon, I'm showing the original test failure - # at epsilon = ~38. - assert_image_similar(im, target_img, 6.2) + # some versions of freetype have different horizontal spacing. + # setting a tight epsilon, I'm showing the original test failure + # at epsilon = ~38. + assert_image_similar_tofile(im, "Tests/images/multiline_text.png", 6.2) def test_render_multiline_text(self): ttf = self.get_font() @@ -208,11 +202,8 @@ class TestImageFont: draw = ImageDraw.Draw(im) draw.text((0, 0), TEST_TEXT, font=ttf) - target = "Tests/images/multiline_text.png" - with Image.open(target) as target_img: - - # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, 6.2) + # Epsilon ~.5 fails with FreeType 2.7 + assert_image_similar_tofile(im, "Tests/images/multiline_text.png", 6.2) # Test that text() can pass on additional arguments # to multiline_text() @@ -227,11 +218,10 @@ class TestImageFont: draw = ImageDraw.Draw(im) draw.multiline_text((0, 0), TEST_TEXT, font=ttf, align=align) - target = "Tests/images/multiline_text" + ext + ".png" - with Image.open(target) as target_img: - - # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, 6.2) + # Epsilon ~.5 fails with FreeType 2.7 + assert_image_similar_tofile( + im, "Tests/images/multiline_text" + ext + ".png", 6.2 + ) def test_unknown_align(self): im = Image.new(mode="RGB", size=(300, 100)) @@ -285,11 +275,8 @@ class TestImageFont: draw = ImageDraw.Draw(im) draw.multiline_text((0, 0), TEST_TEXT, font=ttf, spacing=10) - target = "Tests/images/multiline_text_spacing.png" - with Image.open(target) as target_img: - - # Epsilon ~.5 fails with FreeType 2.7 - assert_image_similar(im, target_img, 6.2) + # Epsilon ~.5 fails with FreeType 2.7 + assert_image_similar_tofile(im, "Tests/images/multiline_text_spacing.png", 6.2) def test_rotated_transposed_font(self): img_grey = Image.new("L", (100, 100)) @@ -677,13 +664,11 @@ class TestImageFont: d.text((10, 10), "Text", font=font, fill="black") try: - with Image.open(path) as expected: - assert_image_similar(im, expected, epsilon) + assert_image_similar_tofile(im, path, epsilon) except AssertionError: if "_adobe" in path: path = path.replace("_adobe", "_adobe_older_harfbuzz") - with Image.open(path) as expected: - assert_image_similar(im, expected, epsilon) + assert_image_similar_tofile(im, path, epsilon) else: raise @@ -774,8 +759,7 @@ class TestImageFont: assert d.textbbox((0, 0), text, f, anchor=anchor) == bbox_expected - with Image.open(path) as expected: - assert_image_similar(im, expected, 7) + assert_image_similar_tofile(im, path, 7) @pytest.mark.parametrize( "anchor, align", @@ -813,8 +797,7 @@ class TestImageFont: (300, 200), text, fill="black", anchor=anchor, font=f, align=align ) - with Image.open(target) as expected: - assert_image_similar(im, expected, 4) + assert_image_similar_tofile(im, target, 4) def test_anchor_invalid(self): font = self.get_font() @@ -872,8 +855,7 @@ class TestImageFont: d = ImageDraw.Draw(im) d.text((10, 10), txt, font=ttf, fill="#fa6", embedded_color=True) - with Image.open("Tests/images/standard_embedded.png") as expected: - assert_image_similar(im, expected, 6.2) + assert_image_similar_tofile(im, "Tests/images/standard_embedded.png", 6.2) @skip_unless_feature_version("freetype2", "2.5.0") def test_cbdt(self): @@ -889,8 +871,7 @@ class TestImageFont: d.text((10, 10), "\U0001f469", embedded_color=True, font=font) - with Image.open("Tests/images/cbdt_notocoloremoji.png") as expected: - assert_image_similar(im, expected, 6.2) + assert_image_similar_tofile(im, "Tests/images/cbdt_notocoloremoji.png", 6.2) except IOError as e: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") @@ -909,8 +890,9 @@ class TestImageFont: d.text((10, 10), "\U0001f469", "black", font=font) - with Image.open("Tests/images/cbdt_notocoloremoji_mask.png") as expected: - assert_image_similar(im, expected, 6.2) + assert_image_similar_tofile( + im, "Tests/images/cbdt_notocoloremoji_mask.png", 6.2 + ) except IOError as e: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") @@ -928,8 +910,7 @@ class TestImageFont: d.text((15, 5), "Bungee", embedded_color=True, font=font) - with Image.open("Tests/images/colr_bungee.png") as expected: - assert_image_similar(im, expected, 21) + assert_image_similar_tofile(im, "Tests/images/colr_bungee.png", 21) @skip_unless_feature_version("freetype2", "2.10.0") def test_colr_mask(self): @@ -944,8 +925,7 @@ class TestImageFont: d.text((15, 5), "Bungee", "black", font=font) - with Image.open("Tests/images/colr_bungee_mask.png") as expected: - assert_image_similar(im, expected, 22) + assert_image_similar_tofile(im, "Tests/images/colr_bungee_mask.png", 22) @skip_unless_feature("raqm") diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 82e2b4ebc..655b7662a 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -4,7 +4,7 @@ from packaging.version import parse as parse_version from PIL import Image, ImageDraw, ImageFont, features from .helper import ( - assert_image_similar, + assert_image_similar_tofile, skip_unless_feature, skip_unless_feature_version, ) @@ -31,8 +31,7 @@ def test_complex_text(): draw.text((0, 0), "اهلا عمان", font=ttf, fill=500) target = "Tests/images/test_text.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_y_offset(): @@ -43,8 +42,7 @@ def test_y_offset(): draw.text((0, 0), "العالم العربي", font=ttf, fill=500) target = "Tests/images/test_y_offset.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 1.7) + assert_image_similar_tofile(im, target, 1.7) def test_complex_unicode_text(): @@ -55,8 +53,7 @@ def test_complex_unicode_text(): draw.text((0, 0), "السلام عليكم", font=ttf, fill=500) target = "Tests/images/test_complex_unicode_text.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) ttf = ImageFont.truetype("Tests/fonts/KhmerOSBattambang-Regular.ttf", FONT_SIZE) @@ -65,8 +62,7 @@ def test_complex_unicode_text(): draw.text((0, 0), "លោកុប្បត្តិ", font=ttf, fill=500) target = "Tests/images/test_complex_unicode_text2.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 2.33) + assert_image_similar_tofile(im, target, 2.33) def test_text_direction_rtl(): @@ -77,8 +73,7 @@ def test_text_direction_rtl(): draw.text((0, 0), "English عربي", font=ttf, fill=500, direction="rtl") target = "Tests/images/test_direction_rtl.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_text_direction_ltr(): @@ -89,8 +84,7 @@ def test_text_direction_ltr(): draw.text((0, 0), "سلطنة عمان Oman", font=ttf, fill=500, direction="ltr") target = "Tests/images/test_direction_ltr.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_text_direction_rtl2(): @@ -101,8 +95,7 @@ def test_text_direction_rtl2(): draw.text((0, 0), "Oman سلطنة عمان", font=ttf, fill=500, direction="rtl") target = "Tests/images/test_direction_ltr.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_text_direction_ttb(): @@ -117,8 +110,7 @@ def test_text_direction_ttb(): pytest.skip("libraqm 0.7 or greater not available") target = "Tests/images/test_direction_ttb.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 2.8) + assert_image_similar_tofile(im, target, 2.8) def test_text_direction_ttb_stroke(): @@ -141,8 +133,7 @@ def test_text_direction_ttb_stroke(): pytest.skip("libraqm 0.7 or greater not available") target = "Tests/images/test_direction_ttb_stroke.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 19.4) + assert_image_similar_tofile(im, target, 19.4) def test_ligature_features(): @@ -152,8 +143,7 @@ def test_ligature_features(): draw = ImageDraw.Draw(im) draw.text((0, 0), "filling", font=ttf, fill=500, features=["-liga"]) target = "Tests/images/test_ligature_features.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) liga_size = ttf.getsize("fi", features=["-liga"]) assert liga_size == (13, 19) @@ -167,8 +157,7 @@ def test_kerning_features(): draw.text((0, 0), "TeToAV", font=ttf, fill=500, features=["-kern"]) target = "Tests/images/test_kerning_features.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_arabictext_features(): @@ -185,8 +174,7 @@ def test_arabictext_features(): ) target = "Tests/images/test_arabictext_features.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_x_max_and_y_offset(): @@ -197,8 +185,7 @@ def test_x_max_and_y_offset(): draw.text((0, 0), "لح", font=ttf, fill=500) target = "Tests/images/test_x_max_and_y_offset.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) def test_language(): @@ -209,8 +196,7 @@ def test_language(): draw.text((0, 0), "абвг", font=ttf, fill=500, language="sr") target = "Tests/images/test_language.png" - with Image.open(target) as target_img: - assert_image_similar(im, target_img, 0.5) + assert_image_similar_tofile(im, target, 0.5) @pytest.mark.parametrize("mode", ("L", "1")) @@ -287,8 +273,7 @@ def test_anchor_ttb(anchor): if str(ex) == "libraqm 0.7 or greater required for 'ttb' direction": pytest.skip("libraqm 0.7 or greater not available") - with Image.open(path) as expected: - assert_image_similar(im, expected, 1) # fails at 5 + assert_image_similar_tofile(im, path, 1) # fails at 5 combine_tests = ( @@ -351,8 +336,7 @@ def test_combine(name, text, dir, anchor, epsilon): if str(ex) == "libraqm 0.7 or greater required for 'ttb' direction": pytest.skip("libraqm 0.7 or greater not available") - with Image.open(path) as expected: - assert_image_similar(im, expected, epsilon) + assert_image_similar_tofile(im, path, epsilon) @pytest.mark.parametrize( @@ -384,8 +368,7 @@ def test_combine_multiline(anchor, align): d.rectangle(bbox, outline="red") d.multiline_text((200, 200), text, fill="black", anchor=anchor, font=f, align=align) - with Image.open(path) as expected: - assert_image_similar(im, expected, 0.015) + assert_image_similar_tofile(im, path, 0.015) def test_anchor_invalid_ttb(): diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index f17bfdd2f..33489bd13 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -5,6 +5,7 @@ from PIL import Image, ImageDraw, ImageOps, ImageStat, features from .helper import ( assert_image_equal, assert_image_similar, + assert_image_similar_tofile, assert_tuple_approx_equal, hopper, ) @@ -112,10 +113,9 @@ def test_pad(): new_im = ImageOps.pad(im, new_size, color=color, centering=centering) assert new_im.size == new_size - with Image.open( - "Tests/images/imageops_pad_" + label + "_" + str(i) + ".jpg" - ) as target: - assert_image_similar(new_im, target, 6) + assert_image_similar_tofile( + new_im, "Tests/images/imageops_pad_" + label + "_" + str(i) + ".jpg", 6 + ) def test_pil163(): From faf8fad76d5f4a2ec9a41bc92fad106b35a613f1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Oct 2020 20:35:45 +1100 Subject: [PATCH 312/750] Stopped flattening EXIF IFD into getexif() --- Tests/test_image.py | 24 +++--- src/PIL/Image.py | 168 ++++++++++++++++++++----------------- src/PIL/JpegImagePlugin.py | 2 +- src/PIL/MpoImagePlugin.py | 2 +- src/PIL/PngImagePlugin.py | 2 +- src/PIL/WebPImagePlugin.py | 2 +- 6 files changed, 106 insertions(+), 94 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 73cf7bf83..3d0804950 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -663,43 +663,43 @@ class TestImage: exif = im.getexif() assert 258 not in exif assert 274 in exif - assert 40960 in exif - assert exif[40963] == 450 + assert 282 in exif + assert exif[296] == 2 assert exif[11] == "gThumb 3.0.1" out = str(tmp_path / "temp.jpg") exif[258] = 8 del exif[274] - del exif[40960] - exif[40963] = 455 + del exif[282] + exif[296] = 455 exif[11] = "Pillow test" im.save(out, exif=exif) with Image.open(out) as reloaded: reloaded_exif = reloaded.getexif() assert reloaded_exif[258] == 8 assert 274 not in reloaded_exif - assert 40960 not in reloaded_exif - assert reloaded_exif[40963] == 455 + assert 282 not in reloaded_exif + assert reloaded_exif[296] == 455 assert reloaded_exif[11] == "Pillow test" with Image.open("Tests/images/no-dpi-in-exif.jpg") as im: # Big endian exif = im.getexif() assert 258 not in exif - assert 40962 in exif - assert exif[40963] == 200 + assert 306 in exif + assert exif[274] == 1 assert exif[305] == "Adobe Photoshop CC 2017 (Macintosh)" out = str(tmp_path / "temp.jpg") exif[258] = 8 - del exif[34665] - exif[40963] = 455 + del exif[306] + exif[274] = 455 exif[305] = "Pillow test" im.save(out, exif=exif) with Image.open(out) as reloaded: reloaded_exif = reloaded.getexif() assert reloaded_exif[258] == 8 - assert 34665 not in reloaded_exif - assert reloaded_exif[40963] == 455 + assert 306 not in reloaded_exif + assert reloaded_exif[274] == 455 assert reloaded_exif[305] == "Pillow test" @skip_unless_feature("webp") diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 01fe7ed1b..354dbbed7 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3309,11 +3309,11 @@ class Exif(MutableMapping): # returns a dict with any single item tuples/lists as individual values return {k: self._fixup(v) for k, v in src_dict.items()} - def _get_ifd_dict(self, tag): + def _get_ifd_dict(self, offset): try: # an offset pointer to the location of the nested embedded IFD. # It should be a long, but may be corrupted. - self.fp.seek(self[tag]) + self.fp.seek(offset) except (KeyError, TypeError): pass else: @@ -3351,11 +3351,16 @@ class Exif(MutableMapping): self.fp.seek(self._info.next) self._info.load(self.fp) + def _get_merged_dict(self): + merged_dict = dict(self) + # get EXIF extension - ifd = self._get_ifd_dict(0x8769) - if ifd: - self._data.update(ifd) - self._ifds[0x8769] = ifd + if 0x8769 in self: + ifd = self._get_ifd_dict(self[0x8769]) + if ifd: + merged_dict.update(ifd) + + return merged_dict def tobytes(self, offset=8): from . import TiffImagePlugin @@ -3370,87 +3375,94 @@ class Exif(MutableMapping): return b"Exif\x00\x00" + head + ifd.tobytes(offset) def get_ifd(self, tag): - if tag not in self._ifds and tag in self: - if tag in [0x8825, 0xA005]: - # gpsinfo, interop - self._ifds[tag] = self._get_ifd_dict(tag) - elif tag == 0x927C: # makernote - from .TiffImagePlugin import ImageFileDirectory_v2 + if tag not in self._ifds: + if tag in [0x8769, 0x8825]: + # exif, gpsinfo + if tag in self: + self._ifds[tag] = self._get_ifd_dict(self[tag]) + elif tag in [0xA005, 0x927C]: + # interop, makernote + if 0x8769 not in self._ifds: + self.get_ifd(0x8769) + tag_data = self._ifds[0x8769][tag] + if tag == 0x927C: + from .TiffImagePlugin import ImageFileDirectory_v2 - if self[0x927C][:8] == b"FUJIFILM": - exif_data = self[0x927C] - ifd_offset = i32le(exif_data, 8) - ifd_data = exif_data[ifd_offset:] + if self._ifds[0x8769][tag][:8] == b"FUJIFILM": + ifd_offset = i32le(tag_data, 8) + ifd_data = tag_data[ifd_offset:] - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack(" 4: + (offset,) = struct.unpack("H", ifd_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", ifd_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo = {"ModelID": self.fp.read(4)} - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False + makernote[ifd_tag] = handler( + ImageFileDirectory_v2(), data, False ) + self._ifds[tag] = dict(self._fixup_dict(makernote)) + elif self.get(0x010F) == "Nintendo": + makernote = {} + for i in range(0, struct.unpack(">H", tag_data[:2])[0]): + ifd_tag, typ, count, data = struct.unpack( + ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] + ) + if ifd_tag == 0x1101: + # CameraInfo + (offset,) = struct.unpack(">L", data) + self.fp.seek(offset) - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) + camerainfo = {"ModelID": self.fp.read(4)} - makernote = {0x1101: dict(self._fixup_dict(camerainfo))} - self._ifds[0x927C] = makernote + self.fp.read(4) + # Seconds since 2000 + camerainfo["TimeStamp"] = i32le(self.fp.read(12)) + + self.fp.read(4) + camerainfo["InternalSerialNumber"] = self.fp.read(4) + + self.fp.read(12) + parallax = self.fp.read(4) + handler = ImageFileDirectory_v2._load_dispatch[ + TiffTags.FLOAT + ][1] + camerainfo["Parallax"] = handler( + ImageFileDirectory_v2(), parallax, False + ) + + self.fp.read(4) + camerainfo["Category"] = self.fp.read(2) + + makernote = {0x1101: dict(self._fixup_dict(camerainfo))} + self._ifds[tag] = makernote + else: + # gpsinfo, interop + self._ifds[tag] = self._get_ifd_dict(tag_data) return self._ifds.get(tag, {}) def __str__(self): diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 054495e6f..ad260acbd 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -478,7 +478,7 @@ class JpegImageFile(ImageFile.ImageFile): def _getexif(self): if "exif" not in self.info: return None - return dict(self.getexif()) + return self.getexif()._get_merged_dict() def _getmp(self): diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index 575cc9c8e..8b49d10e5 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -82,7 +82,7 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): n = i16(self.fp.read(2)) - 2 self.info["exif"] = ImageFile._safe_read(self.fp, n) - exif = self.getexif() + exif = self.getexif().get_ifd(0x8769) if 40962 in exif and 40963 in exif: self._size = (exif[40962], exif[40963]) elif "exif" in self.info: diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 2d4ac7606..30eb13aa3 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -968,7 +968,7 @@ class PngImageFile(ImageFile.ImageFile): self.load() if "exif" not in self.info and "Raw profile type exif" not in self.info: return None - return dict(self.getexif()) + return self.getexif()._get_merged_dict() def getexif(self): if "exif" not in self.info: diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 2e9746fa3..bc12ce4be 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -96,7 +96,7 @@ class WebPImageFile(ImageFile.ImageFile): def _getexif(self): if "exif" not in self.info: return None - return dict(self.getexif()) + return self.getexif()._get_merged_dict() def seek(self, frame): if not self._seek_check(frame): From 4b14f0102d8fa585c900ff8a174defb2452c042b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Oct 2020 20:16:48 +1100 Subject: [PATCH 313/750] Save base IFDs when converting Exif to bytes --- Tests/test_image.py | 8 ++++++++ src/PIL/Image.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Tests/test_image.py b/Tests/test_image.py index 3d0804950..b1db41235 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -752,6 +752,14 @@ class TestImage: 4098: 1704, } + def test_exif_ifd(self): + im = Image.open("Tests/images/flower.jpg") + exif = im.getexif() + + reloaded_exif = Image.Exif() + reloaded_exif.load(exif.tobytes()) + assert reloaded_exif.get_ifd(0x8769) == exif.get_ifd(0x8769) + @pytest.mark.parametrize( "test_module", [PIL, Image], diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 354dbbed7..73eef3d81 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3371,6 +3371,8 @@ class Exif(MutableMapping): head = b"MM\x00\x2A\x00\x00\x00\x08" ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) for tag, value in self.items(): + if tag in [0x8769, 0x8225] and not isinstance(value, dict): + value = self.get_ifd(tag) ifd[tag] = value return b"Exif\x00\x00" + head + ifd.tobytes(offset) From b25bc400093283104e7eeb232074795f2e2cdb8e Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 7 Oct 2020 18:35:16 +1100 Subject: [PATCH 314/750] Simplified code Co-authored-by: Konstantin Kopachev --- src/PIL/Image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 73eef3d81..d318bc236 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3390,7 +3390,7 @@ class Exif(MutableMapping): if tag == 0x927C: from .TiffImagePlugin import ImageFileDirectory_v2 - if self._ifds[0x8769][tag][:8] == b"FUJIFILM": + if tag_data[:8] == b"FUJIFILM": ifd_offset = i32le(tag_data, 8) ifd_data = tag_data[ifd_offset:] From e763f8f2be026cd598f0e1bd3c8b50c5b2d9be64 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 07:47:59 +1100 Subject: [PATCH 315/750] Save interop IFD when converting Exif to bytes --- Tests/test_image.py | 9 +++++++-- src/PIL/Image.py | 7 +++++++ src/PIL/TiffTags.py | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index b1db41235..e1c14d0d8 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -752,9 +752,14 @@ class TestImage: 4098: 1704, } + reloaded_exif = Image.Exif() + reloaded_exif.load(exif.tobytes()) + assert reloaded_exif.get_ifd(0xA005) == exif.get_ifd(0xA005) + def test_exif_ifd(self): - im = Image.open("Tests/images/flower.jpg") - exif = im.getexif() + with Image.open("Tests/images/flower.jpg") as im: + exif = im.getexif() + del exif.get_ifd(0x8769)[0xA005] reloaded_exif = Image.Exif() reloaded_exif.load(exif.tobytes()) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index d318bc236..df3ebfd18 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3373,6 +3373,13 @@ class Exif(MutableMapping): for tag, value in self.items(): if tag in [0x8769, 0x8225] and not isinstance(value, dict): value = self.get_ifd(tag) + if ( + tag == 0x8769 + and 0xA005 in value + and not isinstance(value[0xA005], dict) + ): + value = value.copy() + value[0xA005] = self.get_ifd(0xA005) ifd[tag] = value return b"Exif\x00\x00" + head + ifd.tobytes(offset) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 796ff3479..9e9e117a4 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -184,6 +184,7 @@ TAGS_V2 = { 34665: ("ExifIFD", LONG, 1), 34675: ("ICCProfile", UNDEFINED, 1), 34853: ("GPSInfoIFD", LONG, 1), + 40965: ("InteroperabilityIFD", LONG, 1), # MPInfo 45056: ("MPFVersion", UNDEFINED, 1), 45057: ("NumberOfImages", LONG, 1), From c0ee869c2c09bca7825e0fd9ef76515de880d6da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 07:48:58 +1100 Subject: [PATCH 316/750] Only draw each rectangle outline pixel once --- .../imagedraw_rectangle_translucent_outline.png | Bin 0 -> 235 bytes Tests/test_imagedraw.py | 14 ++++++++++++++ src/libImaging/Draw.c | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Tests/images/imagedraw_rectangle_translucent_outline.png diff --git a/Tests/images/imagedraw_rectangle_translucent_outline.png b/Tests/images/imagedraw_rectangle_translucent_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..845648762ccab1e1d2047f653a9bb6bda4e22e65 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^DImhline(im, x0, y0 + i, x1, ink); draw->hline(im, x0, y1 - i, x1, ink); - draw->line(im, x1 - i, y0, x1 - i, y1, ink); - draw->line(im, x0 + i, y1, x0 + i, y0, ink); + draw->line(im, x1 - i, y0 + width, x1 - i, y1 - width + 1, ink); + draw->line(im, x0 + i, y0 + width, x0 + i, y1 - width + 1, ink); } } From 61ee8ec03cc9f12810e239d1618047cd7330d800 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 30 Dec 2020 03:27:28 +0100 Subject: [PATCH 317/750] document and add tests for SBIX color font support --- .github/workflows/test-windows.yml | 2 +- Tests/fonts/LICENSE.txt | 2 ++ Tests/fonts/chromacheck-sbix.woff | Bin 0 -> 740 bytes Tests/images/chromacheck-sbix.png | Bin 0 -> 1410 bytes Tests/images/chromacheck-sbix_mask.png | Bin 0 -> 1415 bytes Tests/test_imagefont.py | 40 +++++++++++++++++++++++++ docs/reference/ImageDraw.rst | 10 +++---- docs/releasenotes/8.0.0.rst | 3 +- 8 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 Tests/fonts/chromacheck-sbix.woff create mode 100644 Tests/images/chromacheck-sbix.png create mode 100644 Tests/images/chromacheck-sbix_mask.png diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index f3bb85f32..330db7c65 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -110,7 +110,7 @@ jobs: if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libwebp.cmd" - # for FreeType CBDT font support + # for FreeType CBDT/SBIX font support - name: Build dependencies / libpng if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libpng.cmd" diff --git a/Tests/fonts/LICENSE.txt b/Tests/fonts/LICENSE.txt index 06eaa9a4e..884f6a5bf 100644 --- a/Tests/fonts/LICENSE.txt +++ b/Tests/fonts/LICENSE.txt @@ -15,6 +15,8 @@ FreeMono.ttf is licensed under GPLv3, with the GPL font exception. OpenSansCondensed-LightItalic.tt, from https://fonts.google.com/specimen/Open+Sans, under Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) +chromacheck-sbix.woff, from https://github.com/RoelN/ChromaCheck, under The MIT License (MIT), Copyright (c) 2018 Roel Nieskens, https://pixelambacht.nl Copyright (c) 2018 Google LLC + DejaVuSans-24-{1,2,4,8}-stripped.ttf are based on DejaVuSans.ttf converted using FontForge to add bitmap strikes and keep only the ASCII range. diff --git a/Tests/fonts/chromacheck-sbix.woff b/Tests/fonts/chromacheck-sbix.woff new file mode 100644 index 0000000000000000000000000000000000000000..518d4b7ea6c45b7c3c660ef94aa6b71affa9fa70 GIT binary patch literal 740 zcmXT-cXMN4WB>xDCk)&mnmGYTU4j5$C_DxI*pFoa zFMC0LaS70GHb6cPNF4(+14D6ACeRKh49lLy?gieV(neV{1Cf6`;7E?e*CY!ubQsB?9d{$1L`WtPRA`}Ggf|lf4pT1 zJ3|}i2C!Sw4gf8wWnclhi^Yk};9268#19OYm;(MZGjec!x+H4F{O3;P&Luk`i&?MD$f~p69W~x5zbY02Qr}@)!CD**2oiA59uI$vD+NvI$ z+t77`sm3X0xnYAtT+4Zv2_NU_^(l&OzbBKzvU7pw!~ef*_}LXEi#>3b6Xth5l*#7S Xof)d6z~~=tKfTnC)0e?ILG362-q6Sn literal 0 HcmV?d00001 diff --git a/Tests/images/chromacheck-sbix.png b/Tests/images/chromacheck-sbix.png new file mode 100644 index 0000000000000000000000000000000000000000..b906ef133a473b8f5bb3f777b0342acdf7a841cf GIT binary patch literal 1410 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL985qF{<{ljGcd4vdb&7?h^t!3eJOz^LVrEgM07i zyyg6GeV_4d;k=3nhqeSp$tKnm4zUS}qnyz&7)=L5H80GWdGj8_hmQ8a?f#fwPCU}W T?Aix_Wh;ZHtDnm{r-UW|CpLkcdw+BWkigGfy{KSPE0h6bL4Ohzo+Cj@j9oCg;tIo|fc z%}SZo>IdR~$6kNM$!|00oH)orY}7fUDP$04WNgWD+sw$lj1NTl2V=p5aPJPr_uF`+ VU$07d4J=?8JYD@<);T3K0RVGNmXH7d literal 0 HcmV?d00001 diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 5d611a27f..757395bcf 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -897,6 +897,46 @@ class TestImageFont: assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or unsupported") + @skip_unless_feature_version("freetype2", "2.5.1") + def test_sbix(self): + try: + font = ImageFont.truetype( + "Tests/fonts/chromacheck-sbix.woff", + size=300, + layout_engine=self.LAYOUT_ENGINE, + ) + + im = Image.new("RGB", (400, 400), "white") + d = ImageDraw.Draw(im) + + d.text((50, 50), "\uE901", embedded_color=True, font=font) + + with Image.open("Tests/images/chromacheck-sbix.png") as expected: + assert_image_similar(im, expected, 1) + except IOError as e: + assert str(e) in ("unimplemented feature", "unknown file format") + pytest.skip("freetype compiled without libpng or unsupported") + + @skip_unless_feature_version("freetype2", "2.5.1") + def test_sbix_mask(self): + try: + font = ImageFont.truetype( + "Tests/fonts/chromacheck-sbix.woff", + size=300, + layout_engine=self.LAYOUT_ENGINE, + ) + + im = Image.new("RGB", (400, 400), "white") + d = ImageDraw.Draw(im) + + d.text((50, 50), "\uE901", (100, 0, 0), font=font) + + with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: + assert_image_similar(im, expected, 1) + except IOError as e: + assert str(e) in ("unimplemented feature", "unknown file format") + pytest.skip("freetype compiled without libpng or unsupported") + @skip_unless_feature_version("freetype2", "2.10.0") def test_colr(self): font = ImageFont.truetype( diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 57d1c2dda..e2ef548d4 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -352,7 +352,7 @@ Methods .. versionadded:: 6.2.0 - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. versionadded:: 8.0.0 @@ -413,7 +413,7 @@ Methods .. versionadded:: 6.2.0 - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. versionadded:: 8.0.0 @@ -577,7 +577,7 @@ Methods correct substitutions as appropriate, if available. It should be a `BCP 47 language code`_. Requires libraqm. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: ImageDraw.textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0, embedded_color=False) @@ -626,7 +626,7 @@ Methods It should be a `BCP 47 language code`_. Requires libraqm. :param stroke_width: The width of the text stroke. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: ImageDraw.multiline_textbbox(xy, text, font=None, anchor=None, spacing=4, align="left", direction=None, features=None, language=None, stroke_width=0, embedded_color=False) @@ -669,7 +669,7 @@ Methods It should be a `BCP 47 language code`_. Requires libraqm. :param stroke_width: The width of the text stroke. - :param embedded_color: Whether to use font embedded color glyphs (COLR or CBDT). + :param embedded_color: Whether to use font embedded color glyphs (COLR, CBDT, SBIX). .. py:method:: getdraw(im=None, hints=None) diff --git a/docs/releasenotes/8.0.0.rst b/docs/releasenotes/8.0.0.rst index 1bef62e00..28dc8324d 100644 --- a/docs/releasenotes/8.0.0.rst +++ b/docs/releasenotes/8.0.0.rst @@ -115,8 +115,9 @@ now support fonts with embedded color data. To render text with embedded color data, use the parameter ``embedded_color=True``. Support for CBDT fonts requires FreeType 2.5 compiled with libpng. +Support for SBIX fonts requires FreeType 2.5.1 compiled with libpng. Support for COLR fonts requires FreeType 2.10. -SBIX and SVG fonts are not yet supported. +SVG fonts are not yet supported. ImageDraw.textlength ^^^^^^^^^^^^^^^^^^^^ From c709aa3d28abbdc006288ac88de082ba00439be0 Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 30 Dec 2020 04:48:01 +0100 Subject: [PATCH 318/750] minor test formatting cleanup --- Tests/test_imagefont.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 757395bcf..259a0f872 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -869,12 +869,12 @@ class TestImageFont: im = Image.new("RGB", (150, 150), "white") d = ImageDraw.Draw(im) - d.text((10, 10), "\U0001f469", embedded_color=True, font=font) + d.text((10, 10), "\U0001f469", font=font, embedded_color=True) assert_image_similar_tofile(im, "Tests/images/cbdt_notocoloremoji.png", 6.2) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or CBDT support") @skip_unless_feature_version("freetype2", "2.5.0") def test_cbdt_mask(self): @@ -893,9 +893,9 @@ class TestImageFont: assert_image_similar_tofile( im, "Tests/images/cbdt_notocoloremoji_mask.png", 6.2 ) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or CBDT support") @skip_unless_feature_version("freetype2", "2.5.1") def test_sbix(self): @@ -909,13 +909,13 @@ class TestImageFont: im = Image.new("RGB", (400, 400), "white") d = ImageDraw.Draw(im) - d.text((50, 50), "\uE901", embedded_color=True, font=font) + d.text((50, 50), "\uE901", font=font, embedded_color=True) with Image.open("Tests/images/chromacheck-sbix.png") as expected: assert_image_similar(im, expected, 1) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or SBIX support") @skip_unless_feature_version("freetype2", "2.5.1") def test_sbix_mask(self): @@ -933,9 +933,9 @@ class TestImageFont: with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: assert_image_similar(im, expected, 1) - except IOError as e: + except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") - pytest.skip("freetype compiled without libpng or unsupported") + pytest.skip("freetype compiled without libpng or SBIX support") @skip_unless_feature_version("freetype2", "2.10.0") def test_colr(self): @@ -948,7 +948,7 @@ class TestImageFont: im = Image.new("RGB", (300, 75), "white") d = ImageDraw.Draw(im) - d.text((15, 5), "Bungee", embedded_color=True, font=font) + d.text((15, 5), "Bungee", font=font, embedded_color=True) assert_image_similar_tofile(im, "Tests/images/colr_bungee.png", 21) From 8fb5fd7f633a64948c472e0716b0909a99e8029e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 12:14:49 +1100 Subject: [PATCH 319/750] Updated tests for changed helper imports --- Tests/test_imagefont.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 259a0f872..80ae55d32 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -911,8 +911,7 @@ class TestImageFont: d.text((50, 50), "\uE901", font=font, embedded_color=True) - with Image.open("Tests/images/chromacheck-sbix.png") as expected: - assert_image_similar(im, expected, 1) + assert_image_similar_tofile(im, "Tests/images/chromacheck-sbix.png", 1) except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or SBIX support") @@ -931,8 +930,7 @@ class TestImageFont: d.text((50, 50), "\uE901", (100, 0, 0), font=font) - with Image.open("Tests/images/chromacheck-sbix_mask.png") as expected: - assert_image_similar(im, expected, 1) + assert_image_similar_tofile(im, "Tests/images/chromacheck-sbix_mask.png", 1) except IOError as e: # pragma: no cover assert str(e) in ("unimplemented feature", "unknown file format") pytest.skip("freetype compiled without libpng or SBIX support") From 297789284b8680a1d15549dc2d192f3abc552160 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Feb 2021 19:32:52 +1100 Subject: [PATCH 320/750] Fixed linear_gradient and radial_gradient 32-bit modes --- Tests/test_image.py | 4 ++-- src/libImaging/Fill.c | 28 ++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 73cf7bf83..141a116f9 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -519,7 +519,7 @@ class TestImage: # Arrange target_file = "Tests/images/linear_gradient.png" - for mode in ["L", "P"]: + for mode in ["L", "P", "I", "F"]: # Act im = Image.linear_gradient(mode) @@ -545,7 +545,7 @@ class TestImage: # Arrange target_file = "Tests/images/radial_gradient.png" - for mode in ["L", "P"]: + for mode in ["L", "P", "I", "F"]: # Act im = Image.radial_gradient(mode) diff --git a/src/libImaging/Fill.c b/src/libImaging/Fill.c index e4e4b4344..f72060228 100644 --- a/src/libImaging/Fill.c +++ b/src/libImaging/Fill.c @@ -76,8 +76,21 @@ ImagingFillLinearGradient(const char *mode) { return NULL; } - for (y = 0; y < 256; y++) { - memset(im->image8[y], (unsigned char)y, 256); + if (im->image8) { + for (y = 0; y < 256; y++) { + memset(im->image8[y], (unsigned char)y, 256); + } + } else { + int x; + for (y = 0; y < 256; y++) { + for (x = 0; x < 256; x++) { + if (im->type == IMAGING_TYPE_FLOAT32) { + IMAGING_PIXEL_FLOAT32(im, x, y) = y; + } else { + IMAGING_PIXEL_INT32(im, x, y) = y; + } + } + } } return im; @@ -103,9 +116,16 @@ ImagingFillRadialGradient(const char *mode) { d = (int)sqrt( (double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0); if (d >= 255) { - im->image8[y][x] = 255; - } else { + d = 255; + } + if (im->image8) { im->image8[y][x] = d; + } else { + if (im->type == IMAGING_TYPE_FLOAT32) { + IMAGING_PIXEL_FLOAT32(im, x, y) = d; + } else { + IMAGING_PIXEL_INT32(im, x, y) = d; + } } } } From f74d7d800ced0d7c7ad149196af4c3c839e66deb Mon Sep 17 00:00:00 2001 From: Jesus Cea Date: Mon, 22 Feb 2021 23:59:51 +0100 Subject: [PATCH 321/750] The example from filter should be next to filter method docs, not in 'frombytes' --- docs/reference/Image.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index f0a368479..a3df6b75f 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -160,7 +160,6 @@ This crops the input image with the provided coordinates: .. automethod:: PIL.Image.Image.effect_spread .. automethod:: PIL.Image.Image.entropy .. automethod:: PIL.Image.Image.filter -.. automethod:: PIL.Image.Image.frombytes This blurs the input image using a filter from the ``ImageFilter`` module: @@ -173,6 +172,7 @@ This blurs the input image using a filter from the ``ImageFilter`` module: # Blur the input image using the filter ImageFilter.BLUR im_blurred = im.filter(filter=ImageFilter.BLUR) +.. automethod:: PIL.Image.Image.frombytes .. automethod:: PIL.Image.Image.getbands This helps to get the bands of the input image: From 9c09a975df31306356f27755e008cf95423844e4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 23 Feb 2021 23:08:44 +1100 Subject: [PATCH 322/750] Corrected syntax [ci skip] --- docs/handbook/writing-your-own-file-decoder.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 03b4ca601..9b670dba8 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -269,7 +269,7 @@ decoder that can be used to read various packed formats into a floating point image memory. To use the bit decoder with the :py:func:`PIL.Image.frombytes` function, use -the following syntax:: +the following syntax: .. code-block:: python From 48ac517c8d48bbb3062dcbf0d7d2866dd78368a1 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 24 Feb 2021 07:02:42 -0800 Subject: [PATCH 323/750] Fix suspicious sequence of types castings --- src/libImaging/Jpeg2KEncode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 5829cf37f..6e7c0a75d 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -385,7 +385,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) { float *pq; if (len > 0) { - if ((unsigned)len > + if ((ssize_t)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { len = sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0]); } From 71f48e19b949740275a4ba0475c6d41a21266c57 Mon Sep 17 00:00:00 2001 From: Christoph Gohlke Date: Wed, 24 Feb 2021 08:15:25 -0800 Subject: [PATCH 324/750] Use unsigned size_t --- src/libImaging/Jpeg2KEncode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 6e7c0a75d..2e6b5daf0 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -385,7 +385,7 @@ j2k_encode_entry(Imaging im, ImagingCodecState state) { float *pq; if (len > 0) { - if ((ssize_t)len > + if ((size_t)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { len = sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0]); } From 114145a61ade795f31e1ab2afe090eae31264b82 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Feb 2021 22:49:11 +1100 Subject: [PATCH 325/750] Set all transparent colors to be equal --- Tests/test_image_quantize.py | 10 ++++++++++ src/libImaging/Quant.c | 23 +++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index af4172c88..1ceff0842 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -74,3 +74,13 @@ def test_quantize_dither_diff(): nodither = image.quantize(dither=0, palette=palette) assert dither.tobytes() != nodither.tobytes() + + +def test_transparent_colors_equal(): + im = Image.new("RGBA", (1, 2), (0, 0, 0, 0)) + px = im.load() + px[0, 1] = (255, 255, 255, 0) + + converted = im.quantize() + converted_px = converted.load() + assert converted_px[0, 0] == converted_px[0, 1] diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index bee5e5599..17b75b4c2 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -1688,9 +1688,26 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) { } else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) { /* true colour */ + withAlpha = !strcmp(im->mode, "RGBA"); + int transparency = 0; + unsigned char r, g, b; for (i = y = 0; y < im->ysize; y++) { for (x = 0; x < im->xsize; x++, i++) { p[i].v = im->image32[y][x]; + if (withAlpha && p[i].c.a == 0) { + if (transparency == 0) { + transparency = 1; + r = p[i].c.r; + g = p[i].c.g; + b = p[i].c.b; + } else { + /* Set all subsequent transparent pixels + to the same colour as the first */ + p[i].c.r = r; + p[i].c.g = g; + p[i].c.b = b; + } + } } } @@ -1725,9 +1742,6 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) { kmeans); break; case 2: - if (!strcmp(im->mode, "RGBA")) { - withAlpha = 1; - } result = quantize_octree( p, im->xsize * im->ysize, @@ -1739,9 +1753,6 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) { break; case 3: #ifdef HAVE_LIBIMAGEQUANT - if (!strcmp(im->mode, "RGBA")) { - withAlpha = 1; - } result = quantize_pngquant( p, im->xsize, From 80e570bb9927f173065769b7ef1c21409729e953 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Feb 2021 23:41:31 +1100 Subject: [PATCH 326/750] Added context managers --- docs/reference/Image.rst | 68 ++++++++++++------------ docs/reference/ImageDraw.rst | 26 ++++----- docs/reference/ImageMath.rst | 8 +-- docs/reference/c_extension_debugging.rst | 4 +- 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index a3df6b75f..c4e8f37a3 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -22,8 +22,8 @@ Windows). .. code-block:: python from PIL import Image - im = Image.open("hopper.jpg") - im.rotate(45).show() + with Image.open("hopper.jpg") as im: + im.rotate(45).show() Create thumbnails ^^^^^^^^^^^^^^^^^ @@ -40,9 +40,9 @@ current directory preserving aspect ratios with 128x128 max resolution. for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) - im = Image.open(infile) - im.thumbnail(size) - im.save(file + ".thumbnail", "JPEG") + with Image.open(infile) as im: + im.thumbnail(size) + im.save(file + ".thumbnail", "JPEG") Functions --------- @@ -145,15 +145,15 @@ This crops the input image with the provided coordinates: from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # The crop method from the Image module takes four coordinates as input. - # The right can also be represented as (left+width) - # and lower can be represented as (upper+height). - (left, upper, right, lower) = (20, 20, 100, 100) + # The crop method from the Image module takes four coordinates as input. + # The right can also be represented as (left+width) + # and lower can be represented as (upper+height). + (left, upper, right, lower) = (20, 20, 100, 100) - # Here the image "im" is cropped and assigned to new variable im_crop - im_crop = im.crop((left, upper, right, lower)) + # Here the image "im" is cropped and assigned to new variable im_crop + im_crop = im.crop((left, upper, right, lower)) .. automethod:: PIL.Image.Image.draft @@ -167,10 +167,10 @@ This blurs the input image using a filter from the ``ImageFilter`` module: from PIL import Image, ImageFilter - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Blur the input image using the filter ImageFilter.BLUR - im_blurred = im.filter(filter=ImageFilter.BLUR) + # Blur the input image using the filter ImageFilter.BLUR + im_blurred = im.filter(filter=ImageFilter.BLUR) .. automethod:: PIL.Image.Image.frombytes .. automethod:: PIL.Image.Image.getbands @@ -181,8 +181,8 @@ This helps to get the bands of the input image: from PIL import Image - im = Image.open("hopper.jpg") - print(im.getbands()) # Returns ('R', 'G', 'B') + with Image.open("hopper.jpg") as im: + print(im.getbands()) # Returns ('R', 'G', 'B') .. automethod:: PIL.Image.Image.getbbox @@ -192,9 +192,9 @@ This helps to get the bounding box coordinates of the input image: from PIL import Image - im = Image.open("hopper.jpg") - print(im.getbbox()) - # Returns four coordinates in the format (left, upper, right, lower) + with Image.open("hopper.jpg") as im: + print(im.getbbox()) + # Returns four coordinates in the format (left, upper, right, lower) .. automethod:: PIL.Image.Image.getchannel .. automethod:: PIL.Image.Image.getcolors @@ -222,11 +222,11 @@ This resizes the given image from ``(width, height)`` to ``(width/2, height/2)`` from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Provide the target width and height of the image - (width, height) = (im.width // 2, im.height // 2) - im_resized = im.resize((width, height)) + # Provide the target width and height of the image + (width, height) = (im.width // 2, im.height // 2) + im_resized = im.resize((width, height)) .. automethod:: PIL.Image.Image.rotate @@ -236,12 +236,12 @@ This rotates the input image by ``theta`` degrees counter clockwise: from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Rotate the image by 60 degrees counter clockwise - theta = 60 - # Angle is in degrees counter clockwise - im_rotated = im.rotate(angle=theta) + # Rotate the image by 60 degrees counter clockwise + theta = 60 + # Angle is in degrees counter clockwise + im_rotated = im.rotate(angle=theta) .. automethod:: PIL.Image.Image.save .. automethod:: PIL.Image.Image.seek @@ -260,12 +260,12 @@ This flips the input image by using the :data:`FLIP_LEFT_RIGHT` method. from PIL import Image - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - # Flip the image from left to right - im_flipped = im.transpose(method=Image.FLIP_LEFT_RIGHT) - # To flip the image from top to bottom, - # use the method "Image.FLIP_TOP_BOTTOM" + # Flip the image from left to right + im_flipped = im.transpose(method=Image.FLIP_LEFT_RIGHT) + # To flip the image from top to bottom, + # use the method "Image.FLIP_TOP_BOTTOM" .. automethod:: PIL.Image.Image.verify diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 57d1c2dda..6a7ad70cc 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -81,24 +81,24 @@ Example: Draw Partial Opacity Text from PIL import Image, ImageDraw, ImageFont # get an image - base = Image.open("Pillow/Tests/images/hopper.png").convert("RGBA") + with Image.open("Pillow/Tests/images/hopper.png").convert("RGBA") as base: - # make a blank image for the text, initialized to transparent text color - txt = Image.new("RGBA", base.size, (255,255,255,0)) + # make a blank image for the text, initialized to transparent text color + txt = Image.new("RGBA", base.size, (255,255,255,0)) - # get a font - fnt = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 40) - # get a drawing context - d = ImageDraw.Draw(txt) + # get a font + fnt = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 40) + # get a drawing context + d = ImageDraw.Draw(txt) - # draw text, half opacity - d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) - # draw text, full opacity - d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) + # draw text, half opacity + d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) + # draw text, full opacity + d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) - out = Image.alpha_composite(base, txt) + out = Image.alpha_composite(base, txt) - out.show() + out.show() Example: Draw Multiline Text ---------------------------- diff --git a/docs/reference/ImageMath.rst b/docs/reference/ImageMath.rst index 821f60cf5..63f88fddd 100644 --- a/docs/reference/ImageMath.rst +++ b/docs/reference/ImageMath.rst @@ -15,11 +15,11 @@ Example: Using the :py:mod:`~PIL.ImageMath` module from PIL import Image, ImageMath - im1 = Image.open("image1.jpg") - im2 = Image.open("image2.jpg") + with Image.open("image1.jpg") as im1: + with Image.open("image2.jpg") as im2: - out = ImageMath.eval("convert(min(a, b), 'L')", a=im1, b=im2) - out.save("result.png") + out = ImageMath.eval("convert(min(a, b), 'L')", a=im1, b=im2) + out.save("result.png") .. py:function:: eval(expression, environment) diff --git a/docs/reference/c_extension_debugging.rst b/docs/reference/c_extension_debugging.rst index 893acc699..527b9d7bc 100644 --- a/docs/reference/c_extension_debugging.rst +++ b/docs/reference/c_extension_debugging.rst @@ -63,8 +63,8 @@ Take your test image, and make a really simple harness. :: from PIL import Image - im = Image.open(path) - im.load() + with Image.open(path) as im: + im.load() - Run this through valgrind, but note that python triggers some issues on its own, so you're looking for items within the Pillow hierarchy From 3e670d7737bad0eedd959b8b8d989ed10d0fd625 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 26 Feb 2021 20:59:11 +1100 Subject: [PATCH 327/750] Migrated from deprecated numpy bool and float --- Tests/test_numpy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 550d02eea..def7adf3f 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -31,7 +31,7 @@ def test_numpy_to_image(): return i # Check supported 1-bit integer formats - assert_image(to_image(numpy.bool, 1, 1), "1", TEST_IMAGE_SIZE) + assert_image(to_image(bool, 1, 1), "1", TEST_IMAGE_SIZE) assert_image(to_image(numpy.bool8, 1, 1), "1", TEST_IMAGE_SIZE) # Check supported 8-bit integer formats @@ -65,7 +65,7 @@ def test_numpy_to_image(): to_image(numpy.int64) # Check floating-point formats - assert_image(to_image(numpy.float), "F", TEST_IMAGE_SIZE) + assert_image(to_image(float), "F", TEST_IMAGE_SIZE) with pytest.raises(TypeError): to_image(numpy.float16) assert_image(to_image(numpy.float32), "F", TEST_IMAGE_SIZE) @@ -191,7 +191,7 @@ def test_putdata(): def test_roundtrip_eye(): for dtype in ( - numpy.bool, + bool, numpy.bool8, numpy.int8, numpy.int16, @@ -199,7 +199,7 @@ def test_roundtrip_eye(): numpy.uint8, numpy.uint16, numpy.uint32, - numpy.float, + float, numpy.float32, numpy.float64, ): @@ -218,7 +218,7 @@ def test_zero_size(): def test_bool(): # https://github.com/python-pillow/Pillow/issues/2044 - a = numpy.zeros((10, 2), dtype=numpy.bool) + a = numpy.zeros((10, 2), dtype=bool) a[0][0] = True im2 = Image.fromarray(a) From 5f92636bd07268a552a4b0d49f4c717918b38a1d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 27 Feb 2021 00:33:23 +1100 Subject: [PATCH 328/750] Removed comment --- src/PIL/ImageShow.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 1ada8252c..fceb65378 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -69,7 +69,6 @@ class Viewer: Converts the given image to the target format and displays it. """ - # save temporary image to disk if not ( image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode in ("I;16", "LA")) From cf5b9a77b378b23659e4b707fbec0a52afb7baa2 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:22:26 +0100 Subject: [PATCH 329/750] Add Valgrind GHA --- .github/workflows/test-valgrind.yml | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/test-valgrind.yml diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml new file mode 100644 index 000000000..fa7f459b6 --- /dev/null +++ b/.github/workflows/test-valgrind.yml @@ -0,0 +1,72 @@ +name: Test Valgrind + +# like the docker tests, but running valgrind only on *.c/*.h changes. + +on: + push: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + pull_request + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + docker: [ + ubuntu-20.04-focal-amd64-valgrind, + ] + dockerTag: [master] + + name: ${{ matrix.docker }} + + steps: + - uses: actions/checkout@v2 + + - name: Build system information + run: python3 .github/workflows/system-info.py + + - name: Docker pull + run: | + docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + + - name: Docker build + run: | + # The Pillow user in the docker container is UID 1000 + sudo chown -R 1000 $GITHUB_WORKSPACE + docker run --name pillow_container -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + sudo chown -R runner $GITHUB_WORKSPACE + + - name: After success + run: | + PATH="$PATH:~/.local/bin" + docker start pillow_container + pil_path=`docker exec pillow_container /vpy3/bin/python -c 'import os, PIL;print(os.path.realpath(os.path.dirname(PIL.__file__)))'` + docker stop pillow_container + sudo mkdir -p $pil_path + sudo cp src/PIL/*.py $pil_path + .ci/after_success.sh + env: + MATRIX_DOCKER: ${{ matrix.docker }} + + - name: Upload coverage + uses: codecov/codecov-action@v1 + with: + flags: GHA_Docker + name: ${{ matrix.docker }} + + success: + needs: build + runs-on: ubuntu-latest + name: Valgrind Test Successful + steps: + - name: Success + run: echo Valgrind Test Successful From ba1555a48562722b8c5738a076ce0f569a2d467f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:31:43 +0100 Subject: [PATCH 330/750] syntax --- .github/workflows/test-valgrind.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index fa7f459b6..9e2a90898 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -8,7 +8,7 @@ on: - "**.yml" # testing, remove me - "**.c" - "**.h" - pull_request + pull_request: paths: - "**.yml" # testing, remove me - "**.c" From f194d9e6e220ef4f7eedae3d824e8ff0ef068abf Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:46:19 +0100 Subject: [PATCH 331/750] Keep errors if they're "known" --- .github/workflows/cifuzz.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 04fc152a0..fbfd673c0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -12,15 +12,22 @@ jobs: language: python dry-run: false - name: Run Fuzzers + id: run uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'pillow' fuzz-seconds: 600 language: python dry-run: false - - name: Upload Crash - uses: actions/upload-artifact@v1 + - name: Upload New Crash + uses: actions/upload-artifact@v2 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts + - name: Upload Legacy Crash + uses: actions/upload-artifact@v2 + if: steps.run.outcome == 'success': + with: + name: crash + path: ./out/crash* From 061012c46aca37fe30ad960171b999b031e2c04b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:52:52 +0100 Subject: [PATCH 332/750] Stage Title Change --- .github/workflows/test-valgrind.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index 9e2a90898..52174d18d 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -38,7 +38,7 @@ jobs: run: | docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} - - name: Docker build + - name: Build and Run Valgrind run: | # The Pillow user in the docker container is UID 1000 sudo chown -R 1000 $GITHUB_WORKSPACE From 2d52a9fcf20a0e601da0ec5d990d4db909c69265 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 11:54:33 +0100 Subject: [PATCH 333/750] Syntax --- .github/workflows/cifuzz.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index fbfd673c0..076f5300d 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -27,7 +27,7 @@ jobs: path: ./out/artifacts - name: Upload Legacy Crash uses: actions/upload-artifact@v2 - if: steps.run.outcome == 'success': + if: steps.run.outcome == 'success' with: name: crash path: ./out/crash* From 3c2893cdf1625700dd8fecf79e24feed9f92909d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 12:00:18 +0100 Subject: [PATCH 334/750] No coverage from the valgrind run --- .github/workflows/test-valgrind.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index 52174d18d..be5881a51 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -45,24 +45,6 @@ jobs: docker run --name pillow_container -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} sudo chown -R runner $GITHUB_WORKSPACE - - name: After success - run: | - PATH="$PATH:~/.local/bin" - docker start pillow_container - pil_path=`docker exec pillow_container /vpy3/bin/python -c 'import os, PIL;print(os.path.realpath(os.path.dirname(PIL.__file__)))'` - docker stop pillow_container - sudo mkdir -p $pil_path - sudo cp src/PIL/*.py $pil_path - .ci/after_success.sh - env: - MATRIX_DOCKER: ${{ matrix.docker }} - - - name: Upload coverage - uses: codecov/codecov-action@v1 - with: - flags: GHA_Docker - name: ${{ matrix.docker }} - success: needs: build runs-on: ubuntu-latest From 95884c6b2d99364ba9424671dad0c4253e989d30 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 27 Feb 2021 12:54:38 +0100 Subject: [PATCH 335/750] Riun on .c/.h --- .github/workflows/cifuzz.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 076f5300d..96506fabe 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -1,5 +1,16 @@ name: CIFuzz -on: [push,pull_request] +on: + push: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + pull_request: + paths: + - "**.yml" # testing, remove me + - "**.c" + - "**.h" + jobs: Fuzzing: runs-on: ubuntu-latest From 70fb148fc45fe72302445450190907ee1d161539 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 27 Feb 2021 15:14:00 +0100 Subject: [PATCH 336/750] fix merge --- winbuild/fribidi.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/fribidi.cmake b/winbuild/fribidi.cmake index acb614bfa..27b8d17a8 100644 --- a/winbuild/fribidi.cmake +++ b/winbuild/fribidi.cmake @@ -99,4 +99,4 @@ add_library(fribidi SHARED ${FRIBIDI_SOURCES_GENERATED}) fribidi_definitions(fribidi) target_compile_definitions(fribidi - PUBLIC "-DFRIBIDI_ENTRY=__declspec(dllexport)") + PUBLIC "-DFRIBIDI_BUILD") From e4cc42265dc4e00bccdf960f13fbbd6dfcb469dc Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 27 Feb 2021 16:52:46 +0100 Subject: [PATCH 337/750] add Raqm build configuration info to build summary --- setup.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/setup.py b/setup.py index cc902c152..6c4840c75 100755 --- a/setup.py +++ b/setup.py @@ -304,8 +304,8 @@ class pil_build_ext(build_ext): def want(self, feat): return getattr(self, feat) is None - def want_system(self, feat): - return feat not in self.vendor + def want_vendor(self, feat): + return feat in self.vendor def __iter__(self): yield from self.features @@ -710,14 +710,14 @@ class pil_build_ext(build_ext): _add_directory(self.compiler.include_dirs, subdir, 0) if feature.freetype and feature.want("raqm"): - if feature.want_system("raqm"): # want system Raqm + if not feature.want_vendor("raqm"): # want system Raqm _dbg("Looking for Raqm") if _find_include_file(self, "raqm.h"): if _find_library_file(self, "raqm"): feature.raqm = "raqm" elif _find_library_file(self, "libraqm"): feature.raqm = "libraqm" - else: # want to build Raqm + else: # want to build Raqm from src/thirdparty _dbg("Looking for HarfBuzz") feature.harfbuzz = None hb_dir = _find_include_dir(self, "harfbuzz", "hb.h") @@ -727,7 +727,7 @@ class pil_build_ext(build_ext): if _find_library_file(self, "harfbuzz"): feature.harfbuzz = "harfbuzz" if feature.harfbuzz: - if feature.want_system("fribidi"): # want system FriBiDi + if not feature.want_vendor("fribidi"): # want system FriBiDi _dbg("Looking for FriBiDi") feature.fribidi = None fribidi_dir = _find_include_dir(self, "fribidi", "fribidi.h") @@ -739,7 +739,7 @@ class pil_build_ext(build_ext): if _find_library_file(self, "fribidi"): feature.fribidi = "fribidi" feature.raqm = True - else: # want to build FriBiDi shim + else: # want to build FriBiDi shim from src/thirdparty feature.raqm = True if feature.want("lcms"): @@ -841,18 +841,18 @@ class pil_build_ext(build_ext): libs = ["freetype"] defs = [] if feature.raqm: - if feature.want_system("raqm"): # using system Raqm + if not feature.want_vendor("raqm"): # using system Raqm defs.append(("HAVE_RAQM", None)) defs.append(("HAVE_RAQM_SYSTEM", None)) libs.append(feature.raqm) - else: # building Raqm + else: # building Raqm from src/thirdparty defs.append(("HAVE_RAQM", None)) srcs.append("src/thirdparty/raqm/raqm.c") libs.append(feature.harfbuzz) - if feature.want_system("fribidi"): # using system FriBiDi + if not feature.want_vendor("fribidi"): # using system FriBiDi defs.append(("HAVE_FRIBIDI_SYSTEM", None)) libs.append(feature.fribidi) - else: # building our FriBiDi shim + else: # building FriBiDi shim from src/thirdparty srcs.append("src/thirdparty/fribidi-shim/fribidi.c") self._update_extension("PIL._imagingft", libs, defs, srcs) @@ -902,6 +902,12 @@ class pil_build_ext(build_ext): print(f" [{v.strip()}") print("-" * 68) + raqm_extra_info = "" + if feature.want_vendor("raqm"): + raqm_extra_info += "bundled" + if feature.want_vendor("fribidi"): + raqm_extra_info += ", FriBiDi shim" + options = [ (feature.jpeg, "JPEG"), (feature.jpeg2000, "OPENJPEG (JPEG2000)", feature.openjpeg_version), @@ -909,7 +915,7 @@ class pil_build_ext(build_ext): (feature.imagequant, "LIBIMAGEQUANT"), (feature.tiff, "LIBTIFF"), (feature.freetype, "FREETYPE2"), - (feature.raqm, "RAQM (Text shaping)"), # TODO!!! + (feature.raqm, "RAQM (Text shaping)", raqm_extra_info), (feature.lcms, "LITTLECMS2"), (feature.webp, "WEBP"), (feature.webpmux, "WEBPMUX"), @@ -919,10 +925,10 @@ class pil_build_ext(build_ext): all = 1 for option in options: if option[0]: - version = "" + extra_info = "" if len(option) >= 3 and option[2]: - version = f" ({option[2]})" - print(f"--- {option[1]} support available{version}") + extra_info = f" ({option[2]})" + print(f"--- {option[1]} support available{extra_info}") else: print(f"*** {option[1]} support not available") all = 0 From f74d0465748174b94ef7cedcdf54999b540517e7 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 17:09:27 +0100 Subject: [PATCH 338/750] Removing the .yml files from the triggers --- .github/workflows/test-valgrind.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test-valgrind.yml b/.github/workflows/test-valgrind.yml index be5881a51..7b8474d0f 100644 --- a/.github/workflows/test-valgrind.yml +++ b/.github/workflows/test-valgrind.yml @@ -5,12 +5,10 @@ name: Test Valgrind on: push: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" pull_request: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" From aa0b982ef61b1ee4df7ff312b097c1e4ca36eae4 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 17:17:33 +0100 Subject: [PATCH 339/750] Added failure if out/crash-* exists --- .github/workflows/cifuzz.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 96506fabe..e158bd84d 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -42,3 +42,8 @@ jobs: with: name: crash path: ./out/crash* + - name: Fail on legacy crash + if: success() + run: | + [ ! -e out/crash-* ] + echo No legacy crash detected From 3fee28eb9479bf7d59e0fa08068f9cc4a6e2f04c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 3 Jan 2021 21:35:32 +0100 Subject: [PATCH 340/750] Incorrect error code checking in TiffDecode.c * since Pillow 8.1.0 * CVE-2021-25289 --- ...-0e16d3bfb83be87356d026d66919deaefca44dac.tif | Bin 0 -> 4567 bytes ...-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif | Bin 0 -> 4221 bytes Tests/test_tiff_crashes.py | 2 ++ src/libImaging/TiffDecode.c | 3 +-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif create mode 100644 Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif diff --git a/Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif b/Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif new file mode 100644 index 0000000000000000000000000000000000000000..f59aab21afe39d2926aad3eeb896b7d147d510f5 GIT binary patch literal 4567 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 Il8QY0FD*Gu-2eap literal 0 HcmV?d00001 diff --git a/Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif b/Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif new file mode 100644 index 0000000000000000000000000000000000000000..c8d6e2aada30caad02b460a088519afaec3706d8 GIT binary patch literal 4221 zcma)8c|6qJ_rHuKWl1EqEde(Mau82MYi z@6Qaz`?|a^W5d7-bQl3JhVct03*Wy z3~d9T!?W*izwOh05B(nR{udtl3Vj25aO(bNV*GzX{G0ZT{D%cbMg~U4e^36e0Qv|- z;pmzF&k!8=Kg7U@U}9!rJ-~MG5Ufyhc>ib-j7$h-W+ocyM%>kFo?KM9JUTX}rdmC{ZOKRV=_2oQQcr>u~1vcS= zkn3x|n1m=Mo;PQDeS38Y;%m$HW7<>7Rb{^ftSJRSqk`NUZ+k;TM%3H2*%r}uDU&(^ zDxv%;(-nPWA5KM?1tBTbsVoNZ7@WQCD*AFs+sd6j&oq%2fle-%BU(SKKNmCj0hvbL z*%I#WLFL8Q=dT#GY->u`wMp^~8j8u{zOFcC;SAj8-<9JcnBA>xk|Tw<$v zBwr!!vVLi*KqOyjtv85O%9##*ZYxatL}g2DA~2pSy>E^*q7 zE~v4_uVxlIpg$MzBDCg4F?Ut(F}!Bwog}onja;EhhDE}3_aR|xgZ3mxA7slZL~%qm z$Hy%siBr0e<6*4Q%bIZ4O^4J3o2*QCr$c&==+`dm&c@VTWmWINFtZ=b6h=3Mn$JlZ z6Z{X^1r1Jkt%%>RQ=bcA))f=SNPp~@a51^|YhX4ZCjRwI>>I6@bgHSC%ROP#4}s~^ zWJ$coPE0Q+a=jYwqxh>zl=q2-Gh@iqB$%aD^;0kC( z`c4ZM&Wv&jJVNBq597;%1AUY3EC)H+rJpc_#sL>zTR}v2^rnYk-gH} z|3QY0piB_#Z!yU;FYTEdj1%ta_9vrSn)Vm4%fSeMJQCcwz!5V1+NvY7 z@bATqbL}%``OFw4Ez`-mc#G+}hps+96tyyNPsy3%M0&Ma(HPq|6AcZQ!;sCH%a zm^d;n)N*9P+#%&hqp3fKv6Nt$>2*?h%u9Y9+nax8I5^MpufnOSnVC`8s_||*`gIT4 z#MYu3m#VF3R`-YSIrjt2hcT17yH)EyxynMgOSxQ5MhbT{x!m4=^YkD3s;ur3nCZF= zjki~=g1Bdo28W7dD3~m;EuWFECWd!Zg@45}DQmWqaB=cfZI;LR-yzVV`m={~YczO! zu};IKL1pw=+Kp0Yqh$7yYU-4lGUnTx( zZ)LGqkgVdQ5eF?AyF~gm?KPx3gZ?PmfrwmceU44YNKFvjF_Fat&h)RcZnGS;nr>thcBn_nh(pQ$AtU9 ztK{tAB;Vmtl&ie=XIdQuBCdw{?KtIA53iZFit^dpd0=@5FTY;XX?#g=lS@%4(JA4M z9N0EAdt>V!A#oxvK2rM*af`_EtN)`Tz0l;=mBv+3C5&7UZg>*uZ503MX5{C}WMQdV zOY8R=i|=mNP=q^{74{BO5A953FQ!M9<<8SZhE~NIQ%AK=b&Za$w`eBIZneF2=J_6C z26|Gb$rS_ZbkJQDu;{qpkn8bIJ-^tecw-^BJ`*|qxY#7>uyMgDo_Lv=?WOc^JFcmY zttTXOOcPs}AyJ1nxXNBu@BEOxunO&@f?nC2i0iVZ#Uom~&5IkVH`UlV!XWI&?E+`=OvoX-1+LU7IVjn&#_+B@1)^fKO+GqnxFd5&C)81qxxNS z`a=~0P3B~6=}Q9*?*me8BOOW=3F5RLUyomnv=epx7E84A@_#3tc(tj-OkdU^&gm38 zMt%2IhdPr;ZnXLO&W63h$!Od8#@?3$E)U$K5U0g*rq^|aBT*urUvl)#;v32dRu&JO zK2tJQqsLrpUC~>ST*9m-{xOz(E(RGz^=b>LQ7O-rhBB!Hk-wBjx_L5ZW7fZKc5Lg1 z8)g|9Slq~ZH`>wJ%ennx_;tUQLcV00$oeHU^(i$12{)l$(NmR@|C!vMazTXrV_T=1 zWbj<&E&#>Ob=@%xgaY6BFAWEW<*(>;)JMf8y5Z+zQb{kf7g&tMq*x5by&xd91@GX( zo_4%R%#_gezPCf%mhou>;2bwHJyn1bq{$!8Rhl0Y`NCIHtyR%>=T%^W)diKoPgBHu ztMTo4be9CbpV87gkx~z9SxIL?I=TBx>O}7OyH@XWE63kwmVoizqI3h>+vNlpc6k|8>3XT6EAes`|<(o2;N$tN2}Ju^r2#`KPQK zrNy&va*d7taP}?~uqw=%!@EF0Z>&aPP`fJbJ;om`ORtnK-|%npMAKQb>xY*IW}y-I z9o`JM55Ny`83Y42VB}^%a5F%ofE~dAGYD>g0(9?E2u$;jlRF{syh109CLci;{T@VT zfk1q>4`l|m*2U>U7$+sFY zoHiY(wIv7`(k;q)c5q5gHj`Mf&gCW&MHUl&Y$ARKuV-wBF}*m58Xko}GiuYZ;z}6% z7T?;gsBW+sU7JW7+~0%*CVv4FXG4{w1*kOGK;U>01QzeoFEkvZUZ>>ZROmuFXwzMR z06b+EO=I(1s>W|qRX^`&;pv9_*tOS-6;b$gWFK}(GY|qfHQ@{`5Lkce3xUdc`c<7E z83-i72K~D?b?(#3@kA<|*s6OF*i)10s+JWZO7eA zIv)f+J$a1n5T!}ra>pw>sF~;%pS=?r^7Loj=sD9!bXzL~h&2$%%k7(p-$l;g$g>de zHe88n$L>(?(;K|;o98PQefM*~eIZ2n@^bjZfIn zaEY3l6n^{TaB=z&D3&Q{SeC+1KidK~X(lG}yKZFE0G_`W0u(K0S zXQ0N02gZGyX^C8-5I*1*cYrP$sFGFiF?5?2k}C?kg7WF&0fTfIrF literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index d0de4b305..eb2533466 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -24,6 +24,8 @@ from .helper import on_ci "Tests/images/crash_1.tif", "Tests/images/crash_2.tif", "Tests/images/crash-2020-10-test.tif", + "Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif", + "Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 7f14b5a34..2f92824c3 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -282,8 +282,7 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { img.row_offset = state->y; rows_to_read = min(rows_per_strip, img.height - state->y); - if (TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read) == - -1) { + if (!TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read)) { TRACE(("Decode Error, y: %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; goto decodeycbcr_err; From 4853e522bddbec66022c0915b9a56255d0188bf9 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 2 Jan 2021 16:07:36 +0100 Subject: [PATCH 341/750] Fix OOB read in SgiRleDecode.c * From Pillow 4.3.0->8.1.0 * CVE-2021-25293 --- ...5703f71a0f0094873a3e0e82c9f798161171b8.sgi | Bin 0 -> 13703 bytes ...834657ee604b8797bf99eac6a194c124a9a8ba.sgi | Bin 0 -> 12789 bytes ...4d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi | Bin 0 -> 549 bytes ...cf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi | Bin 0 -> 21017 bytes ...2e64d4f3f76d7465b6af535283029eda211259.sgi | Bin 0 -> 18364 bytes ...b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi | Bin 0 -> 12748 bytes ...8bfa78b19721225425530c5946217720d7df4e.sgi | Bin 0 -> 12744 bytes Tests/test_sgi_crash.py | 7 ++ src/libImaging/SgiRleDecode.c | 91 +++++++++++++++--- 9 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi create mode 100644 Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi create mode 100644 Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi create mode 100644 Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi create mode 100644 Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi create mode 100644 Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi create mode 100644 Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi diff --git a/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi b/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi new file mode 100644 index 0000000000000000000000000000000000000000..81ae1182391fcfe8adfab2bb029cb68e90d95342 GIT binary patch literal 13703 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 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi b/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi new file mode 100644 index 0000000000000000000000000000000000000000..8e093bdfd72c786e508ca80f703f6b35b4f01573 GIT binary patch literal 549 zcmZR)#mLCO%)khQ%nT6lA4=1Q+WCTsJ{Cc2VUl2AV3G!6IUpb8V=!h+2Ks*l1Kgn! J%)}VS005jE1;zjX literal 0 HcmV?d00001 diff --git a/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi b/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi new file mode 100644 index 0000000000000000000000000000000000000000..790cb37449eab15d127dedb85a7f67e4b74f0d74 GIT binary patch literal 21017 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 z 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 S^Q3AyOqwhX7k(xzRR0SwB${6U literal 0 HcmV?d00001 diff --git a/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi b/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi new file mode 100644 index 0000000000000000000000000000000000000000..b02aacea9c387eccca911b300cf836a46b11da89 GIT binary patch literal 12744 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 literal 0 HcmV?d00001 diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index ac304aab4..d4ddc12f9 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -11,6 +11,13 @@ from PIL import Image "Tests/images/sgi_crash.bin", "Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi", "Tests/images/ossfuzz-5730089102868480.sgi", + "Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi", + "Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi", + "Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi", + "Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi", + "Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi", + "Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi", + "Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi", ], ) def test_crashes(test_file): diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index c19231e02..4eef44ba5 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -25,12 +25,58 @@ read4B(UINT32 *dest, UINT8 *buf) { *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); } +/* + SgiRleDecoding is done in a single channel row oriented set of RLE chunks. + + * The file is arranged as + - SGI Header + - Rle Offset Table + - Rle Length Table + - Scanline Data + + * Each RLE atom is c->bpc bytes wide (1 or 2) + + * Each RLE Chunk is [specifier atom] [ 1 or n data atoms ] + + * Copy Atoms are a byte with the high bit set, and the low 7 are + the number of bytes to copy from the source to the + destination. e.g. + + CBBBBBBBB or 0CHLHLHLHLHLHL (B=byte, H/L = Hi low bytes) + + * Run atoms do not have the high bit set, and the low 7 bits are + the number of copies of the next atom to copy to the + destination. e.g.: + + RB -> BBBBB or RHL -> HLHLHLHLHL + + The upshot of this is, there is no way to determine the required + length of the input buffer from reloffset and rlelength without + going through the data at that scan line. + + Furthermore, there's no requirement that individual scan lines + pointed to from the rleoffset table are in any sort of order or + used only once, or even disjoint. There's also no requirement that + all of the data in the scan line area of the image file be used + + */ static int -expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { +expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { + /* + * n here is the number of rlechunks + * z is the number of channels, for calculating the interleave + * offset to go to RGBA style pixels + * xsize is the row width + * end_of_buffer is the address of the end of the input buffer + */ + UINT8 pixel, count; int x = 0; for (; n > 0; n--) { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; if (n == 1 && pixel != 0) { return n; @@ -44,12 +90,18 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + count > end_of_buffer) { + return -1; + } while (count--) { *dest = *src++; dest += z; } } else { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; while (count--) { *dest = pixel; @@ -61,12 +113,14 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } static int -expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { +expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { UINT8 pixel, count; - int x = 0; for (; n > 0; n--) { + if (src + 1 > end_of_buffer) { + return -1; + } pixel = src[1]; src += 2; if (n == 1 && pixel != 0) { @@ -81,12 +135,18 @@ expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + 2 * count > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); src += 2; dest += z * 2; } } else { + if (src + 2 > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); dest += z * 2; @@ -132,7 +192,11 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t return -1; } _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); - _imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize); + if (_imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize) != c->bufsize) { + state->errcode = IMAGING_CODEC_UNKNOWN; + return -1; + } + /* decoder initialization */ state->count = 0; @@ -166,20 +230,20 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); } - state->count += c->tablen * sizeof(UINT32) * 2; - /* read compressed rows */ for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) { for (c->channo = 0; c->channo < im->bands; c->channo++) { c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; - c->rleoffset -= SGI_HEADER_SIZE; - if (c->rleoffset + c->rlelength > c->bufsize) { + // Check for underflow of rleoffset-SGI_HEADER_SIZE + if (c->rleoffset < SGI_HEADER_SIZE) { state->errcode = IMAGING_CODEC_OVERRUN; goto sgi_finish_decode; } + c->rleoffset -= SGI_HEADER_SIZE; + /* row decompression */ if (c->bpc == 1) { status = expandrow( @@ -187,14 +251,16 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } else { status = expandrow2( &state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } if (status == -1) { state->errcode = IMAGING_CODEC_OVERRUN; @@ -203,15 +269,12 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t goto sgi_finish_decode; } - state->count += c->rlelength; } /* store decompressed data in image */ state->shuffle((UINT8 *)im->image[state->y], state->buffer, im->xsize); } - c->bufsize++; - sgi_finish_decode:; free(c->starttab); @@ -221,5 +284,5 @@ sgi_finish_decode:; state->errcode = err; return -1; } - return state->count - c->bufsize; + return 0; } From 86f02f7c70862a0954bfe8133736d352db978eaa Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 8 Jan 2021 18:45:42 +0100 Subject: [PATCH 342/750] Fix negative size read in TiffDecode.c * Caught by oss-fuzz runs * CVE-2021-25290 --- ...-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif | Bin 0 -> 2529 bytes ...-1185209cf7655b5aed8ae5e77784dfdd18ab59e9.tif | Bin 0 -> 1931 bytes ...-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif | Bin 0 -> 4682 bytes ...-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif | Bin 0 -> 4050 bytes ...-86214e58da443d2b80820cff9677a38a33dcbbca.tif | Bin 0 -> 286 bytes ...-f46f5b2f43c370fe65706c11449f567ecc345e74.tif | Bin 0 -> 1844 bytes Tests/test_tiff_crashes.py | 8 +++++++- src/libImaging/TiffDecode.c | 4 ++++ 8 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif create mode 100644 Tests/images/crash-1185209cf7655b5aed8ae5e77784dfdd18ab59e9.tif create mode 100644 Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif create mode 100644 Tests/images/crash-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif create mode 100644 Tests/images/crash-86214e58da443d2b80820cff9677a38a33dcbbca.tif create mode 100644 Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif diff --git a/Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif b/Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif new file mode 100644 index 0000000000000000000000000000000000000000..5275075e9177155cfa0fcc91bb783e237116ddba GIT binary patch literal 2529 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 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif b/Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif new file mode 100644 index 0000000000000000000000000000000000000000..344d62b277a85e4dd8262d31b175958efd0e768f GIT binary patch literal 4682 zcmdUvcUV)&8i&6m6hQ_`VoSZP8??i_HDd!M`PefGaQc{1lc-~8sxS7ye=MH{97z;plt z2?&UmqK@#Do6tKEF$p~%p+D)XT^g~}SC&GoNRSx)N-yH?zS{9QGruw!@%LXf^@!EJ z+VS;#5#w5A^s-KqL}~#PPvDgZlp%5Ldxmdhk&&H>1Q(~{r6mz1NRpBg5=fnn#z8_+a>hJ^6;evx6zTbi%7z&` z4^LUJvh>DxKD7c3qX^bU8QGcNtEkRexJXlLv9_^^=`u5O3p;xUM<-_&S6{!?{sDnO z!PH1BDmsQ1%jR&Cc*!a2Hf3(k+OqYBZMk{7@(XtVv}f;;qsNY)C^~tn_}uvm7k@3g zbh*6pX4S3RcYeEj?{QuIlcx>O8lN}4Yi?<6Ywzgn>iPY1Z(skw;FlphE&|$xf3*J^ zmm-RbC?P?TkjCR85P9fNQk0OKXCO6Wg|{>%QE9$m#uVk1I}exMkXc~lBls?YRVzDF z!?!5@A9)3Kdfr{nBJCjVjmAD@cU1QrKv1TUmFip1Dd z#F>cWd7K2?ERUwoe_yNxX%fZ^hlhm5N}Q5 zVu(rZh_jMt7!PqhVvTq%orZW2u`(T_umL2{VFwKkMvXzNk64c7=VOQ13LSX4=m{J# zfjL+*@)N+0nUKPwMaOW+TGYj419NjTvNOhu$2c4vFA6n|!ipr@G3f~uMhd`K%=j#r zf#;Ttl5A>VZfdGysEg7+-X;Wj-450G-n@!^ofI=p~uhkRcnThY07!D`FLQjv!;wuGBkTO;f zRBlEjjYDHH$TY^ERrqgCo8SYEWBVF`(lHSzhwH-hYGojOcmNVgQ-Ksxh(-wGb#s^T z2mIs(%xxdr_lVK>X#Z~=F$cX8*|cafZnpFBBU8DoB%INiz&lBh1qDzBRhR<{Knrxh z5SD=@*n$JNf+zSv5QG60Vt@`T;6WN>Ko9F)NoxB<7}KGeVy zcmZ#r6}mwH{Vf$x%s;7b$jQo?ap#9UqxKyx+-tgOOJ&f z439ET@O1Ia^L*u{>6Pg9Pj4x2FYkTcZ9WD*X+C#+m3+f}i+%h3R{G`my;!Zan!CEv zU%@}b|CIkgfPFx2z}rB*!1TcTL9>ErL6?H1gZ+a~1oy3RSd+h|HN+$&E97aYW@vKg z-LP3<@nKiP6~Zau=hsTE4Om;eR!H%r9HI0@xJ2xa5K!%?yQ$rgwvoFcJF(?hF4i8k zJSsP;BYJssUUX-SO-w<|dzu|>FRdrmIrd=eK%8e>QJgqFAijh?g}#=4nK6SA$Eae? zVJ0(c6P6@oCA>|vNX$Qo@=W#24VlfGoi?A&lFwpgU8*s!DX+Dvz4qAV@r^qBy4&?G_4l86JgI%U z`suTVkcPL1ypx=pKHb^+EB&{*PK8FMP87^gs|O zXzgM3h=1SyS@m;KuW@f>pI6`OetQ4#z_vlv!INLizT6oK7-}Ep38jTUjVvB17rBXE zis@ppm6QDn_f;5&5=r4utYyh$D;Ew%Co?E?Z25eLKo`gGl{6093uF0G=n3)Id}}i@ z`dR7Ws{bmtL)Q+=7r%7oTN_NGv!`${KN=mW4D}6+EcBOI=o^y_mRT4YTNqC^&mox> z<&Ux0=wg{~t#4>Jnbwm=Iyb3V~fc`Eu&g z-qukcik*k&sD;>V%hnEBpSZf|=;`D9^9>$%E~F`pmfCz^@h9uM z6wNIcI^*dTO&XgQ6%5_$8fljO<(cFnTX|K-l#*1LU27?M+9q9oXH||L*D5RSkn|_cv~;6(#Z{;2xOJTiyH_8rGdq`_Vsf>*+N|!Tl^8O63=1hPOAYh)dIpxg zIeXBN)>-~@#oR6QTh|TlT2b~KvkhUWHV#+1evm%&DXhTr`epe!ySnNteGBJZZOP*= zd7qN9o+K*}ur{`tojUumBwDIJMPsW0mVHi1^CW45^wVo4q+Q-OFFR%%A8twgDMWqb zH=#_ywQ8c_nFR6;$W`W$PNdxE{uHY6a-o*5XqH8fikWZrV}}mTzSN5m#fqhmzOS(S zWnEsl`5N6K)BUS=w%nhp9_)BKkHS=|Ttq6~cxYNxznVaPNzt^;*~UjMu8-^?Jb!fU)v!{mg>YCy|YHTVq??{ofU7(S^ zr0Px+=HcJ^xP9mLobzqj7p#tmgq{nq40W5=sx4Z5nia8w+aJlR{eG^3Y1CReSNTVa zNMcH}*BM8rQtN%yA~^OKeduYI`oPx|MWTG`-?%GB+`A zQ-#TybSYVR8Qm>)Ly|6*2Bs@dU$T|HXD%TZ4T)XJLhWB3=f{>F=#8$SEG(|DtD!ms z{xsdt$$NiZy&P#rT<_96h3^@mi~(Wwk(*_|?c-U!s46~r&XTm>;JS_8FY0%`8_EjU zRd?X*Y#p7pE00Pd-ye^xCOl>Oy)yM!`KvM~^q;Av3&e0X{1_G#u|?5#DgBd+!X_dD)FJw`KZBF!0_? zEx=E|zTRZp)f|t#=UC@!y7~N;_V;&GU+tH_{OHq(=dBlQnD2WpZXY^WQ2y(-q5aIo zKFzTkug{Pzfc3Twx3%^28?-MM%$7f(XY+ZvU6WMi>$wf&->=zI)wW%qcIe}y+8aw{ zs!ghA)mC~O^E>mfqi%h_~=C|3odemTEC zcq?Ch-2vlkW`&;=gef@#zGA>i4)H7bO%}yzHhQ0pT81Brdc;t(S=-VmcXw5`iWr{g z4ZmqxGjcH3(sD>8j4Xy6X7x}&{vN(m(Qj{WaeGHRJoLUq_t`wIPN;?MuPBB?dq)Bm4j%0uI{N&uK$xT18~#DmDO&w5LbRB__2I|VicJ2KqT%c?wf^0wYMoLF%fz6| T?|*bELLzInhh(yaEK@2|njzbib;y=I3Mq^T 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 > state->eof) { + TIFFError("_tiffReadProc", "Invalid Read at loc %d, eof: %d", state->loc, state->eof); + return 0; + } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); TRACE(("to_read: %d\n", (int)to_read)); From cbdce6c5d054fccaf4af34b47f212355c64ace7a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 23 Jan 2021 11:36:50 +0100 Subject: [PATCH 343/750] Fix for CVE-2021-25291 * Invalid tile boundaries lead to OOB Read in TiffDecode.c, in TiffReadRGBATile * Check the tile validity before attempting to read. --- ...-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif | Bin 0 -> 3728 bytes Tests/test_tiff_crashes.py | 1 + src/libImaging/TiffDecode.c | 9 +++++++++ 3 files changed, 10 insertions(+) create mode 100644 Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif diff --git a/Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif b/Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif new file mode 100644 index 0000000000000000000000000000000000000000..b89203f75c40ec004e9a37d04caa7ba1c1aee085 GIT binary patch literal 3728 zcmeHJU1%It6h3!mvTpv`ByO`93yvFYX=!$6XE$kfZ6s;hz-p~OK@3R2jY-?2NmJ8> zjc-AP2=&E06@}uHeGrl2OCJPr5%*;&6!gLBQy&6aDB6cgtnB!mnR_Rb%_deNis%{c z+%sp+J^%OIo6GH|FcGy05;_TB5i&?foI*f6&~zi@d`bJ;NE4c2G&DFKTomp+EkD&% zRS4#a1W9_oo5*p9mZolzZVU*WwK7yrR4SMp=T=Ty)lAB&kO5R$#r&GYK_*?|`xePH z*pnxyT^Q8;;@JQPd+M%~rtFm~3oo6XDnJ20tO$>0+|^t=A?@SpZ=wo|B`E7!eCys} zRLc4uT#XoG*N8gHn)NX74}eF@8X`;7AMc}w%7WVHQ~C__t}@~c`p-M@0(43njUfI>%v;5I+IPT8rqk(1 z_GSk9?L&4dex1^;&>F}5&pMF_kbJg3LO3Fwo*94cJwBN|dp_0YzE3zr{&(MIxXXTG(aweFu2q5&b*1C%7uHE>JLu?kFs_56Tz<_i3PIox33E7 z2xMZtaF6FBsQ#gP&v84n(AH%!iEpAngTR-F1}cPhyoua``XdJCmfg{oDiyiuy~AqL zgNjQJoXWyhY>j4!W7D}7RP5S-tJoD#D7E?8&RL`6hEX8Dz!vXRQfKZ)KV0iBVAo`Q zlTbl^I@$C(@GaAV9r@-WXNjv0^$CACGr8P1&Z^`5x_XzZwHtlbNxN}8^SM)PM(eO_ zGZ{~&`z_l(VA@vFPFM#M$=;r1f7a^Drh82Zu_v3%L-P|Sv!h2w%!Sz*bi{d?kc;A< zZhCNdv%IQ3acmK>;39S}R~#bVF&!jNM=qDK;hCw?!u%AtaBjYkFQPTv-`T2)4g7xF zb7`!y(N}q!RdQb-8W9GjY2t*~u*|#id4ueNKQB4*}vc-xz#-kD*kV?d<*#3wb_Z21F_SE!ntfBQ7jhY#iT8}fqQFScctFg kya%~|*K6LjQtkNM{Ha7TlgT73J7L>BX!bqlU(XEu4zt$kbpQYW literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 4e68c5c55..ae4d0f100 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -32,6 +32,7 @@ from .helper import on_ci "Tests/images/crash-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif", "Tests/images/crash-86214e58da443d2b80820cff9677a38a33dcbbca.tif", "Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif", + "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 099f9ea65..14a685df8 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -562,6 +562,15 @@ ImagingLibTiffDecode( for (y = state->yoff; y < state->ysize; y += tile_length) { for (x = state->xoff; x < state->xsize; x += tile_width) { + /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions + have a different view of the size of the tiff than we're getting from + other functions. So, we need to check here. + */ + if (!TIFFCheckTile(tiff, x, y, 0, 0)) { + TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } if (isYCbCr) { /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { From 3bce145966374dd39ce58a6fc0083f8d1890719c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Jan 2021 15:53:09 +0200 Subject: [PATCH 344/750] Use more specific regex chars to prevent ReDoS * CVE-2021-25292 --- src/PIL/PdfParser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 975905f96..86d78a95c 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -580,8 +580,9 @@ class PdfParser: whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]" whitespace_optional = whitespace + b"*" whitespace_mandatory = whitespace + b"+" + whitespace_optional_no_nl = br"[\000\011\014\015\040]*" # no "\012" aka "\n" newline_only = br"[\r\n]+" - newline = whitespace_optional + newline_only + whitespace_optional + newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl re_trailer_end = re.compile( whitespace_mandatory + br"trailer" From 3f2b7d71402ff70cb873cadfe7379350da64b72c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 18:13:16 +0100 Subject: [PATCH 345/750] Release notes for 8.1.1 --- docs/releasenotes/8.1.1.rst | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/releasenotes/8.1.1.rst diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst new file mode 100644 index 000000000..7ee2b67a8 --- /dev/null +++ b/docs/releasenotes/8.1.1.rst @@ -0,0 +1,32 @@ +8.1.1 +----- + + +Security +======== + +CVE-2021-25289: The previous fix for CVE-2020-35654 was insufficent +due to incorrect error checking in TiffDecode.c. + +CVE-2021-25290: In TiffDecode.c, there is a negative-offset memcpy +with an invalid size + +CVE-2021-25291: In TiffDecode.c, invalid tile boundaries could lead to +an OOB Read in TiffReadRGBATile + +CVE-2021-25292: The PDF parser has a catastrophic backtracking regex +that could be used as a DOS attack. + +CVE-2021-25293: There is an Out of Bounds Read in SGIRleDecode.c, +since pillow 4.3.0. + +There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP +container formats where Pillow did not properly check the reported +size of the contained image. These images could cause arbitrariliy +large memory allocations. + + +Other Changes +============= + +A crash with the feature flags for LibJpeg and Webp on unreleased Python 3.10 has been fixed (https://github.com/python-pillow/Pillow/issues/5193) From c96eac1ca43ff48120fe0adf901f33f36a0301d6 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Feb 2021 18:19:17 +0100 Subject: [PATCH 346/750] Credits --- docs/releasenotes/8.1.1.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 7ee2b67a8..6483a4f4b 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -23,7 +23,8 @@ since pillow 4.3.0. There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP container formats where Pillow did not properly check the reported size of the contained image. These images could cause arbitrariliy -large memory allocations. +large memory allocations. This was reported by Jiayi Lin, Luke +Shaffer, Xinran Xie, and Akshay Ajayan of ASU.edu. Other Changes From fb4ae1ee3c7532857199654c8ced45ab396dc325 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Mar 2021 19:20:52 +1100 Subject: [PATCH 347/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b4d6b5348..e2073d867 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,12 +20,30 @@ Changelog (Pillow) - Support for ignoring tests when running valgrind #5150 [wiredfool, radarhere, hugovk] -- PyModule_AddObject fix for Python 3.10 #5194 - [radarhere] - - OSS-Fuzz support #5189 [wiredfool, radarhere] +8.1.1 (2020-03-01) +------------------ + +- Use more specific regex chars to prevent ReDoS. CVE-2021-25292 + [hugovk] + +- Fix OOB Read in TiffDecode.c, and check the tile validity before reading. CVE-2021-25291 + [wiredfool] + +- Fix negative size read in TiffDecode.c. CVE-2021-25290 + [wiredfool] + +- Fix OOB read in SgiRleDecode.c. CVE-2021-25293 + [wiredfool] + +- Incorrect error code checking in TiffDecode.c. CVE-2021-25289 + [wiredfool] + +- PyModule_AddObject fix for Python 3.10 #5194 + [radarhere] + 8.1.0 (2020-01-02) ------------------ From a80cf4227570a5e5148d8e9fb76366f3e3790405 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Mar 2021 19:22:57 +1100 Subject: [PATCH 348/750] Added 8.1.1 release notes to index --- docs/releasenotes/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 0930768e7..38aed08cf 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -15,6 +15,7 @@ expected to be backported to earlier versions. :maxdepth: 2 8.2.0 + 8.1.1 8.1.0 8.0.1 8.0.0 From 3c96fbf908b735a58bd39e663c5d5ad7350bbf5a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 1 Mar 2021 21:03:26 +0100 Subject: [PATCH 349/750] Removed "Remove me" testing lines --- .github/workflows/cifuzz.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index e158bd84d..9fe8f774f 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -2,12 +2,10 @@ name: CIFuzz on: push: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" pull_request: paths: - - "**.yml" # testing, remove me - "**.c" - "**.h" From 8e887b62ac3d02493d5666aa7ea190ecb417adb0 Mon Sep 17 00:00:00 2001 From: heitbaum Date: Tue, 2 Mar 2021 20:09:23 +1100 Subject: [PATCH 350/750] CHANGES.rst: update dates --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e2073d867..923142a61 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,7 +23,7 @@ Changelog (Pillow) - OSS-Fuzz support #5189 [wiredfool, radarhere] -8.1.1 (2020-03-01) +8.1.1 (2021-03-01) ------------------ - Use more specific regex chars to prevent ReDoS. CVE-2021-25292 @@ -44,7 +44,7 @@ Changelog (Pillow) - PyModule_AddObject fix for Python 3.10 #5194 [radarhere] -8.1.0 (2020-01-02) +8.1.0 (2021-01-02) ------------------ - Fix TIFF OOB Write error. CVE-2020-35654 #5175 From 915f68967fd6de16b16b75a68dccd4ac30168c6f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 2 Mar 2021 13:16:14 +0200 Subject: [PATCH 351/750] Update release notes formatting, links, spelling --- docs/conf.py | 4 ++++ docs/releasenotes/8.1.0.rst | 10 +++++----- docs/releasenotes/8.1.1.rst | 28 +++++++++++++++------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4fb9d1f8f..123e93c9b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -312,3 +312,7 @@ def setup(app): app.add_js_file("js/script.js") app.add_css_file("css/dark.css") app.add_css_file("css/light.css") + + +# GitHub repo for sphinx-issues +issues_github_path = "python-pillow/Pillow" diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 5c4ee3773..c5fc26226 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -18,7 +18,7 @@ vulnerability introduced in FreeType 2.6 (:cve:`CVE-2020-15999`). Makefile ^^^^^^^^ -The 'install-venv' target has been deprecated. +The ``install-venv`` target has been deprecated. API Additions ============= @@ -48,15 +48,15 @@ Thanks to Google's `OSS-Fuzz`_ project for finding this. * :cve:`CVE-2020-35654` Fix TIFF OOB Write error -OOB Write in TiffDecode.c when reading corrupt YCbCr files in some LibTIFF versions +OOB Write in ``TiffDecode.c`` when reading corrupt YCbCr files in some LibTIFF versions (4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to an Out of -bounds write in TiffDecode.c. This potentially affects Pillow versions from 6.0.0 to +bounds write in ``TiffDecode.c``. This potentially affects Pillow versions from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun -4 byte read overflow in SGIRleDecode.c, where the code was not correctly checking the +4 byte read overflow in ``SGIRleDecode.c``, where the code was not correctly checking the offsets and length tables. Independently reported through `Tidelift`_ and Google's `OSS-Fuzz`_. This vulnerability covers Pillow versions 4.3.0->8.0.1. @@ -78,7 +78,7 @@ Other Changes Makefile ^^^^^^^^ -The 'co' target has been removed. +The ``co`` target has been removed. PyPy wheels ^^^^^^^^^^^ diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 6483a4f4b..51a81c7a6 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -5,29 +5,31 @@ Security ======== -CVE-2021-25289: The previous fix for CVE-2020-35654 was insufficent -due to incorrect error checking in TiffDecode.c. +:cve:`CVE-2021-25289`: The previous fix for :cve:`CVE-2020-35654` was insufficient +due to incorrect error checking in ``TiffDecode.c``. -CVE-2021-25290: In TiffDecode.c, there is a negative-offset memcpy -with an invalid size +:cve:`CVE-2021-25290`: In ``TiffDecode.c``, there is a negative-offset ``memcpy`` +with an invalid size. -CVE-2021-25291: In TiffDecode.c, invalid tile boundaries could lead to -an OOB Read in TiffReadRGBATile +:cve:`CVE-2021-25291`: In ``TiffDecode.c``, invalid tile boundaries could lead to +an out-of-bounds read in ``TIFFReadRGBATile``. -CVE-2021-25292: The PDF parser has a catastrophic backtracking regex +:cve:`CVE-2021-25292`: The PDF parser has a catastrophic backtracking regex that could be used as a DOS attack. -CVE-2021-25293: There is an Out of Bounds Read in SGIRleDecode.c, -since pillow 4.3.0. +:cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, +since Pillow 4.3.0. -There is an Exhaustion of Memory DOS in the ICNS, ICO, and BLP +There is an exhaustion of memory DOS in the ICNS, ICO, and BLP container formats where Pillow did not properly check the reported -size of the contained image. These images could cause arbitrariliy +size of the contained image. These images could cause arbitrarily large memory allocations. This was reported by Jiayi Lin, Luke -Shaffer, Xinran Xie, and Akshay Ajayan of ASU.edu. +Shaffer, Xinran Xie, and Akshay Ajayan of +`Arizona State University `_. Other Changes ============= -A crash with the feature flags for LibJpeg and Webp on unreleased Python 3.10 has been fixed (https://github.com/python-pillow/Pillow/issues/5193) +A crash with the feature flags for libjpeg and WebP on unreleased Python 3.10 has been +fixed (:issue:`5193`). From b41dab0e9b8a0b8bb0fa3118e8a06b7dc05ba1cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Mar 2021 23:22:06 +1100 Subject: [PATCH 352/750] Expanded "OOB" to "out-of-bounds" [ci skip] --- docs/releasenotes/7.1.0.rst | 2 +- docs/releasenotes/8.1.0.rst | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/releasenotes/7.1.0.rst b/docs/releasenotes/7.1.0.rst index fd3627e3c..0024a537d 100644 --- a/docs/releasenotes/7.1.0.rst +++ b/docs/releasenotes/7.1.0.rst @@ -74,7 +74,7 @@ Security This release includes security fixes. -* :cve:`CVE-2020-10177` Fix multiple OOB reads in FLI decoding +* :cve:`CVE-2020-10177` Fix multiple out-of-bounds reads in FLI decoding * :cve:`CVE-2020-10378` Fix bounds overflow in PCX decoding * :cve:`CVE-2020-10379` Fix two buffer overflows in TIFF decoding * :cve:`CVE-2020-10994` Fix bounds overflow in JPEG 2000 decoding diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index c5fc26226..17074d486 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -46,13 +46,14 @@ The PCX image decoder used the reported image stride to calculate the row buffer rather than calculating it from the image size. This issue dates back to the PIL fork. Thanks to Google's `OSS-Fuzz`_ project for finding this. -* :cve:`CVE-2020-35654` Fix TIFF OOB Write error +* :cve:`CVE-2020-35654` Fix TIFF out-of-bounds write error -OOB Write in ``TiffDecode.c`` when reading corrupt YCbCr files in some LibTIFF versions -(4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases LibTIFF's -interpretation of the file is different when reading in RGBA mode, leading to an Out of -bounds write in ``TiffDecode.c``. This potentially affects Pillow versions from 6.0.0 to -8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. +Out-of-bounds write in ``TiffDecode.c`` when reading corrupt YCbCr files in some +LibTIFF versions (4.1.0/Ubuntu 20.04, but not 4.0.9/Ubuntu 18.04). In some cases +LibTIFF's interpretation of the file is different when reading in RGBA mode, leading to +an out-of-bounds write in ``TiffDecode.c``. This potentially affects Pillow versions +from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported through +`Tidelift`_. * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun From f676b10813ef16141bc7f6bff050384a3960a471 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 Mar 2021 07:56:29 +1100 Subject: [PATCH 353/750] Updated libimagequant to 2.14.1 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index e204ea9ad..376d8ef9b 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.14.0 +archive=libimagequant-2.14.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 4610d87d8..ec39c9fa8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -177,7 +177,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.14** + * Pillow has been tested with libimagequant **2.6-2.14.1** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From 333fd06e9075b483046dd59aa0474d34fa3224ca Mon Sep 17 00:00:00 2001 From: nulano Date: Tue, 2 Mar 2021 23:19:20 +0100 Subject: [PATCH 354/750] update libimagequant in winbuild --- winbuild/build_prepare.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 2f7c858bc..7b561aa4e 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -255,10 +255,10 @@ deps = { "libs": [r"bin\*.lib"], }, "libimagequant": { - # e5d454b: Merge tag '2.12.6' into msvc - "url": "https://github.com/ImageOptim/libimagequant/archive/e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4.zip", # noqa: E501 - "filename": "libimagequant-e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4.zip", - "dir": "libimagequant-e5d454bc7f5eb63ee50c84a83a7fa5ac94f68ec4", + # Merge master into msvc (matches 2.14.1 except for version bump) + "url": "https://github.com/ImageOptim/libimagequant/archive/16adaded22d1f90db5c9154a06d00a8b672ca09a.zip", # noqa: E501 + "filename": "libimagequant-16adaded22d1f90db5c9154a06d00a8b672ca09a.zip", + "dir": "libimagequant-16adaded22d1f90db5c9154a06d00a8b672ca09a", "patch": { "CMakeLists.txt": { "add_library": "add_compile_options(-openmp-)\r\nadd_library", From d0cf8ffef5012b4fb9766b7974beb9e7f2f4b88b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 3 Mar 2021 10:47:21 +0200 Subject: [PATCH 355/750] Fix filename spelling Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/releasenotes/8.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 17074d486..8ed1d9d85 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -57,7 +57,7 @@ from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported thro * :cve:`CVE-2020-35655` Fix for SGI Decode buffer overrun -4 byte read overflow in ``SGIRleDecode.c``, where the code was not correctly checking the +4 byte read overflow in ``SgiRleDecode.c``, where the code was not correctly checking the offsets and length tables. Independently reported through `Tidelift`_ and Google's `OSS-Fuzz`_. This vulnerability covers Pillow versions 4.3.0->8.0.1. From b959ee7885fbca24ebe001531c799addde14881b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 3 Mar 2021 20:34:52 +1100 Subject: [PATCH 356/750] Corrected list of relevant dependencies [ci skip] --- docs/releasenotes/8.1.1.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 51a81c7a6..40add51b0 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -31,5 +31,5 @@ Shaffer, Xinran Xie, and Akshay Ajayan of Other Changes ============= -A crash with the feature flags for libjpeg and WebP on unreleased Python 3.10 has been -fixed (:issue:`5193`). +A crash with the feature flags for libimagequant, libjpegturbo, WebP and XCB on +unreleased Python 3.10 has been fixed (:issue:`5193`). From 944fd834dbc271859f5f0b44a2c75b7a15ed90a4 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 3 Mar 2021 22:38:24 +1100 Subject: [PATCH 357/750] Updated spelling [ci skip] Co-authored-by: Hugo van Kemenade --- docs/releasenotes/8.1.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 40add51b0..f5c2ed90c 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -31,5 +31,5 @@ Shaffer, Xinran Xie, and Akshay Ajayan of Other Changes ============= -A crash with the feature flags for libimagequant, libjpegturbo, WebP and XCB on +A crash with the feature flags for libimagequant, libjpeg-turbo, WebP and XCB on unreleased Python 3.10 has been fixed (:issue:`5193`). From 852fd170f8f3bb45cb0a7709d62bbc52b568d8bc Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Wed, 3 Mar 2021 13:30:28 +0000 Subject: [PATCH 358/750] Fix -Wformat error in TiffDecode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit src/libImaging/TiffDecode.c: In function ‘_tiffReadProc’: src/libImaging/TiffDecode.c:59:58: error: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘toff_t’ {aka ‘long unsigned int’} [-Werror=format=] src/libImaging/TiffDecode.c:59:67: error: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘toff_t’ {aka ‘long unsigned int’} [-Werror=format=] --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 14a685df8..a67091921 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -56,7 +56,7 @@ _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { dump_state(state); if (state->loc > state->eof) { - TIFFError("_tiffReadProc", "Invalid Read at loc %d, eof: %d", state->loc, state->eof); + TIFFError("_tiffReadProc", "Invalid Read at loc %lu, eof: %lu", state->loc, state->eof); return 0; } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); From 346bfc95375fe9441f904af21af1e6ddb3d2898d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:55:24 +1100 Subject: [PATCH 359/750] Added IPythonViewer --- Tests/test_imageshow.py | 18 +++++++++++++++++- src/PIL/ImageShow.py | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index 78e80f521..5981e22c0 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -62,4 +62,20 @@ def test_viewer(): def test_viewers(): for viewer in ImageShow._viewers: - viewer.get_command("test.jpg") + try: + viewer.get_command("test.jpg") + except NotImplementedError: + pass + + +def test_ipythonviewer(): + pytest.importorskip("IPython", reason="IPython not installed") + for viewer in ImageShow._viewers: + if isinstance(viewer, ImageShow.IPythonViewer): + test_viewer = viewer + break + else: + assert False + + im = hopper() + assert test_viewer.show(im) == 1 diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index fceb65378..9e7614144 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -225,6 +225,21 @@ if sys.platform not in ("win32", "darwin"): # unixoids if shutil.which("xv"): register(XVViewer) + +class IPythonViewer(Viewer): + def show_image(self, image, **options): + display(image) + return 1 + + +try: + from IPython.display import display +except ImportError: + pass +else: + register(IPythonViewer) + + if __name__ == "__main__": if len(sys.argv) < 2: From f067fe4c05bfed6e20257c3c54f77ade8547de86 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:56:03 +1100 Subject: [PATCH 360/750] Added import alias for clarity --- src/PIL/ImageShow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 9e7614144..bb04c4e29 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -228,12 +228,12 @@ if sys.platform not in ("win32", "darwin"): # unixoids class IPythonViewer(Viewer): def show_image(self, image, **options): - display(image) + ipython_display(image) return 1 try: - from IPython.display import display + from IPython.display import display as ipython_display except ImportError: pass else: From 5e0a4acb85bd3ea1dd2d41e25bc4616fde15b138 Mon Sep 17 00:00:00 2001 From: Kipkurui Mutai Date: Sun, 28 Feb 2021 19:50:27 +0300 Subject: [PATCH 361/750] Update ImageShow.rst --- docs/reference/ImageShow.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reference/ImageShow.rst b/docs/reference/ImageShow.rst index a30a6caed..f1fbd90ce 100644 --- a/docs/reference/ImageShow.rst +++ b/docs/reference/ImageShow.rst @@ -9,6 +9,7 @@ All default viewers convert the image to be shown to PNG format. .. autofunction:: PIL.ImageShow.show +.. autoclass:: IPythonViewer .. autoclass:: WindowsViewer .. autoclass:: MacViewer From 7b094638094986a7506efb310b6dcbe72675276b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:56:49 +1100 Subject: [PATCH 362/750] Added IPythonViewer docstring --- src/PIL/ImageShow.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index bb04c4e29..3368865a4 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -227,6 +227,8 @@ if sys.platform not in ("win32", "darwin"): # unixoids class IPythonViewer(Viewer): + """The viewer for IPython frontends.""" + def show_image(self, image, **options): ipython_display(image) return 1 From a1463ff211c37a026135894487d13f7c908ed8ce Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 08:59:47 +1100 Subject: [PATCH 363/750] Added release notes --- docs/releasenotes/8.2.0.rst | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 28d39ca46..f27f295a7 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -21,10 +21,17 @@ TODO API Additions ============= -TODO -^^^^ +ImageShow.IPythonViewer +^^^^^^^^^^^^^^^^^^^^^^^ -TODO +If IPython is present, this new ``ImageShow.Viewer`` subclass will be +registered. It displays images on all IPython frontends. This will be helpful +to users of Google Colab, allowing ``im.show()`` to display images. + +It is lower in priority than the other default Viewer instances, so it will +only be used by ``im.show()`` or ``ImageShow.show()`` if none of the other +viewers are available. This means that the behaviour of ``ImageShow`` will stay +the same for most Pillow users. Security ======== From b885af93cb56a9e73be58440b6f217e94e3cc45e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Mar 2021 17:33:47 +1100 Subject: [PATCH 364/750] Added more CVE numbers [ci skip] --- docs/releasenotes/8.1.1.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index f5c2ed90c..90a786ec4 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -20,11 +20,11 @@ that could be used as a DOS attack. :cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, since Pillow 4.3.0. -There is an exhaustion of memory DOS in the ICNS, ICO, and BLP -container formats where Pillow did not properly check the reported -size of the contained image. These images could cause arbitrarily -large memory allocations. This was reported by Jiayi Lin, Luke -Shaffer, Xinran Xie, and Akshay Ajayan of +There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), +ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats +where Pillow did not properly check the reported size of the contained image. +These images could cause arbitrarily large memory allocations. This was reported +by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of `Arizona State University `_. From 480f6819b592d7f07b9a9a52a7656c10bbe07442 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Feb 2021 23:27:07 +0100 Subject: [PATCH 365/750] Fix Memory DOS in Icns, Ico and Blp Image Plugins Some container plugins that could contain images of other formats, such as the ICNS format, did not properly check the reported size of the contained image. These images could cause arbitrariliy large memory allocations. This is fixed for all locations where individual *ImageFile classes are created without going through the usual Image.open method. --- ...d3316a4109213ca96fb8a256a0bfefdece1461.icns | Bin 0 -> 240915 bytes Tests/test_file_icns.py | 6 ++++++ src/PIL/BlpImagePlugin.py | 1 + src/PIL/IcnsImagePlugin.py | 2 ++ src/PIL/IcoImagePlugin.py | 1 + 5 files changed, 10 insertions(+) create mode 100644 Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns diff --git a/Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns b/Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns new file mode 100644 index 0000000000000000000000000000000000000000..0521f5cf176fd6c774b7e58a7f450dbc369644a9 GIT binary patch literal 240915 zcmbTa1ym)?5}OgPLJqnW#YceHk7Cj4T+ zzpikJUsuboCWe)zsWY#O{UiVY1OUJwA-`$>oQjEqt@A&(0l-PhTG=~*AOQe&_O8y# z62gRz8wiU)n6DW-caQ9P-7s96q!i!vF8`zwP|D*8d*<8QXtp+$sH!F#}>u{zvv7+yBTM3IG7khp*Vg{YPe;4gj=- z0svU+|B;dA0RV_006_E1f4vXJKl8=X)zy)kfx*MWgWk%_g#Mp^{=58tD*RjXe+~cj zJo&0N{g)5_;J@be7oZk?0MHER0Z21w0MLs` z02nGP08}^Us|Wb+ag&8s2mJHpX%HO!Yu{k=S#ma*4AF+tCDxry+ zv->~%^-cU!fdgOwhyXMIHUJ+$0-yxY0hj?C03LuKKnx%aPyna`v;g`56M!Ya4&V&% z0Qdj`0bzhBKpY?$kO9aA6avZs)qr|H3!oFw2N(uS0A>M8fDOPl-~ez2xCT4|-heUFu*aqwa zjsfR@Yrq}g3Gf#93IYlO2Z9EI2SN_Q0Ky3(1R?{X3Ze&M0pbMW1rh@C6C@3!0HhM6 z8Ke(n0%Qqf8{`b+0TciV3yJ|s1WE_W2`U1r0ICgY4(bf*2O0^Q0$KoC4cZPm0=fXY z4SEjx0tNww3PuP<2gU;?38n^S0_Ftf2Nn&M0agmu3^oY10JZ~m4fX*J4~`2?1I`UD z1+EEh0qy}F2A%?54BiAj1il1*0R9L80f7NQ0l@(w384jH4dD$D4Ur8|1JMgH2eAk7 z00{|+4M_vZ2dMyQ1nCMH2AK|73E2ZV4|xFj3s62vmYio~kHTEcq8Cd3xQw!x0aZo%Hf0mGrjQNr=S$-x=I zIsb5%dt85~33d5!w=_5e^bw6X6m`61frO6HODn5mOMW5eE_15O0#ekZ_Wi zlO&P!lU$P$kjjzzkXDeclR=Yll39|al8ul(kyDUskcX4EkRMZEQAkmEQB+X;ri7;y zpmd@vpj@PapyH&mp~|M3r3Rs9qqd~Zq@JMxp<$=7qRFP2qXnnsqP3?jpk1MZqZ6WY zr>mgbp~s+?r4OQSp}%AxWzc4bXBc7lU}R&oWh`XeU_xP%W(s0zXS!vkW;S8YWL{)} zXAx)dXK7`*VWnX;W6fb*WkY3?V+&{NXZy>}!S2jn&3?i`%3;Wn#j(PP#;M2|%{j^i z&Lzy{&(+EG!p+X@%3aTW#Y4wq!&A<4%uB&*##_j{$4AU(#Fx*v%}>a0$e+i*EkGn- zBv2r*D@Y<}Dp)LdBt#`-EmSFVDaowDLO5NBBmymA+{w> zEN&rQA$~2vCgCm7D+w+sBN;EbB84YqB2^}JEzKeAD?KO!C!->hA+sw>E$b}XE(anf zEte?wTb@kbUcN;Epdh7?sIaL>q3ER8p#-6%sFbO6sLZ77qdcO5s$!s0uJWiVtQxDj zp+>3Zrq-{HsIIGCrv9WMs*#|vt;wM2t2v>Cqh+Plstu{Fu3fDCpd+S}taG5trW>Za ztVf~esW+yNqi?IvWqfTSVv=fdW-4f!WO`!8 zXO>`gWX@-vV18`DXOU=eVkuymVtH;QVwGWaV=ZZ&YyD)SU{hlAX{%vdV+UntXxC~!rc<6P_lbkTEZbw&G1rY7Ae-9p`V-1*%z-Jd!f-!m*TmNJDiYqD^&eq=pmn`Y1F2#PQHy4l>r2K;T<^JoiP`z-Zh_k4y7^gU@_-~1Q$#$u7>0lX0Sy?%5d29tpgTy?`?JTZ=b_iJ_q@-dZ?E5=e`7#%U~y1s zaC%5)XmnV7cwj_mq-T_Gv~!GmtZkfgyk&xYqIr^SvT2HKs%e^ix_O3UrgfHUwtbFw zu6tf!zHdQvVR%t$abih+X>M6?Xik2_DqPi9YbP7lr;&)&|% zE|4#>E-5b?uLQ3quQjg^Zk%sEZ=>(9?@I1j@B1GVAGRLt9^alKpRu1yUpQYzUNv5i z-aOtR-_!n5{cZn{`S|^5_xbs?{u7&+nwkGA75K^@K>w9pe#t?;eqZV1*ZI$16O&Jc zPo=NS;H&(TWc+uc@jtb}ApcqI|L@~d8Sqa&4g`XOfdPP@x&Tx{MNLh^|L4$DRMh-5 z1t0@}GDbE=rfziZZ1i8r^Jm;wPV!}iGWTVZIMauV>~qCwXwi|FABxA$Ur!cd7HW%_ zK4g_pMNiD$7}XTh7?ayriL93Ci8+yxxEJk26&s(`Rp-zf)()2Gtj-ZD9@t5ylp!>- zu1`?-;0QamCm<#YnYRM%JVdoEYm{aFA^X#FUQRm_N|`6T;{Jkz^~ zZ|3r1w=VS;DLC8X?lUl%j#liPcTh(YnyS&_P%O?j5#oV;Tu zp976;=}dzUm~&t=uBEI=>uU@Gb+4wv-n7;j^LOy_&+jt=0ht9Thg^CabMyj1s4GFVXO>vTfVL?0LLA%R1SIcmH4;T{LMv&|Jc#&_A4{n2Os?a+ND|Hkd z9ptfb&s#RzR^?*u2}_(9aXG9?*nt4pMEsIngg*#*4GDUxBnx(>7?}?gHiKW)BWI4S=hds??>`Lh9>W} z+2}b!ieON8VbPj_Ln^{3`J%Y{lRX&y{u%l-cv65_ZGbJn0>b(bL zzwwl4&`x*XUFTaUvbJT~Y6Yt&l4+5d$x8vyRzFBWF4O&DA>+>H5gF93*ce7BR^?Ik zf%Uo9oOGq|XQ927tV~WDL_eHye;+{&%q@6jP@|}GY*Fxhl>m2Q9!kv;+=VimhMJiW z^uXJvPk7k5$l>%4KTKWZK$^w?nIQExvfCX(T04x{Z7>r}PRPurUiVPSye{zxKAh9? zQKZl<%M-MlK+EfGn>1F>6oCtpS?K$Z;2Y0R$L;T&o;zCh$vR!G(zLS{d%3QcrlJ8e z(<8ar`2^V+HuMID8PbJ}{9D{eig3=KWE&j&M>*QTZb_Ko$0mzh-Q(0A-gcI7r=U>+ z+e=9AXVb&KwDq!9vRiJ!I9l)v8fgb00@9DDLH7UMsPw(hK0KCaod9Si@gRIc&>B=T?mUL_Gv^kJ4U$DwfNMk85HmU88~an zR9o9PQVExp36RfHrE?^dHV)lUIkS>4A69c1V`*T{1ro3x%KKa-^UtNTe`hBN%deLl zM^CiOy_i5}ZNoBVN{``MXF=<~T?uD*x0}&OTUI?g?JS>x*KxMJY;!6?{B>4SI4ShE zDdtL6w;B7#GyA?Cy}HqYlENSG_!|oG;9mo%z?P`Qin)k_={h#s(^>t@B=WJ60O2sq zW`HX^7W8f##L9 zdZdy^72{A}LymvLaV49Xp7pq-Nv2$(t6Saw%0bvAxz+aDh8^2vGIC2TQ%&twzg0QY zyqMf$W*P;_L2@iyQm^ftN40-SI!F1GSLe6QM;J1IP5LC$NWnMo)t@Jj;3og9l zrWtKGk7yeHZi1kyT0HdUpZx6Ni9@O=7`mIEFLYq|)-!34uV-@Aj8D4bi}eY#6Zvhp zMm?#~Q~hj{e_=V9PSJa+pXEyX?o^~alxqNy4fjlni*O}iJ&5tkZ9(-Jwhtv%h6&-> z3^mZFY3Ye##fsv$VA6$OBuY&n2%f`A`aheAo>hpgxC3ITzp=;D^Yfy2>>Hh1XF@P- z8=JtoCoTGWK&j%Fl3GNl5mNwCnq*dNLIM;DKTtH+>2AGzFg82c7T&!jr~^~`EhWGc zRgw55?NM(nIjw(8K}Au8hb>n^Z(g#AZrye~ubq?FE#_gM!MGxzj6S~;nK;b)tBmx^ z$y2zPI@HFx4O|owJuWc5Q`L&6uSJ*t2oUy9stxOGlGgcMqTh769H;`af=vg8$^i@E zTbu0YmQhWFz*-$t3)#R@pI{RSVn3t~Z8`$+?lJrs#Kz@8lWC^zT|d{sL9;0Q>$#sh z9(WePzy>O2Hfhe3(qW~+uu&u@N59wCfY^U7&a&se9CJ+rhSKlv6!(4zV({R})o(r( zAL{G*CRRw=nFrwvOhX950{7GbpfYZj+V zY&Q@kyh++tG@Hjg zMN(-qHyt52gniaslI+{|L88<3ShNYrU4xsM86(_9+q2`g`F+4Zd4Bk?bxt>EBXv?z$OjN* zIbAob*4@l!R!Ug%=84$fp7>1e6)E@0+fmGSM32L#UtB~*I?+QDe{tfgXIp{Wsu1`b zit=MJIK?AWKn}#(weu8Vv0|t9;%{bQGEfQ1D3=B5&r*h{2`_Cl{_`DBBgF6MX(V2> z>zyl@en8TJ?oY>3iar$RV?=>injvAFiuMPw_6Mr^WesS1P>9J52Eq)f*jjMJ3u@Lf zNC6n*?+&kCz*$=%LG`7WCS&yU{K5rv36+~>==vtBogD&G;dGL@jDs)8hcJ3=`E2!X zM))bXB&-1Yt0uT$x8;T3qYBB$WDw3Iaup%ELq5?s?|+D~jqJ=X`r(NVT%U{z7yY)X?&L#3 z*E|F33QVV*r(Rlqf!ToKD``iuQ7J}GNgm`M4z~N-&(Hp=NrXh22??(AK-qFDU_k%I zE!rTnMZbb$6nyu7JHa3;jY2M|bv4?TB%2{D&uEOnKDTf4952I0+OeJ@{%XF}RA$bt z^x_iLUaW!krwGK;6pdo%uS8U`>O^|q!V?~gZihMUGg(rzdlcREaDvt;-ifN0ksL!Y{82+IL+3lB=x7vb+e@F)`*Fp63J z)E`{H{{^Gg*QWYz>T&WwTLRw4-awSjjc%abHbcet-_I9 z0N)LS9@S1#dX@0V)LqI_mNoswFYjd3v`5dh+eLgSa&ab0Qrt0gfY15 z^~7W2hj_7`^;SQyig!3Eol2>*L8q}0bH6XFe^+8Gt%biLpH+Qp&pz8OEM5KU`pnkT zfVWs6hY;y_)OY_hLrZi(m}E^BZ^jG^V5*;iUOBHK@#ZoWq@AowvXAmylX)ACaO$zs zrvB8zkM)u_j4%0}JN*1QCy4tH&itv&nLO`n<(%h#3F$;l*&*`9Czt;We4gg|1K&^A zD+<*}!@ne(2J9^k^l#u62tjFaq+PV}a`BQ=d1$>&IR5K`%ℑ?Ji*~_)TXvunaHt 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index fef2329bc..ea022332c 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -140,3 +140,9 @@ def test_not_an_icns_file(): with io.BytesIO(b"invalid\n") as fp: with pytest.raises(SyntaxError): IcnsImagePlugin.IcnsFile(fp) + + +def test_icns_decompression_bomb(): + with pytest.raises(Image.DecompressionBombError): + im = Image.open('Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns') + im.load() diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index d5d7c0e05..88aae80eb 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -353,6 +353,7 @@ class BLP1Decoder(_BLPBaseDecoder): data = jpeg_header + data data = BytesIO(data) image = JpegImageFile(data) + Image._decompression_bomb_check(image.size) self.tile = image.tile # :/ self.fd = image.fp self.mode = image.mode diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 2a63d75cb..ca6a0adad 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -105,6 +105,7 @@ def read_png_or_jpeg2000(fobj, start_length, size): if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": fobj.seek(start) im = PngImagePlugin.PngImageFile(fobj) + Image._decompression_bomb_check(im.size) return {"RGBA": im} elif ( sig[:4] == b"\xff\x4f\xff\x51" @@ -121,6 +122,7 @@ def read_png_or_jpeg2000(fobj, start_length, size): jp2kstream = fobj.read(length) f = io.BytesIO(jp2kstream) im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + Image._decompression_bomb_check(im.size) if im.mode != "RGBA": im = im.convert("RGBA") return {"RGBA": im} diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index e1bfa7a59..5634bf8e9 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -178,6 +178,7 @@ class IcoFile: if data[:8] == PngImagePlugin._MAGIC: # png frame im = PngImagePlugin.PngImageFile(self.buf) + Image._decompression_bomb_check(im.size) else: # XOR + AND mask bmp frame im = BmpImagePlugin.DibImageFile(self.buf) From 5269ab13a760612b6bff3685f2fc83d28765b420 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 10:20:01 +1100 Subject: [PATCH 366/750] Lint fix --- Tests/test_file_icns.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index ea022332c..7ce8cb286 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -144,5 +144,7 @@ def test_not_an_icns_file(): def test_icns_decompression_bomb(): with pytest.raises(Image.DecompressionBombError): - im = Image.open('Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns') + im = Image.open( + "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" + ) im.load() From f2ea25780a97360bbe42f8c3ff1f97c97b2646cd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 13:21:30 +1100 Subject: [PATCH 367/750] Added release notes for 8.1.2 --- docs/releasenotes/8.1.1.rst | 8 -------- docs/releasenotes/8.1.2.rst | 12 ++++++++++++ docs/releasenotes/index.rst | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 docs/releasenotes/8.1.2.rst diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 90a786ec4..4081c49ca 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -1,7 +1,6 @@ 8.1.1 ----- - Security ======== @@ -20,13 +19,6 @@ that could be used as a DOS attack. :cve:`CVE-2021-25293`: There is an out-of-bounds read in ``SgiRleDecode.c``, since Pillow 4.3.0. -There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), -ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats -where Pillow did not properly check the reported size of the contained image. -These images could cause arbitrarily large memory allocations. This was reported -by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of -`Arizona State University `_. - Other Changes ============= diff --git a/docs/releasenotes/8.1.2.rst b/docs/releasenotes/8.1.2.rst new file mode 100644 index 000000000..50d132f33 --- /dev/null +++ b/docs/releasenotes/8.1.2.rst @@ -0,0 +1,12 @@ +8.1.2 +----- + +Security +======== + +There is an exhaustion of memory DOS in the BLP (:cve:`CVE-2021-27921`), +ICNS (:cve:`CVE-2021-27922`) and ICO (:cve:`CVE-2021-27923`) container formats +where Pillow did not properly check the reported size of the contained image. +These images could cause arbitrarily large memory allocations. This was reported +by Jiayi Lin, Luke Shaffer, Xinran Xie, and Akshay Ajayan of +`Arizona State University `_. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 38aed08cf..117738675 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -15,6 +15,7 @@ expected to be backported to earlier versions. :maxdepth: 2 8.2.0 + 8.1.2 8.1.1 8.1.0 8.0.1 From 1d7cbeb338a6e042ad21e4e242c600200c1b5de9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 13:24:53 +1100 Subject: [PATCH 368/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 923142a61..50401e2c3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,6 +23,12 @@ Changelog (Pillow) - OSS-Fuzz support #5189 [wiredfool, radarhere] +8.1.2 (2021-03-06) +------------------ + +- Fix Memory DOS in BLP (CVE-2021-27921), ICNS (CVE-2021-27922) and ICO (CVE-2021-27923) Image Plugins + [wiredfool] + 8.1.1 (2021-03-01) ------------------ From 690cf9ebe2d7002eb134980cbb07ed7b113ae5bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 20:54:21 +1100 Subject: [PATCH 369/750] Allow alpha_composite destination to be negative --- Tests/test_image.py | 8 ++++++-- src/PIL/Image.py | 2 -- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 73cf7bf83..de1999d3d 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -344,6 +344,12 @@ class TestImage: assert_image_equal(offset.crop((64, 64, 127, 127)), target.crop((0, 0, 63, 63))) assert offset.size == (128, 128) + # with negative offset + offset = src.copy() + offset.alpha_composite(over, (-64, -64)) + assert_image_equal(offset.crop((0, 0, 63, 63)), target.crop((64, 64, 127, 127))) + assert offset.size == (128, 128) + # offset and crop box = src.copy() box.alpha_composite(over, (64, 64), (0, 0, 32, 32)) @@ -367,8 +373,6 @@ class TestImage: source.alpha_composite(over, 0) with pytest.raises(ValueError): source.alpha_composite(over, (0, 0), 0) - with pytest.raises(ValueError): - source.alpha_composite(over, (0, -1)) with pytest.raises(ValueError): source.alpha_composite(over, (0, 0), (0, -1)) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 01fe7ed1b..d2a7c3490 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1544,8 +1544,6 @@ class Image: raise ValueError("Destination must be a 2-tuple") if min(source) < 0: raise ValueError("Source must be non-negative") - if min(dest) < 0: - raise ValueError("Destination must be non-negative") if len(source) == 2: source = source + im.size From 8206f14419873c7186ba7b9028d9d5189bce385b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Mar 2021 21:44:31 +1100 Subject: [PATCH 370/750] Simplified code --- src/PIL/Image.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 01fe7ed1b..cc1c23fdb 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2396,18 +2396,11 @@ class Image: :returns: An :py:class:`~PIL.Image.Image` object. """ - if self.mode == "LA": + if self.mode in ("LA", "RGBA"): return ( - self.convert("La") + self.convert(self.mode.replace("A", "a")) .transform(size, method, data, resample, fill, fillcolor) - .convert("LA") - ) - - if self.mode == "RGBA": - return ( - self.convert("RGBa") - .transform(size, method, data, resample, fill, fillcolor) - .convert("RGBA") + .convert(self.mode) ) if isinstance(method, ImageTransformHandler): From e437a8f9817d993df4b53e675dab24c069acab88 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 7 Mar 2021 13:14:07 +1100 Subject: [PATCH 371/750] Do not edit text of mode strings --- src/PIL/Image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index cc1c23fdb..451349d17 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1913,7 +1913,7 @@ class Image: resample = NEAREST if self.mode in ["LA", "RGBA"]: - im = self.convert(self.mode[:-1] + "a") + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) im = im.resize(size, resample, box) return im.convert(self.mode) @@ -1963,7 +1963,7 @@ class Image: return self.copy() if self.mode in ["LA", "RGBA"]: - im = self.convert(self.mode[:-1] + "a") + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) im = im.reduce(factor, box) return im.convert(self.mode) @@ -2398,7 +2398,7 @@ class Image: if self.mode in ("LA", "RGBA"): return ( - self.convert(self.mode.replace("A", "a")) + self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) .transform(size, method, data, resample, fill, fillcolor) .convert(self.mode) ) From ca204ba04f9c68708a5acd9f7a40bbea199f39af Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 7 Mar 2021 14:21:27 +1100 Subject: [PATCH 372/750] Removed Image._MODEINFO --- src/PIL/Image.py | 25 ++----------------------- src/PIL/ImageMode.py | 30 ++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 33 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 01fe7ed1b..deb39435e 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -213,28 +213,7 @@ DECODERS = {} ENCODERS = {} # -------------------------------------------------------------------- -# Modes supported by this version - -_MODEINFO = { - # NOTE: this table will be removed in future versions. use - # getmode* functions or ImageMode descriptors instead. - # official modes - "1": ("L", "L", ("1",)), - "L": ("L", "L", ("L",)), - "I": ("L", "I", ("I",)), - "F": ("L", "F", ("F",)), - "P": ("P", "L", ("P",)), - "RGB": ("RGB", "L", ("R", "G", "B")), - "RGBX": ("RGB", "L", ("R", "G", "B", "X")), - "RGBA": ("RGB", "L", ("R", "G", "B", "A")), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), - "LAB": ("RGB", "L", ("L", "A", "B")), - "HSV": ("RGB", "L", ("H", "S", "V")), - # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and - # BGR;24. Use these modes only if you know exactly what you're - # doing... -} +# Modes if sys.byteorder == "little": _ENDIAN = "<" @@ -280,7 +259,7 @@ def _conv_type_shape(im): return (im.size[1], im.size[0], extra), typ -MODES = sorted(_MODEINFO) +MODES = ["1", "CMYK", "F", "HSV", "I", "L", "LAB", "P", "RGB", "RGBA", "RGBX", "YCbCr"] # raw modes that may be memory mapped. NOTE: if you change this, you # may have to modify the stride calculation in map.c too! diff --git a/src/PIL/ImageMode.py b/src/PIL/ImageMode.py index 988288329..0afcf9fe1 100644 --- a/src/PIL/ImageMode.py +++ b/src/PIL/ImageMode.py @@ -35,18 +35,28 @@ def getmode(mode): global _modes if not _modes: # initialize mode cache - - from . import Image - modes = {} - # core modes - for m, (basemode, basetype, bands) in Image._MODEINFO.items(): + for m, (basemode, basetype, bands) in { + # core modes + "1": ("L", "L", ("1",)), + "L": ("L", "L", ("L",)), + "I": ("L", "I", ("I",)), + "F": ("L", "F", ("F",)), + "P": ("P", "L", ("P",)), + "RGB": ("RGB", "L", ("R", "G", "B")), + "RGBX": ("RGB", "L", ("R", "G", "B", "X")), + "RGBA": ("RGB", "L", ("R", "G", "B", "A")), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), + "LAB": ("RGB", "L", ("L", "A", "B")), + "HSV": ("RGB", "L", ("H", "S", "V")), + # extra experimental modes + "RGBa": ("RGB", "L", ("R", "G", "B", "a")), + "LA": ("L", "L", ("L", "A")), + "La": ("L", "L", ("L", "a")), + "PA": ("RGB", "L", ("P", "A")), + }.items(): modes[m] = ModeDescriptor(m, bands, basemode, basetype) - # extra experimental modes - modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") - modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") - modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") - modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") # mapping modes for i16mode in ( "I;16", From 441a1cf9cf7a6fa018e7cecdfbd70b5680b53f26 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:00:57 +1100 Subject: [PATCH 373/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 50401e2c3..aa25e7991 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,21 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Added IPythonViewer #5289 + [radarhere, Kipkurui-mutai] + +- Only draw each rectangle outline pixel once #5183 + [radarhere] + +- Use mmap instead of built-in Win32 mapper #5224 + [radarhere, cgohlke] + +- Handle PCX images with an odd stride #5214 + [radarhere] + +- Only read different sizes for "Large Thumbnail" MPO frames #5168 + [radarhere] + - Added PyQt6 support #5258 [radarhere] From 45c43fc9112e08b050fe5322399500c60fef2d90 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:39:28 +1100 Subject: [PATCH 374/750] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 28d39ca46..92909cfb5 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -13,10 +13,13 @@ when Tk/Tcl 8.5 will be the minimum supported. API Changes =========== -TODO -^^^^ +Image.alpha_composite: dest +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +When calling :py:meth:`~PIL.Image.Image.alpha_composite`, the ``dest`` argument now +accepts negative co-ordinates, like the upper left corner of the ``box`` argument of +:py:meth:`~PIL.Image.Image.paste` can be negative. Naturally, this has effect of +cropping the overlaid image. API Additions ============= From f5d49f4f6166625fec381dc28886258a8be19f06 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 19:53:59 +1100 Subject: [PATCH 375/750] Added rounded_rectangle method --- Tests/images/imagedraw_rounded_rectangle.png | Bin 0 -> 934 bytes Tests/test_imagedraw.py | 28 ++++++++++++ docs/reference/ImageDraw.rst | 14 ++++++ src/PIL/ImageDraw.py | 45 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 Tests/images/imagedraw_rounded_rectangle.png diff --git a/Tests/images/imagedraw_rounded_rectangle.png b/Tests/images/imagedraw_rounded_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..2e815f4ada247e8302c8cc5e053a162b4fe3ed01 GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k2}mkgS)OEIV9xb)aSW-L^Y+HYqE!YWZGkra z`|j^~zUcByEkULy+m*8KcJ6r0b6;iKWfq_w7JO{=uCm%MWtMrNFZA{Hn$kOmx$mrcylh_ev~WwS zgty)=UgoY9+4kq%s}Iie>-O!L=l3Kt@%*~)XYTyJsLt*EYRRoiQ~ffF50Ce5U9#%j z>c4MhiCe$nUA=YQs&jb>(YyN&-SnFD%b+*8urBrDH`(lM4Xf<@AJ06uUgws?wVYk6 z?5-Z%*7onYY+VlLYB~KI>+Eh%^j&Se=B7(%?7?^2%H&#C?dq#Ne=A={>DQrEyTiAw zUR_!9=<2SQ^JKd_`Zj3&Q?-~MRayVJ@2Sk5Woysh4fJT)&=JAC`dyqQ`}&;A_uI;J zlv-SYVgh1pg*rZu#DecshQo!%8SzkmVTE(;2wjg~sgADZUY zzLQPNopVC<%BkOdPLLSzJG}blm+ueEt;Gbb4{yqhJ-#pft}HMnx2;?7amw@XsBLc| zHh13om9u;GtUt$;Qj#OSRvcXRb!A^p_~m)B*=DiP^PeY#UN*T~w(d^Uv+T#W_ALBn zc5%;+jQ9C#u6b=+w^=&$YRQY^)!DYWbFUv*wd}9^!&`^?jtW=qlC{}=&$#%%`|oMt zH*QB+#!b5)D_i&Ca`e8IL-$;+pPvdzun)FNS@!G?Og_f*_k4A)%rW^DiIdyjMeGmF zGI)IT$Ha{r_Jx+&xQAvHSgg4Z&K>`Lal^6 Date: Mon, 22 Feb 2021 07:38:04 +1100 Subject: [PATCH 376/750] Only draw each pixel once --- .../imagedraw_rounded_rectangle_both.png | Bin 0 -> 530 bytes .../images/imagedraw_rounded_rectangle_x.png | Bin 0 -> 567 bytes .../images/imagedraw_rounded_rectangle_y.png | Bin 0 -> 528 bytes Tests/test_imagedraw.py | 24 ++++ src/PIL/ImageDraw.py | 103 +++++++++++++----- 5 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 Tests/images/imagedraw_rounded_rectangle_both.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_x.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_y.png diff --git a/Tests/images/imagedraw_rounded_rectangle_both.png b/Tests/images/imagedraw_rounded_rectangle_both.png new file mode 100644 index 0000000000000000000000000000000000000000..24f600e3913ebc74a9c301e815f06f4ac0cfdd94 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^DIm7ZFWD}C_M}wCs{)<;eRDP)o0Zj@@g?*-%YXh2Cub>!tu2gw`02!~<0084 z-RnK1`%I^)u!s%^Wrko*Ci z>}`Huu3gs7ZhQOk`^z=c%tQ=M%qsIWS=Y?1;;o>R-BzHQ_2I-V^_n&7FNirrZ+iA| z>TR8qb5tKpF?HUtsJZ~?m)F{Rqb-XLEvk_Jv-s5<*OYTsYmCGKebp|D?4uWRojEl-z|T`s&ch> literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_x.png b/Tests/images/imagedraw_rounded_rectangle_x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf5211a3340d62724b64a5517693c1fa2403e7d GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^DImsnv^Py)@I#H6G!aHYxGIp1VMO3=9uSE2Lu&$j^^gx8G4e{Yv2p zkI3asQ9VNDZr3i)l3N)brgi#JhWE^^-xt*;EnB3$euc-isrH`>r}fR}?p~rSHoY|G z)s>6WlCuNjBO`T#{Vi@?+BEI6=#;J5rxv}O7@MjXzmj?1v5@Su7beP23{88L@U%t0 zUOI2}narq-xt{scwG|aEzKp7;#;jQ_5L91BvpZlrp`NrOe<1yh3&3|zc8+e-t_F_ zROyHVGgTi<0ZJ_@HaK%q>b175p^DMd6%}G<*JfP{d~)X2S|jm|n^pz@L+woX(?2?D zn>h_W`!{4xVk&ixUF^)86}S4T?ZM~&{BLr5q-k>-Y>jTH`~Z%~^+)udCACbFI5_JE Oi0|p@=d#Wzp$Pyx_3|kI literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_y.png b/Tests/images/imagedraw_rounded_rectangle_y.png new file mode 100644 index 0000000000000000000000000000000000000000..9b391b95e28ea723f75e90210945f1481d93d402 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^DIm37 zx6T&5yXNj1ekQKN^_ScyZq&GA?4T4MP&VO)CM!@M7`Rka-?Xl+W8L@TeEEa!|J}W! zQZKw>cC3i#Pr23Q@l59RM>qGrtM~54Wu6K;S{iCM`Re8c{U?e)bai zaw}?Hd1Vm3RHWIrXHFfVaZ&s7&=$$1nAL zofUm1{en% z&%y@vNY;7$Q~ax)mtGGqnm7N!^FOmL6o&p;-`r5oBlscS1QtCv}Ao?m#zm1 NdAj= x1 - x0 + if full_x: + # The two left and two right corners are joined + d = x1 - x0 + full_y = d >= y1 - y0 + if full_y: + # The two top and two bottom corners are joined + d = y1 - y0 + if full_x and full_y: + # If all corners are joined, that is a circle + return self.ellipse(xy, fill, outline, width) + if d == 0: + # If the corners have no curve, that is a rectangle return self.rectangle(xy, fill, outline, width) ink, fill = self._getink(outline, fill) + + def draw_corners(pieslice): + if full_x: + # Draw top and bottom halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 180, 360), + ((x0, y1 - d, x0 + d, y1), 0, 180), + ) + elif full_y: + # Draw left and right halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 90, 270), + ((x1 - d, y0, x1, y0 + d), 270, 90), + ) + else: + # Draw four separate corners + parts = ( + ((x1 - d, y0, x1, y0 + d), 270, 360), + ((x1 - d, y1 - d, x1, y1), 0, 90), + ((x0, y1 - d, x0 + d, y1), 90, 180), + ((x0, y0, x0 + d, y0 + d), 180, 270), + ) + for part in parts: + if pieslice: + self.draw.draw_pieslice(*(part + (fill, 1))) + else: + self.draw.draw_arc(*(part + (ink, width))) + if fill is not None: - self.draw.draw_pieslice((x1 - d, y0, x1, y0 + d), 270, 360, fill, 1) - self.draw.draw_pieslice((x1 - d, y1 - d, x1, y1), 0, 90, fill, 1) - self.draw.draw_pieslice((x0, y1 - d, x0 + d, y1), 90, 180, fill, 1) - self.draw.draw_pieslice((x0, y0, x0 + d, y0 + d), 180, 270, fill, 1) + draw_corners(True) - self.draw.draw_rectangle((x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y1), fill, 1) - self.draw.draw_rectangle( - (x0, y0 + d / 2 + 1, x0 + d / 2, y1 - d / 2 - 1), fill, 1 - ) - self.draw.draw_rectangle( - (x1 - d / 2, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 - ) + if full_x: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 + ) + else: + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y1), fill, 1 + ) + if not full_x and not full_y: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x0 + d / 2, y1 - d / 2 - 1), fill, 1 + ) + self.draw.draw_rectangle( + (x1 - d / 2, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), fill, 1 + ) if ink is not None and ink != fill and width != 0: - self.draw.draw_arc((x1 - d, y0, x1, y0 + d), 270, 360, ink, width) - self.draw.draw_arc((x1 - d, y1 - d, x1, y1), 0, 90, ink, width) - self.draw.draw_arc((x0, y1 - d, x0 + d, y1), 90, 180, ink, width) - self.draw.draw_arc((x0, y0, x0 + d, y0 + d), 180, 270, ink, width) + draw_corners(False) - self.draw.draw_rectangle( - (x1 - width + 1, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + d / 2 + 1, y1 - width + 1, x1 - d / 2 - 1, y1), ink, 1 - ) - self.draw.draw_rectangle( - (x0, y0 + d / 2 + 1, x0 + width - 1, y1 - d / 2 - 1), ink, 1 - ) - self.draw.draw_rectangle( - (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y0 + width - 1), ink, 1 - ) + if not full_x: + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y0, x1 - d / 2 - 1, y0 + width - 1), ink, 1 + ) + self.draw.draw_rectangle( + (x0 + d / 2 + 1, y1 - width + 1, x1 - d / 2 - 1, y1), ink, 1 + ) + if not full_y: + self.draw.draw_rectangle( + (x0, y0 + d / 2 + 1, x0 + width - 1, y1 - d / 2 - 1), ink, 1 + ) + self.draw.draw_rectangle( + (x1 - width + 1, y0 + d / 2 + 1, x1, y1 - d / 2 - 1), ink, 1 + ) def _multiline_check(self, text): """Draw text.""" From 62bf920634164509f2465b2ae1d7924bc7065699 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 20:10:17 +1100 Subject: [PATCH 377/750] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index f27f295a7..04d80e80e 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -13,10 +13,20 @@ when Tk/Tcl 8.5 will be the minimum supported. API Changes =========== -TODO -^^^^ +ImageDraw.rounded_rectangle +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +Added :py:meth:`~PIL.ImageDraw.ImageDraw.rounded_rectangle`. It works the same as +:py:meth:`~PIL.ImageDraw.ImageDraw.rectangle`, except with an additional ``radius`` +argument. ``radius`` is limited to half of the width or the height, so that users can +create a circle, but not any other ellipse. + +.. code-block:: python + + from PIL import Image, ImageDraw + im = Image.new("RGB", (200, 200)) + draw = ImageDraw.Draw(im) + draw.rounded_rectangle(xy=(10, 20, 190, 180), radius=30, fill="red") API Additions ============= From ac1a9b28c9b7b405d6f3e52d49feebd3508706d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 20:33:13 +1100 Subject: [PATCH 378/750] Added link to class and function [ci skip] --- docs/releasenotes/8.2.0.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index f27f295a7..d339479a5 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -24,14 +24,14 @@ API Additions ImageShow.IPythonViewer ^^^^^^^^^^^^^^^^^^^^^^^ -If IPython is present, this new ``ImageShow.Viewer`` subclass will be +If IPython is present, this new :py:class:`PIL.ImageShow.Viewer` subclass will be registered. It displays images on all IPython frontends. This will be helpful to users of Google Colab, allowing ``im.show()`` to display images. -It is lower in priority than the other default Viewer instances, so it will -only be used by ``im.show()`` or ``ImageShow.show()`` if none of the other -viewers are available. This means that the behaviour of ``ImageShow`` will stay -the same for most Pillow users. +It is lower in priority than the other default :py:class:`PIL.ImageShow.Viewer` +instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show()` +if none of the other viewers are available. This means that the behaviour of +:py:class:`PIL.ImageShow` will stay the same for most Pillow users. Security ======== From e7f5bb18312e6c6db1ec3cd4eec7272be094baaf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Feb 2021 18:19:05 +1100 Subject: [PATCH 379/750] Ensure file is closed if it is opened by ImageQt.ImageQt --- Tests/test_imageqt.py | 13 +++++++++++-- src/PIL/ImageQt.py | 19 +++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index 404849cb9..53b1fef7c 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -4,11 +4,14 @@ from PIL import ImageQt from .helper import hopper +pytestmark = pytest.mark.skipif( + not ImageQt.qt_is_installed, reason="Qt bindings are not installed" +) + if ImageQt.qt_is_installed: from PIL.ImageQt import qRgba -@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") def test_rgb(): # from https://doc.qt.io/archives/qt-4.8/qcolor.html # typedef QRgb @@ -38,7 +41,13 @@ def test_rgb(): checkrgb(0, 0, 255) -@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed") def test_image(): for mode in ("1", "RGB", "RGBA", "L", "P"): ImageQt.ImageQt(hopper(mode)) + + +def test_closed_file(): + with pytest.warns(None) as record: + ImageQt.ImageQt("Tests/images/hopper.gif") + + assert not record diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 74ca3166c..56650e102 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -128,6 +128,7 @@ def align8to32(bytes, width, mode): def _toqclass_helper(im): data = None colortable = None + exclusive_fp = False # handle filename, if given instead of image name if hasattr(im, "toUtf8"): @@ -135,6 +136,7 @@ def _toqclass_helper(im): im = str(im.toUtf8(), "utf-8") if isPath(im): im = Image.open(im) + exclusive_fp = True qt_format = QImage.Format if qt_version == "6" else QImage if im.mode == "1": @@ -157,10 +159,15 @@ def _toqclass_helper(im): data = im.tobytes("raw", "BGRA") format = qt_format.Format_ARGB32 else: + if exclusive_fp: + im.close() raise ValueError(f"unsupported image mode {repr(im.mode)}") - __data = data or align8to32(im.tobytes(), im.size[0], im.mode) - return {"data": __data, "im": im, "format": format, "colortable": colortable} + size = im.size + __data = data or align8to32(im.tobytes(), size[0], im.mode) + if exclusive_fp: + im.close() + return {"data": __data, "size": size, "format": format, "colortable": colortable} if qt_is_installed: @@ -182,8 +189,8 @@ if qt_is_installed: self.__data = im_data["data"] super().__init__( self.__data, - im_data["im"].size[0], - im_data["im"].size[1], + im_data["size"][0], + im_data["size"][1], im_data["format"], ) if im_data["colortable"]: @@ -197,8 +204,8 @@ def toqimage(im): def toqpixmap(im): # # This doesn't work. For now using a dumb approach. # im_data = _toqclass_helper(im) - # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1]) - # result.loadFromData(im_data['data']) + # result = QPixmap(im_data["size"][0], im_data["size"][1]) + # result.loadFromData(im_data["data"]) # Fix some strange bug that causes if im.mode == "RGB": im = im.convert("RGBA") From 666d3c5d3f2c042fef3a2f2976458a67bf72e245 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 22:21:22 +1100 Subject: [PATCH 380/750] Use bash shell for mkdir command --- .github/workflows/test-windows.yml | 2 +- .github/workflows/test.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 12c288374..32518c9d1 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -174,7 +174,7 @@ jobs: if: failure() run: | mkdir -p Tests/errors - shell: pwsh + shell: bash - name: Upload errors uses: actions/upload-artifact@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4064a0589..e52fefc69 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -92,7 +92,6 @@ jobs: if: failure() run: | mkdir -p Tests/errors - shell: pwsh - name: Upload errors uses: actions/upload-artifact@v2 From 7c7a68867df60e5ca668a6cc703776355c79fff6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Mar 2021 23:15:59 +1100 Subject: [PATCH 381/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aa25e7991..3695ed964 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Ensure file is closed if it is opened by ImageQt.ImageQt #5260 + [radarhere] + +- Added ImageDraw rounded_rectangle method #5208 + [radarhere] + - Added IPythonViewer #5289 [radarhere, Kipkurui-mutai] From 21da5b1ed8e905b7f3e4198207486317304b8698 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Mar 2021 07:09:50 +1100 Subject: [PATCH 382/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3695ed964..57e7f75cc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Allow alpha_composite destination to be negative #5313 + [radarhere] + - Ensure file is closed if it is opened by ImageQt.ImageQt #5260 [radarhere] From e54880c6528efcc41c4a942b938398c1ddcd5644 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Mar 2021 13:17:19 +1100 Subject: [PATCH 383/750] Moved RGB fix inside ImageQt class --- Tests/test_qt_image_qapplication.py | 27 +++++++++++++++++++++++++-- src/PIL/ImageQt.py | 9 ++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index a3d5620d3..dec790c50 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -2,18 +2,26 @@ import pytest from PIL import ImageQt -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper if ImageQt.qt_is_installed: from PIL.ImageQt import QPixmap if ImageQt.qt_version == "6": + from PyQt6.QtCore import QPoint + from PyQt6.QtGui import QImage, QPainter, QRegion from PyQt6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side6": + from PySide6.QtCore import QPoint + from PySide6.QtGui import QImage, QPainter, QRegion from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "5": + from PyQt5.QtCore import QPoint + from PyQt5.QtGui import QImage, QPainter, QRegion from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget elif ImageQt.qt_version == "side2": + from PySide2.QtCore import QPoint + from PySide2.QtGui import QImage, QPainter, QRegion from PySide2.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget class Example(QWidget): @@ -49,7 +57,8 @@ def test_sanity(tmp_path): for mode in ("1", "RGB", "RGBA", "L", "P"): # to QPixmap - data = ImageQt.toqpixmap(hopper(mode)) + im = hopper(mode) + data = ImageQt.toqpixmap(im) assert isinstance(data, QPixmap) assert not data.isNull() @@ -58,6 +67,20 @@ def test_sanity(tmp_path): tempfile = str(tmp_path / f"temp_{mode}.png") data.save(tempfile) + # Render the image + qimage = ImageQt.ImageQt(im) + data = QPixmap.fromImage(qimage) + qt_format = QImage.Format if ImageQt.qt_version == "6" else QImage + qimage = QImage(128, 128, qt_format.Format_ARGB32) + painter = QPainter(qimage) + image_label = QLabel() + image_label.setPixmap(data) + image_label.render(painter, QPoint(0, 0), QRegion(0, 0, 128, 128)) + painter.end() + rendered_tempfile = str(tmp_path / f"temp_rendered_{mode}.png") + qimage.save(rendered_tempfile) + assert_image_equal_tofile(im.convert("RGBA"), rendered_tempfile) + # from QPixmap roundtrip(hopper(mode)) diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 56650e102..32630f2ca 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -153,7 +153,10 @@ def _toqclass_helper(im): for i in range(0, len(palette), 3): colortable.append(rgb(*palette[i : i + 3])) elif im.mode == "RGB": - data = im.tobytes("raw", "BGRX") + # Populate the 4th channel with 255 + im = im.convert("RGBA") + + data = im.tobytes("raw", "BGRA") format = qt_format.Format_RGB32 elif im.mode == "RGBA": data = im.tobytes("raw", "BGRA") @@ -206,9 +209,5 @@ def toqpixmap(im): # im_data = _toqclass_helper(im) # result = QPixmap(im_data["size"][0], im_data["size"][1]) # result.loadFromData(im_data["data"]) - # Fix some strange bug that causes - if im.mode == "RGB": - im = im.convert("RGBA") - qimage = toqimage(im) return QPixmap.fromImage(qimage) From f42d6cf1ac493ed7007af4c1c86810fcf1557e4b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Mar 2021 20:16:49 +1100 Subject: [PATCH 384/750] Save ICC profile from TIFF encoderinfo --- Tests/test_file_png.py | 2 ++ Tests/test_file_tiff.py | 22 ++++++++++++++++++++++ src/PIL/TiffImagePlugin.py | 5 +++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 57bc7f015..52ea3b6d2 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -517,6 +517,8 @@ class TestFilePng: def test_discard_icc_profile(self): with Image.open("Tests/images/icc_profile.png") as im: + assert "icc_profile" in im.info + im = roundtrip(im, icc_profile=None) assert "icc_profile" not in im.info diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index f09117ca7..ba7f9a084 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -568,6 +568,28 @@ class TestFileTiff: with Image.open(tmpfile) as reloaded: assert b"Dummy value" == reloaded.info["icc_profile"] + def test_save_icc_profile(self, tmp_path): + im = hopper() + assert "icc_profile" not in im.info + + outfile = str(tmp_path / "temp.tif") + icc_profile = b"Dummy value" + im.save(outfile, icc_profile=icc_profile) + + with Image.open(outfile) as reloaded: + assert reloaded.info["icc_profile"] == icc_profile + + def test_discard_icc_profile(self, tmp_path): + outfile = str(tmp_path / "temp.tif") + + with Image.open("Tests/images/icc_profile.png") as im: + assert "icc_profile" in im.info + + im.save(outfile, icc_profile=None) + + with Image.open(outfile) as reloaded: + assert "icc_profile" not in reloaded.info + def test_close_on_load_exclusive(self, tmp_path): # similar to test_fd_leak, but runs on unixlike os tmpfile = str(tmp_path / "temp.tif") diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 0b70ce382..98c70d7c4 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1481,8 +1481,9 @@ def _save(im, fp, filename): # preserve ICC profile (should also work when saving other formats # which support profiles as TIFF) -- 2008-06-06 Florian Hoech - if "icc_profile" in im.info: - ifd[ICCPROFILE] = im.info["icc_profile"] + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + ifd[ICCPROFILE] = icc for key, name in [ (IMAGEDESCRIPTION, "description"), From 68b655f3f014c6beb13f4c9a6fa53f1ebff527c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 10 Mar 2021 20:43:16 +1100 Subject: [PATCH 385/750] Updated format specifiers --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index a67091921..746994da3 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -56,7 +56,7 @@ _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { dump_state(state); if (state->loc > state->eof) { - TIFFError("_tiffReadProc", "Invalid Read at loc %lu, eof: %lu", state->loc, state->eof); + TIFFError("_tiffReadProc", "Invalid Read at loc %llu, eof: %llu", state->loc, state->eof); return 0; } to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); From 188d4f6b6abffe7ecb71f3e03d11079138661b60 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 12 Mar 2021 12:03:45 +1100 Subject: [PATCH 386/750] Only import numpy when necessary --- src/PIL/ImageFilter.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 9ca17d9ad..6800bc3a0 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -16,11 +16,6 @@ # import functools -try: - import numpy -except ImportError: # pragma: no cover - numpy = None - class Filter: pass @@ -369,6 +364,13 @@ class Color3DLUT(MultibandFilter): items = size[0] * size[1] * size[2] wrong_size = False + numpy = None + if hasattr(table, "shape"): + try: + import numpy + except ImportError: # pragma: no cover + pass + if numpy and isinstance(table, numpy.ndarray): if copy_table: table = table.copy() From 2844fd2d18e2711db7facd9bd61f6aaa0ee7cef0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 12 Mar 2021 22:45:07 +1100 Subject: [PATCH 387/750] Fixed unclosed file warning --- Tests/test_file_icns.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 7ce8cb286..30ec3dc72 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -143,8 +143,8 @@ def test_not_an_icns_file(): def test_icns_decompression_bomb(): - with pytest.raises(Image.DecompressionBombError): - im = Image.open( - "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" - ) - im.load() + with Image.open( + "Tests/images/oom-8ed3316a4109213ca96fb8a256a0bfefdece1461.icns" + ) as im: + with pytest.raises(Image.DecompressionBombError): + im.load() From 38692f222f0f5e8bfa5edd34e719f8ea9416721d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 13 Mar 2021 11:09:37 +0100 Subject: [PATCH 388/750] Delegate building of oss-fuzz versions to pillow --- Tests/oss-fuzz/build.sh | 46 ++++++++++++++++++++++++++++ Tests/oss-fuzz/build_dictionaries.sh | 33 ++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100755 Tests/oss-fuzz/build.sh create mode 100755 Tests/oss-fuzz/build_dictionaries.sh diff --git a/Tests/oss-fuzz/build.sh b/Tests/oss-fuzz/build.sh new file mode 100755 index 000000000..1d05bea79 --- /dev/null +++ b/Tests/oss-fuzz/build.sh @@ -0,0 +1,46 @@ +#!/bin/bash -eu +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ + +python3 setup.py build --build-base=/tmp/build install + +# Build fuzzers in $OUT. +for fuzzer in $(find $SRC -name 'fuzz_*.py'); do + fuzzer_basename=$(basename -s .py $fuzzer) + fuzzer_package=${fuzzer_basename}.pkg + pyinstaller \ + --add-binary /usr/local/lib/libjpeg.so.9:. \ + --add-binary /usr/local/lib/libfreetype.so.6:. \ + --add-binary /usr/local/lib/liblcms2.so.2:. \ + --add-binary /usr/local/lib/libopenjp2.so.7:. \ + --add-binary /usr/local/lib/libpng16.so.16:. \ + --add-binary /usr/local/lib/libtiff.so.5:. \ + --add-binary /usr/local/lib/libwebp.so.7:. \ + --add-binary /usr/local/lib/libwebpdemux.so.2:. \ + --add-binary /usr/local/lib/libwebpmux.so.3:. \ + --distpath $OUT --onefile --name $fuzzer_package $fuzzer + + # Create execution wrapper. + echo "#!/bin/sh +# LLVMFuzzerTestOneInput for fuzzer detection. +this_dir=\$(dirname \"\$0\") +LD_PRELOAD=\$this_dir/sanitizer_with_fuzzer.so \ +ASAN_OPTIONS=\$ASAN_OPTIONS:symbolize=1:external_symbolizer_path=\$this_dir/llvm-symbolizer:detect_leaks=0 \ +\$this_dir/$fuzzer_package \$@" > $OUT/$fuzzer_basename + chmod u+x $OUT/$fuzzer_basename +done + +find Tests/images Tests/icc Tests/fonts -print | zip -q $OUT/fuzz_pillow_seed_corpus.zip -@ diff --git a/Tests/oss-fuzz/build_dictionaries.sh b/Tests/oss-fuzz/build_dictionaries.sh new file mode 100755 index 000000000..9aae56ca8 --- /dev/null +++ b/Tests/oss-fuzz/build_dictionaries.sh @@ -0,0 +1,33 @@ +#!/bin/bash -eu +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ + +# Generate image dictionaries here for each of the fuzzers and put them in the +# $OUT directory, named for the fuzzer + +git clone --depth 1 https://github.com/google/fuzzing +cat fuzzing/dictionaries/bmp.dict \ + fuzzing/dictionaries/dds.dict \ + fuzzing/dictionaries/gif.dict \ + fuzzing/dictionaries/icns.dict \ + fuzzing/dictionaries/jpeg.dict \ + fuzzing/dictionaries/jpeg2000.dict \ + fuzzing/dictionaries/pbm.dict \ + fuzzing/dictionaries/png.dict \ + fuzzing/dictionaries/psd.dict \ + fuzzing/dictionaries/tiff.dict \ + fuzzing/dictionaries/webp.dict \ + > $OUT/fuzz_pillow.dict From e2577d1736617968110ef658b94150f114b17e41 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 13 Mar 2021 11:35:50 +0100 Subject: [PATCH 389/750] font fuzzer --- Tests/oss-fuzz/build.sh | 3 ++- Tests/oss-fuzz/fuzz_font.py | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100755 Tests/oss-fuzz/fuzz_font.py diff --git a/Tests/oss-fuzz/build.sh b/Tests/oss-fuzz/build.sh index 1d05bea79..fc54ee3ee 100755 --- a/Tests/oss-fuzz/build.sh +++ b/Tests/oss-fuzz/build.sh @@ -43,4 +43,5 @@ ASAN_OPTIONS=\$ASAN_OPTIONS:symbolize=1:external_symbolizer_path=\$this_dir/llvm chmod u+x $OUT/$fuzzer_basename done -find Tests/images Tests/icc Tests/fonts -print | zip -q $OUT/fuzz_pillow_seed_corpus.zip -@ +find Tests/images Tests/icc -print | zip -q $OUT/fuzz_pillow_seed_corpus.zip -@ +find Tests/fonts -print | zip -q $OUT/fuzz_font_seed_corpus.zip -@ diff --git a/Tests/oss-fuzz/fuzz_font.py b/Tests/oss-fuzz/fuzz_font.py new file mode 100755 index 000000000..43c23fe60 --- /dev/null +++ b/Tests/oss-fuzz/fuzz_font.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 + +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io +import sys +import warnings + +import atheris_no_libfuzzer as atheris + +from PIL import Image, ImageDraw, ImageFont + + +def TestOneInput(data): + try: + with ImageFont.load(io.BytesIO(data)) as font: + font.getsize_multiline("ABC\nAaaa") + font.getmask("test text") + with Image.new(mode="RGBA", size=(200, 200)) as im: + draw = ImageDraw.Draw(im) + draw.text((10,10), "Test Text", font) + except Exception: + # We're catching all exceptions because Pillow's exceptions are + # directly inheriting from Exception. + return + return + + +def main(): + atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) + atheris.Fuzz() + + +if __name__ == "__main__": + main() From 16dbffc3a8deee69daf0b5f4f787b2b6dc07f763 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 13:31:16 +1100 Subject: [PATCH 390/750] _crop already makes a copy of the image --- src/PIL/GifImagePlugin.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 7c083bd8b..e66665965 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -267,14 +267,15 @@ class GifImageFile(ImageFile.ImageFile): # replace with background colour Image._decompression_bomb_check(self.size) self.dispose = Image.core.fill("P", self.size, self.info["background"]) + + # only dispose the extent in this frame + if self.dispose: + self.dispose = self._crop(self.dispose, self.dispose_extent) else: # replace with previous contents if self.im: - self.dispose = self.im.copy() - - # only dispose the extent in this frame - if self.dispose: - self.dispose = self._crop(self.dispose, self.dispose_extent) + # only dispose the extent in this frame + self.dispose = self._crop(self.im, self.dispose_extent) except (AttributeError, KeyError): pass From 2f84f633e38e2f708bae2a0d65115e05abc8f3dd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 13:40:55 +1100 Subject: [PATCH 391/750] Create disposal image at the destination size, instead of cropping --- src/PIL/GifImagePlugin.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index e66665965..ba08bd074 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -265,12 +265,15 @@ class GifImageFile(ImageFile.ImageFile): self.dispose = None elif self.disposal_method == 2: # replace with background colour - Image._decompression_bomb_check(self.size) - self.dispose = Image.core.fill("P", self.size, self.info["background"]) # only dispose the extent in this frame - if self.dispose: - self.dispose = self._crop(self.dispose, self.dispose_extent) + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + self.dispose = Image.core.fill( + "P", dispose_size, self.info["background"] + ) else: # replace with previous contents if self.im: From cfcedcc5203acb26f79d1b59a38521eee605b4f3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 21:21:40 +1100 Subject: [PATCH 392/750] icc_profile is now a keyword argument when saving TIFF files [ci skip] --- docs/handbook/image-file-formats.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 35c4177aa..0ccd3b1a4 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -901,6 +901,9 @@ using the general tags available through tiffinfo. **copyright** Strings +**icc_profile** + The ICC Profile to include in the saved file. + **resolution_unit** An integer. 1 for no unit, 2 for inches and 3 for centimeters. From d466620cfa31e5caf5b6fdd1aade93b5df144ee1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Mar 2021 21:25:16 +1100 Subject: [PATCH 393/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 57e7f75cc..dbe06304d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Save ICC profile from TIFF encoderinfo #5321 + [radarhere] + +- Moved RGB fix inside ImageQt class #5268 + [radarhere] + - Allow alpha_composite destination to be negative #5313 [radarhere] From becd633d3f6c7fab7e6027d86ae3fbb6a09cfbd4 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 12:21:02 +0100 Subject: [PATCH 394/750] Refactor fuzzers, add fuzzer tests --- Tests/oss-fuzz/fuzz_font.py | 10 ++-------- Tests/oss-fuzz/fuzz_pillow.py | 15 ++++----------- Tests/oss-fuzz/fuzzers.py | 33 +++++++++++++++++++++++++++++++++ Tests/oss-fuzz/test_fuzzers.py | 31 +++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 Tests/oss-fuzz/fuzzers.py create mode 100644 Tests/oss-fuzz/test_fuzzers.py diff --git a/Tests/oss-fuzz/fuzz_font.py b/Tests/oss-fuzz/fuzz_font.py index 43c23fe60..ec3a4b2de 100755 --- a/Tests/oss-fuzz/fuzz_font.py +++ b/Tests/oss-fuzz/fuzz_font.py @@ -20,17 +20,11 @@ import warnings import atheris_no_libfuzzer as atheris -from PIL import Image, ImageDraw, ImageFont - +import fuzzers def TestOneInput(data): try: - with ImageFont.load(io.BytesIO(data)) as font: - font.getsize_multiline("ABC\nAaaa") - font.getmask("test text") - with Image.new(mode="RGBA", size=(200, 200)) as im: - draw = ImageDraw.Draw(im) - draw.text((10,10), "Test Text", font) + fuzzers.fuzz_font(data) except Exception: # We're catching all exceptions because Pillow's exceptions are # directly inheriting from Exception. diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py index 894068f63..695e9e5eb 100644 --- a/Tests/oss-fuzz/fuzz_pillow.py +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -18,28 +18,21 @@ import io import sys import warnings +import fuzzers + import atheris_no_libfuzzer as atheris -from PIL import Image, ImageFile, ImageFilter - - def TestOneInput(data): try: - with Image.open(io.BytesIO(data)) as im: - im.rotate(45) - im.filter(ImageFilter.DETAIL) - im.save(io.BytesIO(), "BMP") + fuzzers.fuzz_image(data) except Exception: # We're catching all exceptions because Pillow's exceptions are # directly inheriting from Exception. return return - def main(): - ImageFile.LOAD_TRUNCATED_IMAGES = True - warnings.filterwarnings("ignore") - warnings.simplefilter("error", Image.DecompressionBombWarning) + fuzzers.enable_decompressionbomb_error() atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) atheris.Fuzz() diff --git a/Tests/oss-fuzz/fuzzers.py b/Tests/oss-fuzz/fuzzers.py new file mode 100644 index 000000000..f7c395e76 --- /dev/null +++ b/Tests/oss-fuzz/fuzzers.py @@ -0,0 +1,33 @@ +import warnings +import io + +from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageFile, PcfFontFile + +def enable_decompressionbomb_error(): + ImageFile.LOAD_TRUNCATED_IMAGES = True + warnings.filterwarnings("ignore") + warnings.simplefilter("error", Image.DecompressionBombWarning) + +def fuzz_image(data): + # This will fail on some images in the corpus, as we have many + # invalid images in the test suite. + with Image.open(io.BytesIO(data)) as im: + im.rotate(45) + im.filter(ImageFilter.DETAIL) + im.save(io.BytesIO(), "BMP") + +def fuzz_font(data): + # This should not fail on a valid font load for any of the fonts in the corpus + wrapper = io.BytesIO(data) + try: + font = ImageFont.truetype(wrapper) + except OSError: + # pcf/pilfonts/random garbage here here. They're different. + return + + font.getsize_multiline("ABC\nAaaa") + font.getmask("test text") + with Image.new(mode="RGBA", size=(200, 200)) as im: + draw = ImageDraw.Draw(im) + draw.multiline_textsize("ABC\nAaaa", font, stroke_width=2) + draw.text((10,10), "Test Text", font=font, fill="#000") diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py new file mode 100644 index 000000000..56b1ee9a0 --- /dev/null +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -0,0 +1,31 @@ +import pytest + +import fuzzers +import glob +import subprocess + +from PIL import Image + +@pytest.mark.parametrize("path", subprocess.check_output('find Tests/images -type f', shell=True).split(b'\n')) +def test_fuzz_images(path): + fuzzers.enable_decompressionbomb_error() + try: + with open(path, 'rb') as f: + fuzzers.fuzz_image(f.read()) + assert True + except (OSError, SyntaxError, MemoryError, ValueError, NotImplementedError): + # Known exceptions that are through from Pillow + assert True + except (Image.DecompressionBombError, Image.DecompressionBombWarning, + Image.UnidentifiedImageError): + # Known Image.* exceptions + assert True + + +@pytest.mark.parametrize("path", subprocess.check_output('find Tests/fonts -type f', shell=True).split(b'\n')) +def test_fuzz_fonts(path): + if not path or b'LICENSE.txt' in path or b'.pil' in path: + return + with open(path, 'rb') as f: + fuzzers.fuzz_font(f.read()) + assert True From 6d6ef4a539e2eb2a5103073495841de63cf4e852 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 12:21:25 +0100 Subject: [PATCH 395/750] Ignore the pyinstaller spec files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 15add232b..5500ec037 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,6 @@ Tests/images/jpeg2000 Tests/images/msp Tests/images/picins Tests/images/sunraster + +# pyinstaller +*.spec From c17ce801cfba4a850381ca6811e5b27b09bffe10 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:02:48 +0100 Subject: [PATCH 396/750] I see a python file and I want to paint it black --- Tests/oss-fuzz/fuzz_font.py | 2 +- Tests/oss-fuzz/fuzz_pillow.py | 3 ++- Tests/oss-fuzz/fuzzers.py | 9 ++++++--- Tests/oss-fuzz/test_fuzzers.py | 29 +++++++++++++++++++---------- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Tests/oss-fuzz/fuzz_font.py b/Tests/oss-fuzz/fuzz_font.py index ec3a4b2de..3cea56fd7 100755 --- a/Tests/oss-fuzz/fuzz_font.py +++ b/Tests/oss-fuzz/fuzz_font.py @@ -19,9 +19,9 @@ import sys import warnings import atheris_no_libfuzzer as atheris - import fuzzers + def TestOneInput(data): try: fuzzers.fuzz_font(data) diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py index 695e9e5eb..8112dd9a0 100644 --- a/Tests/oss-fuzz/fuzz_pillow.py +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -18,9 +18,9 @@ import io import sys import warnings +import atheris_no_libfuzzer as atheris import fuzzers -import atheris_no_libfuzzer as atheris def TestOneInput(data): try: @@ -31,6 +31,7 @@ def TestOneInput(data): return return + def main(): fuzzers.enable_decompressionbomb_error() atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) diff --git a/Tests/oss-fuzz/fuzzers.py b/Tests/oss-fuzz/fuzzers.py index f7c395e76..c3fa1f0ce 100644 --- a/Tests/oss-fuzz/fuzzers.py +++ b/Tests/oss-fuzz/fuzzers.py @@ -1,13 +1,15 @@ -import warnings import io +import warnings + +from PIL import Image, ImageDraw, ImageFile, ImageFilter, ImageFont, PcfFontFile -from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageFile, PcfFontFile def enable_decompressionbomb_error(): ImageFile.LOAD_TRUNCATED_IMAGES = True warnings.filterwarnings("ignore") warnings.simplefilter("error", Image.DecompressionBombWarning) + def fuzz_image(data): # This will fail on some images in the corpus, as we have many # invalid images in the test suite. @@ -16,6 +18,7 @@ def fuzz_image(data): im.filter(ImageFilter.DETAIL) im.save(io.BytesIO(), "BMP") + def fuzz_font(data): # This should not fail on a valid font load for any of the fonts in the corpus wrapper = io.BytesIO(data) @@ -30,4 +33,4 @@ def fuzz_font(data): with Image.new(mode="RGBA", size=(200, 200)) as im: draw = ImageDraw.Draw(im) draw.multiline_textsize("ABC\nAaaa", font, stroke_width=2) - draw.text((10,10), "Test Text", font=font, fill="#000") + draw.text((10, 10), "Test Text", font=font, fill="#000") diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 56b1ee9a0..aa13ff1b2 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -1,31 +1,40 @@ -import pytest - -import fuzzers import glob import subprocess +import fuzzers +import pytest + from PIL import Image -@pytest.mark.parametrize("path", subprocess.check_output('find Tests/images -type f', shell=True).split(b'\n')) + +@pytest.mark.parametrize( + "path", + subprocess.check_output("find Tests/images -type f", shell=True).split(b"\n"), +) def test_fuzz_images(path): fuzzers.enable_decompressionbomb_error() try: - with open(path, 'rb') as f: + with open(path, "rb") as f: fuzzers.fuzz_image(f.read()) assert True except (OSError, SyntaxError, MemoryError, ValueError, NotImplementedError): # Known exceptions that are through from Pillow assert True - except (Image.DecompressionBombError, Image.DecompressionBombWarning, - Image.UnidentifiedImageError): + except ( + Image.DecompressionBombError, + Image.DecompressionBombWarning, + Image.UnidentifiedImageError, + ): # Known Image.* exceptions assert True -@pytest.mark.parametrize("path", subprocess.check_output('find Tests/fonts -type f', shell=True).split(b'\n')) +@pytest.mark.parametrize( + "path", subprocess.check_output("find Tests/fonts -type f", shell=True).split(b"\n") +) def test_fuzz_fonts(path): - if not path or b'LICENSE.txt' in path or b'.pil' in path: + if not path or b"LICENSE.txt" in path or b".pil" in path: return - with open(path, 'rb') as f: + with open(path, "rb") as f: fuzzers.fuzz_font(f.read()) assert True From 8b06fec6ab62c2c588c7e8723fec4fc2ff218515 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:14:39 +0100 Subject: [PATCH 397/750] linty bits --- Tests/oss-fuzz/fuzz_font.py | 2 -- Tests/oss-fuzz/fuzz_pillow.py | 2 -- Tests/oss-fuzz/fuzzers.py | 2 +- Tests/oss-fuzz/test_fuzzers.py | 1 - 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Tests/oss-fuzz/fuzz_font.py b/Tests/oss-fuzz/fuzz_font.py index 3cea56fd7..9f21a1fa5 100755 --- a/Tests/oss-fuzz/fuzz_font.py +++ b/Tests/oss-fuzz/fuzz_font.py @@ -14,9 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import io import sys -import warnings import atheris_no_libfuzzer as atheris import fuzzers diff --git a/Tests/oss-fuzz/fuzz_pillow.py b/Tests/oss-fuzz/fuzz_pillow.py index 8112dd9a0..d816d535f 100644 --- a/Tests/oss-fuzz/fuzz_pillow.py +++ b/Tests/oss-fuzz/fuzz_pillow.py @@ -14,9 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import io import sys -import warnings import atheris_no_libfuzzer as atheris import fuzzers diff --git a/Tests/oss-fuzz/fuzzers.py b/Tests/oss-fuzz/fuzzers.py index c3fa1f0ce..156653f1d 100644 --- a/Tests/oss-fuzz/fuzzers.py +++ b/Tests/oss-fuzz/fuzzers.py @@ -1,7 +1,7 @@ import io import warnings -from PIL import Image, ImageDraw, ImageFile, ImageFilter, ImageFont, PcfFontFile +from PIL import Image, ImageDraw, ImageFile, ImageFilter, ImageFont def enable_decompressionbomb_error(): diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index aa13ff1b2..fc5b21840 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -1,4 +1,3 @@ -import glob import subprocess import fuzzers From 6189bca3bc238c11ec31de30091a60012d9acfa6 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:27:47 +0100 Subject: [PATCH 398/750] Skip fuzzer tests on windows --- Tests/oss-fuzz/test_fuzzers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index fc5b21840..f7be87373 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -1,11 +1,15 @@ import subprocess +import sys import fuzzers import pytest from PIL import Image +def is_win32(): + sys.platform.startswith("win32") +@pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/images -type f", shell=True).split(b"\n"), @@ -27,7 +31,7 @@ def test_fuzz_images(path): # Known Image.* exceptions assert True - +@pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/fonts -type f", shell=True).split(b"\n") ) From 0ea13132a24cec8dbbf729630e480d26742879f0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:32:44 +0100 Subject: [PATCH 399/750] Overflow error shows up in x86 --- Tests/oss-fuzz/test_fuzzers.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index f7be87373..d7c16f144 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -20,7 +20,12 @@ def test_fuzz_images(path): with open(path, "rb") as f: fuzzers.fuzz_image(f.read()) assert True - except (OSError, SyntaxError, MemoryError, ValueError, NotImplementedError): + except (OSError, + SyntaxError, + MemoryError, + ValueError, + NotImplementedError, + OverflowError): # Known exceptions that are through from Pillow assert True except ( From bb6b991d8d74ae4f09063dac9ed78d7df3ed3596 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:49:36 +0100 Subject: [PATCH 400/750] no colors anymore, they want them to turn black --- Tests/oss-fuzz/test_fuzzers.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index d7c16f144..410fff505 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -6,9 +6,11 @@ import pytest from PIL import Image + def is_win32(): sys.platform.startswith("win32") + @pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", @@ -20,12 +22,14 @@ def test_fuzz_images(path): with open(path, "rb") as f: fuzzers.fuzz_image(f.read()) assert True - except (OSError, - SyntaxError, - MemoryError, - ValueError, - NotImplementedError, - OverflowError): + except ( + OSError, + SyntaxError, + MemoryError, + ValueError, + NotImplementedError, + OverflowError, + ): # Known exceptions that are through from Pillow assert True except ( @@ -36,6 +40,7 @@ def test_fuzz_images(path): # Known Image.* exceptions assert True + @pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/fonts -type f", shell=True).split(b"\n") From 487dc16ce6ee4f71815329acb023d28ac6529d74 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 13:57:24 +0100 Subject: [PATCH 401/750] Can't skip windows properly because the depenedncy is in the decorator --- Tests/oss-fuzz/test_fuzzers.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 410fff505..4ccdeca4a 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -7,11 +7,10 @@ import pytest from PIL import Image -def is_win32(): - sys.platform.startswith("win32") +if sys.platform.startswith("win32"): + pytest.skip("Fuzzer is linux only", true) -@pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/images -type f", shell=True).split(b"\n"), @@ -41,7 +40,6 @@ def test_fuzz_images(path): assert True -@pytest.mark.skipif(is_win32(), reason="Fuzzer is linux only") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/fonts -type f", shell=True).split(b"\n") ) From 961b2c0242df0b749c2524ce51e4272f2bd160d2 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 14:03:41 +0100 Subject: [PATCH 402/750] True --- Tests/oss-fuzz/test_fuzzers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 4ccdeca4a..97fe4a60f 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -8,7 +8,7 @@ from PIL import Image if sys.platform.startswith("win32"): - pytest.skip("Fuzzer is linux only", true) + pytest.skip("Fuzzer is linux only", True) @pytest.mark.parametrize( From 862e3b9d8e19fb7c222ecd590ac94c97f459ae6f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 14:11:48 +0100 Subject: [PATCH 403/750] Apparently, it's a keyword-only parameter --- Tests/oss-fuzz/test_fuzzers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 97fe4a60f..b5e6a3d86 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -8,7 +8,7 @@ from PIL import Image if sys.platform.startswith("win32"): - pytest.skip("Fuzzer is linux only", True) + pytest.skip("Fuzzer is linux only", allow_module_level=True) @pytest.mark.parametrize( From 76e0422eb7810963a455443910a6ceeb9e39d631 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 14:13:37 +0100 Subject: [PATCH 404/750] Isort linted that there's an extra line, which black didn't worry about --- Tests/oss-fuzz/test_fuzzers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index b5e6a3d86..c61cb7e55 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -6,7 +6,6 @@ import pytest from PIL import Image - if sys.platform.startswith("win32"): pytest.skip("Fuzzer is linux only", allow_module_level=True) From d0d42cd7c25bbdd27b5a64b69d5340b006852bb0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 11 Mar 2021 22:32:30 +0100 Subject: [PATCH 405/750] Install pytest-timeout on the ci. (dry?) --- .ci/install.sh | 1 + .github/workflows/macos-install.sh | 1 + .github/workflows/test-windows.yml | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 9372d0c51..4917b3a7c 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -27,6 +27,7 @@ python3 -m pip install coverage python3 -m pip install olefile python3 -m pip install -U pytest python3 -m pip install -U pytest-cov +python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index afcb9a5a7..f45824445 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -9,6 +9,7 @@ python3 -m pip install coverage python3 -m pip install olefile python3 -m pip install -U pytest python3 -m pip install -U pytest-cov +python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index f3bb85f32..8cab06efb 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -57,8 +57,8 @@ jobs: - name: Print build system information run: python .github/workflows/system-info.py - - name: python -m pip install wheel pytest pytest-cov - run: python -m pip install wheel pytest pytest-cov + - name: python -m pip install wheel pytest pytest-cov pytest-timeout + run: python -m pip install wheel pytest pytest-cov pytest-timeout # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: - name: Upgrade setuptools From 12715c5ea9097af314d3ffec688800c91b9c9f23 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 14:22:27 +0100 Subject: [PATCH 406/750] Install Pytest-timeout in dev-requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1ed1356f9..4b534ae53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ packaging pyroma pytest pytest-cov +pytest-timeout sphinx>=2.4 sphinx-issues sphinx-removed-in From b57aee53a2ecbbc56d3da212aa08ab9184e8a7f1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 Mar 2021 08:30:27 +1100 Subject: [PATCH 407/750] Added release notes for #5321 [ci skip] --- docs/releasenotes/8.2.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index bbac2449f..95b17ab31 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -51,6 +51,14 @@ instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show if none of the other viewers are available. This means that the behaviour of :py:class:`PIL.ImageShow` will stay the same for most Pillow users. +Saving TIFF with ICC profile +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As is already possible for JPEG, PNG and WebP, the ICC profile for TIFF files can now +be specified through a keyword argument:: + + im.save("out.tif", icc_profile=...) + Security ======== From d45247eb6683d660cd151a4b3db555eb3f97d03b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 15 Mar 2021 00:14:43 +0100 Subject: [PATCH 408/750] Add decompression bomb error to font fuzzer --- Tests/oss-fuzz/fuzz_font.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/oss-fuzz/fuzz_font.py b/Tests/oss-fuzz/fuzz_font.py index 9f21a1fa5..bdfda7a13 100755 --- a/Tests/oss-fuzz/fuzz_font.py +++ b/Tests/oss-fuzz/fuzz_font.py @@ -31,6 +31,7 @@ def TestOneInput(data): def main(): + fuzzers.enable_decompressionbomb_error() atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) atheris.Fuzz() From 83dabda6b2df344ecc6352d2b4d1e20fee4120dc Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 15 Mar 2021 00:18:07 +0100 Subject: [PATCH 409/750] Clean up comments and filters --- Tests/oss-fuzz/fuzzers.py | 4 ++-- Tests/oss-fuzz/test_fuzzers.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/oss-fuzz/fuzzers.py b/Tests/oss-fuzz/fuzzers.py index 156653f1d..1e7a4e27d 100644 --- a/Tests/oss-fuzz/fuzzers.py +++ b/Tests/oss-fuzz/fuzzers.py @@ -20,12 +20,12 @@ def fuzz_image(data): def fuzz_font(data): - # This should not fail on a valid font load for any of the fonts in the corpus wrapper = io.BytesIO(data) try: font = ImageFont.truetype(wrapper) except OSError: - # pcf/pilfonts/random garbage here here. They're different. + # Catch pcf/pilfonts/random garbage here. They return + # different font objects. return font.getsize_multiline("ABC\nAaaa") diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index c61cb7e55..04d4fd16b 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -43,7 +43,7 @@ def test_fuzz_images(path): "path", subprocess.check_output("find Tests/fonts -type f", shell=True).split(b"\n") ) def test_fuzz_fonts(path): - if not path or b"LICENSE.txt" in path or b".pil" in path: + if not path: return with open(path, "rb") as f: fuzzers.fuzz_font(f.read()) From ad37e86c40e42a10300c763acba7bdf53dd7c28a Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 15 Mar 2021 00:21:18 +0100 Subject: [PATCH 410/750] DecompressionBombError is now an option --- Tests/oss-fuzz/test_fuzzers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 04d4fd16b..8de71eb4b 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -46,5 +46,9 @@ def test_fuzz_fonts(path): if not path: return with open(path, "rb") as f: - fuzzers.fuzz_font(f.read()) + try: + fuzzers.fuzz_font(f.read()) + except (Image.DecompressionBombError, + Image.DecompressionBombWarning): + pass assert True From c52b45df62a34b14c66159db777e9d3fc942fb55 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 Mar 2021 12:32:42 +1100 Subject: [PATCH 411/750] Removed automatic retrieval of GPS IFD --- Tests/test_file_jpeg.py | 4 ++-- src/PIL/Image.py | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 740f9fa4d..3ee33d65f 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -264,11 +264,11 @@ class TestFileJpeg: assert exif[0x0112] == Image.TRANSVERSE # Assert that the GPS IFD is present and empty - assert exif[0x8825] == {} + assert exif.get_ifd(0x8825) == {} transposed = ImageOps.exif_transpose(im) exif = transposed.getexif() - assert exif[0x8825] == {} + assert exif.get_ifd(0x8825) == {} # Assert that it was transposed assert 0x0112 not in exif diff --git a/src/PIL/Image.py b/src/PIL/Image.py index df3ebfd18..31eab54a4 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3360,6 +3360,10 @@ class Exif(MutableMapping): if ifd: merged_dict.update(ifd) + # GPS + if 0x8825 in self: + merged_dict[0x8825] = self._get_ifd_dict(self[0x8825]) + return merged_dict def tobytes(self, offset=8): @@ -3371,7 +3375,7 @@ class Exif(MutableMapping): head = b"MM\x00\x2A\x00\x00\x00\x08" ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) for tag, value in self.items(): - if tag in [0x8769, 0x8225] and not isinstance(value, dict): + if tag in [0x8769, 0x8225, 0x8825] and not isinstance(value, dict): value = self.get_ifd(tag) if ( tag == 0x8769 @@ -3491,8 +3495,6 @@ class Exif(MutableMapping): def __getitem__(self, tag): if self._info is not None and tag not in self._data and tag in self._info: self._data[tag] = self._fixup(self._info[tag]) - if tag == 0x8825: - self._data[tag] = self.get_ifd(tag) del self._info[tag] return self._data[tag] From 36a4b055bba2c2ffff6945f0bb071ac1554c26ac Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 Mar 2021 12:50:30 +1100 Subject: [PATCH 412/750] Updated comments --- src/PIL/Image.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 545fdc019..2e7abfb68 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3397,6 +3397,7 @@ class Exif(MutableMapping): self.get_ifd(0x8769) tag_data = self._ifds[0x8769][tag] if tag == 0x927C: + # makernote from .TiffImagePlugin import ImageFileDirectory_v2 if tag_data[:8] == b"FUJIFILM": @@ -3472,7 +3473,7 @@ class Exif(MutableMapping): makernote = {0x1101: dict(self._fixup_dict(camerainfo))} self._ifds[tag] = makernote else: - # gpsinfo, interop + # interop self._ifds[tag] = self._get_ifd_dict(tag_data) return self._ifds.get(tag, {}) From c801db7a32312a2e75cf9766f38972d237b56ab8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 15 Mar 2021 21:27:07 +1100 Subject: [PATCH 413/750] Added test for saving PNG with bits keyword --- Tests/test_file_png.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 52ea3b6d2..c8d441485 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -625,6 +625,15 @@ class TestFilePng: with Image.open("Tests/images/hopper_idat_after_image_end.png") as im: assert im.text == {"TXT": "VALUE", "ZIP": "VALUE"} + def test_specify_bits(self, tmp_path): + im = hopper("P") + + out = str(tmp_path / "temp.png") + im.save(out, bits=4) + + with Image.open(out) as reloaded: + assert len(reloaded.png.im_palette[1]) == 48 + def test_exif(self): # With an EXIF chunk with Image.open("Tests/images/exif.png") as im: From d7cbc9a27e8907ed4dfae1127eb97bf6a365733c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 16 Mar 2021 22:19:48 +1100 Subject: [PATCH 414/750] Corrected grammar --- src/libImaging/GifDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/GifDecode.c b/src/libImaging/GifDecode.c index 88ae3896c..5817001ac 100644 --- a/src/libImaging/GifDecode.c +++ b/src/libImaging/GifDecode.c @@ -221,7 +221,7 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t if (context->next < GIFTABLE) { /* We'll only add this symbol if we have room - for it (take advise, Netscape!) */ + for it (take the advice, Netscape!) */ context->data[context->next] = c; context->link[context->next] = context->lastcode; From a4a314f765443c088744deca074325ff4c005262 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 23 Oct 2018 22:33:57 -0500 Subject: [PATCH 415/750] GIF: Support transparency in the native decoder. Allow the transparency index to be passed to the native decoder. If not -1, pixels with this index will be left at their previous value. This only adds the decoder support and isn't active yet. --- src/PIL/GifImagePlugin.py | 2 +- src/decode.c | 4 +++- src/libImaging/Gif.h | 3 +++ src/libImaging/GifDecode.c | 38 +++++++++++++++++++++----------------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 7c083bd8b..131aa939e 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -251,7 +251,7 @@ class GifImageFile(ImageFile.ImageFile): bits = self.fp.read(1)[0] self.__offset = self.fp.tell() self.tile = [ - ("gif", (x0, y0, x1, y1), self.__offset, (bits, interlace)) + ("gif", (x0, y0, x1, y1), self.__offset, (bits, interlace, -1)) ] break diff --git a/src/decode.c b/src/decode.c index 5d64bd0b9..a29c6a46e 100644 --- a/src/decode.c +++ b/src/decode.c @@ -430,7 +430,8 @@ PyImaging_GifDecoderNew(PyObject *self, PyObject *args) { char *mode; int bits = 8; int interlace = 0; - if (!PyArg_ParseTuple(args, "s|ii", &mode, &bits, &interlace)) { + int transparency = -1; + if (!PyArg_ParseTuple(args, "s|iii", &mode, &bits, &interlace, &transparency)) { return NULL; } @@ -448,6 +449,7 @@ PyImaging_GifDecoderNew(PyObject *self, PyObject *args) { ((GIFDECODERSTATE *)decoder->state.context)->bits = bits; ((GIFDECODERSTATE *)decoder->state.context)->interlace = interlace; + ((GIFDECODERSTATE *)decoder->state.context)->transparency = transparency; return (PyObject *)decoder; } diff --git a/src/libImaging/Gif.h b/src/libImaging/Gif.h index a85ce2b6e..0f44df795 100644 --- a/src/libImaging/Gif.h +++ b/src/libImaging/Gif.h @@ -30,6 +30,9 @@ typedef struct { */ int interlace; + /* The transparent palette index, or -1 for no transparency. */ + int transparency; + /* PRIVATE CONTEXT (set by decoder) */ /* Interlace parameters */ diff --git a/src/libImaging/GifDecode.c b/src/libImaging/GifDecode.c index 88ae3896c..5392198da 100644 --- a/src/libImaging/GifDecode.c +++ b/src/libImaging/GifDecode.c @@ -248,29 +248,33 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t /* To squeeze some extra pixels out of this loop, we test for some common cases and handle them separately. */ - /* FIXME: should we handle the transparency index in here??? */ - - if (i == 1) { - if (state->x < state->xsize - 1) { - /* Single pixel, not at the end of the line. */ - *out++ = p[0]; - state->x++; + /* If we have transparency, we need to use the regular loop. */ + if (context->transparency == -1) { + if (i == 1) { + if (state->x < state->xsize - 1) { + /* Single pixel, not at the end of the line. */ + *out++ = p[0]; + state->x++; + continue; + } + } else if (state->x + i <= state->xsize) { + /* This string fits into current line. */ + memcpy(out, p, i); + out += i; + state->x += i; + if (state->x == state->xsize) { + NEWLINE(state, context); + } continue; } - } else if (state->x + i <= state->xsize) { - /* This string fits into current line. */ - memcpy(out, p, i); - out += i; - state->x += i; - if (state->x == state->xsize) { - NEWLINE(state, context); - } - continue; } /* No shortcut, copy pixel by pixel */ for (c = 0; c < i; c++) { - *out++ = p[c]; + if (p[c] != context->transparency) { + *out = p[c]; + } + out++; if (++state->x >= state->xsize) { NEWLINE(state, context); } From 18854dcf14c7c66a7c56929ddf9714fb843af8a1 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 23 Oct 2018 23:15:15 -0500 Subject: [PATCH 416/750] GIF: Handle GIF transparency in the decoder. Remove the special case for disposal_method == 1 and handle GIF transparency by telling the decoder the transparent index. --- src/PIL/GifImagePlugin.py | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 131aa939e..bf2db4260 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -145,7 +145,6 @@ class GifImageFile(ImageFile.ImageFile): self.dispose_extent = [0, 0, 0, 0] # x0, y0, x1, y1 self.__frame = -1 self.__fp.seek(self.__rewind) - self._prev_im = None self.disposal_method = 0 else: # ensure that the previous frame was loaded @@ -250,9 +249,10 @@ class GifImageFile(ImageFile.ImageFile): # image data bits = self.fp.read(1)[0] self.__offset = self.fp.tell() - self.tile = [ - ("gif", (x0, y0, x1, y1), self.__offset, (bits, interlace, -1)) - ] + self.tile = [("gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace, info.get("transparency", -1)))] break else: @@ -295,20 +295,6 @@ class GifImageFile(ImageFile.ImageFile): def tell(self): return self.__frame - def load_end(self): - ImageFile.ImageFile.load_end(self) - - # if the disposal method is 'do not dispose', transparent - # pixels should show the content of the previous frame - if self._prev_im and self._prev_disposal_method == 1: - # we do this by pasting the updated area onto the previous - # frame which we then use as the current image content - updated = self._crop(self.im, self.dispose_extent) - self._prev_im.paste(updated, self.dispose_extent, updated.convert("RGBA")) - self.im = self._prev_im - self._prev_im = self.im.copy() - self._prev_disposal_method = self.disposal_method - def _close__fp(self): try: if self.__fp != self.fp: From b216b367ac91d5d8514d97d42b30805df7529c86 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Mar 2021 00:24:57 +1100 Subject: [PATCH 417/750] Only set info transparency on first frame --- Tests/images/different_transparency.gif | Bin 0 -> 4118 bytes .../images/different_transparency_merged.gif | Bin 0 -> 3046 bytes Tests/test_file_gif.py | 17 +++++++++-- Tests/test_file_webp_animated.py | 4 +-- src/PIL/GifImagePlugin.py | 27 +++++++++++++----- 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 Tests/images/different_transparency.gif create mode 100644 Tests/images/different_transparency_merged.gif diff --git a/Tests/images/different_transparency.gif b/Tests/images/different_transparency.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d36bef9e360923246f7d29c705f39ef1d732021 GIT binary patch literal 4118 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 1b2314d51..52d7f035d 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -468,12 +468,25 @@ def test_dispose2_background(tmp_path): assert im.getpixel((0, 0)) == 0 -def test_iss634(): +def test_transparency_in_second_frame(): + with Image.open("Tests/images/different_transparency.gif") as im: + assert im.info["transparency"] == 0 + + # Seek to the second frame + im.seek(im.tell() + 1) + assert im.info["transparency"] == 0 + + assert_image_equal_tofile(im, "Tests/images/different_transparency_merged.gif") + + +def test_no_transparency_in_second_frame(): with Image.open("Tests/images/iss634.gif") as img: # Seek to the second frame img.seek(img.tell() + 1) + assert "transparency" not in img.info + # All transparent pixels should be replaced with the color from the first frame - assert img.histogram()[img.info["transparency"]] == 0 + assert img.histogram()[255] == 0 def test_duration(tmp_path): diff --git a/Tests/test_file_webp_animated.py b/Tests/test_file_webp_animated.py index 26e903488..25ebffe02 100644 --- a/Tests/test_file_webp_animated.py +++ b/Tests/test_file_webp_animated.py @@ -45,12 +45,12 @@ def test_write_animation_L(tmp_path): # Compare first and last frames to the original animated GIF orig.load() im.load() - assert_image_similar(im, orig.convert("RGBA"), 25.0) + assert_image_similar(im, orig.convert("RGBA"), 32.9) orig.seek(orig.n_frames - 1) im.seek(im.n_frames - 1) orig.load() im.load() - assert_image_similar(im, orig.convert("RGBA"), 25.0) + assert_image_similar(im, orig.convert("RGBA"), 32.9) @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index bf2db4260..2f6d98204 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -173,6 +173,8 @@ class GifImageFile(ImageFile.ImageFile): self.palette = copy(self.global_palette) info = {} + frame_transparency = None + interlace = None while True: s = self.fp.read(1) @@ -191,7 +193,7 @@ class GifImageFile(ImageFile.ImageFile): # flags = block[0] if flags & 1: - info["transparency"] = block[3] + frame_transparency = block[3] info["duration"] = i16(block, 1) * 10 # disposal method - find the value of bits 4 - 6 @@ -249,10 +251,6 @@ class GifImageFile(ImageFile.ImageFile): # image data bits = self.fp.read(1)[0] self.__offset = self.fp.tell() - self.tile = [("gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, info.get("transparency", -1)))] break else: @@ -278,11 +276,26 @@ class GifImageFile(ImageFile.ImageFile): except (AttributeError, KeyError): pass - if not self.tile: + if interlace is not None: + transparency = -1 + if frame_transparency is not None: + if frame == 0: + self.info["transparency"] = frame_transparency + else: + transparency = frame_transparency + self.tile = [ + ( + "gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace, transparency), + ) + ] + else: # self.__fp = None raise EOFError - for k in ["transparency", "duration", "comment", "extension", "loop"]: + for k in ["duration", "comment", "extension", "loop"]: if k in info: self.info[k] = info[k] elif k in self.info: From b7a76899be42fc1f5fc91663fc0b93724bc5e9f7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Mar 2021 07:51:32 +1100 Subject: [PATCH 418/750] Updated harfbuzz to 2.8.0 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 7b561aa4e..a20fef02b 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -275,9 +275,9 @@ deps = { "libs": [r"*.lib"], }, "harfbuzz": { - "url": "https://github.com/harfbuzz/harfbuzz/archive/2.7.4.zip", - "filename": "harfbuzz-2.7.4.zip", - "dir": "harfbuzz-2.7.4", + "url": "https://github.com/harfbuzz/harfbuzz/archive/2.8.0.zip", + "filename": "harfbuzz-2.8.0.zip", + "dir": "harfbuzz-2.8.0", "build": [ cmd_cmake("-DHB_HAVE_FREETYPE:BOOL=TRUE"), cmd_nmake(target="clean"), From dd097fe1fd6bbfd22611f1dc5427e4220e7a437a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Mar 2021 11:14:12 +1100 Subject: [PATCH 419/750] Updated list of TIFF compression methods [ci skip] --- docs/handbook/image-file-formats.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 0ccd3b1a4..ef95fc21d 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -876,10 +876,10 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum **compression** A string containing the desired compression method for the file. (valid only with libtiff installed) Valid compression - methods are: :data:`None`, ``"tiff_ccitt"``, ``"group3"``, - ``"group4"``, ``"tiff_jpeg"``, ``"tiff_adobe_deflate"``, - ``"tiff_thunderscan"``, ``"tiff_deflate"``, ``"tiff_sgilog"``, - ``"tiff_sgilog24"``, ``"tiff_raw_16"`` + methods are: :data:`None`, ``"tiff_ccitt"``, ``"group3"``, ``"group4"``, + ``"tiff_lzw"``, ``"jpeg"``, ``"tiff_adobe_deflate"``, ``"tiff_raw_16"``, + ``"packbits"``, ``"tiff_thunderscan"``, ``"tiff_deflate"``, ``"tiff_sgilog"``, + ``"tiff_sgilog24"``, ``"lzma"``, ``"zstd"``, ``"webp"`` **quality** The image quality for JPEG compression, on a scale from 0 (worst) to 100 From 8f37f8dcb0c2eaffbb61b13b42cb3dd0582c75cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Mar 2021 17:54:37 +1100 Subject: [PATCH 420/750] Sorted TIFF compression methods alphabetically [ci skip] --- docs/handbook/image-file-formats.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index ef95fc21d..fa4735cf8 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -876,10 +876,10 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum **compression** A string containing the desired compression method for the file. (valid only with libtiff installed) Valid compression - methods are: :data:`None`, ``"tiff_ccitt"``, ``"group3"``, ``"group4"``, - ``"tiff_lzw"``, ``"jpeg"``, ``"tiff_adobe_deflate"``, ``"tiff_raw_16"``, - ``"packbits"``, ``"tiff_thunderscan"``, ``"tiff_deflate"``, ``"tiff_sgilog"``, - ``"tiff_sgilog24"``, ``"lzma"``, ``"zstd"``, ``"webp"`` + methods are: :data:`None`, ``"group3"``, ``"group4"``, ``"jpeg"``, ``"lzma"``, + ``"packbits"``, ``"tiff_adobe_deflate"``, ``"tiff_ccitt"``, ``"tiff_deflate"``, + ``"tiff_lzw"``, ``"tiff_raw_16"``, ``"tiff_sgilog"``, ``"tiff_sgilog24"``, + ``"tiff_thunderscan"``, ``"webp"`, ``"zstd"`` **quality** The image quality for JPEG compression, on a scale from 0 (worst) to 100 From 1d8c5a820cd335a6b4f8d534e3f2fa4aa9112e0a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Mar 2021 20:37:31 +1100 Subject: [PATCH 421/750] Use duration from info dictionary when saving --- Tests/test_file_webp.py | 13 +++++++++++++ src/PIL/WebPImagePlugin.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index c1eb86ae5..cde7020ed 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -176,3 +176,16 @@ class TestFileWebp: [abs(original_value[i] - reread_value[i]) for i in range(0, 3)] ) assert difference < 5 + + @skip_unless_feature("webp") + @skip_unless_feature("webp_anim") + def test_duration(self, tmp_path): + with Image.open("Tests/images/dispose_bgnd.gif") as im: + assert im.info["duration"] == 1000 + + out_webp = str(tmp_path / "temp.webp") + im.save(out_webp, save_all=True) + + with Image.open(out_webp) as reloaded: + reloaded.load() + assert reloaded.info["duration"] == 1000 diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 2e9746fa3..c9b700314 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -192,7 +192,7 @@ def _save_all(im, fp, filename): r, g, b = palette[background * 3 : (background + 1) * 3] background = (r, g, b, 0) - duration = im.encoderinfo.get("duration", 0) + duration = im.encoderinfo.get("duration", im.info.get("duration")) loop = im.encoderinfo.get("loop", 0) minimize_size = im.encoderinfo.get("minimize_size", False) kmin = im.encoderinfo.get("kmin", None) From 94df4ec1c95932ec498e8be307498a1cd9241cbe Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 17 Mar 2021 23:16:35 +1100 Subject: [PATCH 422/750] Lint fix --- Tests/oss-fuzz/test_fuzzers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 8de71eb4b..a243c0260 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -48,7 +48,6 @@ def test_fuzz_fonts(path): with open(path, "rb") as f: try: fuzzers.fuzz_font(f.read()) - except (Image.DecompressionBombError, - Image.DecompressionBombWarning): + except (Image.DecompressionBombError, Image.DecompressionBombWarning): pass assert True From 298600381f0ca6308688985c5ddfbc131b817981 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 19 Mar 2021 12:00:29 +1100 Subject: [PATCH 423/750] Replaced tiff_deflate with tiff_adobe_deflate compression when saving --- Tests/test_file_libtiff.py | 8 ++++++++ src/PIL/TiffImagePlugin.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 7a5a5b462..d6f4900cd 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -471,6 +471,14 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(out) as reloaded: assert reloaded.info["compression"] == "jpeg" + def test_tiff_deflate_compression(self, tmp_path): + im = hopper("RGB") + out = str(tmp_path / "temp.tif") + im.save(out, compression="tiff_deflate") + + with Image.open(out) as reloaded: + assert reloaded.info["compression"] == "tiff_adobe_deflate" + def test_quality(self, tmp_path): im = hopper("RGB") out = str(tmp_path / "temp.tif") diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 98c70d7c4..19bcf4419 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1442,6 +1442,8 @@ def _save(im, fp, filename): elif compression == "tiff_jpeg": # OJPEG is obsolete, so use new-style JPEG compression instead compression = "jpeg" + elif compression == "tiff_deflate": + compression = "tiff_adobe_deflate" libtiff = WRITE_LIBTIFF or compression != "raw" From 242af47a686d0c4a6eaee07e59569795289701c5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 19 Mar 2021 12:14:41 +1100 Subject: [PATCH 424/750] Removed obsolete "tiff_deflate" from compression methods [ci skip] --- docs/handbook/image-file-formats.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index fa4735cf8..c67f8fb8f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -877,9 +877,9 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum A string containing the desired compression method for the file. (valid only with libtiff installed) Valid compression methods are: :data:`None`, ``"group3"``, ``"group4"``, ``"jpeg"``, ``"lzma"``, - ``"packbits"``, ``"tiff_adobe_deflate"``, ``"tiff_ccitt"``, ``"tiff_deflate"``, - ``"tiff_lzw"``, ``"tiff_raw_16"``, ``"tiff_sgilog"``, ``"tiff_sgilog24"``, - ``"tiff_thunderscan"``, ``"webp"`, ``"zstd"`` + ``"packbits"``, ``"tiff_adobe_deflate"``, ``"tiff_ccitt"``, ``"tiff_lzw"``, + ``"tiff_raw_16"``, ``"tiff_sgilog"``, ``"tiff_sgilog24"``, ``"tiff_thunderscan"``, + ``"webp"`, ``"zstd"`` **quality** The image quality for JPEG compression, on a scale from 0 (worst) to 100 From 03eecb51d561f24ca5d5714cf9af53f568e90a9a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 19 Mar 2021 18:03:44 +1100 Subject: [PATCH 425/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dbe06304d..99aa94f9a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Replaced tiff_deflate with tiff_adobe_deflate compression when saving TIFF images #5343 + [radarhere] + - Save ICC profile from TIFF encoderinfo #5321 [radarhere] From 7a32dfd5e30934000ca4dcc9624f6aec2fa20e0e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Mar 2021 08:30:09 +1100 Subject: [PATCH 426/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 99aa94f9a..6bd8ef8b5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Stop flattening EXIF IFD into getexif() #4947 + [radarhere, kkopachev] + - Replaced tiff_deflate with tiff_adobe_deflate compression when saving TIFF images #5343 [radarhere] From 309d6f662cf43d65ed756e5bd3290ae291625463 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Mar 2021 08:32:39 +1100 Subject: [PATCH 427/750] Moved rounded_rectangle to API additions [ci skip] --- docs/releasenotes/8.2.0.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 95b17ab31..02df50bc8 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -21,6 +21,9 @@ accepts negative co-ordinates, like the upper left corner of the ``box`` argumen :py:meth:`~PIL.Image.Image.paste` can be negative. Naturally, this has effect of cropping the overlaid image. +API Additions +============= + ImageDraw.rounded_rectangle ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -36,9 +39,6 @@ create a circle, but not any other ellipse. draw = ImageDraw.Draw(im) draw.rounded_rectangle(xy=(10, 20, 190, 180), radius=30, fill="red") -API Additions -============= - ImageShow.IPythonViewer ^^^^^^^^^^^^^^^^^^^^^^^ From da9b1046935177f1e202c4e0f7934f600a68eeae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Mar 2021 08:43:32 +1100 Subject: [PATCH 428/750] Document #4947 [ci skip] --- docs/releasenotes/8.2.0.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 02df50bc8..d82bf45c2 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -21,6 +21,20 @@ accepts negative co-ordinates, like the upper left corner of the ``box`` argumen :py:meth:`~PIL.Image.Image.paste` can be negative. Naturally, this has effect of cropping the overlaid image. +Image.getexif: EXIF and GPS IFD +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Previously, :py:meth:`~PIL.Image.Image.getexif` flattened the EXIF IFD into the rest of +the data, losing information. This information is now kept separate, moved under +``im.getexif().get_ifd(0x8769)``. + +Direct access to the GPS IFD dictionary was possible through ``im.getexif()[0x8825]``. +This is now consistent with other IFDs, and must be accessed through +``im.getexif().get_ifd(0x8825)``. + +These changes only affect :py:meth:`~PIL.Image.Image.getexif`, introduced in Pillow +6.0. The older ``_getexif()`` methods are unaffected. + API Additions ============= From 6591297239d4fd28ea41585fb6fa1f7c9096f6d2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Mar 2021 22:32:27 +1100 Subject: [PATCH 429/750] Increased use of assert_image_equal_tofile --- Tests/test_imagedraw.py | 115 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 55a4b03e2..06c5b2503 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -856,20 +856,19 @@ def create_base_image_draw( def test_square(): - with Image.open(os.path.join(IMAGES_PATH, "square.png")) as expected: - expected.load() - img, draw = create_base_image_draw((10, 10)) - draw.polygon([(2, 2), (2, 7), (7, 7), (7, 2)], BLACK) - assert_image_equal(img, expected, "square as normal polygon failed") - img, draw = create_base_image_draw((10, 10)) - draw.polygon([(7, 7), (7, 2), (2, 2), (2, 7)], BLACK) - assert_image_equal(img, expected, "square as inverted polygon failed") - img, draw = create_base_image_draw((10, 10)) - draw.rectangle((2, 2, 7, 7), BLACK) - assert_image_equal(img, expected, "square as normal rectangle failed") - img, draw = create_base_image_draw((10, 10)) - draw.rectangle((7, 7, 2, 2), BLACK) - assert_image_equal(img, expected, "square as inverted rectangle failed") + expected = os.path.join(IMAGES_PATH, "square.png") + img, draw = create_base_image_draw((10, 10)) + draw.polygon([(2, 2), (2, 7), (7, 7), (7, 2)], BLACK) + assert_image_equal_tofile(img, expected, "square as normal polygon failed") + img, draw = create_base_image_draw((10, 10)) + draw.polygon([(7, 7), (7, 2), (2, 2), (2, 7)], BLACK) + assert_image_equal_tofile(img, expected, "square as inverted polygon failed") + img, draw = create_base_image_draw((10, 10)) + draw.rectangle((2, 2, 7, 7), BLACK) + assert_image_equal_tofile(img, expected, "square as normal rectangle failed") + img, draw = create_base_image_draw((10, 10)) + draw.rectangle((7, 7, 2, 2), BLACK) + assert_image_equal_tofile(img, expected, "square as inverted rectangle failed") def test_triangle_right(): @@ -896,18 +895,18 @@ def test_line_horizontal(): os.path.join(IMAGES_PATH, "line_horizontal_w2px_inverted.png"), "line straight horizontal inverted 2px wide failed", ) - with Image.open(os.path.join(IMAGES_PATH, "line_horizontal_w3px.png")) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 14, 5), BLACK, 3) - assert_image_equal( - img, expected, "line straight horizontal normal 3px wide failed" - ) - img, draw = create_base_image_draw((20, 20)) - draw.line((14, 5, 5, 5), BLACK, 3) - assert_image_equal( - img, expected, "line straight horizontal inverted 3px wide failed" - ) + + expected = os.path.join(IMAGES_PATH, "line_horizontal_w3px.png") + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 14, 5), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line straight horizontal normal 3px wide failed" + ) + img, draw = create_base_image_draw((20, 20)) + draw.line((14, 5, 5, 5), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line straight horizontal inverted 3px wide failed" + ) img, draw = create_base_image_draw((200, 110)) draw.line((5, 55, 195, 55), BLACK, 101) @@ -945,18 +944,19 @@ def test_line_vertical(): os.path.join(IMAGES_PATH, "line_vertical_w2px_inverted.png"), "line straight vertical inverted 2px wide failed", ) - with Image.open(os.path.join(IMAGES_PATH, "line_vertical_w3px.png")) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 5, 14), BLACK, 3) - assert_image_equal( - img, expected, "line straight vertical normal 3px wide failed" - ) - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 14, 5, 5), BLACK, 3) - assert_image_equal( - img, expected, "line straight vertical inverted 3px wide failed" - ) + + expected = os.path.join(IMAGES_PATH, "line_vertical_w3px.png") + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 5, 14), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line straight vertical normal 3px wide failed" + ) + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 14, 5, 5), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line straight vertical inverted 3px wide failed" + ) + img, draw = create_base_image_draw((110, 200)) draw.line((55, 5, 55, 195), BLACK, 101) assert_image_equal_tofile( @@ -975,26 +975,25 @@ def test_line_vertical(): def test_line_oblique_45(): - with Image.open( - os.path.join(IMAGES_PATH, "line_oblique_45_w3px_a.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 5, 14, 14), BLACK, 3) - assert_image_equal(img, expected, "line oblique 45 normal 3px wide A failed") - img, draw = create_base_image_draw((20, 20)) - draw.line((14, 14, 5, 5), BLACK, 3) - assert_image_equal(img, expected, "line oblique 45 inverted 3px wide A failed") - with Image.open( - os.path.join(IMAGES_PATH, "line_oblique_45_w3px_b.png") - ) as expected: - expected.load() - img, draw = create_base_image_draw((20, 20)) - draw.line((14, 5, 5, 14), BLACK, 3) - assert_image_equal(img, expected, "line oblique 45 normal 3px wide B failed") - img, draw = create_base_image_draw((20, 20)) - draw.line((5, 14, 14, 5), BLACK, 3) - assert_image_equal(img, expected, "line oblique 45 inverted 3px wide B failed") + expected = os.path.join(IMAGES_PATH, "line_oblique_45_w3px_a.png") + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 5, 14, 14), BLACK, 3) + assert_image_equal_tofile(img, expected, "line oblique 45 normal 3px wide A failed") + img, draw = create_base_image_draw((20, 20)) + draw.line((14, 14, 5, 5), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line oblique 45 inverted 3px wide A failed" + ) + + expected = os.path.join(IMAGES_PATH, "line_oblique_45_w3px_b.png") + img, draw = create_base_image_draw((20, 20)) + draw.line((14, 5, 5, 14), BLACK, 3) + assert_image_equal_tofile(img, expected, "line oblique 45 normal 3px wide B failed") + img, draw = create_base_image_draw((20, 20)) + draw.line((5, 14, 14, 5), BLACK, 3) + assert_image_equal_tofile( + img, expected, "line oblique 45 inverted 3px wide B failed" + ) def test_wide_line_dot(): From 754752e78f61f5a45b6f64211ff965abdbe348f6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Mar 2021 09:22:01 +1100 Subject: [PATCH 430/750] Allow fewer palette entries than the bit depth maximum --- Tests/test_file_png.py | 10 ++++++++++ src/PIL/PngImagePlugin.py | 26 ++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index c8d441485..bbf5f5772 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -634,6 +634,16 @@ class TestFilePng: with Image.open(out) as reloaded: assert len(reloaded.png.im_palette[1]) == 48 + def test_plte_length(self, tmp_path): + im = Image.new("P", (1, 1)) + im.putpalette((1, 1, 1)) + + out = str(tmp_path / "temp.png") + im.save(str(tmp_path / "temp.png")) + + with Image.open(out) as reloaded: + assert len(reloaded.png.im_palette[1]) == 3 + def test_exif(self): # With an EXIF chunk with Image.open("Tests/images/exif.png") as im: diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 30eb13aa3..07bbc5228 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -1186,23 +1186,21 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False): # attempt to minimize storage requirements for palette images if "bits" in im.encoderinfo: # number of bits specified by user - colors = 1 << im.encoderinfo["bits"] + colors = min(1 << im.encoderinfo["bits"], 256) else: # check palette contents if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 2) + colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) else: colors = 256 - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - elif colors <= 16: - bits = 4 - else: - bits = 8 - if bits != 8: + if colors <= 16: + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + else: + bits = 4 mode = f"{mode};{bits}" # encoder options @@ -1270,7 +1268,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False): chunk(fp, cid, data) if im.mode == "P": - palette_byte_number = (2 ** bits) * 3 + palette_byte_number = colors * 3 palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] while len(palette_bytes) < palette_byte_number: palette_bytes += b"\0" @@ -1281,7 +1279,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False): if transparency or transparency == 0: if im.mode == "P": # limit to actual palette size - alpha_bytes = 2 ** bits + alpha_bytes = colors if isinstance(transparency, bytes): chunk(fp, b"tRNS", transparency[:alpha_bytes]) else: @@ -1302,7 +1300,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False): else: if im.mode == "P" and im.im.getpalettemode() == "RGBA": alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = 2 ** bits + alpha_bytes = colors chunk(fp, b"tRNS", alpha[:alpha_bytes]) dpi = im.encoderinfo.get("dpi") From 7ab8ec9b91681dea850269e08d3fd1adcd96afd5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Mar 2021 21:00:05 +1100 Subject: [PATCH 431/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6bd8ef8b5..3d022c77d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Use duration from info dictionary when saving WebP #5338 + [radarhere] + - Stop flattening EXIF IFD into getexif() #4947 [radarhere, kkopachev] From ef864d72f10fe7c918d4cbc07fc16d4fef4b30bc Mon Sep 17 00:00:00 2001 From: Latosha Maltba Date: Sun, 21 Mar 2021 14:36:18 +0000 Subject: [PATCH 432/750] TestSuite: Add support for GraphicsMagick Add support to run the tests using GraphicsMagick's "gm convert" instead of ImageMagick's "convert". --- Tests/helper.py | 24 +++++++++++++++++++++--- Tests/test_file_palm.py | 12 ++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index be3bdb76f..5573c78c4 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -257,8 +257,16 @@ def netpbm_available(): return bool(shutil.which("ppmquant") and shutil.which("ppmtogif")) +def convert_available(): + return imagemagick_available() or graphicsmagick_available() + + def imagemagick_available(): - return bool(IMCONVERT and shutil.which(IMCONVERT)) + return bool(IMCONVERT and shutil.which(IMCONVERT[0])) + + +def graphicsmagick_available(): + return bool(GMCONVERT and shutil.which(GMCONVERT[0])) def on_appveyor(): @@ -298,10 +306,20 @@ def is_mingw(): if sys.platform == "win32": IMCONVERT = os.environ.get("MAGICK_HOME", "") + GMCONVERT = None if IMCONVERT: - IMCONVERT = os.path.join(IMCONVERT, "convert.exe") + IMCONVERT = [os.path.join(IMCONVERT, "convert.exe")] + GMCONVERT = [os.path.join(IMCONVERT, "gm.exe"), "convert"] else: - IMCONVERT = "convert" + IMCONVERT = ["convert"] + GMCONVERT = ["gm", "convert"] + +if imagemagick_available(): + CONVERT = IMCONVERT +elif graphicsmagick_available(): + CONVERT = GMCONVERT +else: + CONVERT = None class cached_property: diff --git a/Tests/test_file_palm.py b/Tests/test_file_palm.py index 25d194b62..bbbab25d8 100644 --- a/Tests/test_file_palm.py +++ b/Tests/test_file_palm.py @@ -5,9 +5,9 @@ import pytest from PIL import Image -from .helper import IMCONVERT, assert_image_equal, hopper, imagemagick_available +from .helper import CONVERT, assert_image_equal, convert_available, hopper -_roundtrip = imagemagick_available() +_roundtrip = convert_available() def helper_save_as_palm(tmp_path, mode): @@ -23,13 +23,13 @@ def helper_save_as_palm(tmp_path, mode): assert os.path.getsize(outfile) > 0 -def open_with_imagemagick(tmp_path, f): - if not imagemagick_available(): +def open_with_convert(tmp_path, f): + if not convert_available(): raise OSError() outfile = str(tmp_path / "temp.png") rc = subprocess.call( - [IMCONVERT, f, outfile], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT + CONVERT + [f, outfile], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT ) if rc: raise OSError @@ -44,7 +44,7 @@ def roundtrip(tmp_path, mode): outfile = str(tmp_path / "temp.palm") im.save(outfile) - converted = open_with_imagemagick(tmp_path, outfile) + converted = open_with_convert(tmp_path, outfile) assert_image_equal(converted, im) From bb88d8d0170d63e0824b6dfe684421426364db40 Mon Sep 17 00:00:00 2001 From: Latosha Maltba Date: Sun, 21 Mar 2021 14:36:18 +0000 Subject: [PATCH 433/750] Add support to use GraphicsMagick's "gm display" as viewer --- docs/reference/ImageShow.rst | 1 + src/PIL/ImageShow.py | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/docs/reference/ImageShow.rst b/docs/reference/ImageShow.rst index f1fbd90ce..e4d9805ab 100644 --- a/docs/reference/ImageShow.rst +++ b/docs/reference/ImageShow.rst @@ -18,6 +18,7 @@ All default viewers convert the image to be shown to PNG format. The following viewers may be registered on Unix-based systems, if the given command is found: .. autoclass:: PIL.ImageShow.DisplayViewer + .. autoclass:: PIL.ImageShow.GmDisplayViewer .. autoclass:: PIL.ImageShow.EogViewer .. autoclass:: PIL.ImageShow.XVViewer diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 3368865a4..6cc420d1b 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -194,6 +194,15 @@ class DisplayViewer(UnixViewer): return command, executable +class GmDisplayViewer(UnixViewer): + """The GraphicsMagick ``gm display`` command.""" + + def get_command_ex(self, file, **options): + executable = "gm" + command = "gm display" + return command, executable + + class EogViewer(UnixViewer): """The GNOME Image Viewer ``eog`` command.""" @@ -220,6 +229,8 @@ class XVViewer(UnixViewer): if sys.platform not in ("win32", "darwin"): # unixoids if shutil.which("display"): register(DisplayViewer) + if shutil.which("gm"): + register(GmDisplayViewer) if shutil.which("eog"): register(EogViewer) if shutil.which("xv"): From c585e6ab6b4731d65570dbb1cbf396add919b3ae Mon Sep 17 00:00:00 2001 From: elejke Date: Sun, 21 Mar 2021 21:15:13 +0300 Subject: [PATCH 434/750] Add preserve_tone option to autocontrast --- Tests/test_imageops.py | 1 + src/PIL/ImageOps.py | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 33489bd13..b261fa9fe 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -29,6 +29,7 @@ def test_sanity(): ImageOps.autocontrast(hopper("L"), cutoff=(2, 10)) ImageOps.autocontrast(hopper("L"), ignore=[0, 255]) ImageOps.autocontrast(hopper("L"), mask=hopper("L")) + ImageOps.autocontrast(hopper("L"), preserve_tone=True) ImageOps.colorize(hopper("L"), (0, 0, 0), (255, 255, 255)) ImageOps.colorize(hopper("L"), "black", "white") diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 14602a5c8..ac4a7c8f4 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -61,7 +61,7 @@ def _lut(image, lut): # actions -def autocontrast(image, cutoff=0, ignore=None, mask=None): +def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): """ Maximize (normalize) image contrast. This function calculates a histogram of the input image (or mask region), removes ``cutoff`` percent of the @@ -77,9 +77,14 @@ def autocontrast(image, cutoff=0, ignore=None, mask=None): :param mask: Histogram used in contrast operation is computed using pixels within the mask. If no mask is given the entire image is used for histogram computation. + :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. :return: An image. """ - histogram = image.histogram(mask) + if preserve_tone: + histogram = image.convert("L").histogram(mask) + else: + histogram = image.histogram(mask) + lut = [] for layer in range(0, len(histogram), 256): h = histogram[layer : layer + 256] From aa35f6b572c3491976e2336b28f481dad0a2a353 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 06:49:25 +1100 Subject: [PATCH 435/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3d022c77d..21eeb214c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Allow fewer PNG palette entries than the bit depth maximum when saving #5330 + [radarhere] + - Use duration from info dictionary when saving WebP #5338 [radarhere] From 2d8658bd84327b601ddd9147fd84b32d8e7e09da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 18:58:50 +1100 Subject: [PATCH 436/750] Deprecated categories [ci skip] --- docs/deprecations.rst | 12 ++++++++++++ docs/reference/Image.rst | 7 ------- docs/releasenotes/8.2.0.rst | 10 ++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index fd2f5620e..ef88afa23 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -33,6 +33,18 @@ Tk/Tcl 8.4 Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), when Tk/Tcl 8.5 will be the minimum supported. +Categories +~~~~~~~~~~ + +.. deprecated:: 8.2.0 + +``im.category`` is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +along with the related ``Image.NORMAL``, ``Image.SEQUENCE`` and +``Image.CONTAINER`` attributes. + +To determine if an image has multiple frames or not, +``getattr(im, "is_animated", False)`` can be used instead. + Image.show command parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index c4e8f37a3..0e68366ad 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -502,10 +502,3 @@ Used to specify the quantization method to use for the :meth:`~Image.quantize` m Check support using :py:func:`PIL.features.check_feature` with ``feature="libimagequant"``. - -.. comment: These are not referenced anywhere? - Categories - ^^^^^^^^^^ - .. data:: NORMAL - .. data:: SEQUENCE - .. data:: CONTAINER diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index d82bf45c2..3ef05894d 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -10,6 +10,16 @@ Tk/Tcl 8.4 Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), when Tk/Tcl 8.5 will be the minimum supported. +Categories +^^^^^^^^^^ + +``im.category`` is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +along with the related ``Image.NORMAL``, ``Image.SEQUENCE`` and +``Image.CONTAINER`` attributes. + +To determine if an image has multiple frames or not, +``getattr(im, "is_animated", False)`` can be used instead. + API Changes =========== From ab56edb49f30557eb684256a1e3064936b737ecf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 19:18:36 +1100 Subject: [PATCH 437/750] Documented default quantization method --- docs/reference/Image.rst | 6 +++--- src/PIL/Image.py | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index c4e8f37a3..bf173ace9 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -486,15 +486,15 @@ Used to specify the quantization method to use for the :meth:`~Image.quantize` m .. data:: MEDIANCUT - Median cut + Median cut. Default method, except for RGBA images. .. data:: MAXCOVERAGE - Maximum coverage + Maximum coverage. .. data:: FASTOCTREE - Fast octree + Fast octree. Default method for RGBA images. .. data:: LIBIMAGEQUANT diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 2e7abfb68..bec6f3f64 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1059,6 +1059,11 @@ class Image: :data:`LIBIMAGEQUANT` (libimagequant; check support using :py:func:`PIL.features.check_feature` with ``feature="libimagequant"``). + + By default, :data:`MEDIANCUT` will be used. + + The exception to this is RGBA images. RGBA images use + :data:`FASTOCTREE` by default instead. :param kmeans: Integer :param palette: Quantize to the palette of given :py:class:`PIL.Image.Image`. From 0ff987917116d5b859959b1dc80092f7fdffac0f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 19:21:31 +1100 Subject: [PATCH 438/750] Document supported quantization methods for RGBA images --- docs/reference/Image.rst | 5 +++-- src/PIL/Image.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index bf173ace9..2f4c9af99 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -486,11 +486,12 @@ Used to specify the quantization method to use for the :meth:`~Image.quantize` m .. data:: MEDIANCUT - Median cut. Default method, except for RGBA images. + Median cut. Default method, except for RGBA images. This method does not support + RGBA images. .. data:: MAXCOVERAGE - Maximum coverage. + Maximum coverage. This method does not support RGBA images. .. data:: FASTOCTREE diff --git a/src/PIL/Image.py b/src/PIL/Image.py index bec6f3f64..0bfd1da80 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1062,8 +1062,9 @@ class Image: By default, :data:`MEDIANCUT` will be used. - The exception to this is RGBA images. RGBA images use - :data:`FASTOCTREE` by default instead. + The exception to this is RGBA images. :data:`MEDIANCUT` and + :data:`MAXCOVERAGE` do not support RGBA images, so + :data:`FASTOCTREE` is used by default instead. :param kmeans: Integer :param palette: Quantize to the palette of given :py:class:`PIL.Image.Image`. From 4e0bc3bab61124e5c8d29743d77541de052c44d8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 19:44:56 +1100 Subject: [PATCH 439/750] Use quantization method attributes --- src/PIL/Image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 2e7abfb68..5e9d9a89f 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1074,11 +1074,11 @@ class Image: if method is None: # defaults: - method = 0 + method = MEDIANCUT if self.mode == "RGBA": - method = 2 + method = FASTOCTREE - if self.mode == "RGBA" and method not in (2, 3): + if self.mode == "RGBA" and method not in (FASTOCTREE, LIBIMAGEQUANT): # Caller specified an invalid mode. raise ValueError( "Fast Octree (method == 2) and libimagequant (method == 3) " From b4e5a6d202037f9f96cf46371ca96e2743d6f24a Mon Sep 17 00:00:00 2001 From: elejke Date: Mon, 22 Mar 2021 12:06:44 +0300 Subject: [PATCH 440/750] add more tests for autocontrast preserve tone option --- Tests/test_imageops.py | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index b261fa9fe..922899e51 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -363,3 +363,51 @@ def test_auto_contrast_mask_real_input(): threshold=2, msg="autocontrast without mask pixel incorrect", ) + + +def test_autocontrast_preserve_gradient(): + from PIL import _imaging as core + + gradient = Image.Image()._new(core.linear_gradient("L")) + + # test with a grayscale gradient that extends to 0,255. + # Should be a noop. + out = ImageOps.autocontrast(gradient, cutoff=0, preserve_tone=True) + + assert_image_equal(gradient, out) + + # cutoff the top and bottom + # autocontrast should make the first and list histogram entries equal + # and should be 10% of the image pixels (+-, because integers) + out = ImageOps.autocontrast(gradient, cutoff=10, preserve_tone=True) + hist = out.histogram() + assert hist[0] == hist[-1] + assert hist[-1] == 256 * round(256 * 0.10) + + # in rgb + img = gradient.convert("RGB") + out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True) + assert_image_equal(img, out) + + +def test_autocontrast_preserve_onecolor(): + def _test_one_color(color): + img = Image.new("RGB", (10, 10), color) + + # single color images shouldn't change + out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True) + # remove when production + assert_image_equal(img, out) # single color, no cutoff + + # even if there is a cutoff + out = ImageOps.autocontrast( + img, cutoff=0, preserve_tone=True + ) # single color 10 cutoff + assert_image_equal(img, out) + + # succeeding + _test_one_color((255, 255, 255)) + _test_one_color((127, 255, 0)) + # failing + _test_one_color((127, 127, 127)) + _test_one_color((0, 0, 0)) From 25403063ead189d2335968a2097b20c3e425bd1a Mon Sep 17 00:00:00 2001 From: German Novikov Date: Mon, 22 Mar 2021 15:27:13 +0300 Subject: [PATCH 441/750] Update Tests/test_imageops.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_imageops.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 922899e51..f2479da16 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -366,9 +366,7 @@ def test_auto_contrast_mask_real_input(): def test_autocontrast_preserve_gradient(): - from PIL import _imaging as core - - gradient = Image.Image()._new(core.linear_gradient("L")) + gradient = Image.linear_gradient("L")) # test with a grayscale gradient that extends to 0,255. # Should be a noop. From f73d238cd2d10d5b576d0d7472ef8b62f9a4e1c2 Mon Sep 17 00:00:00 2001 From: elejke Date: Mon, 22 Mar 2021 15:30:43 +0300 Subject: [PATCH 442/750] removed redundant comments in tests for tone preserving autocolor --- Tests/test_imageops.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index f2479da16..973d45c15 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -366,7 +366,7 @@ def test_auto_contrast_mask_real_input(): def test_autocontrast_preserve_gradient(): - gradient = Image.linear_gradient("L")) + gradient = Image.linear_gradient("L") # test with a grayscale gradient that extends to 0,255. # Should be a noop. @@ -394,7 +394,6 @@ def test_autocontrast_preserve_onecolor(): # single color images shouldn't change out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True) - # remove when production assert_image_equal(img, out) # single color, no cutoff # even if there is a cutoff @@ -403,9 +402,7 @@ def test_autocontrast_preserve_onecolor(): ) # single color 10 cutoff assert_image_equal(img, out) - # succeeding _test_one_color((255, 255, 255)) _test_one_color((127, 255, 0)) - # failing _test_one_color((127, 127, 127)) _test_one_color((0, 0, 0)) From 35943372f08d7c4e344dd4b77db1547644af73ca Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Mar 2021 07:48:13 +1100 Subject: [PATCH 443/750] Removed CONVERT helper variables --- Tests/helper.py | 42 +++++++++++++++-------------------------- Tests/test_file_palm.py | 16 ++++++---------- 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 5573c78c4..ad8138ccc 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -257,16 +257,22 @@ def netpbm_available(): return bool(shutil.which("ppmquant") and shutil.which("ppmtogif")) -def convert_available(): - return imagemagick_available() or graphicsmagick_available() +def magick_command(): + if sys.platform == "win32": + imagemagick = os.environ.get("MAGICK_HOME", "") + if imagemagick: + imagemagick = [os.path.join(imagemagick, "convert.exe")] + graphicsmagick = [os.path.join(imagemagick, "gm.exe"), "convert"] + else: + graphicsmagick = None + else: + imagemagick = ["convert"] + graphicsmagick = ["gm", "convert"] - -def imagemagick_available(): - return bool(IMCONVERT and shutil.which(IMCONVERT[0])) - - -def graphicsmagick_available(): - return bool(GMCONVERT and shutil.which(GMCONVERT[0])) + if imagemagick and shutil.which(imagemagick[0]): + return imagemagick + elif graphicsmagick and shutil.which(graphicsmagick[0]): + return graphicsmagick def on_appveyor(): @@ -304,24 +310,6 @@ def is_mingw(): return sysconfig.get_platform() == "mingw" -if sys.platform == "win32": - IMCONVERT = os.environ.get("MAGICK_HOME", "") - GMCONVERT = None - if IMCONVERT: - IMCONVERT = [os.path.join(IMCONVERT, "convert.exe")] - GMCONVERT = [os.path.join(IMCONVERT, "gm.exe"), "convert"] -else: - IMCONVERT = ["convert"] - GMCONVERT = ["gm", "convert"] - -if imagemagick_available(): - CONVERT = IMCONVERT -elif graphicsmagick_available(): - CONVERT = GMCONVERT -else: - CONVERT = None - - class cached_property: def __init__(self, func): self.func = func diff --git a/Tests/test_file_palm.py b/Tests/test_file_palm.py index bbbab25d8..e1c1c361b 100644 --- a/Tests/test_file_palm.py +++ b/Tests/test_file_palm.py @@ -5,9 +5,7 @@ import pytest from PIL import Image -from .helper import CONVERT, assert_image_equal, convert_available, hopper - -_roundtrip = convert_available() +from .helper import assert_image_equal, hopper, magick_command def helper_save_as_palm(tmp_path, mode): @@ -23,13 +21,10 @@ def helper_save_as_palm(tmp_path, mode): assert os.path.getsize(outfile) > 0 -def open_with_convert(tmp_path, f): - if not convert_available(): - raise OSError() - +def open_with_magick(magick, tmp_path, f): outfile = str(tmp_path / "temp.png") rc = subprocess.call( - CONVERT + [f, outfile], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT + magick + [f, outfile], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT ) if rc: raise OSError @@ -37,14 +32,15 @@ def open_with_convert(tmp_path, f): def roundtrip(tmp_path, mode): - if not _roundtrip: + magick = magick_command() + if not magick: return im = hopper(mode) outfile = str(tmp_path / "temp.palm") im.save(outfile) - converted = open_with_convert(tmp_path, outfile) + converted = open_with_magick(magick, tmp_path, outfile) assert_image_equal(converted, im) From 52794432f02112eb7c912ef8855c6a6fe82a99d1 Mon Sep 17 00:00:00 2001 From: Latosha Maltba Date: Mon, 22 Mar 2021 18:17:40 +0000 Subject: [PATCH 444/750] Make code for ImageMagick/GraphicsMagick more symmetric --- Tests/helper.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index ad8138ccc..59ba0dd15 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -259,11 +259,12 @@ def netpbm_available(): def magick_command(): if sys.platform == "win32": - imagemagick = os.environ.get("MAGICK_HOME", "") - if imagemagick: - imagemagick = [os.path.join(imagemagick, "convert.exe")] - graphicsmagick = [os.path.join(imagemagick, "gm.exe"), "convert"] + magickhome = os.environ.get("MAGICK_HOME", "") + if magickhome: + imagemagick = [os.path.join(magickhome, "convert.exe")] + graphicsmagick = [os.path.join(magickhome, "gm.exe"), "convert"] else: + imagemagick = None graphicsmagick = None else: imagemagick = ["convert"] From d8acc3be0d9387b3c086f08693f6633d88ad481e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 23 Mar 2021 12:55:16 +1100 Subject: [PATCH 445/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index ec39c9fa8..79bb8079f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -465,9 +465,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 11.0 Big Sur | 3.8, 3.9 | 8.1.0 |arm | +| macOS 11.0 Big Sur | 3.8, 3.9 | 8.1.2 |arm | | +------------------------------+--------------------------------+-----------------------+ -| | 3.6, 3.7, 3.8, 3.9 | 8.1.0 |x86-64 | +| | 3.6, 3.7, 3.8, 3.9 | 8.1.2 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | | +------------------------------+--------------------------------+ + From 0f8fffbb11616ee3d9abd1379a2718c192871198 Mon Sep 17 00:00:00 2001 From: Latosha Maltba Date: Tue, 23 Mar 2021 07:16:56 +0000 Subject: [PATCH 446/750] Mention GraphicsMagick support release notes 8.2.0 Co-authored-by: Andrew Murray --- docs/releasenotes/8.2.0.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index d82bf45c2..83ba5b0c0 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -65,6 +65,18 @@ instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show if none of the other viewers are available. This means that the behaviour of :py:class:`PIL.ImageShow` will stay the same for most Pillow users. +ImageShow.GmDisplayViewer +^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GraphicsMagick is present, this new :py:class:`PIL.ImageShow.Viewer` subclass will +be registered. It uses GraphicsMagick_, an ImageMagick_ fork, to display images. + +The GraphicsMagick based viewer has a lower priority than its ImageMagick +counterpart. Thus, if both ImageMagick and GraphicsMagick are installed, +``im.show()`` and :py:func:`.ImageShow.show()` prefer the viewer based on +ImageMagick, i.e the behaviour stays the same for Pillow users having +ImageMagick installed. + Saving TIFF with ICC profile ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -86,3 +98,12 @@ PyQt6 Support has been added for PyQt6. If it is installed, it will be used instead of PySide6, PyQt5 or PySide2. + +GraphicsMagick +^^^^^^^^^^^^^^ + +The test suite can now be run on systems which have GraphicsMagick_ but not +ImageMagick_ installed. If both are installed, the tests prefer ImageMagick. + +.. _GraphicsMagick: http://www.graphicsmagick.org/ +.. _ImageMagick: https://imagemagick.org/ From 8913166c7ea748d6884813172208eac4cb057141 Mon Sep 17 00:00:00 2001 From: elejke Date: Tue, 23 Mar 2021 11:59:37 +0300 Subject: [PATCH 447/750] fix test function name for autocontrast --- Tests/test_imageops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 973d45c15..595a8e02b 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -337,7 +337,7 @@ def test_autocontrast_mask_toy_input(): assert ImageStat.Stat(result_nomask).median == [128] -def test_auto_contrast_mask_real_input(): +def test_autocontrast_mask_real_input(): # Test the autocontrast with a rectangular mask with Image.open("Tests/images/iptc.jpg") as img: From 4a0698838d08fb36bbbc8a90376e777e52c7d0ad Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 23 Mar 2021 20:08:18 +1100 Subject: [PATCH 448/750] Parametrized test --- Tests/test_imageops.py | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 595a8e02b..64736513e 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -388,21 +388,18 @@ def test_autocontrast_preserve_gradient(): assert_image_equal(img, out) -def test_autocontrast_preserve_onecolor(): - def _test_one_color(color): - img = Image.new("RGB", (10, 10), color) +@pytest.mark.parametrize( + "color", ((255, 255, 255), (127, 255, 0), (127, 127, 127), (0, 0, 0)) +) +def test_autocontrast_preserve_one_color(color): + img = Image.new("RGB", (10, 10), color) - # single color images shouldn't change - out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True) - assert_image_equal(img, out) # single color, no cutoff + # single color images shouldn't change + out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True) + assert_image_equal(img, out) # single color, no cutoff - # even if there is a cutoff - out = ImageOps.autocontrast( - img, cutoff=0, preserve_tone=True - ) # single color 10 cutoff - assert_image_equal(img, out) - - _test_one_color((255, 255, 255)) - _test_one_color((127, 255, 0)) - _test_one_color((127, 127, 127)) - _test_one_color((0, 0, 0)) + # even if there is a cutoff + out = ImageOps.autocontrast( + img, cutoff=0, preserve_tone=True + ) # single color 10 cutoff + assert_image_equal(img, out) From 694d70bdc3f6179178348c2c9a6da64944177442 Mon Sep 17 00:00:00 2001 From: elejke Date: Tue, 23 Mar 2021 13:09:51 +0300 Subject: [PATCH 449/750] fixed typos in test for autocolor tone preserving --- Tests/test_imageops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 64736513e..8d12f6869 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -400,6 +400,6 @@ def test_autocontrast_preserve_one_color(color): # even if there is a cutoff out = ImageOps.autocontrast( - img, cutoff=0, preserve_tone=True + img, cutoff=10, preserve_tone=True ) # single color 10 cutoff assert_image_equal(img, out) From 9b8f7c2a8ff1b7e7f33bf4f8c1badac9ea7cc0ac Mon Sep 17 00:00:00 2001 From: elejke Date: Tue, 23 Mar 2021 13:56:51 +0300 Subject: [PATCH 450/750] versionadded directive and releasenotes added --- docs/releasenotes/8.2.0.rst | 9 +++++++++ src/PIL/ImageOps.py | 3 +++ 2 files changed, 12 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index d82bf45c2..7a6caec5b 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -73,6 +73,15 @@ be specified through a keyword argument:: im.save("out.tif", icc_profile=...) + +ImageOps.autocontrast: tone preserving option +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default behaviour of the :py:meth:`~PIL.ImageOps.autocontrast` is to normalize separate +histograms for each color channel, it changes tone of the image. Added ``preserve_tone`` +argument which avoids changing the tone of the image using one luminance histogram for all +channels. + Security ======== diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index ac4a7c8f4..d0b255530 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -78,6 +78,9 @@ def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): within the mask. If no mask is given the entire image is used for histogram computation. :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. + + .. versionadded:: 1.1.5 + :return: An image. """ if preserve_tone: From 2c973b4cca9e07de84e9fbe99e07411337cdebbc Mon Sep 17 00:00:00 2001 From: elejke Date: Tue, 23 Mar 2021 13:57:51 +0300 Subject: [PATCH 451/750] versionadded version fixed --- src/PIL/ImageOps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index d0b255530..d69a304ca 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -79,7 +79,7 @@ def autocontrast(image, cutoff=0, ignore=None, mask=None, preserve_tone=False): for histogram computation. :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - .. versionadded:: 1.1.5 + .. versionadded:: 8.2.0 :return: An image. """ From 9d3da37f35426704776aef421b7e620d4b667e6e Mon Sep 17 00:00:00 2001 From: German Novikov Date: Tue, 23 Mar 2021 15:04:12 +0300 Subject: [PATCH 452/750] Update docs/releasenotes/8.2.0.rst [ci skip] Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/releasenotes/8.2.0.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 7a6caec5b..3bdfadacd 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -74,13 +74,13 @@ be specified through a keyword argument:: im.save("out.tif", icc_profile=...) -ImageOps.autocontrast: tone preserving option -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ImageOps.autocontrast: preserve_tone +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The default behaviour of the :py:meth:`~PIL.ImageOps.autocontrast` is to normalize separate -histograms for each color channel, it changes tone of the image. Added ``preserve_tone`` -argument which avoids changing the tone of the image using one luminance histogram for all -channels. +The default behaviour of the :py:meth:`~PIL.ImageOps.autocontrast` is to normalize +separate histograms for each color channel, changing the tone of the image. The new +``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram +for all channels. Security ======== From 49fa3656b180713dfa9b680e4b9a5885aba501bd Mon Sep 17 00:00:00 2001 From: nulano Date: Wed, 3 Mar 2021 13:58:13 +0100 Subject: [PATCH 453/750] do not premultiply alpha when resizing with Image.NEAREST resampling --- Tests/test_image_transform.py | 36 +++++++++++++++++++++++++++++++++++ src/PIL/Image.py | 6 +++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 3ee51178d..c22b874c6 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -143,6 +143,42 @@ class TestImageTransform: self._test_alpha_premult(op) + def _test_nearest(self, op, mode): + # create white image with half transparent, + # with the black half transparent. + # do op, + # the image should be white with half transparent + transparent, opaque = { + "RGBA": ((255, 255, 255, 0), (255, 255, 255, 255)), + "LA": ((255, 0), (255, 255)), + }[mode] + im = Image.new(mode, (10, 10), transparent) + im2 = Image.new(mode, (5, 10), opaque) + im.paste(im2, (0, 0)) + + im = op(im, (40, 10)) + + colors = im.getcolors() + assert colors == [ + (20 * 10, opaque), + (20 * 10, transparent), + ] + + @pytest.mark.parametrize("mode", ("RGBA", "LA")) + def test_nearest_resize(self, mode): + def op(im, sz): + return im.resize(sz, Image.NEAREST) + + self._test_nearest(op, mode) + + @pytest.mark.parametrize("mode", ("RGBA", "LA")) + def test_nearest_transform(self, mode): + def op(im, sz): + (w, h) = im.size + return im.transform(sz, Image.EXTENT, (0, 0, w, h), Image.NEAREST) + + self._test_nearest(op, mode) + def test_blank_fill(self): # attempting to hit # https://github.com/python-pillow/Pillow/issues/254 reported diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 2e7abfb68..6f7ed776f 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1910,7 +1910,7 @@ class Image: if self.mode in ("1", "P"): resample = NEAREST - if self.mode in ["LA", "RGBA"]: + if self.mode in ["LA", "RGBA"] and resample != NEAREST: im = self.convert(self.mode[:-1] + "a") im = im.resize(size, resample, box) return im.convert(self.mode) @@ -2394,14 +2394,14 @@ class Image: :returns: An :py:class:`~PIL.Image.Image` object. """ - if self.mode == "LA": + if self.mode == "LA" and resample != NEAREST: return ( self.convert("La") .transform(size, method, data, resample, fill, fillcolor) .convert("LA") ) - if self.mode == "RGBA": + if self.mode == "RGBA" and resample != NEAREST: return ( self.convert("RGBa") .transform(size, method, data, resample, fill, fillcolor) From e85bf540cf1da0ada4ef424bfb67c8f69c1b2352 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 23 Mar 2021 20:58:01 +0200 Subject: [PATCH 454/750] Contributing: Include release notes as needed or appropriate [CI skip] --- .github/CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 563fcda6a..35bd47be8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -18,6 +18,7 @@ Please send a pull request to the master branch. Please include [documentation]( - Provide tests for any newly added code. - Follow PEP 8. - When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on AppVeyor. +- Include [release notes](https://github.com/python-pillow/Pillow/tree/master/docs/releasenotes) as needed or appropriate with your bug fixes, feature additions and tests. ## Reporting Issues From f4deb4df308852585c7940f4a4c66a93149ef55b Mon Sep 17 00:00:00 2001 From: nulano Date: Sun, 30 Aug 2020 04:32:49 +0200 Subject: [PATCH 455/750] compile libtiff with cmake (cherry picked from commit 3f17d61fed513ac6bb569ac687c77db1564f056f) --- setup.py | 4 +- winbuild/build_prepare.py | 6 +- winbuild/tiff.opt | 220 -------------------------------------- 3 files changed, 4 insertions(+), 226 deletions(-) delete mode 100644 winbuild/tiff.opt diff --git a/setup.py b/setup.py index 10992779e..4f768d395 100755 --- a/setup.py +++ b/setup.py @@ -727,9 +727,7 @@ class pil_build_ext(build_ext): if feature.tiff: libs.append(feature.tiff) defs.append(("HAVE_LIBTIFF", None)) - # FIXME the following define should be detected automatically - # based on system libtiff, see #4237 - if PLATFORM_MINGW: + if sys.platform == "win32": defs.append(("USE_WIN32_FILEIO", None)) if feature.xcb: libs.append(feature.xcb) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index a20fef02b..102dfe175 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -145,9 +145,9 @@ deps = { "filename": "tiff-4.2.0.tar.gz", "dir": "tiff-4.2.0", "build": [ - cmd_copy(r"{winbuild_dir}\tiff.opt", "nmake.opt"), - cmd_nmake("makefile.vc", "clean"), - cmd_nmake("makefile.vc", "lib"), + cmd_cmake("-DBUILD_SHARED_LIBS:BOOL=OFF"), + cmd_nmake(target="clean"), + cmd_nmake(target="tiff"), ], "headers": [r"libtiff\tiff*.h"], "libs": [r"libtiff\*.lib"], diff --git a/winbuild/tiff.opt b/winbuild/tiff.opt deleted file mode 100644 index d82c51678..000000000 --- a/winbuild/tiff.opt +++ /dev/null @@ -1,220 +0,0 @@ -# $Id: nmake.opt,v 1.18 2006/06/07 16:33:45 dron Exp $ -# -# Copyright (C) 2004, Andrey Kiselev -# -# Permission to use, copy, modify, distribute, and sell this software and -# its documentation for any purpose is hereby granted without fee, provided -# that (i) the above copyright notices and this permission notice appear in -# all copies of the software and related documentation, and (ii) the names of -# Sam Leffler and Silicon Graphics may not be used in any advertising or -# publicity relating to the software without the specific, prior written -# permission of Sam Leffler and Silicon Graphics. -# -# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, -# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY -# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. -# -# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR -# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, -# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF -# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -# OF THIS SOFTWARE. - -# Compile time parameters for MS Visual C++ compiler. -# You may edit this file to specify building options. - -# -###### Edit the following lines to choose a feature set you need. ####### -# - -# -# Select WINMODE_CONSOLE to build a library which reports errors to stderr, or -# WINMODE_WINDOWED to build such that errors are reported via MessageBox(). -# -WINMODE_CONSOLE = 1 -#WINMODE_WINDOWED = 1 - -# -# Comment out the following lines to disable internal codecs. -# -# Support for CCITT Group 3 & 4 algorithms -CCITT_SUPPORT = 1 -# Support for Macintosh PackBits algorithm -PACKBITS_SUPPORT = 1 -# Support for LZW algorithm -LZW_SUPPORT = 1 -# Support for ThunderScan 4-bit RLE algorithm -THUNDER_SUPPORT = 1 -# Support for NeXT 2-bit RLE algorithm -NEXT_SUPPORT = 1 -# Support for LogLuv high dynamic range encoding -LOGLUV_SUPPORT = 1 - -# -# Uncomment and edit following lines to enable JPEG support. -# -JPEG_SUPPORT = 1 -JPEG_INCLUDE = -I$(INCLIB) -JPEG_LIB = $(INCLIB)/libjpeg.lib - -# -# Uncomment and edit following lines to enable ZIP support -# (required for Deflate compression and Pixar log-format) -# -ZIP_SUPPORT = 1 -ZLIB_INCLUDE = -I$(INCLIB) -ZLIB_LIB = $(INCLIB)/zlib.lib - -# Indicate if the compiler provides strtoll/strtoull (default 1) -# Users of MSVC++ 14.0 ("Visual Studio 2015") and later should set this to 1 -HAVE_STRTOLL = 1 - -# -# Uncomment and edit following lines to enable ISO JBIG support -# -#JBIG_SUPPORT = 1 -#JBIGDIR = d:/projects/jbigkit -#JBIG_INCLUDE = -I$(JBIGDIR)/libjbig -#JBIG_LIB = $(JBIGDIR)/libjbig/jbig.lib - -# -# Uncomment following line to enable Pixar log-format algorithm -# (Zlib required). -# -#PIXARLOG_SUPPORT = 1 - -# -# Comment out the following lines to disable strip chopping -# (whether or not to convert single-strip uncompressed images to multiple -# strips of specified size to reduce memory usage). Default strip size -# is 8192 bytes, it can be configured via the STRIP_SIZE_DEFAULT parameter -# -STRIPCHOP_SUPPORT = 1 -STRIP_SIZE_DEFAULT = 8192 - -# -# Comment out the following lines to disable treating the fourth sample with -# no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA -# files but don't mark the alpha properly. -# -EXTRASAMPLE_AS_ALPHA_SUPPORT = 1 - -# -# Comment out the following lines to disable picking up YCbCr subsampling -# info from the JPEG data stream to support files lacking the tag. -# See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling() for details. -# -CHECK_JPEG_YCBCR_SUBSAMPLING = 1 - -# -####################### Compiler related options. ####################### -# - -# -# Pick debug or optimized build flags. We default to an optimized build -# with no debugging information. -# NOTE: /EHsc option required if you want to build the C++ stream API -# -OPTFLAGS = /Ox /MD /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE -#OPTFLAGS = /Zi - -# -# Uncomment following line to enable using Windows Common RunTime Library -# instead of Windows specific system calls. See notes on top of tif_unix.c -# module for details. -# -USE_WIN_CRT_LIB = 1 - -# Compiler specific options. You may probably want to adjust compilation -# parameters in CFLAGS variable. Refer to your compiler documentation -# for the option reference. -# -MAKE = nmake /nologo -CC = cl /nologo -CXX = cl /nologo -AR = lib /nologo -LD = link /nologo - -CFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) -CXXFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) -EXTRAFLAGS = -LIBS = - -# Name of the output shared library -DLLNAME = libtiff.dll - -# -########### There is nothing to edit below this line normally. ########### -# - -# Set the native cpu bit order -EXTRAFLAGS = -DFILLODER_LSB2MSB $(EXTRAFLAGS) - -!IFDEF WINMODE_WINDOWED -EXTRAFLAGS = -DTIF_PLATFORM_WINDOWED $(EXTRAFLAGS) -LIBS = user32.lib $(LIBS) -!ELSE -EXTRAFLAGS = -DTIF_PLATFORM_CONSOLE $(EXTRAFLAGS) -!ENDIF - -# Codec stuff -!IFDEF CCITT_SUPPORT -EXTRAFLAGS = -DCCITT_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF PACKBITS_SUPPORT -EXTRAFLAGS = -DPACKBITS_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF LZW_SUPPORT -EXTRAFLAGS = -DLZW_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF THUNDER_SUPPORT -EXTRAFLAGS = -DTHUNDER_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF NEXT_SUPPORT -EXTRAFLAGS = -DNEXT_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF LOGLUV_SUPPORT -EXTRAFLAGS = -DLOGLUV_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF JPEG_SUPPORT -LIBS = $(LIBS) $(JPEG_LIB) -EXTRAFLAGS = -DJPEG_SUPPORT -DOJPEG_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF ZIP_SUPPORT -LIBS = $(LIBS) $(ZLIB_LIB) -EXTRAFLAGS = -DZIP_SUPPORT $(EXTRAFLAGS) -!IFDEF PIXARLOG_SUPPORT -EXTRAFLAGS = -DPIXARLOG_SUPPORT $(EXTRAFLAGS) -!ENDIF -!ENDIF - -!IFDEF JBIG_SUPPORT -LIBS = $(LIBS) $(JBIG_LIB) -EXTRAFLAGS = -DJBIG_SUPPORT $(EXTRAFLAGS) -!ENDIF - -!IFDEF STRIPCHOP_SUPPORT -EXTRAFLAGS = -DSTRIPCHOP_DEFAULT=TIFF_STRIPCHOP -DSTRIP_SIZE_DEFAULT=$(STRIP_SIZE_DEFAULT) $(EXTRAFLAGS) -!ENDIF - -!IFDEF EXTRASAMPLE_AS_ALPHA_SUPPORT -EXTRAFLAGS = -DDEFAULT_EXTRASAMPLE_AS_ALPHA $(EXTRAFLAGS) -!ENDIF - -!IFDEF CHECK_JPEG_YCBCR_SUBSAMPLING -EXTRAFLAGS = -DCHECK_JPEG_YCBCR_SUBSAMPLING $(EXTRAFLAGS) -!ENDIF - -!IFDEF USE_WIN_CRT_LIB -EXTRAFLAGS = -DAVOID_WIN32_FILEIO $(EXTRAFLAGS) -!ELSE -EXTRAFLAGS = -DUSE_WIN32_FILEIO $(EXTRAFLAGS) -!ENDIF From 1105c5d5c93ce2aa2693cc94ba31ebd27d8417cb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Mar 2021 00:40:12 +1100 Subject: [PATCH 456/750] Updated nasm to 2.15.05 (cherry picked from commit 6e31662a49cea6d4fac78534a9935354d75af229) --- .github/workflows/test-windows.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index d53daec13..2b15d6aea 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -68,8 +68,8 @@ jobs: - name: Install dependencies id: install run: | - 7z x winbuild\depends\nasm-2.14.02-win64.zip "-o$env:RUNNER_WORKSPACE\" - echo "$env:RUNNER_WORKSPACE\nasm-2.14.02" >> $env:GITHUB_PATH + 7z x winbuild\depends\nasm-2.15.05-win64.zip "-o$env:RUNNER_WORKSPACE\" + echo "$env:RUNNER_WORKSPACE\nasm-2.15.05" >> $env:GITHUB_PATH winbuild\depends\gs9533w32.exe /S echo "C:\Program Files (x86)\gs\gs9.53.3\bin" >> $env:GITHUB_PATH From 5e61c1842fcee02562cbb46dd44e8bdd39e3903f Mon Sep 17 00:00:00 2001 From: nulano Date: Thu, 25 Mar 2021 00:04:41 +0100 Subject: [PATCH 457/750] fix support for old versions of Raqm --- src/_imagingft.c | 61 ++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 41 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 0995abab3..330294479 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -236,7 +236,6 @@ text_layout_raqm( size_t i = 0, count = 0, start = 0; raqm_t *rq; raqm_glyph_t *glyphs = NULL; -// raqm_glyph_t_01 *glyphs_01 = NULL; raqm_direction_t direction; rq = raqm_create(); @@ -278,12 +277,12 @@ text_layout_raqm( direction = RAQM_DIRECTION_LTR; } else if (strcmp(dir, "ttb") == 0) { direction = RAQM_DIRECTION_TTB; -// if (p_raqm.version_atleast == NULL || !(*p_raqm.version_atleast)(0, 7, 0)) { -// PyErr_SetString( -// PyExc_ValueError, -// "libraqm 0.7 or greater required for 'ttb' direction"); -// goto failed; -// } +#if !defined(RAQM_VERSION_ATLEAST) || !RAQM_VERSION_ATLEAST(0, 7, 0) + PyErr_SetString( + PyExc_ValueError, + "libraqm 0.7 or greater required for 'ttb' direction"); + goto failed; +#endif } else { PyErr_SetString( PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); @@ -340,21 +339,12 @@ text_layout_raqm( goto failed; } -// if (p_raqm.version == 1) { -// glyphs_01 = raqm_get_glyphs_01(rq, &count); -// if (glyphs_01 == NULL) { -// PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); -// count = 0; -// goto failed; -// } -// } else { /* version == 2 */ - glyphs = raqm_get_glyphs(rq, &count); - if (glyphs == NULL) { - PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); - count = 0; - goto failed; - } -// } + glyphs = raqm_get_glyphs(rq, &count); + if (glyphs == NULL) { + PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); + count = 0; + goto failed; + } (*glyph_info) = PyMem_New(GlyphInfo, count); if ((*glyph_info) == NULL) { @@ -363,25 +353,14 @@ text_layout_raqm( goto failed; } -// if (p_raqm.version == 1) { -// for (i = 0; i < count; i++) { -// (*glyph_info)[i].index = glyphs_01[i].index; -// (*glyph_info)[i].x_offset = glyphs_01[i].x_offset; -// (*glyph_info)[i].x_advance = glyphs_01[i].x_advance; -// (*glyph_info)[i].y_offset = glyphs_01[i].y_offset; -// (*glyph_info)[i].y_advance = glyphs_01[i].y_advance; -// (*glyph_info)[i].cluster = glyphs_01[i].cluster; -// } -// } else { - for (i = 0; i < count; i++) { - (*glyph_info)[i].index = glyphs[i].index; - (*glyph_info)[i].x_offset = glyphs[i].x_offset; - (*glyph_info)[i].x_advance = glyphs[i].x_advance; - (*glyph_info)[i].y_offset = glyphs[i].y_offset; - (*glyph_info)[i].y_advance = glyphs[i].y_advance; - (*glyph_info)[i].cluster = glyphs[i].cluster; - } -// } + for (i = 0; i < count; i++) { + (*glyph_info)[i].index = glyphs[i].index; + (*glyph_info)[i].x_offset = glyphs[i].x_offset; + (*glyph_info)[i].x_advance = glyphs[i].x_advance; + (*glyph_info)[i].y_offset = glyphs[i].y_offset; + (*glyph_info)[i].y_advance = glyphs[i].y_advance; + (*glyph_info)[i].cluster = glyphs[i].cluster; + } failed: raqm_destroy(rq); From c718cc6c94cacfbfcd7e84cff9f012df1b84c718 Mon Sep 17 00:00:00 2001 From: nulano Date: Thu, 25 Mar 2021 00:25:38 +0100 Subject: [PATCH 458/750] avoid unused variable warnings --- src/_imagingft.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 330294479..73f0f6362 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -1367,7 +1367,6 @@ setup_module(PyObject *m) { PyDict_SetItemString(d, "HAVE_FRIBIDI", v); PyDict_SetItemString(d, "HAVE_HARFBUZZ", v); if (have_raqm) { - const char *a, *b; #ifdef RAQM_VERSION_MAJOR v = PyUnicode_FromString(raqm_version_string()); #else @@ -1376,12 +1375,14 @@ setup_module(PyObject *m) { PyDict_SetItemString(d, "raqm_version", v); #ifdef FRIBIDI_MAJOR_VERSION - a = strchr(fribidi_version_info, ')'); - b = strchr(fribidi_version_info, '\n'); - if (a && b) { - v = PyUnicode_FromStringAndSize(a + 2, b - a - 2); - } else { - v = Py_None; + { + const char *a = strchr(fribidi_version_info, ')'); + const char *b = strchr(fribidi_version_info, '\n'); + if (a && b && a + 2 < b) { + v = PyUnicode_FromStringAndSize(a + 2, b - (a + 2)); + } else { + v = Py_None; + } } #else v = Py_None; From 4b1dd40b5aa42af3f5fcf65856cb7bafae1cf256 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Mar 2021 11:57:48 +1100 Subject: [PATCH 459/750] Listed Debian packages [ci skip] --- docs/installation.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 79bb8079f..95d87feb7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -88,9 +88,10 @@ libraqm, fribidi, and harfbuzz to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow -Most major Linux distributions, including Fedora, Debian/Ubuntu and -ArchLinux also include Pillow in packages that previously contained -PIL e.g. ``python-imaging``. +Most major Linux distributions, including Fedora, Ubuntu and ArchLinux +also include Pillow in packages that previously contained PIL e.g. +``python-imaging``. Debian splits it into two packages, ``python3-pil`` +and ``python3-pil.imagetk``. FreeBSD Installation ^^^^^^^^^^^^^^^^^^^^ From 4c36945206272a29958716d0cef5fbf6e3a0b56a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Mar 2021 22:43:46 +1100 Subject: [PATCH 460/750] Added prerequisites and Python development libraries for Alpine --- docs/installation.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 79bb8079f..bc34f1d01 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -366,6 +366,10 @@ In Fedora, the command is:: sudo dnf install python3-devel redhat-rpm-config +In Alpine, the command is:: + + sudo apk add python3-dev py3-setuptools + .. Note:: ``redhat-rpm-config`` is required on Fedora 23, but not earlier versions. Prerequisites for **Ubuntu 16.04 LTS - 20.04 LTS** are installed with:: @@ -385,6 +389,12 @@ Prerequisites are installed on recent **Red Hat**, **CentOS** or **Fedora** with Note that the package manager may be yum or DNF, depending on the exact distribution. +Prerequisites are installed for **Alpine** with:: + + sudo apk add tiff-dev jpeg-dev openjpeg-dev zlib-dev freetype-dev lcms2-dev \ + libwebp-dev tcl-dev tk-dev harfbuzz-dev fribidi-dev libimagequant-dev \ + libxcb-dev libpng-dev + See also the ``Dockerfile``\s in the Test Infrastructure repo (https://github.com/python-pillow/docker-images) for a known working install process for other tested distros. From 977e64fb6150b04fcbe2ae29eadd893df443f9c9 Mon Sep 17 00:00:00 2001 From: German Novikov Date: Thu, 25 Mar 2021 14:56:30 +0300 Subject: [PATCH 461/750] Update Tests/test_imageops.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_imageops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 8d12f6869..986c5f887 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -376,7 +376,7 @@ def test_autocontrast_preserve_gradient(): # cutoff the top and bottom # autocontrast should make the first and list histogram entries equal - # and should be 10% of the image pixels (+-, because integers) + # and, with rounding, should be 10% of the image pixels out = ImageOps.autocontrast(gradient, cutoff=10, preserve_tone=True) hist = out.histogram() assert hist[0] == hist[-1] From 0acf3514a1d5c9ca669a81c86d69d5102e44cfbe Mon Sep 17 00:00:00 2001 From: Ray Gardner Date: Mon, 22 Feb 2021 16:25:00 -0700 Subject: [PATCH 462/750] Modify GifEncode.c and Gif.h to use LZW encoding --- src/libImaging/Gif.h | 39 ++- src/libImaging/GifEncode.c | 554 +++++++++++++++++++------------------ 2 files changed, 308 insertions(+), 285 deletions(-) diff --git a/src/libImaging/Gif.h b/src/libImaging/Gif.h index a85ce2b6e..4029bbfe5 100644 --- a/src/libImaging/Gif.h +++ b/src/libImaging/Gif.h @@ -9,10 +9,10 @@ /* Max size for a LZW code word. */ -#define GIFBITS 12 +#define GIFBITS 12 -#define GIFTABLE (1 << GIFBITS) -#define GIFBUFFER (1 << GIFBITS) +#define GIFTABLE (1<block || context->block->size == 255) { - GIFENCODERBLOCK *block; +/* Values of entry_state */ +enum { LZW_INITIAL, LZW_TRY_IN1, LZW_TRY_IN2, LZW_TRY_OUT1, LZW_TRY_OUT2, + LZW_FINISHED }; - /* no room in the current block (or no current block); - allocate a new one */ +/* Values of control_state */ +enum { PUT_HEAD, PUT_INIT_CLEAR, PUT_CLEAR, PUT_LAST_HEAD, PUT_END }; - /* add current block to end of flush queue */ - if (context->block) { - block = context->flush; - while (block && block->next) { - block = block->next; - } - if (block) { - block->next = context->block; - } else { - context->flush = context->block; - } - } - - /* get a new block */ - if (context->free) { - block = context->free; - context->free = NULL; - } else { - /* malloc check ok, small constant allocation */ - block = malloc(sizeof(GIFENCODERBLOCK)); - if (!block) { - return 0; - } - } - - block->size = 0; - block->next = NULL; - - context->block = block; - } - - /* write new byte to block */ - context->block->data[context->block->size++] = byte; - - return 1; +static void glzwe_reset(GIFENCODERSTATE *st) { + st->next_code = st->end_code + 1; + st->max_code = 2 * st->clear_code - 1; + st->code_width = st->bits + 1; + memset(st->codes, 0, sizeof(st->codes)); } -/* write a code word to the current block. this is a macro to make - sure it's inlined on all platforms */ +static void glzwe_init(GIFENCODERSTATE *st) { + st->clear_code = 1 << st->bits; + st->end_code = st->clear_code + 1; + glzwe_reset(st); + st->entry_state = LZW_INITIAL; + st->buf_bits_left = 8; + st->code_buffer = 0; +} -#define EMIT(code) \ - { \ - context->bitbuffer |= ((INT32)(code)) << context->bitcount; \ - context->bitcount += 9; \ - while (context->bitcount >= 8) { \ - if (!emit(context, (UINT8)context->bitbuffer)) { \ - state->errcode = IMAGING_CODEC_MEMORY; \ - return 0; \ - } \ - context->bitbuffer >>= 8; \ - context->bitcount -= 8; \ - } \ - } - -/* write a run. we use a combination of literals and combinations of - literals. this can give quite decent compression for images with - long stretches of identical pixels. but remember: if you want - really good compression, use another file format. */ - -#define EMIT_RUN(label) \ - { \ - label: \ - while (context->count > 0) { \ - int run = 2; \ - EMIT(context->last); \ - context->count--; \ - if (state->count++ == LAST_CODE) { \ - EMIT(CLEAR_CODE); \ - state->count = FIRST_CODE; \ - goto label; \ - } \ - while (context->count >= run) { \ - EMIT(state->count - 1); \ - context->count -= run; \ - run++; \ - if (state->count++ == LAST_CODE) { \ - EMIT(CLEAR_CODE); \ - state->count = FIRST_CODE; \ - goto label; \ - } \ - } \ - if (context->count > 1) { \ - EMIT(state->count - 1 - (run - context->count)); \ - context->count = 0; \ - if (state->count++ == LAST_CODE) { \ - EMIT(CLEAR_CODE); \ - state->count = FIRST_CODE; \ - } \ - break; \ - } \ - } \ +static int glzwe(GIFENCODERSTATE *st, const UINT8 *in_ptr, UINT8 *out_ptr, + UINT32 *in_avail, UINT32 *out_avail, + UINT32 end_of_data) { + switch (st->entry_state) { + + case LZW_TRY_IN1: +get_first_byte: + if (!*in_avail) { + if (end_of_data) { + goto end_of_data; + } + st->entry_state = LZW_TRY_IN1; + return GLZW_NO_INPUT_AVAIL; + } + st->head = *in_ptr++; + (*in_avail)--; + + case LZW_TRY_IN2: +encode_loop: + if (!*in_avail) { + if (end_of_data) { + st->code = st->head; + st->put_state = PUT_LAST_HEAD; + goto put_code; + } + st->entry_state = LZW_TRY_IN2; + return GLZW_NO_INPUT_AVAIL; + } + st->tail = *in_ptr++; + (*in_avail)--; + + /* Knuth TAOCP vol 3 sec. 6.4 algorithm D. */ + /* Hash found experimentally to be pretty good. */ + /* This works ONLY with TABLE_SIZE a power of 2. */ + st->probe = ((st->head ^ (st->tail << 6)) * 31) & (TABLE_SIZE - 1); + while (st->codes[st->probe]) { + if ((st->codes[st->probe] & 0xFFFFF) == + ((st->head << 8) | st->tail)) { + st->head = st->codes[st->probe] >> 20; + goto encode_loop; + } else { + /* Reprobe decrement must be nonzero and relatively prime to table + * size. So, any odd positive number for power-of-2 size. */ + if ((st->probe -= ((st->tail << 2) | 1)) < 0) { + st->probe += TABLE_SIZE; + } + } + } + /* Key not found, probe is at empty slot. */ + st->code = st->head; + st->put_state = PUT_HEAD; + goto put_code; +insert_code_or_clear: /* jump here after put_code */ + if (st->next_code < CODE_LIMIT) { + st->codes[st->probe] = (st->next_code << 20) | + (st->head << 8) | st->tail; + if (st->next_code > st->max_code) { + st->max_code = st->max_code * 2 + 1; + st->code_width++; + } + st->next_code++; + } else { + st->code = st->clear_code; + st->put_state = PUT_CLEAR; + goto put_code; +reset_after_clear: /* jump here after put_code */ + glzwe_reset(st); + } + st->head = st->tail; + goto encode_loop; + + case LZW_INITIAL: + glzwe_reset(st); + st->code = st->clear_code; + st->put_state = PUT_INIT_CLEAR; +put_code: + st->code_bits_left = st->code_width; +check_buf_bits: + if (!st->buf_bits_left) { /* out buffer full */ + + case LZW_TRY_OUT1: + if (!*out_avail) { + st->entry_state = LZW_TRY_OUT1; + return GLZW_NO_OUTPUT_AVAIL; + } + *out_ptr++ = st->code_buffer; + (*out_avail)--; + st->code_buffer = 0; + st->buf_bits_left = 8; + } + /* code bits to pack */ + UINT32 n = st->buf_bits_left < st->code_bits_left + ? st->buf_bits_left : st->code_bits_left; + st->code_buffer |= + (st->code & ((1 << n) - 1)) << (8 - st->buf_bits_left); + st->code >>= n; + st->buf_bits_left -= n; + st->code_bits_left -= n; + if (st->code_bits_left) + goto check_buf_bits; + switch (st->put_state) { + case PUT_INIT_CLEAR: + goto get_first_byte; + case PUT_HEAD: + goto insert_code_or_clear; + case PUT_CLEAR: + goto reset_after_clear; + case PUT_LAST_HEAD: + goto end_of_data; + case PUT_END: + goto flush_code_buffer; + default: + return GLZW_INTERNAL_ERROR; + } + +end_of_data: + st->code = st->end_code; + st->put_state = PUT_END; + goto put_code; +flush_code_buffer: /* jump here after put_code */ + if (st->buf_bits_left < 8) { + + case LZW_TRY_OUT2: + if (!*out_avail) { + st->entry_state = LZW_TRY_OUT2; + return GLZW_NO_OUTPUT_AVAIL; + } + *out_ptr++ = st->code_buffer; + (*out_avail)--; + } + st->entry_state = LZW_FINISHED; + return GLZW_OK; + + case LZW_FINISHED: + return GLZW_OK; + + default: + return GLZW_INTERNAL_ERROR; } +} +/* -END- GIF LZW encoder. */ int -ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { - UINT8 *ptr; - int this; +ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) { + UINT8* ptr; + UINT8* sub_block_ptr; + UINT8* sub_block_limit; + UINT8* buf_limit; + GIFENCODERSTATE *context = (GIFENCODERSTATE*) state->context; + int r; - GIFENCODERBLOCK *block; - GIFENCODERSTATE *context = (GIFENCODERSTATE *)state->context; + UINT32 in_avail, in_used; + UINT32 out_avail, out_used; - if (!state->state) { - /* place a clear code in the output buffer */ - context->bitbuffer = CLEAR_CODE; - context->bitcount = 9; - - state->count = FIRST_CODE; + if (state->state == INIT) { + state->state = ENCODE; + glzwe_init(context); if (context->interlace) { context->interlace = 1; @@ -159,166 +223,132 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { context->step = 1; } - context->last = -1; - + /* Need at least 2 bytes for data sub-block; 5 for empty image */ + if (bytes < 5) { + state->errcode = IMAGING_CODEC_CONFIG; + return 0; + } /* sanity check */ if (state->xsize <= 0 || state->ysize <= 0) { - state->state = ENCODE_EOF; + /* Is this better than an error return? */ + /* This will handle any legal "LZW Minimum Code Size" */ + memset(buf, 0, 5); + in_avail = 0; + out_avail = 5; + r = glzwe(context, (const UINT8 *)"", buf + 1, &in_avail, &out_avail, 1); + if (r == GLZW_OK) { + r = 5 - out_avail; + if (r < 1 || r > 3) { + state->errcode = IMAGING_CODEC_BROKEN; + return 0; + } + buf[0] = r; + state->errcode = IMAGING_CODEC_END; + return r + 2; + } else { + /* Should not be possible unless something external to this + * routine messes with our state data */ + state->errcode = IMAGING_CODEC_BROKEN; + return 0; + } } + /* Init state->x to make if() below true the first time through. */ + state->x = state->xsize; } - ptr = buf; + buf_limit = buf + bytes; + sub_block_limit = sub_block_ptr = ptr = buf; + /* On entry, buf is output buffer, bytes is space available in buf. + * Loop here getting input until buf is full or image is all encoded. */ for (;;) { - switch (state->state) { - case INIT: - case ENCODE: + /* Set up sub-block ptr and limit. sub_block_ptr stays at beginning + * of sub-block until it is full. ptr will advance when any data is + * placed in buf. + */ + if (ptr >= sub_block_limit) { + if (buf_limit - ptr < 2) { /* Need at least 2 for data sub-block */ + return ptr - buf; + } + sub_block_ptr = ptr; + sub_block_limit = sub_block_ptr + + (256 < buf_limit - sub_block_ptr ? + 256 : buf_limit - sub_block_ptr); + *ptr++ = 0; + } - /* identify and store a run of pixels */ + /* Get next row of pixels. */ + /* This if() originally tested state->x==0 for the first time through. + * This no longer works, as the loop will not advance state->x if + * glzwe() does not consume any input; this would advance the row + * spuriously. Now pre-init state->x above for first time, and avoid + * entering if() when state->state is FINISH, or it will loop + * infinitely. + */ + if (state->x >= state->xsize && state->state == ENCODE) { + if (!context->interlace && state->y >= state->ysize) { + state->state = FINISH; + continue; + } - if (state->x == 0 || state->x >= state->xsize) { - if (!context->interlace && state->y >= state->ysize) { - state->state = ENCODE_EOF; + /* get another line of data */ + state->shuffle( + state->buffer, + (UINT8*) im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, state->xsize + ); + state->x = 0; + + /* step forward, according to the interlace settings */ + state->y += context->step; + while (context->interlace && state->y >= state->ysize) { + switch (context->interlace) { + case 1: + state->y = 4; + context->interlace = 2; break; - } - - if (context->flush) { - state->state = FLUSH; + case 2: + context->step = 4; + state->y = 2; + context->interlace = 3; break; - } - - /* get another line of data */ - state->shuffle( - state->buffer, - (UINT8 *)im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, - state->xsize); - - state->x = 0; - - if (state->state == INIT) { - /* preload the run-length buffer and get going */ - context->last = state->buffer[0]; - context->count = state->x = 1; - state->state = ENCODE; - } - - /* step forward, according to the interlace settings */ - state->y += context->step; - while (context->interlace && state->y >= state->ysize) - switch (context->interlace) { - case 1: - state->y = 4; - context->interlace = 2; - break; - case 2: - context->step = 4; - state->y = 2; - context->interlace = 3; - break; - case 3: - context->step = 2; - state->y = 1; - context->interlace = 0; - break; - default: - /* just make sure we don't loop forever */ - context->interlace = 0; - } - } - /* Potential special case for xsize==1 */ - if (state->x < state->xsize) { - this = state->buffer[state->x++]; - } else { - EMIT_RUN(label0); - break; + case 3: + context->step = 2; + state->y = 1; + context->interlace = 0; + break; + default: + /* just make sure we don't loop forever */ + context->interlace = 0; } + } + } - if (this == context->last) { - context->count++; - } else { - EMIT_RUN(label1); - context->last = this; - context->count = 1; - } - break; + in_avail = state->xsize - state->x; /* bytes left in line */ + out_avail = sub_block_limit - ptr; /* bytes left in sub-block */ + r = glzwe(context, &state->buffer[state->x], ptr, &in_avail, + &out_avail, state->state == FINISH); + out_used = sub_block_limit - ptr - out_avail; + *sub_block_ptr += out_used; + ptr += out_used; + in_used = state->xsize - state->x - in_avail; + state->x += in_used; - case ENCODE_EOF: - - /* write the final run */ - EMIT_RUN(label2); - - /* write an end of image marker */ - EMIT(EOF_CODE); - - /* empty the bit buffer */ - while (context->bitcount > 0) { - if (!emit(context, (UINT8)context->bitbuffer)) { - state->errcode = IMAGING_CODEC_MEMORY; - return 0; - } - context->bitbuffer >>= 8; - context->bitcount -= 8; - } - - /* flush the last block, and exit */ - if (context->block) { - GIFENCODERBLOCK *block; - block = context->flush; - while (block && block->next) { - block = block->next; - } - if (block) { - block->next = context->block; - } else { - context->flush = context->block; - } - context->block = NULL; - } - - state->state = EXIT; - - /* fall through... */ - - case EXIT: - case FLUSH: - - while (context->flush) { - /* get a block from the flush queue */ - block = context->flush; - - if (block->size > 0) { - /* make sure it fits into the output buffer */ - if (bytes < block->size + 1) { - return ptr - buf; - } - - ptr[0] = block->size; - memcpy(ptr + 1, block->data, block->size); - - ptr += block->size + 1; - bytes -= block->size + 1; - } - - context->flush = block->next; - - if (context->free) { - free(context->free); - } - context->free = block; - } - - if (state->state == EXIT) { - /* this was the last block! */ - if (context->free) { - free(context->free); - } - state->errcode = IMAGING_CODEC_END; - return ptr - buf; - } - - state->state = ENCODE; - break; + if (r == GLZW_OK) { + /* Should not be possible when end-of-data flag is false. */ + state->errcode = IMAGING_CODEC_END; + return ptr - buf; + } else if (r == GLZW_NO_INPUT_AVAIL) { + /* Used all the input line; get another line */ + continue; + } else if (r == GLZW_NO_OUTPUT_AVAIL) { + /* subblock is full */ + continue; + } else { + /* Should not be possible unless something external to this + * routine messes with our state data */ + state->errcode = IMAGING_CODEC_BROKEN; + return 0; } } } From 5390786c6546449d4c5ff8e8b8a6709f10016f20 Mon Sep 17 00:00:00 2001 From: Ray Gardner Date: Thu, 25 Mar 2021 16:46:55 -0600 Subject: [PATCH 463/750] Add braces to if -- conform with Pillow style. --- src/libImaging/GifEncode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index 8dec30f40..0ac9dc605 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -156,8 +156,9 @@ check_buf_bits: st->code >>= n; st->buf_bits_left -= n; st->code_bits_left -= n; - if (st->code_bits_left) + if (st->code_bits_left) { goto check_buf_bits; + } switch (st->put_state) { case PUT_INIT_CLEAR: goto get_first_byte; From 7c48f122077671b64ff998595d9c1f3ea8ad1852 Mon Sep 17 00:00:00 2001 From: nulano Date: Fri, 26 Mar 2021 02:54:11 +0100 Subject: [PATCH 464/750] add explanatory comment for USE_WIN32_FILEIO --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index 4f768d395..66bab7ecb 100755 --- a/setup.py +++ b/setup.py @@ -728,6 +728,10 @@ class pil_build_ext(build_ext): libs.append(feature.tiff) defs.append(("HAVE_LIBTIFF", None)) if sys.platform == "win32": + # This define needs to be defined if-and-only-if it was defined + # when compiling LibTIFF. LibTIFF doesn't expose it in `tiffconf.h`, + # so we have to guess; by default it is defined in all Windows builds. + # See #4237, #5243, #5359 for more information. defs.append(("USE_WIN32_FILEIO", None)) if feature.xcb: libs.append(feature.xcb) From 9872d57e3baa0659482bee143e7029f358cd6746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondrej=20Baranovi=C4=8D?= Date: Sat, 27 Mar 2021 02:06:36 +0100 Subject: [PATCH 465/750] corrected comment --- Tests/test_image_transform.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index c22b874c6..845900267 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -145,9 +145,8 @@ class TestImageTransform: def _test_nearest(self, op, mode): # create white image with half transparent, - # with the black half transparent. # do op, - # the image should be white with half transparent + # the image should remain white with half transparent transparent, opaque = { "RGBA": ((255, 255, 255, 0), (255, 255, 255, 255)), "LA": ((255, 0), (255, 255)), From a4a38b805b524f0fdb0d1feca83ca73d3ccfff0b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 27 Mar 2021 14:47:11 +1100 Subject: [PATCH 466/750] Removed return value of build_distance_tables --- src/libImaging/Quant.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index bee5e5599..f5a5d567c 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -789,7 +789,7 @@ resort_distance_tables( return 1; } -static int +static void build_distance_tables( uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) { uint32_t i, j; @@ -811,7 +811,6 @@ build_distance_tables( sizeof(uint32_t *), _sort_ulong_ptr_keys); } - return 1; } static int @@ -1373,9 +1372,7 @@ quantize( goto error_6; } - if (!build_distance_tables(avgDist, avgDistSortKey, p, nPaletteEntries)) { - goto error_7; - } + build_distance_tables(avgDist, avgDistSortKey, p, nPaletteEntries); if (!map_image_pixels_from_median_box( pixelData, nPixels, p, nPaletteEntries, h, avgDist, avgDistSortKey, qp)) { @@ -1580,9 +1577,7 @@ quantize2( goto error_3; } - if (!build_distance_tables(avgDist, avgDistSortKey, p, nQuantPixels)) { - goto error_4; - } + build_distance_tables(avgDist, avgDistSortKey, p, nQuantPixels); if (!map_image_pixels( pixelData, nPixels, p, nQuantPixels, avgDist, avgDistSortKey, qp)) { From 71cd97a5199bc54d492150fdd7f6ad216f381e70 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 28 Mar 2021 15:51:28 +1100 Subject: [PATCH 467/750] Added deprecation warnings --- Tests/test_image.py | 15 +++++++++++++++ src/PIL/Image.py | 35 ++++++++++++++++++++++++++++------- src/PIL/MicImagePlugin.py | 2 +- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index b326ca0f8..3fa071be1 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1,6 +1,7 @@ import io import os import shutil +import sys import tempfile import pytest @@ -769,6 +770,20 @@ class TestImage: reloaded_exif.load(exif.tobytes()) assert reloaded_exif.get_ifd(0x8769) == exif.get_ifd(0x8769) + @pytest.mark.skipif( + sys.version_info < (3, 7), reason="Python 3.7 or greater required" + ) + def test_categories_deprecation(self): + with pytest.warns(DeprecationWarning): + assert hopper().category == 0 + + with pytest.warns(DeprecationWarning): + assert Image.NORMAL == 0 + with pytest.warns(DeprecationWarning): + assert Image.SEQUENCE == 1 + with pytest.warns(DeprecationWarning): + assert Image.CONTAINER == 2 + @pytest.mark.parametrize( "test_module", [PIL, Image], diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 2e7abfb68..6f0fd1383 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -59,6 +59,16 @@ if sys.version_info >= (3, 7): if name == "PILLOW_VERSION": _raise_version_warning() return __version__ + else: + categories = {"NORMAL": 0, "SEQUENCE": 1, "CONTAINER": 2} + if name in categories: + warnings.warn( + "Image categories are deprecated and will be removed in Pillow 10 " + "(2023-01-02). Use is_animated instead.", + DeprecationWarning, + stacklevel=2, + ) + return categories[name] raise AttributeError(f"module '{__name__}' has no attribute '{name}'") @@ -69,6 +79,11 @@ else: # Silence warning assert PILLOW_VERSION + # categories + NORMAL = 0 + SEQUENCE = 1 + CONTAINER = 2 + logger = logging.getLogger(__name__) @@ -187,11 +202,6 @@ MAXCOVERAGE = 1 FASTOCTREE = 2 LIBIMAGEQUANT = 3 -# categories -NORMAL = 0 -SEQUENCE = 1 -CONTAINER = 2 - if hasattr(core, "DEFAULT_STRATEGY"): DEFAULT_STRATEGY = core.DEFAULT_STRATEGY FILTERED = core.FILTERED @@ -535,11 +545,22 @@ class Image: self._size = (0, 0) self.palette = None self.info = {} - self.category = NORMAL + self._category = 0 self.readonly = 0 self.pyaccess = None self._exif = None + def __getattr__(self, name): + if name == "category": + warnings.warn( + "Image categories are deprecated and will be removed in Pillow 10 " + "(2023-01-02). Use is_animated instead.", + DeprecationWarning, + stacklevel=2, + ) + return self._category + raise AttributeError(name) + @property def width(self): return self.size[0] @@ -648,7 +669,7 @@ class Image: and self.mode == other.mode and self.size == other.size and self.info == other.info - and self.category == other.category + and self._category == other._category and self.readonly == other.readonly and self.getpalette() == other.getpalette() and self.tobytes() == other.tobytes() diff --git a/src/PIL/MicImagePlugin.py b/src/PIL/MicImagePlugin.py index 2aed26030..9248b1b65 100644 --- a/src/PIL/MicImagePlugin.py +++ b/src/PIL/MicImagePlugin.py @@ -68,7 +68,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): self.is_animated = self._n_frames > 1 if len(self.images) > 1: - self.category = Image.CONTAINER + self._category = Image.CONTAINER self.seek(0) From fa6fed92cb8ca664a898e37f8df8188c363c4812 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 28 Mar 2021 16:10:34 +1100 Subject: [PATCH 468/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 21eeb214c..dba9d263a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Do not premultiply alpha when resizing with Image.NEAREST resampling #5304 + [nulano] + +- Dynamically link FriBiDi instead of Raqm #5062 + [nulano] + - Allow fewer PNG palette entries than the bit depth maximum when saving #5330 [radarhere] From bf8cebc96d8210d10394eb29728b1953def34f75 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 28 Mar 2021 13:49:37 +0200 Subject: [PATCH 469/750] Add libxcb to fuzzers --- Tests/oss-fuzz/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/oss-fuzz/build.sh b/Tests/oss-fuzz/build.sh index fc54ee3ee..513136fff 100755 --- a/Tests/oss-fuzz/build.sh +++ b/Tests/oss-fuzz/build.sh @@ -31,6 +31,7 @@ for fuzzer in $(find $SRC -name 'fuzz_*.py'); do --add-binary /usr/local/lib/libwebp.so.7:. \ --add-binary /usr/local/lib/libwebpdemux.so.2:. \ --add-binary /usr/local/lib/libwebpmux.so.3:. \ + --add-binary /usr/local/lib/libxcb.so.1:. \ --distpath $OUT --onefile --name $fuzzer_package $fuzzer # Create execution wrapper. From d18e55013dafa2da7a68dd5ab911bfdb3826d74c Mon Sep 17 00:00:00 2001 From: German Novikov Date: Sun, 28 Mar 2021 15:02:52 +0300 Subject: [PATCH 470/750] Update Tests/test_imageops.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_imageops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 986c5f887..888afad37 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -375,7 +375,7 @@ def test_autocontrast_preserve_gradient(): assert_image_equal(gradient, out) # cutoff the top and bottom - # autocontrast should make the first and list histogram entries equal + # autocontrast should make the first and last histogram entries equal # and, with rounding, should be 10% of the image pixels out = ImageOps.autocontrast(gradient, cutoff=10, preserve_tone=True) hist = out.histogram() From 0018685a8e475ce91ceb11a6df8e137f0b1f6a47 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Sat, 23 May 2020 09:24:41 -0700 Subject: [PATCH 471/750] Add Tests and support for Planar Tiff Images --- Tests/images/tiff_strip_planar_16bit_RGB.tiff | Bin 0 -> 31576 bytes .../images/tiff_strip_planar_16bit_RGBa.tiff | Bin 0 -> 37295 bytes Tests/images/tiff_strip_planar_lzw.tiff | Bin 0 -> 155014 bytes Tests/images/tiff_tiled_planar_16bit_RGB.tiff | Bin 0 -> 34501 bytes .../images/tiff_tiled_planar_16bit_RGBa.tiff | Bin 0 -> 41015 bytes Tests/images/tiff_tiled_planar_lzw.tiff | Bin 0 -> 159997 bytes Tests/test_file_libtiff.py | 46 +++++++ Tests/test_lib_pack.py | 54 ++++++++ src/libImaging/Unpack.c | 121 +++++++++++++++++- 9 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 Tests/images/tiff_strip_planar_16bit_RGB.tiff create mode 100644 Tests/images/tiff_strip_planar_16bit_RGBa.tiff create mode 100644 Tests/images/tiff_strip_planar_lzw.tiff create mode 100644 Tests/images/tiff_tiled_planar_16bit_RGB.tiff create mode 100644 Tests/images/tiff_tiled_planar_16bit_RGBa.tiff create mode 100644 Tests/images/tiff_tiled_planar_lzw.tiff diff --git a/Tests/images/tiff_strip_planar_16bit_RGB.tiff b/Tests/images/tiff_strip_planar_16bit_RGB.tiff new file mode 100644 index 0000000000000000000000000000000000000000..360b4c165333468fbbdc015916edf3fc265df7e9 GIT binary patch literal 31576 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 TOKzPa?>J~e2{$#_l;{5+2s|yj literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_planar_16bit_RGBa.tiff b/Tests/images/tiff_strip_planar_16bit_RGBa.tiff new file mode 100644 index 0000000000000000000000000000000000000000..b8c3dcf643853d875a274032c13377739be76638 GIT binary patch literal 37295 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_planar_lzw.tiff b/Tests/images/tiff_strip_planar_lzw.tiff new file mode 100644 index 0000000000000000000000000000000000000000..8145703f4308af2329218d1ffbba2b7f8931d5e8 GIT binary patch literal 155014 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%0D+65bzP;SeSUmHSigA<&*IA``yjt1bd3 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 dzofv!f>z~0AOIx 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_tiled_planar_16bit_RGB.tiff b/Tests/images/tiff_tiled_planar_16bit_RGB.tiff new file mode 100644 index 0000000000000000000000000000000000000000..0376e90a7be5f9da5b5882aa5e54af41de695128 GIT binary patch literal 34501 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

9Rv+tv1F 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 C$e*_W literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_tiled_planar_lzw.tiff b/Tests/images/tiff_tiled_planar_lzw.tiff new file mode 100644 index 0000000000000000000000000000000000000000..57cd6094a285b3ca74102c8041053b999711fea5 GIT binary patch literal 159997 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%0D!T6f{|DWTd6A6}Pk;4Qs2= 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 iAPIFHpHUqA#QJjqd(4 Date: Thu, 11 Mar 2021 22:12:35 +0100 Subject: [PATCH 513/750] Fix FLI DOS -- CVE-2021-28676 * FliDecode did not properly check that the block advance was non-zero, potentally leading to an infinite loop on load. * This dates to the PIL Fork * Found with oss-fuzz --- ...-9139147ce93e20eb14088fe238e541443ffd64b3.fli | Bin 0 -> 200 bytes ...-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli | Bin 0 -> 159 bytes Tests/test_file_fli.py | 15 +++++++++++++++ src/libImaging/FliDecode.c | 5 +++++ 4 files changed, 20 insertions(+) create mode 100644 Tests/images/timeout-9139147ce93e20eb14088fe238e541443ffd64b3.fli create mode 100644 Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli diff --git a/Tests/images/timeout-9139147ce93e20eb14088fe238e541443ffd64b3.fli b/Tests/images/timeout-9139147ce93e20eb14088fe238e541443ffd64b3.fli new file mode 100644 index 0000000000000000000000000000000000000000..ce4607d2dd083a923db2d6326e5b6cb34edd0702 GIT binary patch literal 200 zcmXwyJqp4=6okhm_!AK#S{V>qkC4L7);m~u4$UR3QhET7U>C8`6NsQ~KrD1!$?o_f z?!bdLAH&SWVbk4)s713L;WfRs?&f^rjbH($2=O8(RIXr?StL24^!a$mm34*ztOEHI zPNn;?;{vpx5n#!EK1%YGNr|@KscMMNgL>^6V^2HPbNIWZWZrUq>?l&21IIabHemf% Go_zsZc2frc literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli b/Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli new file mode 100644 index 0000000000000000000000000000000000000000..77a94b87a3ade935e707f3d89c9fbff801a1e976 GIT binary patch literal 159 zcmXwyF$%&!6hz0xLL-qC>;mF7(n^lvLG~UgJ%G1}r6&+U+km7{iDdV=TkI?5!(*6# z4?1nmg=SV3WtzwGHQuf~5xsCK^nnE?^f6l-duYo2Y6m_H%;k;X9X;l|tpZ2k#TbQW bed+df=cp&G@}D$=e#5~fLnPfYMS}JZYT!X? literal 0 HcmV?d00001 diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 0d9748a95..1c1abf2b1 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -123,3 +123,18 @@ def test_seek(): im.seek(50) assert_image_equal_tofile(im, "Tests/images/a_fli.png") + + +@pytest.mark.parametrize( + "test_file", + [ + "Tests/images/timeout-9139147ce93e20eb14088fe238e541443ffd64b3.fli", + "Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli", + ], +) +@pytest.mark.timeout(timeout=3) +def test_timeouts(test_file): + with open(test_file, "rb") as f: + with Image.open(f) as im: + with pytest.raises(OSError): + im.load() diff --git a/src/libImaging/FliDecode.c b/src/libImaging/FliDecode.c index e9000fc99..35a6ccccc 100644 --- a/src/libImaging/FliDecode.c +++ b/src/libImaging/FliDecode.c @@ -243,6 +243,11 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt return -1; } advance = I32(ptr); + if (advance == 0 ) { + // If there's no advance, we're in in infinite loop + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } if (advance < 0 || advance > bytes) { state->errcode = IMAGING_CODEC_OVERRUN; return -1; From ba65f0b08ee8b93195c3f3277820771f5b62aa52 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 14 Mar 2021 23:26:28 +0100 Subject: [PATCH 514/750] Fix Memory DOS in ImageFont * A corrupt or specially crafted TTF font could have font metrics that lead to unreasonably large sizes when rendering text in font. ImageFont.py did not check the image size before allocating memory for it. * Found with oss-fuzz * This dates from the PIL fork --- ...e8e927ba6c0d38274a37c1567560eb33baf74627.ttf | Bin 0 -> 50373 bytes Tests/test_imagefont.py | 13 +++++++++++++ src/PIL/ImageFont.py | 1 + 3 files changed, 14 insertions(+) create mode 100644 Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf diff --git a/Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf b/Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf new file mode 100644 index 0000000000000000000000000000000000000000..79013251524b109bad3ec84ed9f2864f7cca6e1e GIT binary patch literal 50373 zcmeI52Y^)7+4s*mcgpT;ot@drvV~=Lk+Q(T?jq8gNK=}qh=LU9ARqx1M6B`ENQ@da z#@M1pjS^#&7^7H{*rL2q6E#M$B$kkfh7e+z`F_v2bMMRomgMy-@AvNBz0dzVr#|O7 z<(_iy9Ho^~1!|LW)XI@ZPMETHLEd9Z{c{VJ&x|~3_=G2to3<*QJsV#oqoy8l`1Bdm z|3m49p77lcKkCS-C%u1J825EbmFFHlb^3^>K73=g(p}C`%DMH(slA)e{&4DAr8Mqp z_S|K2R{pKmj%$d!k5a)=Cof&U;FYYBdz9)lOsShEEu24RUd|+aIetIkZe55)_Q_cl zgzpdEb>Xr#>u&8@GXefZrSgtmx?=8}@`^tmr&N56QlTf8%~`iHcxvDc+>gP3&GI?R z=6~a?-z1fKnEYf-Ub$lRnrEN-!F@_S@s?7(f1o7q+_&z#>iQE42K`-W=N)X+b7!3J zf``dx6ITRJ39Nz-DI>Q05ym+_xkf!6{Ce`)|J9>)>Ds3(_BJFq=^$A2T+Rgk6XEO5^uc}eQRL$#$xiSP+>BYDgi66bk>;P(% zLr&(IJt}S<=Dtw%1ACc!)M#^=YSJ^+aPz7f!#!2KPN-Ye6myv?K`{-Nr_-OD_q4wW!^lWNm9scsf$s-XFu8fcDHeaxAvo7tfHnqR1)=6uy=euDjK z)nI<5dSmWw{S($asgAN~KdFv0TU0M+t{P-sR;}g*WLra+_rPy(FXny>{vY5h)nc}) zL#*3byJ>z~2jhVJ^P0g@l*d{w9=-aV>N;&c8& zTq3LJT=Fk@e@OK-S*okaLk{$yZ=npteTXZA(^EBb4+50rsU4P;~_;t!x;*`93C}z=f<}EUNx8yx_r}8HGle?Dt zf)p;)dy*ev-pt+2m)p~&=*+vla+Y*6Zz=Q4+bjP}x%R6Ml*4FyOF4PBC%2%~4eypZ zl6gyg@#;)Q9=*Iu9m>3IT}ss_L!FW~=H#d<^G-?zi9_NOxp!jzGWXfY_$6+=n)bIk zxtDt%_dDFrrclf~aqlaB%*mv^|9y&z2b$7l=;cpP?DxNIyLp7RyWj2nT@BOy=mWUT zI@?FInyaZx7pQJh_bK=DxYtVm!@W-W7r9e);kvI3rN4MV-IJt*9d?89b`G@+EtuKOZJ-_5DL+LlSs&CrQMT?m(?w)zU0;~LfigcSGT14o2$MMr7yZnU2XfMgP=TvxUaQi zf<0<^O0U=0F~L35I~glrFMS#JI@_PUqtf+3#t{z_&ehB9@*Lv6+1H<2kMB$McXxhe z==O^@r25DIGP-@J`U(9d{ir$$q%XBdAF4*c)2B*5D*dbFJ(T{nr|ZV^&GyCgKW;yJ zcM89^AMe@UZRmfwm#6yK+dVyg5vKfK|3&E5m*V2KF7<&HnJ$cDk7DGvl6qC8RDFFzLrY8l z*0%cAlH%fcC>#uhisL1v!4k`w35m0Z3?Dv3Z-_;svBc|f*jtcy*iUv0CEw@&ZJFP8XCMChk` z(`J2rG`31uNaFdlnG79w8floz4z;-mhP+&~w)AgkOl8W;h5k5kwnU<jg1YhZEdZRPF-#LTsU*{dnSoSkx(YqOo5U zrO;*Zgol^a5-4N89B zX>@w1$&?x;RhOAqw7In<+P}%vb;&oy(Rh{Vml6SAO$MhSreAZFIOQ7~Fk06oM0uC= zGrbC8XU!i!e*Wuud5xuIgO*I0vSe^s+2AEp9*h+f#2#FE>D1cVsh6$b9A~ zyLKHuvn}yS)A*LEf|wpvn)mI37`kmmw>P2NY}G?*XurmW280Vasmw*GmMB{4Olc|g zG3sTyPLJ#T-QI!hPs(tv$7JMt24k&>`iQNwOK(8c}GuoSuDoAkSh zO*ZPGC!Nr_YS@qy6E9DX@i%?5P-^o9vFP|oeY&^gg(e(v{IsJ?!_s)XG9FKSv^E}Z zjK|2b8c6D6Nu3r_E9EIEr%TQ)p%ibr?%A+@{f0e~mnzvB5Eu3$wOnLcV z%S)rNuTfWw&DB=oEl}nA#n_~2`0rKM%A;PVzH9$z@mL=$(E zmH(~0RAd!R%_7da{bH25Sc_KNhFw>jYU1Y5L?0XX4xx!%j|x1hDIHLB6OEl3i%yKj zmc*h*TXQOn@uWe| zyJkr4%bRKk{pbX(>QRtclK6$_`Xh;TM|D+c>6~axl0)4C7S2nl`~C8=Ys5q1DH2J^ zes@Yg?aDGUYPZ$ap|ey5i1rpYa!KJ9KMOCtByoRA9-^^VUv*PxAs>xy3jMsEhKAg} zXRV`j-J&>F!p@y5RNp3a&K#k(j_9LoE-XoGb*l||I3)Q2Plg?;mOe(h3h6vN#Yk^q zyBSwcW@W|jRmaRYWq5fs_RUzdyr~DZ@4K<+&!v@DwTy4NK@vMH-l>CStD!5fa&t4WSD2OggT<7QP4rJ-Fzbsy%`Kpw}lUGRM3uB$~9*M@R z8FG6nt=xiFUl3E+d})O+cQiZ6Gvg}!~k1ZkBeDaw>Kt1Yoe{j#wN#q zDw9HHE6=c}`q0Yt`-x9t<>8aEbF&!oeJ>Ud1bRDJSvgr*PVYd#is5ACW}g%;&yW4R zq_(QIOlMgcc17Yj7s=T4;+%LyGk8F*ePwtk`Fkv1q#DFf#UbB^!le2ZNl+>a<54?m z%H-3MrMlJ9QnX~o(fI`PnuD>za|3EGUQYAw``0uWZkG&QarAl=KIJwS^5eqo}FB@ zc@<4$Pt`E5ugrM9gu>xe)$>|GX6A}@r7gh1lF5@x3#_On+%uSym75g_^$MGIjubSG zp-5J~>)2JKUDDK4y=+-^Q`1D@Mn_5_LuJx36vJq-nTY%HrMNRB;mIlP(*24%eTd8i zE+cP;DC$Oi-IvXhQ@4>u)=%2gub%pWFL)DzN3wE)O(HnuQdsf;E#STAC2x@ac1iyx zk{v7QkHv74*lb6>#3j+#0}r^`W=3KbxUE6zs#SGtzt$CYT%Cu^hy*PwH}7x1m8kU7 zVtz-OKs0t@?UW`|3IqV<=HzQs{&}vHg!Ti0~4& z7qV<{Woc_S?vbaQ*R@?`MM*WReUkDDy*rh+PhJ#WhRDR$pl&mp%&+BH(-w0_AEhEu zm^q%)&=772g`H5Sv9U`-x1~&Wj~F*3wlq*+XKIs7I6D$HlS~}8V29o?WW! z)z(I`w9bkoUb8$YjY(c*u2d&Wo=f)|t!2!6PnLo}JP2XBncey+=V1w>_n*%GAaNre zqk0z9e9*%b#AZi}ObQ7bM^9IyC;GB_Iz_M4Y|Thb_r37})snU*6Ac=lJN1_)s0T#L z=y9X5o)<5w;cwB!J%uY~c2H4^zi@3u?D`5gbh+xd&5=X8)^+U`Iad}YDCe?@Q>!Wi zAuUnrP@u93nTAvD6>hm}Z%~rzxpjp*-jZSDLCgHdZeH3DIyLi_eu3&P9iRIIvw3tM zTk;^!uy4I2E%Ik&>iX5~mOLv$Dv-nti}rsb5v~FbIM= zLT=+5VoIt_Nl9yKTdQp-;e6B3s8@9B*4pEc%JPbmf`w(G5GD{}cGJ*=J?`|N| z*xMPY^Dy?kt^MpJY5O~zA7Vei+F!ZRwYOtgt37#+qP?}Qy&Y9p`=PG=>DW`w&GfI= z(7(!zmx|UFOOfpnZhj<1qBsb3XNr*g2a;*G<2RZx<%j1E{Gj%>-~$cIP4B_QYESHjrN>y z*kKcUMxzW(51Y_4x;IwM;#_TYO#h&wM^!Xh)uUpYXE;B%pdfd8PBfass>i_OGiIz~ zSa(Q0%`%&j-zE56N4-40Y@3SJc|8Z~5f?97bg{c0(O6Q_DC-f4U%h18@=GpsTXo#q zsXn1Pc5N{uF`CfSuS-{Artyeo$YmJqyR)-enNiv2m^Y&HI;ZqJ4I8~*59-d_7F}!? z0xoMTNlo59eMq9$HA2Ci(tc^t)v?6R1!9+^bI!Jl50)SYZzR}paZlLnL`}R zmO9x>{ZxO$bdu*nedc3W#?XrsZ%fR&9QsqRLO7WVlRN6LnNMAI=T`1SUKTJ@YfKEv z9H!b*;;k+EnbkJrGcvdOPIT1IqA_bB(`;{Yr7LVM=z9)TztsE8TcprSjg*m}9fD+( z;lXA$ZT>{A^uSu)uBUo$XjV9!bwN{IPF_i6I6N$z70wzM4p--d!#S_VnrDm}Iiooq zZ=Nx7)QslXpy6}p4wqYx$qMW2tZ+T;p)Basl+OrfWras%XH5-fz1otKotKsSl(%BJ zx3*2nqOEq{$BljaHh$dLhnHC#f4#MszIMDkNmJ_~{;bhyzv9|F#Du?~);Ntd?oz71 zq&hEi#dXS(L1k<2lEv7&WX83nvaqmn3x=y(XAbMS-(u=X`UX#acg3~1p*3sr@YjY< z$<3dUms^s5dqFHOZ+d<%WnZYPoueuHa(ObirQ-?e&-|!AnJY330{FLMba|TD-Y&f^ z<4-+k0eeo&%bk*+o13p&Wm-5nUsoP0(w~r15X$S6XB-pM0iD}9CsdGgqBxwGpIZ@% z=EicP!HPUxotLL8^YRWC7f9kQG3X6>d67tIzmk9xG$s8@A`x897MBP6=J40|!Mr@$ zLgpALy#rvMy!w{JjWV>=v!G684^tGK&B!u^q7$=Ezvldyb|kwKo;p%PrGESI4_rtr z(F<8^`ap;^nSF)P^}@6x)SEH9J8-4B+s4du>5Fzgf~m2m3^t{U%@`48?t~;xp6BGp zHpJr2JjQz)VzJNK8tG>yNaOwV9w^cjp+r@vAw1NI83TmF-Uuu;qUskbu4~bm z-HGjbGZtJ^iqU_*Fe@Aw5{+FNix%Y1$m(3abEnyw7$qrcW+kM1htNAdg_<2d4@d4# zydoBfo}=sEFD*)3aqqo}tKH>_1J{4$xpcp|#VN7RzrzmJ=Gw0}Ip}Msi8ZDwXn}D` zshS5_g*vHz;=iJgBQZptn?=;~B?O-;GZE32s~ z`}FB};oVvKq2@(}@p$1+vJ)eFEiH`87-S6ZdtGUsWj0Z)hOqyZrBq@sqX)w-n_?~X zWtA&qHE+GPRutRv`I~NQL}B_9ly>mFH@gjXMJ#&O7w^IGCY?F0oeW-sZ%j9sgKe2@ zeJnCiWQNQ0aU;px{yGz1$ zAqQ}$PM)fGx=f(DXaKNh88=csl}`NB^NLJv2s`gYZTGg7M5CuXJuz)4~rB> zm~cd6r!)+!OdKAKz5H@4x|v0Cv4hZd*e}p;A$bqRmy8M8QoRDTEmh&Xl`?m_!BhYP ztqY0U>RS3SQqez)M6QcO9*(pQ*JUHxB7+W3yfb=`)Eik%poKUgwOj_9)R*(sar!>9 zR>hQTx3tJu-8NJEq?E_0F0O6S_r-^gZJip49CO&H!xC@lK4xj8|LDYHQFbfJD-xx!Z6F@TelgTFAJLuO6drlfWXp)RUCk+}rsb^s%+I`%Bl@lkf95AkXbV;P5V(qwYooc%r z83~T7>|9nmZf(3oAHTb*Pi-_>+ox)G=iXxI-MO+yRl%SEyAK^)P}Q^Zn}?Q^M=DD? zmsP*@TCl9RbF4TLD`8B?@IdWuxNXW2!sY8`h(TiX%iS|j~OjOZ`7e(bCs_4Pf@>e01pkH)I1 z#Icij6pX z<;t^1#>&QQUbN_}F=dhR(HrK@-7uy+KH|*9i_aVpOFX!K{m`DhhOA#dvboO{`i91_ z18QprjBQMu(EW&(s@k@(4fUh?S64QVK1AP8Kf0y5x@B~I;?zh((-TdN***F_(XWT- z$In2aoeMo*=R+^hh0w3-BIt!W4*d^Z z0=-C=K`+)7&~NBU=q0)ex<%JOzp1-GFV$V4-_i}x%XByB<+?lc3SJC1>f5>rdZq3I zy-GJjujci5qrRhCq1WgE(C_Mj&};P|==byx=yiG+^m;u4dV?MXy-|;W-lWGuzpuwZ zZ`Ko_x9CaGTlG=UALuF2+w?T(?fPiw9lTm^)DQJ>&^z_<(7SkL-Ked4HuOjOB8GJ@>t~?v=pE2^^>3i>>F1$;*1v`B;?oDC{-R%o{#CyMeV?U8qju|^&=2$* z&=2)n(7)+FLHFo)pnuozLHFui(0}N^Lig$2(0}R=q4L7EQ6KBQ&` z4B_(%CkC>j>y+ca3;yeH--Y{Mz(>GG!TZ6V;g8K0r#Jiq@IQy=!Q^Q8?eGtScY=3; zTfrZJuYiBRUm^Zj&}V@}nLmQJf_$iA-T>bOk<*BrmxA8{F9RRdUI|_WUJZT+ zyaxO(crExn@H+5%@CNWk@Fwv4;Ge*^K|X*n?;=Mfa&!hOz)oNlSdIH`+&=&lU{dMR z=&IOpKq0brdMG#$JPaHI9uCUbaXiT2LZ1lE2Iqi_!6hK$S-k?>44w_12c8dJ2=b*7 z4OnS1N)uLm8Kh~fN|Oh)5Wh1590?8qhk|3k!@;A$8DIn0NIJx0h=*pZOg8p$ z?2Ew~uomnB)`6{H8~(n5ze~U^;5R|^XV9PdEBHSCy5a8-kb2-y4;<=;L;Wx>;{Fo& zGWdJ&J@C)u7dbR?$Tv?~^mQ|M3+`pOmxH%~w}W?pKLno!e+@nZJ_|ku{sR0Z_$$&Y zA-z)K*+)G8#2z%D(;xd5_~+qY0MRqwE@`t9d>wc4?~s4yZ_4~9_#5y!@Imk);-maE z<B%7Z)Z~)~q|#Ht3E)I<6}TE)1D*=51-}Na1Wy5P0BLwUVwCNP3#| z=<1b5KDvLUk;5Tghj<;*aY)CR22KZ&!$A(`81Pu|IB+I-JU9y+2aX3%08a#|Z;sTr zX5#G!_6J))%2iXY3=)*4o-j;Mn)=2-L22p_Lj|QrgJZ!XK+@Nw&tO3586fFv(q}-R z_=ZX|Bv6|483-sn7n}#q2N!@RgA2h$;8JiIxDH$oo(7%{o&jzEH-cw^o4~WcbHH=K z3&5{~7l9Xp)JIKyffqw!23ce5S1^)ql1bz%Az$EoiQ6Dv!3+93OU;$VNM!_O529|)O zU~qANPXfPGtDDd z8R`=cVP)FD0pOwFK=3ed5I7hd0uBX-fy2QO;7E{qW~gUo40t#=7CZtR2aX3PfD^$< z;E^Ep-%$Sz?ZVJ54E54bFU`^54DcB6SnxP-CU`tJ3p@cl5u6Rq0Z#(wg49z(Jv9qJ z>Zw@>E&>;WOTeYzGH^M#0$d560J0RunQ2q|(?@;~@`gYK_gB~69 z=#W2${5j;$A%9B#3`lrI7?sVJy_Yk2rdn}F)C9FunNedVOjG$w=d4-I`fmVxnO=)K zgSnBzr`4#kDMwDMQ8g)hT&z2BT69!k$^2D>J&+QI#KRjMRsy3U^pLV=DyhWP32L4W zsKrcRuV7+%FO$DF*anE`GToqu=sw(I_0jYtysdz&F3DZ2v&NxS$v0F3_l)FYY9{`Nj;^z(G65EjKj8E6k2fPEjmpIKakcgRmW{`+hubh_PeYMX?yV{q4(nB4Yefs3|s`xv(Yw; ziS8Cn7u_G<%aTM-%IlfrE_{9Ee{P(~z4m(MtBXGQV)BFJ+g^OB_&@geuLjZG|K>mB zej_FOSE_qT^D)Zv8GF5$eDPn;2DRu*{Qc{7Mne4WsAsOQ)Qa0l;r`DS{ohMF`5f`S z{rT}GKmPaPmbUlV^8Qy`KC9gST{#bwMd~l|+tz)c>zB772HX35rIPKXL^8^RUO4sl z)urOcxXbEc7rFRS?ZyjtaFn?IPyYQo`kj%WIz{X_-^?>BULD-blMhC^X@P{eava ztg*f*>cijXG*(>wc-*wSSZ&CIRtE{=$@Te28Qe@ozds#k+P{>Qmqt21Pjga^X}|4F zUTo=5?cFmuG~>(a>H&E^M<1DC|21KJG*bsV%w9S`lz?9(94 zY-q;@ZpQ|0#|Cc425!d&ZpQ}h|A-A--IYbzde%x=KknGSWu1K+%j7?0-MlC3=InQL z?BAjX>PN@^E$xH-o{s%n^uWHDUJ9}w*0Fz!9{!9Tn9gR0| z*Rh{VmG9WkWg*AiBktJGO|SEOp^1gJj{V%v)Dp|f9s9Wl)y|h&X52q$$A0eq8u>rY z-xm%A0}ijQ^{gq}YU+=ew{_U$V`?5hwzgN#{n(nqaLrbA)YiQ9HQSQOqmBu53Ld*P zSh>}y&)OQOuY3Ko96LTa==kKI3-OLOHPFM^=;0jj zT(INI`;IT~JHEU>U}L!BO^pLol3~&DrbdP`+8I0E)Q}Gg+o|Ng2h;JU#?^cY*zx0# z9X}5F7&C}pFq7B={+$tGgppznXg~-21pJhZ(jqoWV_+Frj{h$Bufv^p!aIH(l8;9^ zJ}#mnbSznQ{5T{(7T59Pkn{&9p@+HPJa9g^0OUva{%`y^%=O~o)_&N43sF{b=l zTi34`#c$4>RTJmWcRhP%@$H!x;oUQ*{7+i3V!4eRduvX`J~o|0F=pDjk%+Ct(M)bV zGsYQnzUIj)##Fdt)3J$BZ1d)<@^aABw@-?b2;qq5@U(u!C?RrF5{lxRJw_awk=+y0 zGfP%|vjoWS(+{&Jk=T18Nu(o0Qo=U%g&8}?V~}s^{P}3gbDBD5UYeQa`y-H46W^Py zC|(#_<{p#IJaN0F<~d1T+!%23m}V=Hi03LPC7#Q8;`vS@p3jJQKI7G58=Z*fyLdIu zx_DKpsjnxV>n|mdFs?*i+56&I$wigE_L@EMd?#Of;?LKfFuwML@wF$6uRURW?Md8e z?TM48uqJWxnC2#N^0jCEd0O$svpEzeUwgv%+7rgto-n@lgz>c}jITXkJU8xk+7pky z_Jr~4UO#d1>QujW+7l;Vd&2nI6UNt`FuwML@wF$6uRV!7tvzw_6xJk89@E?;PQLc6 zKTmtUcs7UPfKi|5AOPJ80f*PbxG_WFy9r@j8|v?or! z_Jr}ZCycK>VSMcg<7-bCUwaaFT6^N;DXdAHJf^uxoP6zBf1dVy@oWyo$=9ARzV?Li zwI__PJz;$93FB+e7tf8mo%Y0|uRURW?X`%Dr@fYT+7l;Vd&2nI6UNt`FuwML@wF$6 zuRV!7tvzw_6xJk89@E?;PQLc6KTmtUcs7UPfKi|5AO zPJ80f*PbxG_FBco(_U*k?TM4GJz;$93FB)|7+-tB_}UZ3*Pg_k)}Ac}jITXmeC-M2Yfs`%Yfqd!g*Azj$22#IldnDN&(oeSp3R{+`Pvi4 z*PbxG_Jr}ZCycK>VSMfR;<<6R)1G+rwI__Py#eClX>UL~?TM4GJz;$93FB)|7+-tB z_}UZ3*Pg_k)}AdS=47V4Z;OEB8P#)yLanrIc|7rZ~Aa;FiZO22^n z3g?%7Us0tkMo&e;xZ>e&_|o|qoIhD?l4+BtOV2EU>{xoC%#@X*XOmNu*ny_3E`Wclw#G zTz2H^HMO*CwmsN@eq*y-TIrIa-`uR5-`*^jR=Ovf8>cT@DhWjOS{W5Vl;epitZ2@k zwzXH4M4PS=wk-U4py!rKGF39oO>>s6kr=(6&(;p%Tz`FYRUX9_6Ary**yJ%ldC@6W%3 z-Md^4$FBVi^B%1^{fGmfSmG(r1(*x@T_vr1^O>5%ulom>um>XD#>p^_xm^xV;x{N*KgzgWF2XN5{#FI-nFbYeR?Rs{ zbw7F4{3U9fJ>OuQ4JGFmIOHL~uljSw!I#biuME%a$n4iLkQCsSDlsJ<9I<4rNb%f3k_+o$SN! zO*X53{Q6~!^)(P`R5m9ZNEm*R3)xyZFi=dI!vYUe>-22BO5dwDb6=)!g6`0XV1BTM zt2sC}cwBI0aC7k5;I*NK;MU+H!RLd!f{9RJs39~UG%j>}XnAN;=-SY>(959@!+~&B zxPSI(ISX?x%H2^grEqD{(M7Murxb52DJmUMmS28CuadzV2X7nlIHwpW?h<4l#cyS< z;*^Fv)Gv{ZGnFa10pM-iBBR*FvFi%nYwe_dXim`ZTq5viSQoL8^EFcOsNL`J~*N*xj4f|1wNXSBAsYPV&$kb8^Y1U z^l(ntF)3S3-H@7Q&~X+1j6R(6KR8n;u_nPO8Q{vqO8jQ=8>xf%&C<1$zzrO<_%cVj z73x-f6m{YXeXD*_?=pp^iy3Gpm<48?*fi1*c#H|#&SSqL|=xO>G zJ=;{J+*kVUxtNR|!)Znm(gco{^OlfLarCH2>)H-8J5#otKthXgZM(~vP}XnM#^MFQ{1UTq<=K03fa)kZ>^iu9XXa%!k(6Lc>vDM zQwgRl3B##myG^5+VrFoniyQt5-&ZLn!)YS(To(>Z^TL;53WQk}qB-dlDE|k?%lsl(v(xohQNlu=!5}D(C zpVcXw1=zSU)?hMbI`6i-ex(JuvDT(+2Ks)xV3Kp&T%Ut{`#Nj?x0L-D-(KR8b9G$* z^6R@jQ+Z-*keDW>T!#1|qz-6Kdy}?|d~#+GCdDuN(%0)vW}!Jl&eHK(4`;sx6S)bg zvu-PsUug>_p0{l+WrK_1gI|evU53BYRPfWcK7A`~WBqNj{*F)Ea>`dQ@t4G3(l+8x z-31@;YfC!yt}2-PN%ALY-@1tK(uUK16n^-9@w5%SelR&8IRG0it>4QF$FuIAm)m@w z8M#xBOGr6$&kuPG{;o-0lVKzIXs0Q9y8UBsB2>usTVCt~vH2`n1A2;{syFD38L3E4 z+;k0n)8zeJ+&qTF<=|n}IxfkJ)K5=_N_xo0Z5}-vQc?4`+@2~k-%{4n3bcBbI+X3k zLTtx`D|j5#P?Jk znDDri-=ma@@;Q3=Xr+2j0XdZ_x)WqW%-##(|AcvY>gH6bC~pyjPfOjK;OSk%=W$=e zeJT7tI@_L@ujIa#`vL3{;7#0*aNowcKa7yVTe)l%)Eqm;qOCk(#s;gq7u?Y2W9{~@nxY+G<}TiqsHm+dXhep-gpN6@l1V!K2e{f z=jsLeWcshAdYN9KSL##r8VmTVK>uvg{`U(9M zqn!WLuj@DUJNjMyPyMl>fH@C6W{ORjDL03h9;T1!YlfSVW~@2F9BXEp*=CNJ&r@)b zS!~vt)6GW4kekif<{WdbIp17mzGJR2-*un*fg{zoczfe$wNvTfBlOHV@GW&K^nOmc z)6PmgJ6(%7oVZz&Yx_zArESm0qjc@LfRw5||Blj>txTo*KZ%L56trga>zO|v^_u=q z>eDj)=uO1MZR4T*ai<2@^D!xTdoCs=ZqK=+r0uzOl(c@NhX|7TvtggtFB5hrX2TKb z$8vffC->R2`(|-+pP{5qWF&qKr{)FpJ)Ef-(ob{3U6y`<-#CouPdFvBi-~i1YFE>f z6X6=nC^K4hGsknfT6e}A>r_wlyjk@!H#1J>IpW-@PN7GOBpA0~oWHe>YOpa7K{1(3k&$B0S9`Gx3C5|X~(OZu1ngV+vE?@3D{%Z#I=1~2XdUK zBL`{9;>ZDiZg{AFe3^Lh;v`hNW6v_(#FxEZJRnkQA#r%|cs{&TGJjUpa}#u9%nav+ za9wfPWlaZ{_A@nM57ufYCoMbW8{OP5aqj;|nER0@!xe2NL8L1N9DCf87*5PfMN*RvUXW z&&rZo$bHb#_u|bwtTD4*da3Wt9@kOT3Dl>Gj-|>bA#+2D!4s`Ww zJbe*kyO!j+d-(aTp09(Um%_o^{%t!sT8m{$!e_A%6=FjtmxYr;6@`nlsF};sb7v+> zH5|TG%tBlv3!**Pz9?t=q7~ai*&67|fm~zQ)HsquxB7DA)^xTtW^lEsSzH6uiCl-O zxlHK>a!m6Qma;ygEmnrzWZkI0pJCb-nr#A%3iWhQIABcCTkU z;1zY5dX?*PChL3fm1Jw_c8-cJQ+MhL-AO%4E;Lxl5`Q%Zg4MD`p_sDtV$oV5mG|eG zH1@J3a|p}YEXa}D0_!1{1#*@+Qh&WtSj4h*oS2JQA}GbK3|+`k)bb~XQCG4=EC*7{ zanxOz6gJqjjdjl?Md&e3EE1{XZ(!C@V?<@L+$PsH>fgqHCSqK zBXML=)8%M7Ih;;5BOG!UuydIZEx~oqryWEnV`&#sOA4qlgcmnthUOmrt+yH zC2T#3reyP=40AbG7b{yMF?FVPh<>^fM=d%K=?)=|I%DG z^5BeS=jenpeOhsF`Uq!Qu`^W{2B(%eQ{v9#ak1d!gmYAmb7aDqG_f!^Dd9{kbS5O6 z@wkjnIOC2e433LAM|92$9#QCw&2tVx12fJB{^DLw!!Lp}?unak?g)x`flEz^NslwM9F&7&*| zf1TyWr_{}C96yK8^VL(%ZLIQ*HO>(q13@y;pE@AbKXy1=c0vFZ{x zB4@U`B=~|>CHs`#t(=#Kt>~TH(ebi<4*IB9V?zqzMu2YL3w#PFMp3JSgyjq+HQ94QM;Sey72bF z>Yi#@mOJG<4YDGn{?lN4KB8eO<4dWjP~u zez0>-bya?~`e4W1JF!@%PRA|0kDx<`_1nwr!D1!wIEKetnVyh%Nz zctmR?eS3S(=AG4Q-v+f|pXy!IPPQHQ=-pLno3mrE+E%3s$nEd8tBpG)Z+f5NInRSY zBZ)(~ zvUp+RFz8^eQVua4!q{XeSGF3)6;Z>vayZa*gbJyVT!t~!D4rfNiYjLmbrk*nWUeg6 zQq!Q*xw7q8s>+U~su@eo#gA-)W!Vu`cScGpc@mw%)q`=>8eC81b%8APHMZ1>7(uP) z$#oi6p*o$bfLAfjz)W%SyxGWQ7>Auj44b)nFd93Dr}p_=d5p;}Ahrv+0_tM5g`9qq zZIdj+B=NfXoRY4x9k`i*)4 z4g6O9j&xsCFOhc{;l=F;uSC7h>q8~#&lGu<4(f<1(K)<4l+7y-g=|Vhbuo+aC7S1~ zF4d)~lP+TvSZPOrxul@b@FsnOGWG?aeEZT*12Xc*i#=gd4B;amt(5ST<>jA|!>84# zu2YVjSi|_#_2b|#2Q9^rn-K-!vIri4<`N>#Q=L(ZwdHjR@{`9%pqR4jtg4o-n7dTn zYv}{4 zF|f~u=BpT;O;eZBgFmf4)FIuI?ZIpHmRAJtpxO*U!XrABF7df3)A*S3%gsL|K+I?auKXi4)K zIL*u@9b+Lc%!G7UXX$L}qLlXlHC6qbKKG&heC25RP@OM9<-M37&HOh!qMoO+d(own z7?HBW^UIey{{ToEJ9)oAk}RU4$90U#E-?k@CN|mz Date: Sun, 7 Mar 2021 19:04:25 +0100 Subject: [PATCH 515/750] Fix DOS in PSDImagePlugin -- CVE-2021-28675 * PSDImagePlugin did not sanity check the number of input layers and vs the size of the data block, this could lead to a DOS on Image.open prior to Image.load. * This issue dates to the PIL fork --- ...e28a249896e05b83840ae8140622de8e648ba9.psd | Bin 0 -> 555361 bytes ...8843abc37fc080ec36a2699ebbd44f795d3a6f.psd | Bin 0 -> 714605 bytes ...efc3fded6426986ba867a399791bae544f59bc.psd | Bin 0 -> 1004989 bytes ...dc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd | Bin 0 -> 592243 bytes Tests/test_decompression_bomb.py | 1 + Tests/test_file_apng.py | 2 +- Tests/test_file_blp.py | 1 + Tests/test_file_psd.py | 15 ++++++++ Tests/test_file_tiff.py | 7 ++-- src/PIL/ImageFile.py | 14 ++++++-- src/PIL/PsdImagePlugin.py | 32 ++++++++++++------ 11 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd create mode 100644 Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd create mode 100644 Tests/images/timeout-c8efc3fded6426986ba867a399791bae544f59bc.psd create mode 100644 Tests/images/timeout-dedc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd diff --git a/Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd b/Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd new file mode 100644 index 0000000000000000000000000000000000000000..63319e545a2593478112aad29e35407eb8705234 GIT binary patch literal 555361 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 QdhB{QCaj0=T*FuXKVU6>U;qFB literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd b/Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd new file mode 100644 index 0000000000000000000000000000000000000000..c259a15e7f894b7bb079172aa73fee96ed16cae2 GIT binary patch literal 714605 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 Iu7CIc0hU*;8UO$Q literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-c8efc3fded6426986ba867a399791bae544f59bc.psd b/Tests/images/timeout-c8efc3fded6426986ba867a399791bae544f59bc.psd new file mode 100644 index 0000000000000000000000000000000000000000..955fc332522c8bf23620fe7a964258b72154c299 GIT binary patch literal 1004989 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 >uybkx}7s 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 Z#`HA4&ogI?EO{ntY5(%{|4$JD{{wMtJH!A0 literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-dedc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd b/Tests/images/timeout-dedc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd new file mode 100644 index 0000000000000000000000000000000000000000..c658ea45c4b4ce9c5f3295cc595ecda491f1a3a3 GIT binary patch literal 592243 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 z%0D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 literal 0 HcmV?d00001 diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 80ab92666..db4313375 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -52,6 +52,7 @@ class TestDecompressionBomb: with Image.open(TEST_FILE): pass + @pytest.mark.xfail(reason="different exception") def test_exception_ico(self): with pytest.raises(Image.DecompressionBombError): with Image.open("Tests/images/decompression_bomb.ico"): diff --git a/Tests/test_file_apng.py b/Tests/test_file_apng.py index 97e2a150e..8348da4eb 100644 --- a/Tests/test_file_apng.py +++ b/Tests/test_file_apng.py @@ -312,7 +312,7 @@ def test_apng_syntax_errors(): exception = e assert exception is None - with pytest.raises(SyntaxError): + with pytest.raises(OSError): with Image.open("Tests/images/apng/syntax_num_frames_high.png") as im: im.seek(im.n_frames - 1) im.load() diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index 864607301..f21e4edc5 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -1,4 +1,5 @@ from PIL import Image +import pytest from .helper import assert_image_equal_tofile diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 87373d2c4..8c58310bd 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -130,3 +130,18 @@ def test_combined_larger_than_size(): with pytest.raises(OSError): with Image.open("Tests/images/combined_larger_than_size.psd"): pass + +@pytest.mark.parametrize( + "test_file,raises", + [ + ("Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd", Image.UnidentifiedImageError), + ("Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd", Image.UnidentifiedImageError), + ("Tests/images/timeout-c8efc3fded6426986ba867a399791bae544f59bc.psd", OSError), + ("Tests/images/timeout-dedc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd", OSError), + ], +) +def test_crashes(test_file, raises): + with open(test_file, "rb") as f: + with pytest.raises(raises): + with Image.open(f): + pass diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index ba7f9a084..1bc46ee30 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -625,9 +625,10 @@ class TestFileTiff: ) def test_string_dimension(self): # Assert that an error is raised if one of the dimensions is a string - with pytest.raises(ValueError): - with Image.open("Tests/images/string_dimension.tiff"): - pass + with pytest.raises(OSError): + with Image.open("Tests/images/string_dimension.tiff") as im: + im.load() + @pytest.mark.skipif(not is_win32(), reason="Windows only") diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index f58de95bd..2ed1520fd 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -545,12 +545,18 @@ def _safe_read(fp, size): :param fp: File handle. Must implement a read method. :param size: Number of bytes to read. - :returns: A string containing up to size bytes of data. + :returns: A string containing size bytes of data. + + Raises an OSError if the file is truncated and the read can not be completed + """ if size <= 0: return b"" if size <= SAFEBLOCK: - return fp.read(size) + data = fp.read(size) + if len(data) < size: + raise OSError("Truncated File Read") + return data data = [] while size > 0: block = fp.read(min(size, SAFEBLOCK)) @@ -558,9 +564,13 @@ def _safe_read(fp, size): break data.append(block) size -= len(block) + if sum(len(d) for d in data) < size: + raise OSError("Truncated File Read") return b"".join(data) + + class PyCodecState: def __init__(self): self.xsize = 0 diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index d3799edc3..96de58fe7 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -119,7 +119,8 @@ class PsdImageFile(ImageFile.ImageFile): end = self.fp.tell() + size size = i32(read(4)) if size: - self.layers = _layerinfo(self.fp) + _layer_data = io.BytesIO(ImageFile._safe_read(self.fp, size)) + self.layers = _layerinfo(_layer_data, size) self.fp.seek(end) self.n_frames = len(self.layers) self.is_animated = self.n_frames > 1 @@ -170,12 +171,20 @@ class PsdImageFile(ImageFile.ImageFile): finally: self.__fp = None - -def _layerinfo(file): +def _layerinfo(fp, ct_bytes): # read layerinfo block layers = [] - read = file.read - for i in range(abs(i16(read(2)))): + + def read(size): + return ImageFile._safe_read(fp, size) + + ct = i16(read(2)) + + # sanity check + if ct_bytes < (abs(ct) * 20): + raise SyntaxError("Layer block too short for number of layers requested") + + for i in range(abs(ct)): # bounding box y0 = i32(read(4)) @@ -186,7 +195,8 @@ def _layerinfo(file): # image info info = [] mode = [] - types = list(range(i16(read(2)))) + ct_types = i16(read(2)) + types = list(range(ct_types)) if len(types) > 4: continue @@ -219,16 +229,16 @@ def _layerinfo(file): size = i32(read(4)) # length of the extra data field combined = 0 if size: - data_end = file.tell() + size + data_end = fp.tell() + size length = i32(read(4)) if length: - file.seek(length - 16, io.SEEK_CUR) + fp.seek(length - 16, io.SEEK_CUR) combined += length + 4 length = i32(read(4)) if length: - file.seek(length, io.SEEK_CUR) + fp.seek(length, io.SEEK_CUR) combined += length + 4 length = i8(read(1)) @@ -238,7 +248,7 @@ def _layerinfo(file): name = read(length).decode("latin-1", "replace") combined += length + 1 - file.seek(data_end) + fp.seek(data_end) layers.append((name, mode, (x0, y0, x1, y1))) # get tiles @@ -246,7 +256,7 @@ def _layerinfo(file): for name, mode, bbox in layers: tile = [] for m in mode: - t = _maketile(file, m, bbox, 1) + t = _maketile(fp, m, bbox, 1) if t: tile.extend(t) layers[i] = name, mode, bbox, tile From 496245aa4365d0827390bd0b6fbd11287453b3a1 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 7 Mar 2021 19:00:17 +0100 Subject: [PATCH 516/750] Fix BLP DOS -- CVE-2021-28678 * BlpImagePlugin did not properly check that reads after jumping to file offsets returned data. This could lead to a DOS where the decoder could be run a large number of times on empty data * This dates to Pillow 5.1.0 --- ...0745d3f534ad6e4128c51d336ea5489182c69d.blp | Bin 0 -> 284 bytes ...c8f86233ea728339c6e586be7af661a09b5b98.blp | Bin 0 -> 187 bytes ...d8b7c8469d59fc9ffff6b3a3dc0faeae6ea8ee.blp | Bin 0 -> 148 bytes ...73b430977660cdd48d96f6406ddfd4114e69c7.blp | Bin 0 -> 1335 bytes ...a4f2e026b5786529370e5dfe9a11b1bf991f07.blp | Bin 0 -> 571 bytes ...ec061c4afdef39d3edf6da8927240bb07fe9b7.blp | Bin 0 -> 1539 bytes ...9112a065e7183fa7faa2e18929b03e44ee16bf.blp | Bin 0 -> 889 bytes Tests/test_file_blp.py | 19 ++++++++ src/PIL/BlpImagePlugin.py | 43 ++++++++++-------- 9 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 Tests/images/timeout-060745d3f534ad6e4128c51d336ea5489182c69d.blp create mode 100644 Tests/images/timeout-31c8f86233ea728339c6e586be7af661a09b5b98.blp create mode 100644 Tests/images/timeout-60d8b7c8469d59fc9ffff6b3a3dc0faeae6ea8ee.blp create mode 100644 Tests/images/timeout-8073b430977660cdd48d96f6406ddfd4114e69c7.blp create mode 100644 Tests/images/timeout-bba4f2e026b5786529370e5dfe9a11b1bf991f07.blp create mode 100644 Tests/images/timeout-d6ec061c4afdef39d3edf6da8927240bb07fe9b7.blp create mode 100644 Tests/images/timeout-ef9112a065e7183fa7faa2e18929b03e44ee16bf.blp diff --git a/Tests/images/timeout-060745d3f534ad6e4128c51d336ea5489182c69d.blp b/Tests/images/timeout-060745d3f534ad6e4128c51d336ea5489182c69d.blp new file mode 100644 index 0000000000000000000000000000000000000000..97def320f3a634b82661d058c90fbf6353b133bd GIT binary patch literal 284 zcmZ?r2{2-0U|?WkWPs7E3=A$n31Q literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-31c8f86233ea728339c6e586be7af661a09b5b98.blp b/Tests/images/timeout-31c8f86233ea728339c6e586be7af661a09b5b98.blp new file mode 100644 index 0000000000000000000000000000000000000000..73022abfc4ecc1069923c50e0c07cdc48f5fffc3 GIT binary patch literal 187 zcmZ?r2{2-0U|?WkWMG8R0zf_pPhnwT5Mf2-0fkLi8EjY?7+ioD6a0q)gbYZ4fq{_$ z8?CTpp}>k)uVyt^DlGZ?@87=%3Jk@XK!pdg9u)lp(h5PFKp>&{=ck|lA7n1fUblYL HDwtsay1ha# literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-60d8b7c8469d59fc9ffff6b3a3dc0faeae6ea8ee.blp b/Tests/images/timeout-60d8b7c8469d59fc9ffff6b3a3dc0faeae6ea8ee.blp new file mode 100644 index 0000000000000000000000000000000000000000..79e97dce357001112099125d82ceaee78afdfe8a GIT binary patch literal 148 zcmZ?r2{2-0U|?WkWMBl*ASMF?lm+3#NcJCZ&%xLb60z)DS3I-8$ zF+^Bah?@$;B>Ll~M_6srMP{@ZT4XCLh=?MJ>`kk{EY0!2<-2^Bd+vA6`EH;pTx)mgVirk+t9Pp}*XL$YI~1%2-pnj6#z^H@7S_UfnWD8R`s)j%)ILj~^ItaaLc6b^7Y5N4`N*n6$eK=M zQ$JF84k;-@cDz6W9Y|#^vS%3C9|}w3OQfX{X?3x^7&+aBoF7EG-XZY<rrkRq^N_CxP~vFjQ#8wquHKHWYeDl|uFx^_ z3O)E5J?cS^ZA6ckp&bqA*%N5&w?g|y&;bX%`4Am;@%|muxq&|EMaN_4WE+}@pi`yj zw4fi}pkGEv`w_!Ruf!4$R`w89PCeH8&sh1LJ_3>2x{7`FUc07x^Gy9NyQ-py!_Wke FegY3NWdHyG literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-bba4f2e026b5786529370e5dfe9a11b1bf991f07.blp b/Tests/images/timeout-bba4f2e026b5786529370e5dfe9a11b1bf991f07.blp new file mode 100644 index 0000000000000000000000000000000000000000..cb9a4e8b37fd22d3f1a82092775a07cdd709c489 GIT binary patch literal 571 zcmZ?r2{2-0U|?VZVi3*9Aix|Cq(R{S|NmM*G5#}N|Ic`x(fa=Xe?3s>|Nk?2XSBc~ zU=C1H3&H@?K;r7<@b~kDwJdrBHYOdJ9JptatoO6ck^u`iIAk6iVE*64#;fq)!NF!W zHnEBc35OV4*n}lwEG!e97uOy~i7v7^EZ=1RM@9FfoZpC@@S|z{mn}@BjbrArz1V z`4HI?P~U-k4V2vuR|jW+B=CBZk&zs4;`avJb`%CXpAv(CfZ_p0aXuxN2?0vSSlI-n zEM`1-(Adl&Zb_9pGYpj7I0cmy5)uw5xbX<=@oxB_-~bGc|Nk8r dS-HF1!B#=SCgOoYB?q%0Pm6@((O3rtYXE*Z_X+?2 literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-d6ec061c4afdef39d3edf6da8927240bb07fe9b7.blp b/Tests/images/timeout-d6ec061c4afdef39d3edf6da8927240bb07fe9b7.blp new file mode 100644 index 0000000000000000000000000000000000000000..5044fbde10746e277ecb686074990c6872b8c8e4 GIT binary patch literal 1539 zcmds%T}YE*6vv+pWhRO%KguY#%KRvuOH3uTy)NwoO-v#qR#MW3#7a>rwfv}=W|@^) zga#IbAhm8H>?Q|MnKxd=u#3D6g@SGhw)X4U*21qFA&7e5aL)gEo^#Is`Jb29TwI#2 z5<;j|8m-rBg$TMWeN?az8PamcvcGGjFOW88DRb~F*dmc$T8Ok?OY4ni;K2UEJ_Q3t zHj%+*ve-fn`6eK58-;9V7ey3PLMdhJWgq)FfQ5rpaD+;Za-1sK1zBo>2u4FFVT2RG zQX+|FIkBu{6>;cU%X$(>Vgo6hrJhF4(?ly5v2mFWI=RMmy17Y=KVc2)WJ;n;*+?pB zl4QChnMJlFnY$HCm^sF4nIcwv;}b7v$I5AHsHM)=qQTdqWq}qw#H>a~phfbm7JhaY zX#UM^M%cj>NwkX_+@gnG?h@^dwq3CnozGm>Sg*?^f5xKQ15dl;=%B zK3o;wUq0SYI!Q!}>5?2ym@)X#S6Of3izdv|eAQ(h)YfTjhdx{1yd1%73@L1#`sjS6 zOcjk7l04jZSH3e2R(?=o+rmo<{>Iqz<`3){)wFjC+$y%hJ;WF`A6j^ONG99 literal 0 HcmV?d00001 diff --git a/Tests/images/timeout-ef9112a065e7183fa7faa2e18929b03e44ee16bf.blp b/Tests/images/timeout-ef9112a065e7183fa7faa2e18929b03e44ee16bf.blp new file mode 100644 index 0000000000000000000000000000000000000000..7ef78eeec77130e54c6c0e0117acd71efba393be GIT binary patch literal 889 zcmc(dzityj5XN`r3M7}fj0>Fd5Dg9;DKH%biGtHs(LMlnX}f~u1#ssWs4S#IzAcj0 zNx>6D!c@U-++RUtHxYZ%F5jFGLexl%PWs)q^Jhmh+dX=IpOjLpZYd$THG7^E&Us#Q zD6iuWaAXJi9On+U;&YyZYhG{}Li`3DW3(&iE3Nf{-?5v`+!W^$zu+mKR@MrmHrbR% zJfF?sABw*emOcid9hq#%C(P(%$Qk^l6M7%x0KBp$%lHA`L4kwX@7xPM;Ia%>c!T;K zFh}7g2&5fuva71sLNmy+9d+uyn!F|W{f=()J^XAz=NgSI?I=wfYDrtl@;u+tlI+Hg zgaP+|p|6tXmUKp#gBSV`t#D&>c1B~Gy_wI)(9*{#w5wteTJ+ZkG2gMHJ|WG#1${84 z2g=-g^o%~DaG#zM#v5PK5m{^WUFy~MwvxjHVeT+#CBBOBA$ajQ7@;-hcn{3-Nl|et z`G7#7^t+c-{M}bU7>pfxu6XjkDAr(6D{ja^-XpYys;!rx{wu>XjF(R?(?4kc Kv;E!AZ~YVD?RFFZ literal 0 HcmV?d00001 diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index f21e4edc5..6f6634251 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -17,3 +17,22 @@ def test_load_blp2_dxt1(): def test_load_blp2_dxt1a(): with Image.open("Tests/images/blp/blp2_dxt1a.blp") as im: assert_image_equal_tofile(im, "Tests/images/blp/blp2_dxt1a.png") + + +@pytest.mark.parametrize( + "test_file", + [ + "Tests/images/timeout-060745d3f534ad6e4128c51d336ea5489182c69d.blp", + "Tests/images/timeout-31c8f86233ea728339c6e586be7af661a09b5b98.blp", + "Tests/images/timeout-60d8b7c8469d59fc9ffff6b3a3dc0faeae6ea8ee.blp", + "Tests/images/timeout-8073b430977660cdd48d96f6406ddfd4114e69c7.blp", + "Tests/images/timeout-bba4f2e026b5786529370e5dfe9a11b1bf991f07.blp", + "Tests/images/timeout-d6ec061c4afdef39d3edf6da8927240bb07fe9b7.blp", + "Tests/images/timeout-ef9112a065e7183fa7faa2e18929b03e44ee16bf.blp", + ], +) +def test_crashes(test_file): + with open(test_file, "rb") as f: + with Image.open(f) as im: + with pytest.raises(OSError): + im.load() diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index 88aae80eb..e07474621 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -286,33 +286,36 @@ class _BLPBaseDecoder(ImageFile.PyDecoder): raise OSError("Truncated Blp file") from e return 0, 0 + def _safe_read(self, length): + return ImageFile._safe_read(self.fd, length) + def _read_palette(self): ret = [] for i in range(256): try: - b, g, r, a = struct.unpack("<4B", self.fd.read(4)) + b, g, r, a = struct.unpack("<4B", self._safe_read(4)) except struct.error: break ret.append((b, g, r, a)) return ret def _read_blp_header(self): - (self._blp_compression,) = struct.unpack(" Date: Thu, 1 Apr 2021 17:26:24 +0300 Subject: [PATCH 517/750] Reorder, roughly alphabetic --- docs/releasenotes/8.2.0.rst | 88 ++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 7ba5fc4a3..912af3ad2 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -4,12 +4,6 @@ Deprecations ============ -Tk/Tcl 8.4 -^^^^^^^^^^ - -Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), -when Tk/Tcl 8.5 will be the minimum supported. - Categories ^^^^^^^^^^ @@ -20,6 +14,12 @@ along with the related ``Image.NORMAL``, ``Image.SEQUENCE`` and To determine if an image has multiple frames or not, ``getattr(im, "is_animated", False)`` can be used instead. +Tk/Tcl 8.4 +^^^^^^^^^^ + +Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +when Tk/Tcl 8.5 will be the minimum supported. + API Changes =========== @@ -56,6 +56,20 @@ can be used. API Additions ============= +getxmp() for JPEG images +^^^^^^^^^^^^^^^^^^^^^^^^ + +A new method has been added to return +`XMP data `_ for JPEG +images. It reads the XML data into a dictionary of names and values. + +For example:: + + >>> from PIL import Image + >>> with Image.open("Tests/images/xmp_test.jpg") as im: + >>> print(im.getxmp()) + {'RDF': {}, 'Description': {'Version': '10.4', 'ProcessVersion': '10.0', ...}, ...} + ImageDraw.rounded_rectangle ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -71,17 +85,13 @@ create a circle, but not any other ellipse. draw = ImageDraw.Draw(im) draw.rounded_rectangle(xy=(10, 20, 190, 180), radius=30, fill="red") -ImageShow.IPythonViewer -^^^^^^^^^^^^^^^^^^^^^^^ +ImageOps.autocontrast: preserve_tone +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If IPython is present, this new :py:class:`PIL.ImageShow.Viewer` subclass will be -registered. It displays images on all IPython frontends. This will be helpful -to users of Google Colab, allowing ``im.show()`` to display images. - -It is lower in priority than the other default :py:class:`PIL.ImageShow.Viewer` -instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show()` -if none of the other viewers are available. This means that the behaviour of -:py:class:`PIL.ImageShow` will stay the same for most Pillow users. +The default behaviour of :py:meth:`~PIL.ImageOps.autocontrast` is to normalize +separate histograms for each color channel, changing the tone of the image. The new +``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram +for all channels. ImageShow.GmDisplayViewer ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -95,6 +105,18 @@ counterpart. Thus, if both ImageMagick and GraphicsMagick are installed, ImageMagick, i.e the behaviour stays the same for Pillow users having ImageMagick installed. +ImageShow.IPythonViewer +^^^^^^^^^^^^^^^^^^^^^^^ + +If IPython is present, this new :py:class:`PIL.ImageShow.Viewer` subclass will be +registered. It displays images on all IPython frontends. This will be helpful +to users of Google Colab, allowing ``im.show()`` to display images. + +It is lower in priority than the other default :py:class:`PIL.ImageShow.Viewer` +instances, so it will only be used by ``im.show()`` or :py:func:`.ImageShow.show()` +if none of the other viewers are available. This means that the behaviour of +:py:class:`PIL.ImageShow` will stay the same for most Pillow users. + Saving TIFF with ICC profile ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -104,28 +126,6 @@ be specified through a keyword argument:: im.save("out.tif", icc_profile=...) -ImageOps.autocontrast: preserve_tone -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The default behaviour of :py:meth:`~PIL.ImageOps.autocontrast` is to normalize -separate histograms for each color channel, changing the tone of the image. The new -``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram -for all channels. - -getxmp() for JPEG images -^^^^^^^^^^^^^^^^^^^^^^^^ - -A new method has been added to return -`XMP data `_ for JPEG -images. It reads the XML data into a dictionary of names and values. - -For example:: - - >>> from PIL import Image - >>> with Image.open("Tests/images/xmp_test.jpg") as im: - >>> print(im.getxmp()) - {'RDF': {}, 'Description': {'Version': '10.4', 'ProcessVersion': '10.0', ...}, ...} - Security ======== @@ -195,6 +195,12 @@ The pixel data is encoded using the format specified in the `CompuServe GIF stan The older encoder used a variant of run-length encoding that was compatible but less efficient. +GraphicsMagick +^^^^^^^^^^^^^^ + +The test suite can now be run on systems which have GraphicsMagick_ but not +ImageMagick_ installed. If both are installed, the tests prefer ImageMagick. + Libraqm and FriBiDi linking ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -219,12 +225,6 @@ PyQt6 Support has been added for PyQt6. If it is installed, it will be used instead of PySide6, PyQt5 or PySide2. -GraphicsMagick -^^^^^^^^^^^^^^ - -The test suite can now be run on systems which have GraphicsMagick_ but not -ImageMagick_ installed. If both are installed, the tests prefer ImageMagick. - .. _GraphicsMagick: http://www.graphicsmagick.org/ .. _ImageMagick: https://imagemagick.org/ .. _OSS-Fuzz: https://github.com/google/oss-fuzz From 8febdad8dd51ad5c75a1db78492973588c7cbf6b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 1 Apr 2021 17:41:46 +0300 Subject: [PATCH 518/750] Review, typos and lint --- Tests/test_file_blp.py | 3 ++- Tests/test_file_eps.py | 5 ++--- Tests/test_file_psd.py | 11 +++++++++-- Tests/test_file_tiff.py | 5 ++--- src/PIL/ImageFile.py | 4 +--- src/PIL/PsdImagePlugin.py | 1 + src/libImaging/FliDecode.c | 2 +- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index 6f6634251..15bd7e4f8 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -1,6 +1,7 @@ -from PIL import Image import pytest +from PIL import Image + from .helper import assert_image_equal_tofile diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index e616ffa0c..7caac34c3 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,4 +1,5 @@ import io + import pytest from PIL import EpsImagePlugin, Image, features @@ -268,9 +269,7 @@ def test_emptyline(): @pytest.mark.timeout(timeout=5) @pytest.mark.parametrize( "test_file", - [ - ("Tests/images/timeout-d675703545fee17acab56e5fec644c19979175de.eps") - ], + ["Tests/images/timeout-d675703545fee17acab56e5fec644c19979175de.eps"], ) def test_timeout(test_file): with open(test_file, "rb") as f: diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 8c58310bd..bf2a5fea0 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -131,11 +131,18 @@ def test_combined_larger_than_size(): with Image.open("Tests/images/combined_larger_than_size.psd"): pass + @pytest.mark.parametrize( "test_file,raises", [ - ("Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd", Image.UnidentifiedImageError), - ("Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd", Image.UnidentifiedImageError), + ( + "Tests/images/timeout-1ee28a249896e05b83840ae8140622de8e648ba9.psd", + Image.UnidentifiedImageError, + ), + ( + "Tests/images/timeout-598843abc37fc080ec36a2699ebbd44f795d3a6f.psd", + Image.UnidentifiedImageError, + ), ("Tests/images/timeout-c8efc3fded6426986ba867a399791bae544f59bc.psd", OSError), ("Tests/images/timeout-dedc7a4ebd856d79b4359bbcc79e8ef231ce38f6.psd", OSError), ], diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 1bc46ee30..c24438c48 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -625,12 +625,11 @@ class TestFileTiff: ) def test_string_dimension(self): # Assert that an error is raised if one of the dimensions is a string - with pytest.raises(OSError): - with Image.open("Tests/images/string_dimension.tiff") as im: + with Image.open("Tests/images/string_dimension.tiff") as im: + with pytest.raises(OSError): im.load() - @pytest.mark.skipif(not is_win32(), reason="Windows only") class TestFileTiffW32: def test_fd_leak(self, tmp_path): diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 2ed1520fd..0258a2ec1 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -547,7 +547,7 @@ def _safe_read(fp, size): :param size: Number of bytes to read. :returns: A string containing size bytes of data. - Raises an OSError if the file is truncated and the read can not be completed + Raises an OSError if the file is truncated and the read cannot be completed """ if size <= 0: @@ -569,8 +569,6 @@ def _safe_read(fp, size): return b"".join(data) - - class PyCodecState: def __init__(self): self.xsize = 0 diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index 96de58fe7..e7b884674 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -171,6 +171,7 @@ class PsdImageFile(ImageFile.ImageFile): finally: self.__fp = None + def _layerinfo(fp, ct_bytes): # read layerinfo block layers = [] diff --git a/src/libImaging/FliDecode.c b/src/libImaging/FliDecode.c index 35a6ccccc..3a6030703 100644 --- a/src/libImaging/FliDecode.c +++ b/src/libImaging/FliDecode.c @@ -244,7 +244,7 @@ ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt } advance = I32(ptr); if (advance == 0 ) { - // If there's no advance, we're in in infinite loop + // If there's no advance, we're in an infinite loop state->errcode = IMAGING_CODEC_BROKEN; return -1; } From 694c84f88f4299319bac49b20bd9baae82ca41b8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 1 Apr 2021 20:00:13 +0300 Subject: [PATCH 519/750] Fix typo [ci skip] Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/libImaging/Jpeg2KDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index aa4fc58f7..f086848e9 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -829,7 +829,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { /* Total component width = sum (component_width) e.g, it's legal for an la file to have a 1 byte width for l, and 4 for - a. and then a malicious file could have a smaller tile_bytes + a, and then a malicious file could have a smaller tile_bytes */ for (n=0; n < tile_info.nb_comps; n++) { From 7387ec23ac22558809f67fbaf2dc3076a0fa8939 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 31 Mar 2021 08:40:28 +1100 Subject: [PATCH 520/750] Revert "Removed return value of build_distance_tables" This reverts commit a4a38b805b524f0fdb0d1feca83ca73d3ccfff0b. --- src/libImaging/Quant.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index 8ec99699f..17b75b4c2 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -789,7 +789,7 @@ resort_distance_tables( return 1; } -static void +static int build_distance_tables( uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) { uint32_t i, j; @@ -811,6 +811,7 @@ build_distance_tables( sizeof(uint32_t *), _sort_ulong_ptr_keys); } + return 1; } static int @@ -1372,7 +1373,9 @@ quantize( goto error_6; } - build_distance_tables(avgDist, avgDistSortKey, p, nPaletteEntries); + if (!build_distance_tables(avgDist, avgDistSortKey, p, nPaletteEntries)) { + goto error_7; + } if (!map_image_pixels_from_median_box( pixelData, nPixels, p, nPaletteEntries, h, avgDist, avgDistSortKey, qp)) { @@ -1577,7 +1580,9 @@ quantize2( goto error_3; } - build_distance_tables(avgDist, avgDistSortKey, p, nQuantPixels); + if (!build_distance_tables(avgDist, avgDistSortKey, p, nQuantPixels)) { + goto error_4; + } if (!map_image_pixels( pixelData, nPixels, p, nQuantPixels, avgDist, avgDistSortKey, qp)) { From 6541bd7cb5e43b78a88b16cb1cd0255db11f07df Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 31 Mar 2021 09:05:19 +1100 Subject: [PATCH 521/750] Added second attribute to avoid unstable nature of qsort --- Tests/images/hopper_resized.gif | Bin 0 -> 5226 bytes Tests/test_image_resize.py | 18 +++++++++++- src/libImaging/Quant.c | 48 +++++++++++++++++++++++++------- 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 Tests/images/hopper_resized.gif diff --git a/Tests/images/hopper_resized.gif b/Tests/images/hopper_resized.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7be6c26298faca89ddaf52335d21c1ff934b5ec GIT binary patch literal 5226 zcmWlc2{e@Z8^;I346~0hGxnh|WXVoMUS=?c5i+(?_H{^#C~0QwYcsNix=fUP3q`ug zP6)SDT5cikbVM|{cb>EfA~(y8Ub=*7IS$NZ?- z-0+@)q{_m=1pcG6{F|o)b8%OuPZdqY3MOOtlcz4voVq+3mp91fPqHshL|>j@Umjx@ zPO%Foq6;2H6;4JKOoWMQ{zPQ%cxdieP|nDUjF5$tpr`3apItaI#`T^^_Uz@Jynp`K zqj=WjDdW3wuD#LDL*b5HVf5}}N4k7XO1T#*&cxM3+LT97Pjg!@o=ZuI4vLLDBMfk< z2{66xZCk@K%L{NWU|C0>j5+P+6p%S`B5lZ*H{i<|@Jaohb@9IM`MXEY_q!+E_e!{Z zB(dK$;hxKxK9|#X8S%Z0_#UUYJC3nk&g^CfcDH?W7cKfWEvlUs*=fh_wu|hdMzz_8 zciKgC0O1|}$HRR+Lu`)=nw_l5osBY`&AEV18(IGfLYAYcm@0$ucV--MbU9{i>SXN@ zaX`)0K--H%4n)ZvvJbT~r&${w($lv!*0iu7lgMOein{Irc?~t9t}?+!g`i@L!ckCI z6)af=iI!KT5|y0g6##;~8=k0-Colyv6ap@)2sj)Gfg{l}6d4(H1WXPNl|#v3;4rkbG#Vv?K+8a2 zGH`^bfT6k|(e>+J0HAxIEQHR8i>IzfElq%RV0bnkCT4Fn6h}FeofM!@t*!CPjy4yz z)?QGtN3L5X?Y#0$)_i=u?84{G7iT`WUNa3HFSfnnFfReQsLfO(y#?w*zcGs63bh#8 zZVhPrcek>^7#S(}K_^;+bDFr+f$UH5Yk-{1sm<9MV+cywGGTQ}@MUyb(LCuz{YTj* zkH*jrdX7SWzF&jSn1TQH@Z+OGKpjta0D9x!gJC3>dO&@aa`EygUw&U$ez{@&Sh4(2 zUqZP-gIk8s9KmYvspqLRIsQew?dq)+C|zVffg&^P0Dv=)B@Tv?w1DaWUV^IKPomm( zkYl0Z!NKJ{K38I_K+!5`)91krF~Ug!<+a}^Tj4%4GuJ8t5Ti+Q$nCm9TBH+Hnp$Dv zzB4qALfi1*0<`TgUWa&M7U-~(g5%Y^+q2z`q>##%?AeIZFz@@`o^+ggNH$u{u@H*! z-))RKo-S7b20SDARuIf*?q2lynphg1Hu4GkCpW~)M2nYPC z#{ubb%88e)g0#_sYj@6VKA#BwFkNYtwBGr#NgV{@h-*~Ebqt4tI1&}-w->u%r8<6B z{X6`+8y7x=O<#Yy7`6$|l{eDn-z|QubSUxjzdjIv`cMkEgm;J2h>L3ZU z2Lg!^b-OK}?mqo;^wx2WFRWJYwy4P>>%3K+V_j!gntg9bWl`(2$JPZ3QjB6P&!M24 zTn%Rd-cx8~+cBIW5)sNonGwJNxZ+YcrZy;mBXuzD)v$mXUUzhe0Hwc-)+7{qra*DFug_;^CzHYsH4-3<`?vMMtI|5sataB(imZ|;R;Mm?2-=ax# z!YK`kJCIFO8-}7uq}1IXbL2b{;8O$=|GMm$jhWQHJH9k1nI~uHRiAArkyWT{*7HZi z9PdR-)Q4Qd;8pe&HM>kW0&6P{<&zy(RWY6+(nV^AIUGJoj0Be6R}He;SxJ{hsvb`P zIv!GKC~d8q^ctRnL%~$+kBz~B2{q?ts#}JAb|IWxpAZ|MK_D%X{Z` zb{Y=dLMr!!Ow0x@n>9=p?>}y$k=EVxRL7?;V9u|OA=l#fw6SGR$U?;5X1^H!c%h3c zk#S)6Nk{aZBiAVOT=aH>Q5|g^esQha#_Xl%<3<`JXSuG z`0j3C+Pb@jZ^s&Q&aI9?p+RJT$+MDw=$?F#%H0=^+EZ;i`5@_i)HiK{KGXkZ#6Kga zPFjVhzImJc2c@HOB=${v@{|Kp!6br_gY9-%FmSK3H>5gfFy5-d?+pnqiKnep?Pw8Uc$4zD<7Q8^#lI-7Xp=*QUqf+w-jeWA2Qh9&dVFywBWUK2r@o(A4iqvX38fwKjwj0(CN2hfFT*Z}k`cN#cb zO*8&gwVDJ3PCOVea5r#B3ZY=OJ3lZB@iuj8C>8DPBffLN_NKWJL@JseK=0Q{mN+#T5ab-fbJ$ZT5SLfNO-!viQQWCcl>{hLNsa@CC zE*%hK{01iYyGy4KXBq+;`>dt zo@cN>YsEq0Zd&SKQS)Re5wrtUd!s+}*u)z9;z}WL100bfUEI35 zuMF|BJFHvXkhm2vSs&CCHtjKz>tpD55BZ;b*S9PUpDL?u1;UK-q4)*i>kGq6;`>rJ z-gQTp6;_&``rLoo_*S9vy^B9~8mL*Z$IN0Dr{0U;@7ooAE8x>RS`KC(qnP4b5i&7< zlUXHtdvnvbEovtJo5HuCUo@eO*x561+JW`75#AGf7{&dn5Xdc=kmf>ijhxmcq~~u~ zCw|`KUU5VzTbx;a-f-o^%ysK?UpFzAZp|o~gih5SVKw56-5vrt*o<`_1NV-b`*YQu zJt*kwSFYsw}z1T^3xZ8fxIi}#CxaY^q)tBZ?E!6OFN<|RNNaixQ@V>8N@=Qr2p zjye`rSthIuU!^9xRvnBbLeT>w3th5sC6`|NHbz|}Us#JRS+^5&C?+cB;&O(0QbYyv z8g{=RSX&ZWl^mRftg<+3v@D|9WfhAvo7p|f4h7A!7jK5H50L<_V<%eKU^X0E>|PVQ zv^@4$R?{KB&&>%J>7lNDq>n#4KjI{G?&B?Wq={5v@q9Vr+|X-;qFL0F+C4SN#-irH zM~zn6tdFH_aE->0KA}@(TjHO!k@p;ts)sqhC;j)2WQ=0l$xlDGHwZKSR-vhj{eibB z1r=sd3+#}gQG}vt)NHw}2IEO*@WY^-pyd3k^?_3^{&VC4fAf^LyW7jsQ<^pb1F8S* ztVowXNd0H4TjxWTi-K|3WVzwd(R_Im-#^&?w;h=K-G!wS3Y5uat&kbsNJZvHMr+)5 z(rL!mVP1x$3|_ZAKujDgiKe);17v|_>V}HIf*LlpJQhm6EPr&gQ{Fh3=we|ggRS?e z<>gdl!b`LQ%Uf4=92;O*3|`x(x&`#`lO!6zsRcc}169vS{UJ@I?7@kK0R!2A2Pji# z)*eIP^&WauG05fgnm$&GNB#MV)`-5^&^)}}u^uQEH!cH~gyL~8uv&aMJwL3W<#2?| zfJ(qXidgXMqq6jq{V9>(NAd`oB}NI_wr_1UJbNhaIpji>n>zV?kl(NtrqsUDOnOqd z0?Agh{R#E!sz+CAcqblCo(p!oTy33%{uJ1iRi*cK@->bbT)L4fD+BQ1hU&B&Q5L4;0|9Zab2EaUV7+?n$ z3!&MKs~)yXH}KGU#K)-Pe6+TCnJ|K`kH|G799@+}w4V)3bI6kt3^Uh*WnOdz-!ape z+yYV4pmJL5jz#)7Se21)B5EV2h{7x-{!mi`<8{d=`l|)YnQ**mQ1dU>Kqy-#u5CF7 zV{5~*(MuJXo29pznLkbTA^g(3T-%@Dd}5ccD9L z;dszzv1I3V-Ck&fpc<1ya#|X&9mzsbtjbLq?Cf)K+CI;##jcEYhAvOG01HRB2;#@`}l;|(_&(yH2r1$U8sJHhB` z(Xp8H76BlsfTdq1s#BKeH(gcG_;vho9zxOTmx)RuPJi7>n5h1!YI*Ya_5>KDRoNhU zZIdP8GyUv=wzxPM@BrtMY`N`dc@SqnoeL8}gJiF&{9PNmziMf!a|7U;Vr|;V^g6px{a4`_H+AUBFj1|!t%F$A73)!2iw!QFe z@@b>*ZLgL_R-T;ck=}gPc`i??P|DM4JLpbmt9`N8_b~XKJQp|m{By3 zeZ#(R;eW^zzo)D}sTs;FfYqkHc=O-Ccl2MkhPS(ZJTKYA((!BbY+-msvszePQBR}H zS{KdEjn9+=wo7*Eshj-`k3{@7kNs=q{+HG1Ykg;4%!o~u>G^f~-*dGFRmX9J36B#W zT7HXq)*aRD*$~fa^6U2NYUDOAOkcl$smLX+I*wcP;LPhMb$S1brI?%&t+V$f(N#1y zeCYH&Q{plw26B*eNnTxlvfro8)s|J4>(vw86~%J)ifOVw^>&oC?8ubKk|7^l3Vv4j zy6?EFQgQuYhO;V7Fn)DkIP!IG^y7S%8VCTS>|0%0Jn9-tT3xT5^^GF;V)g}1ru;Da zu<_b5MKn|1{*Wahsr}%|>F6=nKWib9Dx#DT(31wq-3=W2d(+q0tC3-# z&ig}UpB7D{Uw~F~Lng|MLMO5@kGdN$d`#NUfbty)S*sERgM{hRCwuDR;-48O&E2rGLmVJLd Yq}k_o*n>XS25Z{4GkSam3distance == *B->distance) { + return A->index < B->index ? -1 : +1; + } + return *A->distance < *B->distance ? -1 : +1; } static int @@ -793,24 +801,42 @@ static int build_distance_tables( uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) { uint32_t i, j; + DistanceWithIndex *dwi; + dwi = calloc(nEntries * nEntries, sizeof(DistanceWithIndex)); + if (!dwi) { + return 0; + } for (i = 0; i < nEntries; i++) { avgDist[i * nEntries + i] = 0; - avgDistSortKey[i * nEntries + i] = &(avgDist[i * nEntries + i]); + dwi[i * nEntries + i] = (DistanceWithIndex){ + &(avgDist[i * nEntries + i]), + i * nEntries + i + }; for (j = 0; j < i; j++) { avgDist[j * nEntries + i] = avgDist[i * nEntries + j] = _DISTSQR(p + i, p + j); - avgDistSortKey[j * nEntries + i] = &(avgDist[j * nEntries + i]); - avgDistSortKey[i * nEntries + j] = &(avgDist[i * nEntries + j]); + dwi[j * nEntries + i] = (DistanceWithIndex){ + &(avgDist[j * nEntries + i]), + j * nEntries + i + }; + dwi[i * nEntries + j] = (DistanceWithIndex){ + &(avgDist[i * nEntries + j]), + i * nEntries + j + }; } } for (i = 0; i < nEntries; i++) { qsort( - avgDistSortKey + i * nEntries, + dwi + i * nEntries, nEntries, - sizeof(uint32_t *), + sizeof(DistanceWithIndex), _sort_ulong_ptr_keys); + for (j = 0; j < nEntries; j++) { + avgDistSortKey[i * nEntries + j] = dwi[i * nEntries + j].distance; + } } + free(dwi); return 1; } @@ -1176,8 +1202,10 @@ k_means( if (!built) { compute_palette_from_quantized_pixels( pixelData, nPixels, paletteData, nPaletteEntries, avg, count, qp); - build_distance_tables( - avgDist, avgDistSortKey, paletteData, nPaletteEntries); + if (!build_distance_tables( + avgDist, avgDistSortKey, paletteData, nPaletteEntries)) { + goto error_3; + } built = 1; } else { recompute_palette_from_averages(paletteData, nPaletteEntries, avg, count); From e0e353c0ef7516979a9aedce3792596649ce4433 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 1 Apr 2021 20:58:27 +0300 Subject: [PATCH 522/750] 8.2.0 version bump --- CHANGES.rst | 2 +- src/PIL/_version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2b685b309..84eb79ec1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,7 +2,7 @@ Changelog (Pillow) ================== -8.2.0 (unreleased) +8.2.0 (2021-04-01) ------------------ - Added getxmp() method #5144 diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 20e8754a4..8fe6294f1 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = "8.2.0.dev0" +__version__ = "8.2.0" From 330f77ae7a6db0d28d5b2be7fea86d723864b087 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 1 Apr 2021 23:56:43 +0300 Subject: [PATCH 523/750] 8.3.0.dev0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 8fe6294f1..8300b60e5 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = "8.2.0" +__version__ = "8.3.0.dev0" From ed8064df22f7913a2f9fce49df0260f5deef15f2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Apr 2021 18:07:03 +1100 Subject: [PATCH 524/750] Removed Fedora 32 docker job --- .github/workflows/test-docker.yml | 1 - docs/installation.rst | 2 -- 2 files changed, 3 deletions(-) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 2ecc27460..051f7865e 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -21,7 +21,6 @@ jobs: centos-7-amd64, centos-8-amd64, debian-10-buster-x86, - fedora-32-amd64, fedora-33-amd64, ubuntu-18.04-bionic-amd64, ubuntu-20.04-focal-amd64, diff --git a/docs/installation.rst b/docs/installation.rst index cc9c51039..be0ed84a6 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -452,8 +452,6 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | Debian 10 Buster | 3.7 |x86 | +----------------------------------+--------------------------+-----------------------+ -| Fedora 32 | 3.8 |x86-64 | -+----------------------------------+--------------------------+-----------------------+ | Fedora 33 | 3.9 |x86-64 | +----------------------------------+--------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | From 6764650e2a0845466ea6b4aafd5885dcd6a4ea50 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Apr 2021 20:48:06 +1100 Subject: [PATCH 525/750] Reduced memory usage --- src/libImaging/Quant.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index f159737f1..72762232b 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -803,37 +803,35 @@ build_distance_tables( uint32_t i, j; DistanceWithIndex *dwi; - dwi = calloc(nEntries * nEntries, sizeof(DistanceWithIndex)); + for (i = 0; i < nEntries; i++) { + avgDist[i * nEntries + i] = 0; + avgDistSortKey[i * nEntries + i] = &(avgDist[i * nEntries + i]); + for (j = 0; j < i; j++) { + avgDist[j * nEntries + i] = avgDist[i * nEntries + j] = + _DISTSQR(p + i, p + j); + avgDistSortKey[j * nEntries + i] = &(avgDist[j * nEntries + i]); + avgDistSortKey[i * nEntries + j] = &(avgDist[i * nEntries + j]); + } + } + + dwi = calloc(nEntries, sizeof(DistanceWithIndex)); if (!dwi) { return 0; } for (i = 0; i < nEntries; i++) { - avgDist[i * nEntries + i] = 0; - dwi[i * nEntries + i] = (DistanceWithIndex){ - &(avgDist[i * nEntries + i]), - i * nEntries + i - }; - for (j = 0; j < i; j++) { - avgDist[j * nEntries + i] = avgDist[i * nEntries + j] = - _DISTSQR(p + i, p + j); - dwi[j * nEntries + i] = (DistanceWithIndex){ - &(avgDist[j * nEntries + i]), - j * nEntries + i - }; - dwi[i * nEntries + j] = (DistanceWithIndex){ + for (j = 0; j < nEntries; j++) { + dwi[j] = (DistanceWithIndex){ &(avgDist[i * nEntries + j]), - i * nEntries + j + j }; } - } - for (i = 0; i < nEntries; i++) { qsort( - dwi + i * nEntries, + dwi, nEntries, sizeof(DistanceWithIndex), _sort_ulong_ptr_keys); for (j = 0; j < nEntries; j++) { - avgDistSortKey[i * nEntries + j] = dwi[i * nEntries + j].distance; + avgDistSortKey[i * nEntries + j] = dwi[j].distance; } } free(dwi); From a69430047bc1f945677d73b1c888b5e25b052f86 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Apr 2021 21:05:33 +1100 Subject: [PATCH 526/750] Renamed function --- src/libImaging/Quant.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index 72762232b..ea226bcf1 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -759,7 +759,7 @@ typedef struct { } DistanceWithIndex; static int -_sort_ulong_ptr_keys(const void *a, const void *b) { +_distance_index_cmp(const void *a, const void *b) { DistanceWithIndex *A = (DistanceWithIndex *)a; DistanceWithIndex *B = (DistanceWithIndex *)b; if (*A->distance == *B->distance) { @@ -829,7 +829,7 @@ build_distance_tables( dwi, nEntries, sizeof(DistanceWithIndex), - _sort_ulong_ptr_keys); + _distance_index_cmp); for (j = 0; j < nEntries; j++) { avgDistSortKey[i * nEntries + j] = dwi[j].distance; } From 3c129142c818edcca3f9e176f490a1da7ea183fd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Apr 2021 09:34:56 +1100 Subject: [PATCH 527/750] Catch OSError --- Tests/test_file_jpeg2k.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 4f6f415a4..2173d245f 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -269,4 +269,7 @@ def test_crashes(test_file): with open(test_file, "rb") as f: with Image.open(f) as im: # Valgrind should not complain here - im.load() + try: + im.load() + except OSError: + pass From 77a8a53a94b9d1c2cf6ee4ca865fa606cbbda2db Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Apr 2021 13:20:58 +1100 Subject: [PATCH 528/750] Allow converting an image to a numpy array to raise errors --- Tests/test_image_array.py | 40 ++++++++++++++++++++++++++------------- src/PIL/Image.py | 11 ++++++++--- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index 980458407..4dbbdd218 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -4,26 +4,32 @@ from PIL import Image from .helper import hopper +numpy = pytest.importorskip("numpy", reason="NumPy not installed") + im = hopper().resize((128, 100)) def test_toarray(): def test(mode): - ai = im.convert(mode).__array_interface__ - return ai["version"], ai["shape"], ai["typestr"], len(ai["data"]) + ai = numpy.array(im.convert(mode)) + return ai.shape, ai.dtype.str, ai.nbytes - # assert test("1") == (3, (100, 128), '|b1', 1600)) - assert test("L") == (3, (100, 128), "|u1", 12800) + # assert test("1") == ((100, 128), '|b1', 1600)) + assert test("L") == ((100, 128), "|u1", 12800) # FIXME: wrong? - assert test("I") == (3, (100, 128), Image._ENDIAN + "i4", 51200) + assert test("I") == ((100, 128), Image._ENDIAN + "i4", 51200) # FIXME: wrong? - assert test("F") == (3, (100, 128), Image._ENDIAN + "f4", 51200) + assert test("F") == ((100, 128), Image._ENDIAN + "f4", 51200) - assert test("LA") == (3, (100, 128, 2), "|u1", 25600) - assert test("RGB") == (3, (100, 128, 3), "|u1", 38400) - assert test("RGBA") == (3, (100, 128, 4), "|u1", 51200) - assert test("RGBX") == (3, (100, 128, 4), "|u1", 51200) + assert test("LA") == ((100, 128, 2), "|u1", 25600) + assert test("RGB") == ((100, 128, 3), "|u1", 38400) + assert test("RGBA") == ((100, 128, 4), "|u1", 51200) + assert test("RGBX") == ((100, 128, 4), "|u1", 51200) + + with Image.open("Tests/images/truncated_jpeg.jpg") as im_truncated: + with pytest.raises(OSError): + numpy.array(im_truncated) def test_fromarray(): @@ -39,10 +45,18 @@ def test_fromarray(): def test(mode): i = im.convert(mode) - a = i.__array_interface__ - a["strides"] = 1 # pretend it's non-contiguous + a = numpy.array(i) # Make wrapper instance for image, new array interface - wrapped = Wrapper(i, a) + wrapped = Wrapper( + i, + { + "shape": a.shape, + "typestr": a.dtype.str, + "version": 3, + "data": a.data, + "strides": 1, # pretend it's non-contiguous + }, + ) out = Image.fromarray(wrapped) return out.mode, out.size, list(i.getdata()) == list(out.getdata()) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ebeaf3c74..01b7f9d53 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -676,9 +676,10 @@ class Image: raise ValueError("Could not save to PNG for display") from e return b.getvalue() - @property - def __array_interface__(self): + def __array__(self): # numpy array interface support + import numpy as np + new = {} shape, typestr = _conv_type_shape(self) new["shape"] = shape @@ -690,7 +691,11 @@ class Image: new["data"] = self.tobytes("raw", "L") else: new["data"] = self.tobytes() - return new + + class ArrayData: + __array_interface__ = new + + return np.array(ArrayData()) def __getstate__(self): return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()] From d4f9c6e08270aedfc446e38a0dd611ca7ad17016 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Apr 2021 21:51:23 +1100 Subject: [PATCH 529/750] Renamed register_open accept methods for consistency --- Tests/test_file_dds.py | 8 ++++---- src/PIL/DdsImagePlugin.py | 4 ++-- src/PIL/FtexImagePlugin.py | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 682cd048b..17c56bb77 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -136,25 +136,25 @@ def test_uncompressed_rgb(): ) -def test__validate_true(): +def test__accept_true(): """Check valid prefix""" # Arrange prefix = b"DDS etc" # Act - output = DdsImagePlugin._validate(prefix) + output = DdsImagePlugin._accept(prefix) # Assert assert output -def test__validate_false(): +def test__accept_false(): """Check invalid prefix""" # Arrange prefix = b"something invalid" # Act - output = DdsImagePlugin._validate(prefix) + output = DdsImagePlugin._accept(prefix) # Assert assert not output diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index df2d0060c..f405b84e3 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -182,9 +182,9 @@ class DdsImageFile(ImageFile.ImageFile): pass -def _validate(prefix): +def _accept(prefix): return prefix[:4] == b"DDS " -Image.register_open(DdsImageFile.format, DdsImageFile, _validate) +Image.register_open(DdsImageFile.format, DdsImageFile, _accept) Image.register_extension(DdsImageFile.format, ".dds") diff --git a/src/PIL/FtexImagePlugin.py b/src/PIL/FtexImagePlugin.py index 900661238..3b169038c 100644 --- a/src/PIL/FtexImagePlugin.py +++ b/src/PIL/FtexImagePlugin.py @@ -98,9 +98,9 @@ class FtexImageFile(ImageFile.ImageFile): pass -def _validate(prefix): +def _accept(prefix): return prefix[:4] == MAGIC -Image.register_open(FtexImageFile.format, FtexImageFile, _validate) +Image.register_open(FtexImageFile.format, FtexImageFile, _accept) Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) From 60da129d4bfdb05e17108f25110a9fbdfe4f4105 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Apr 2021 21:42:14 +1100 Subject: [PATCH 530/750] Replaced register_open lambdas with _accept method for consistency --- src/PIL/BlpImagePlugin.py | 8 +++++--- src/PIL/IcnsImagePlugin.py | 6 +++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index e07474621..7b78597b4 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -417,9 +417,11 @@ class BLP2Decoder(_BLPBaseDecoder): self.set_as_raw(bytes(data)) -Image.register_open( - BlpImageFile.format, BlpImageFile, lambda p: p[:4] in (b"BLP1", b"BLP2") -) +def _accept(prefix): + return prefix[:4] in (b"BLP1", b"BLP2") + + +Image.register_open(BlpImageFile.format, BlpImageFile, _accept) Image.register_extension(BlpImageFile.format, ".blp") Image.register_decoder("BLP1", BLP1Decoder) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index ca6a0adad..a38f2fc5c 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -359,7 +359,11 @@ def _save(im, fp, filename): fp.write(f.read()) -Image.register_open(IcnsImageFile.format, IcnsImageFile, lambda x: x[:4] == b"icns") +def _accept(prefix): + return prefix[:4] == b"icns" + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) Image.register_extension(IcnsImageFile.format, ".icns") if sys.platform == "darwin": From 92edc29439a0e650b6b4b773eb9a526b0089a0f5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Apr 2021 08:54:06 +1000 Subject: [PATCH 531/750] Round down the radius in rounded_rectangle --- ...ded_rectangle_non_integer_radius_given.png | Bin 0 -> 953 bytes ...ed_rectangle_non_integer_radius_height.png | Bin 0 -> 1546 bytes ...ded_rectangle_non_integer_radius_width.png | Bin 0 -> 1629 bytes Tests/test_imagedraw.py | 23 ++++++++++++++++ src/PIL/ImageDraw.py | 25 +++++++----------- 5 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 Tests/images/imagedraw_rounded_rectangle_non_integer_radius_given.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_non_integer_radius_height.png create mode 100644 Tests/images/imagedraw_rounded_rectangle_non_integer_radius_width.png diff --git a/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_given.png b/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_given.png new file mode 100644 index 0000000000000000000000000000000000000000..59e55b2a1e9175a502cea31b0933d015c40bbdf7 GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k2}mkgS)OEIU~ceqaSW-L^Y+H=zDEWEu7NZ3 z*W16Zl<-}hImg1#E@sl!dmIaUp6Ch}?gZ+AfdkdM>`J#*y~;AVGWpuc_Rx=_5+Mg~ zZrq?{I^$>7zY`7-ru8c41B}~!c~__LJvPlcH={B!^#8Q=yx#>%*YcX@?p(h6LW|_q zZ_8%f3sc|pwS4zs`CngNeVX)(BfE0#o~yFf|1LglRsC8h_Bm?TJz0w%J6ly%zh1mm zX{!J2kK`Y&wMRp~zPx39W6up^k+5vlP}#$4wtZ{A8s!}7ZnSjm#rcQceSa|7cHeUA z!@HvWL*1|5xcOWA^tYB$^YGB)-#nrp+qbT=YJM1dPv+VSCK=z{UD+Rw6vfOvej_fQ zJ3GUqJ@jw1o1f0{t2cSx{Al^V@xi^e4X>U}ef(-p-TUgTdA|;Jy0&cS5D*jG3le5u zV|@GTjHgGGoFZH}x;YXB6?K$apb8F+3IYS8C}tPpWlve{L<9yM1eghED8zKAAsv z+FGA}6}(oL9(M0lpX~n^+nzrCy3MLz@Adn#cKa_c=dY^oJ`tC9x%k7h>RsHvGd`|` zrtp=Ce}g}}f8sGMj!;-r56uY?5%;zBF*R#hSj%7Y|9a(W#)|NIMp!OlU}$*zk10Mo U#oz*OX%0x#)78&qol`;+0EY9N@Bjb+ literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_height.png b/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_height.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e54896ba01fc967080b66b86f268f2fdb6d6b1 GIT binary patch literal 1546 zcmZ`(do+}37#Vb!vu9W11!_?2K57Me-RM zxs*#{Ce$XGWEK-cE;TIEni-l|wBNLUZ0$Mwp67Wlzu)h@ocDd+hve_;sj8%-BqJlE z>UI2RAk;pSy23W7-skA>Tt-HY<#qH((1o()Nmgo^<9CPvF2rwddNCtfG*Cy(v^BZ`Hp{ZtzZop7n7W zIK3Y}If1FX)%Z5=kA=jP*TforXTtDEXDDHE-1PW6x)4`vUL?Uzc0I_g@zZ_C=S>zf zT$A!{TEKA=pL(kCp$G1tjO2~<6HP^&T^DN8`vP4S za8^~kDYoEs>vr>p^q|vKAj*bQy6&I>#8@sL{B*TOunm|GXxHS!n0k!Y7k>mFlnhfd zP>vSs=i4BZ8^Qoq3#y)ttrdBZKPpyzO zbux%Ni~l{BS=fs(G*Z=f(O`4hwS$));0!}tmFnU%ax;?+;hki+@I~jLgea@VwTKLZ zOH6A=7mbSBISD2jv+<@TnawabSv}e~-jxv{mDu3@I7}T^V`_EVq^Bt)3C_u+auc)3 z{q(uiov0k0HT_bQv;4YUYE~#i$6nR0veRkJ58gkjp3aR4pPIQspMLiPO7h;%S^m!K z<@*4Kr>d@eP(k_N3c;95?umk4_%^9enLU#JHf0YX`3OpCDMs*3foVAXcAaPhZlZDK zyRYoBviIi=Qj+2w8c)~bKit>4|LeDGZs+BLPBS})GSRK&TTxNHa*_WULh!_nc_{bQ z8=-k*WK^%>7YgBr>N@A*Gob&Td(qPg$0c~~l^!X5i;sqI&m~io{67Z~68lCzDt7R# zKa*WTKCJxYk?)?%o;tRY6pfONWvsrTTUhXut#mZ}m|?0@<7@Q(AtF$R&CK!K>w!5u zyWRq$%``_@L07*pUtZa&Uer0ROYLiK+Ah*NyOtvBf!TpvPcej7!QA4Z7hIJM%w;dC z@TXBwWDK)A%+^FW(Du}auXrsWsi?NNr!p}0g&9X z1vz8YczymU6n1T^X&|U|SScgCqG50YH0z4)B}t>uvL!WDKe#U@ir3{9I({J-=-NYo zHbU-E2hD7_O>wZC^O?QoaDW{LLvAji!}Jy$nxG(WIABw6wvz7-;h65{07aV*{RS5M zq@docD0~Wl1P<Nf zAIq$KHh~`-Zb>VvVL09sU%Of$+L!}pZ`v#8ihkYlFs-!{$_^Jq&(ffUSenzGEKSRZ zO*;ORQ0@lgTH`R9CIamSgOX^g57QCKpj{Abf9V*C-y-6Dn~r6&d0X-ms=LewX;;Uk Olo!JHXrp_?mA?VGc-wIR literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_width.png b/Tests/images/imagedraw_rounded_rectangle_non_integer_radius_width.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0f11fa62706014d94d1473de595354bce3c2ce GIT binary patch literal 1629 zcmb_cc{J2}6ql%&l;wp)i>9WSOr}FLLJOHhnhcX+>Nk&?Oo~!cmKVm8B{DUWL$u)V zvow}zY!k*1QN}jC8B3O^vG2>g;{C?yymQ|F?|VMq<=oHx-gECc_kJEaIi6Bc)=`#| zlT*Rkoy0+Ry=-rghfe(?<_&Uk>)_av$DHq`jCFSxip^AQfaihJKZg!!<&&-J>#e$n z85Qp^o&y8DPfZ`B<79zW7i&f7MipcSqSBfc|GjTXTs};OFXHKKW!eQ^g)JKlkWrb7{Tf zSV~U>AQ6zx8IPIkh^o6=lMRq_0S&@7&Iy{H2*JVfaG}f}ST51>%`A{z6r7*>ZVomw zo`CCTwTmq8<0gcShE#%-?U#|>b9-9KHAxBrB%kZ>^m`mzQUkAboPmJPjk}VpOfw$u zN3xk|jP~;Gig{sMy&B^V$D$PcnEu-E7{MDwZ!eeFezvN%x;W+qf}`(t-XCe{-^&m; z!sj}XuMH{WZ0;GnM^S8k6sw(-35I7I@yKv)4X=xD3cVhYHz)x-!!s98XMLHRVqio6HWZ z19f&b#Efb(hH3E1UIeA0{fptJARdlujSr`B22~luilDMur_1b@_q5V_178+J6N89>QRV+ z0nr&`U59@KN|eF!3{tl{##n#o86h?YTS_XK0UDO!3ACn1{sCm;{LG<%rA2ieBge=+ zOuDsxp?Oo@!`fiqHI7=3iM!lWlEmYS&`=XLW z@I6NG^+O_;QWemxc~>qb5h|+P634s-p&B9-WmwN^eZRZs(t)PQHsoGSch&!5R>oRV z38@{3O=plLJO4kJEu0-)Y41`R$wC#lVf3n2bBEIZ7cp%s59HF!kWIrykvx8w#wrzK z2uzt$v2U4ASIV?7(3Es3_l2=~`+W)0yZp}FTJ4Z9HbAac1gdM3ShG`6<$dU;iE!FO zMFfXOrW~k}=%;RM{02{my0)n%Pt|BVvbNjTJA^qAL@2aU^4wLldux~SRyX=ht}m09 zIECG*cwu|f&_~P(>X9Dis5ha|LWxhGnrgDVeu?7XSyfx6#%OYsul5YJYus$N)$P3Y zt)y|4C#ZOC1zyt z?ce2oH-bx|P%k@3m;LpgRD$aBoNdrx=jHDQ4U9Rw0B_VS;tx}MT=MtI_>6h<>m0Nz zeoqM5r?{NfGB>jDSG+^Z%?S3n`%4Wz4u`WyXc}JIVXS*KTSyYGLqoEBD&fz!=$>ylnHWWZW5-DS(9z2;o9?Xq%9No4>REo-!sb?|Z<1gLX^VnmFF~d9G znrxA))qQWCEgla!A2K5;%~Kb~ygK^=Qs#sFn*ev;FRd1;jM!{mmiTQ~b+MuE2vu)} hU%s+l9>>sNxB Date: Mon, 5 Apr 2021 17:54:34 +1000 Subject: [PATCH 532/750] Reversed rawmode for uncompressed RGB data --- Tests/images/uncompressed_rgb.png | Bin 146640 -> 146690 bytes src/PIL/DdsImagePlugin.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/images/uncompressed_rgb.png b/Tests/images/uncompressed_rgb.png index 50bca09eec8678dedce23fd9b29e8306325d8584..f02b50f6f6f3b4130cc8c7189fe7a6fa05204a47 100644 GIT binary patch literal 146690 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 (Bi|wy^2>)A)xP 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 OqoSZGU;D%|{Qm&7k*0S5 literal 146640 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�fyR;#m1^Z4RkB5Pkc=$s@t#C0FiDv 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%0A-iWR)q>S2)&A^ON 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�?GQoPXjc8D!MMsH9zn2JXGZA;!673> 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 diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index f405b84e3..58d1d5341 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -135,7 +135,7 @@ class DdsImageFile(ImageFile.ImageFile): rawmode += masks[0xFF000000] rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF] - self.tile = [("raw", (0, 0) + self.size, 0, (rawmode, 0, 1))] + self.tile = [("raw", (0, 0) + self.size, 0, (rawmode[::-1], 0, 1))] else: data_start = header_size + 4 n = 0 From d06871d5436b153990fcd23c416e0387fe0a5b61 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Apr 2021 17:58:02 +1000 Subject: [PATCH 533/750] Set mode of three channel uncompressed RGB data to RGB --- Tests/images/hopper.dds | Bin 0 -> 65663 bytes Tests/test_file_dds.py | 14 +++++++++++--- src/PIL/DdsImagePlugin.py | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 Tests/images/hopper.dds diff --git a/Tests/images/hopper.dds b/Tests/images/hopper.dds new file mode 100644 index 0000000000000000000000000000000000000000..8b9af9ed9a4456d464a1530bd48a026fd3abbbce GIT binary patch literal 65663 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≺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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 17c56bb77..236ad41d6 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -14,7 +14,8 @@ TEST_FILE_DX10_BC7 = "Tests/images/bc7-argb-8bpp_MipMaps-1.dds" TEST_FILE_DX10_BC7_UNORM_SRGB = "Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.dds" TEST_FILE_DX10_R8G8B8A8 = "Tests/images/argb-32bpp_MipMaps-1.dds" TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB = "Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.dds" -TEST_FILE_UNCOMPRESSED_RGB = "Tests/images/uncompressed_rgb.dds" +TEST_FILE_UNCOMPRESSED_RGB = "Tests/images/hopper.dds" +TEST_FILE_UNCOMPRESSED_RGB_WITH_ALPHA = "Tests/images/uncompressed_rgb.dds" def test_sanity_dxt1(): @@ -124,15 +125,22 @@ def test_unimplemented_dxgi_format(): def test_uncompressed_rgb(): """Check uncompressed RGB images can be opened""" + # convert -format dds -define dds:compression=none hopper.jpg hopper.dds with Image.open(TEST_FILE_UNCOMPRESSED_RGB) as im: - im.load() + assert im.format == "DDS" + assert im.mode == "RGB" + assert im.size == (128, 128) + assert_image_equal_tofile(im, "Tests/images/hopper.png") + + # Test image with alpha + with Image.open(TEST_FILE_UNCOMPRESSED_RGB_WITH_ALPHA) as im: assert im.format == "DDS" assert im.mode == "RGBA" assert im.size == (800, 600) assert_image_equal_tofile( - im, TEST_FILE_UNCOMPRESSED_RGB.replace(".dds", ".png") + im, TEST_FILE_UNCOMPRESSED_RGB_WITH_ALPHA.replace(".dds", ".png") ) diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 58d1d5341..1a7fe0035 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -133,6 +133,8 @@ class DdsImageFile(ImageFile.ImageFile): rawmode = "" if bitcount == 32: rawmode += masks[0xFF000000] + else: + self.mode = "RGB" rawmode += masks[0xFF0000] + masks[0xFF00] + masks[0xFF] self.tile = [("raw", (0, 0) + self.size, 0, (rawmode[::-1], 0, 1))] From 56dfc4a95607a7c6cfcf908a680cc796cb21a281 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Apr 2021 19:01:13 +1000 Subject: [PATCH 534/750] Added 301 and 532 to core tags --- src/PIL/TiffTags.py | 3 --- src/encode.c | 8 ++++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 9e9e117a4..088272162 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -485,9 +485,6 @@ LIBTIFF_CORE = { 65537, } -LIBTIFF_CORE.remove(301) # Array of short, crashes -LIBTIFF_CORE.remove(532) # Array of long, crashes - LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff LIBTIFF_CORE.remove(323) # Tiled images diff --git a/src/encode.c b/src/encode.c index f92ba62c2..d648c8aa5 100644 --- a/src/encode.c +++ b/src/encode.c @@ -644,10 +644,10 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { int key_int, status, is_core_tag, is_var_length, num_core_tags, i; TIFFDataType type = TIFF_NOTYPE; // This list also exists in TiffTags.py - const int core_tags[] = {256, 257, 258, 259, 262, 263, 266, 269, 274, - 277, 278, 280, 281, 340, 341, 282, 283, 284, - 286, 287, 296, 297, 320, 321, 338, 32995, 32998, - 32996, 339, 32997, 330, 531, 530, 65537}; + const int core_tags[] = {256, 257, 258, 259, 262, 263, 266, 269, 274, + 277, 278, 280, 281, 340, 341, 282, 283, 284, + 286, 287, 296, 297, 320, 321, 338, 32995, 32998, + 32996, 339, 32997, 330, 531, 530, 65537, 301, 532}; Py_ssize_t tags_size; PyObject *item; From 9d489f69ae5f5d285beb2bb251b6b0dc117bc983 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Apr 2021 19:06:22 +1000 Subject: [PATCH 535/750] Removed duplicate word in error message --- src/encode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encode.c b/src/encode.c index d648c8aa5..52392cf33 100644 --- a/src/encode.c +++ b/src/encode.c @@ -790,7 +790,7 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { int stride = 256; if (len != 768) { PyErr_SetString( - PyExc_ValueError, "Requiring 768 items for for Colormap"); + PyExc_ValueError, "Requiring 768 items for Colormap"); return NULL; } UINT16 *av; From d661e438f601ab29fa2848c4cd0b680d024e79dc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 6 Apr 2021 19:31:51 +1000 Subject: [PATCH 536/750] Fixed ensuring that previous frame was loaded --- Tests/test_file_gif.py | 11 +++++++++++ src/PIL/GifImagePlugin.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 52d7f035d..94fc95b05 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -341,6 +341,17 @@ def test_dispose_previous(): pass +def test_previous_frame_loaded(): + with Image.open("Tests/images/dispose_none.gif") as img: + img.load() + img.seek(1) + img.load() + img.seek(2) + with Image.open("Tests/images/dispose_none.gif") as img_skipped: + img_skipped.seek(2) + assert_image_equal(img_skipped, img) + + def test_save_dispose(tmp_path): out = str(tmp_path / "temp.gif") im_list = [ diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 139f91ea0..48685c883 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -148,7 +148,7 @@ class GifImageFile(ImageFile.ImageFile): self.disposal_method = 0 else: # ensure that the previous frame was loaded - if not self.im: + if self.tile: self.load() if frame != self.__frame + 1: From 97207a8b191aff038d6d5389ad0571fc53f1c832 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 7 Apr 2021 19:20:35 +1000 Subject: [PATCH 537/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 84eb79ec1..9bbcbd8de 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,12 @@ Changelog (Pillow) ================== +8.3.0 (unreleased) +------------------ + +- Fixed reading uncompressed RGB data from DDS #5383 + [radarhere] + 8.2.0 (2021-04-01) ------------------ From 3cb2413066e3d1dabdb26db16c3367d8dd558982 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 Apr 2021 08:04:20 +1000 Subject: [PATCH 538/750] Use zero if background color index is missing --- Tests/images/missing_background.gif | Bin 0 -> 660 bytes Tests/images/missing_background_first_frame.gif | Bin 0 -> 950 bytes Tests/test_file_gif.py | 8 ++++++++ src/PIL/GifImagePlugin.py | 4 ++-- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Tests/images/missing_background.gif create mode 100644 Tests/images/missing_background_first_frame.gif diff --git a/Tests/images/missing_background.gif b/Tests/images/missing_background.gif new file mode 100644 index 0000000000000000000000000000000000000000..550d68d81010bccaf734489d9352b959881796aa GIT binary patch literal 660 zcmZ?wbh9u|RA5kGC}&_${Lk&@8WQa67~pE8XTZ$J02KPk!pQ}sb$}SCNP(dlNNeeH z#mzPDIumPTWBLF8|I@esOkaJ)w?)G{Qy-)Z6|iIrobX(|*W&fr-TxCb`ci(fW+W_o zxzsC1r(FLp=j;XiHR=Mhn;s_I_*ft=8(?grAh2si$*w&zf_^SZziZSu9vDa%3zTf{ zT={_8D7*h%@mFEFIl@ujJkH4X2PCRBHMg|3wRd!Ob@%l4i3uXy%gVsPAkDx-hI>PR z?seR;gRQH2{Q}XVWQ_(Vt2L^s0@9%p?F-i}|Jfy+tI#o}z(XaVphI5iAPbXl%L)@K zNsc*ZSOOVx8P|EsNMwIuTEd)@bko#(S;4B?LKDt8Q^jHa;D9vCI8*pyvRcmM1U?N7 z&K97n3Kub@Z4=E==y>_xVNOfi4MiajIeo_rtJ#wq9Xfp&SbZ*h@wgq-D*L=)mPK0V zq~%gwY#DRjdb3a?umT~06?A6zKQW1}sS7w?ESNOeA)~cWVr5p{i|CVVO$!bz2vFas ySk=*T>AAPSybI4$6cV(Aof;>H`rg_Vro?HrL2Xj>HI-A-R;h}=kQQNNum%8Rb=#x> literal 0 HcmV?d00001 diff --git a/Tests/images/missing_background_first_frame.gif b/Tests/images/missing_background_first_frame.gif new file mode 100644 index 0000000000000000000000000000000000000000..be2c95b99936a1a3feaa0203bde0e322fb4a13dc GIT binary patch literal 950 zcmV;n14;ZxNk%w1VITk?0EYko0000gFA83rGm6YzGCVo||NqO|{FkfLO@t^*X)gc( z000000000000000000005D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LW3IG5AEC2ui03ZM$06++n009UbNU)&6g9sB248X8q!2k&bAV82{ zzyJXfCr(U2K%vKvAVZ2&Sirym0~jq{M2N8?#E~##%A85F=E0XB1t7F2(ZI$82{ck9 zK(r`Pg+`MewaK)p)2C3QN|oBMYSoW8Bc`;NlR#F3CVe8nNVcrmjt4Jl1e(CC0FE$= Y4p Date: Thu, 8 Apr 2021 23:53:22 +0300 Subject: [PATCH 539/750] Add test for CVE-2021-25292 ReDoS --- Tests/test_file_pdf.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index e5bba483a..c7839873a 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -286,3 +286,13 @@ def test_pdf_append_to_bytesio(): f = io.BytesIO(f.getvalue()) im.save(f, format="PDF", append=True) assert len(f.getvalue()) > initial_size + + +@pytest.mark.timeout(1) +def test_redos(): + malicious = b" trailer<<>>" + b"\n" * 3456 + + # This particular exception isn't relevant here. + # The important thing is it doesn't timeout, cause a ReDoS (CVE-2021-25292). + with pytest.raises(PdfParser.PdfFormatError): + PdfParser.PdfParser(buf=malicious) From b8c8375d0c37687a19c5d193a58061e5b4bce96d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Apr 2021 19:10:36 +1000 Subject: [PATCH 540/750] Use python3 in shebang line --- Tests/32bit_segfault_check.py | 2 +- Tests/check_fli_oob.py | 2 +- Tests/check_imaging_leaks.py | 2 +- Tests/check_jp2_overflow.py | 2 +- Tests/createfontdatachunk.py | 2 +- docs/Guardfile | 2 +- selftest.py | 2 +- setup.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Tests/32bit_segfault_check.py b/Tests/32bit_segfault_check.py index 26a91d5cd..e19cdf7a9 100755 --- a/Tests/32bit_segfault_check.py +++ b/Tests/32bit_segfault_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys diff --git a/Tests/check_fli_oob.py b/Tests/check_fli_oob.py index 739ad224e..6b63a6826 100644 --- a/Tests/check_fli_oob.py +++ b/Tests/check_fli_oob.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 from PIL import Image diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index 407f3ea80..d07082aba 100755 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import pytest from PIL import Image diff --git a/Tests/check_jp2_overflow.py b/Tests/check_jp2_overflow.py index a7a343c98..f81a360ce 100755 --- a/Tests/check_jp2_overflow.py +++ b/Tests/check_jp2_overflow.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Reproductions/tests for OOB read errors in FliDecode.c diff --git a/Tests/createfontdatachunk.py b/Tests/createfontdatachunk.py index 011bb0bed..e318eb732 100755 --- a/Tests/createfontdatachunk.py +++ b/Tests/createfontdatachunk.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import base64 import os diff --git a/docs/Guardfile b/docs/Guardfile index 16f731611..b689b079a 100755 --- a/docs/Guardfile +++ b/docs/Guardfile @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 from livereload.compiler import shell from livereload.task import Task diff --git a/selftest.py b/selftest.py index 7e08d183b..8d77cc5a9 100755 --- a/selftest.py +++ b/selftest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # minimal sanity check import sys diff --git a/setup.py b/setup.py index 52babbc6b..c3b9eee41 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # > pyroma . # ------------------------------ # Checking . From 714d6c8cd36717b6b5ddc71e90825a7458249b1f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Apr 2021 19:10:53 +1000 Subject: [PATCH 541/750] Removed shebang line --- Tests/test_sgi_crash.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index d4ddc12f9..f9eaf9b19 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import pytest from PIL import Image From 04df6e3bf11c914d1521dab800f678a5af4946b5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Apr 2021 21:38:28 +1000 Subject: [PATCH 542/750] mapdepth is only 1 byte --- Tests/images/200x32_p_bl_raw_origin.tga | Bin 0 -> 7212 bytes Tests/test_file_tga.py | 10 +++++++++- src/PIL/TgaImagePlugin.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Tests/images/200x32_p_bl_raw_origin.tga diff --git a/Tests/images/200x32_p_bl_raw_origin.tga b/Tests/images/200x32_p_bl_raw_origin.tga new file mode 100644 index 0000000000000000000000000000000000000000..329f0ca4d9e579bea5e1ade5783909eafde735c6 GIT binary patch literal 7212 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 465e13316..d14f561c6 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -6,7 +6,7 @@ import pytest from PIL import Image -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper _TGA_DIR = os.path.join("Tests", "images", "tga") _TGA_DIR_COMMON = os.path.join(_TGA_DIR, "common") @@ -112,6 +112,14 @@ def test_save_wrong_mode(tmp_path): im.save(out) +def test_save_mapdepth(): + # This image has been manually hexedited from 200x32_p_bl_raw.tga + # to include an origin + test_file = "Tests/images/200x32_p_bl_raw_origin.tga" + with Image.open(test_file) as im: + assert_image_equal_tofile(im, "Tests/images/tga/common/200x32_p.png") + + def test_save_id_section(tmp_path): test_file = "Tests/images/rgb32rle.tga" with Image.open(test_file) as im: diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 2b936d687..97959ca4e 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -110,7 +110,7 @@ class TgaImageFile(ImageFile.ImageFile): if colormaptype: # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), i16(s, 7) + start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] if mapdepth == 16: self.palette = ImagePalette.raw( "BGR;16", b"\0" * 2 * start + self.fp.read(2 * size) From 43aa6ade6fd3f23695cda41abb66ad9e7b9b438c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 9 Apr 2021 13:39:28 +0200 Subject: [PATCH 543/750] Local valgrind test target --- Makefile | 6 ++++++ Tests/oss-fuzz/python.supp | 16 ++++++++++++++++ requirements.txt | 1 + 3 files changed, 23 insertions(+) create mode 100644 Tests/oss-fuzz/python.supp diff --git a/Makefile b/Makefile index 53eaa0566..7d0c86abf 100644 --- a/Makefile +++ b/Makefile @@ -102,6 +102,12 @@ sdist: test: pytest -qq +.PHONY: valgrind +valgrind: + PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=no \ + --log-file=/tmp/valgrind-output \ + python3 -m pytest --no-memcheck -vv --valgrind --valgrind-log=/tmp/valgrind-output + .PHONY: readme readme: python3 setup.py --long-description | markdown2 > .long-description.html && open .long-description.html diff --git a/Tests/oss-fuzz/python.supp b/Tests/oss-fuzz/python.supp new file mode 100644 index 000000000..94cc87db9 --- /dev/null +++ b/Tests/oss-fuzz/python.supp @@ -0,0 +1,16 @@ +{ + + Memcheck:Cond + ... + fun:encode_current_locale +} + + +{ + + Memcheck:Cond + fun:inflate + fun:ZIPDecode + fun:_TIFFReadEncodedTileAndAllocBuffer + ... +} diff --git a/requirements.txt b/requirements.txt index 4b534ae53..1b4a04a75 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ pyroma pytest pytest-cov pytest-timeout +pytest-valgrind sphinx>=2.4 sphinx-issues sphinx-removed-in From 441e6426aec02cb2a9f06d2c53f907889dae2bfa Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 9 Apr 2021 13:41:07 +0200 Subject: [PATCH 544/750] Initialize buffer with 0, fixes valgrind undefined behavior issues --- src/decode.c | 2 +- src/encode.c | 2 +- src/libImaging/Jpeg2KDecode.c | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/decode.c b/src/decode.c index a29c6a46e..dcd11eb5d 100644 --- a/src/decode.c +++ b/src/decode.c @@ -199,7 +199,7 @@ _setimage(ImagingDecoderObject *decoder, PyObject *args) { state->bytes = (state->bits * state->xsize + 7) / 8; } /* malloc check ok, overflow checked above */ - state->buffer = (UINT8 *)malloc(state->bytes); + state->buffer = (UINT8 *)calloc(1, state->bytes); if (!state->buffer) { return ImagingError_MemoryError(); } diff --git a/src/encode.c b/src/encode.c index f92ba62c2..c47255952 100644 --- a/src/encode.c +++ b/src/encode.c @@ -264,7 +264,7 @@ _setimage(ImagingEncoderObject *encoder, PyObject *args) { } state->bytes = (state->bits * state->xsize + 7) / 8; /* malloc check ok, overflow checked above */ - state->buffer = (UINT8 *)malloc(state->bytes); + state->buffer = (UINT8 *)calloc(1, state->bytes); if (!state->buffer) { return ImagingError_MemoryError(); } diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index f086848e9..6af0f2eae 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -861,6 +861,10 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { state->state = J2K_STATE_FAILED; goto quick_exit; } + /* Undefined behavior, sometimes decode_tile_data doesn't + fill the buffer and we do things with it later, leading + to valgrind errors. */ + memset(new, 0, tile_info.data_size); state->buffer = new; buffer_size = tile_info.data_size; } From ef3de6bf4ffde65c4761add36b23aec246c53530 Mon Sep 17 00:00:00 2001 From: Tanner Davis Date: Fri, 9 Apr 2021 10:53:33 -0600 Subject: [PATCH 545/750] PDF format docs, `append_images` param update [ci skip] Made sure it is documented that both the `append_images` and `save_all` params must be set. Just setting `append_images` does not work. --- docs/handbook/image-file-formats.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index c67f8fb8f..cbeafe828 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1242,8 +1242,9 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 3.0.0 **append_images** - A list of images to append as additional pages. Each of the - images in the list can be single or multiframe images. + A list of :py:obj:`PIL.Image`s to append as additional pages. Each of the + images in the list can be single or multiframe images. The ``save_all`` + parameter must be present and set to ``True`` in conjunction with ``append_images``. .. versionadded:: 4.2.0 From 8da6eef073dcb0d493c8c2d39c2d285bd81993bf Mon Sep 17 00:00:00 2001 From: Tanner Davis Date: Fri, 9 Apr 2021 11:09:16 -0600 Subject: [PATCH 546/750] Made sure the rst link to the Image class was correct --- docs/handbook/image-file-formats.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index cbeafe828..1f91d220c 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1242,7 +1242,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 3.0.0 **append_images** - A list of :py:obj:`PIL.Image`s to append as additional pages. Each of the + A list of :py:obj:`PIL.Image.Image`s to append as additional pages. Each of the images in the list can be single or multiframe images. The ``save_all`` parameter must be present and set to ``True`` in conjunction with ``append_images``. From 8c38c80bb1b69563fda494a6493bfe6ee7c9d665 Mon Sep 17 00:00:00 2001 From: Tanner Davis Date: Fri, 9 Apr 2021 11:47:29 -0600 Subject: [PATCH 547/750] Now the rst link to the Image class should work --- docs/handbook/image-file-formats.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 1f91d220c..9992c1339 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1242,7 +1242,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 3.0.0 **append_images** - A list of :py:obj:`PIL.Image.Image`s to append as additional pages. Each of the + A list of :py:class:`PIL.Image.Image`s to append as additional pages. Each of the images in the list can be single or multiframe images. The ``save_all`` parameter must be present and set to ``True`` in conjunction with ``append_images``. From a3a69c8385d2cd58edee4fa676b26d2420fb265b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 9 Apr 2021 23:33:21 +0200 Subject: [PATCH 548/750] conditional mark for valgrind ignore --- Tests/helper.py | 10 ++++++++++ Tests/test_file_eps.py | 3 ++- Tests/test_file_jpeg.py | 13 +++++++------ Tests/test_file_libtiff.py | 9 +++++---- Tests/test_file_pdf.py | 5 +++-- Tests/test_file_png.py | 3 ++- Tests/test_file_webp_metadata.py | 9 +++++---- Tests/test_image.py | 3 ++- Tests/test_image_resample.py | 7 ++++--- Tests/test_image_thumbnail.py | 1 + 10 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 59ba0dd15..707926b98 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -173,6 +173,16 @@ def skip_unless_feature_version(feature, version_required, reason=None): return pytest.mark.skipif(version_available < version_required, reason=reason) +def mark_if_feature_version(mark, feature, version_blacklist, reason=None): + if not features.check(feature): + return + if reason is None: + reason = f"{feature} is {version_blacklist}" + version_required = parse_version(version_blacklist) + version_available = parse_version(features.version(feature)) + return mark(version_available == version_blacklist, reason=reason) + + @pytest.mark.skipif(sys.platform.startswith("win32"), reason="Requires Unix or macOS") class PillowLeakTestCase: # requires unix/macOS diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 7caac34c3..5007af6ef 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -9,6 +9,7 @@ from .helper import ( assert_image_similar_tofile, hopper, skip_unless_feature, + mark_if_feature_version, ) HAS_GHOSTSCRIPT = EpsImagePlugin.has_ghostscript() @@ -64,7 +65,7 @@ def test_invalid_file(): EpsImagePlugin.EpsImageFile(invalid_file) -@pytest.mark.valgrind_known_error(reason="Known Failing") +@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available") def test_cmyk(): with Image.open("Tests/images/pil_sample_cmyk.eps") as cmyk_image: diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 64f509a95..1c14bd205 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -25,6 +25,7 @@ from .helper import ( hopper, is_win32, skip_unless_feature, + mark_if_feature_version, ) TEST_FILE = "Tests/images/hopper.jpg" @@ -116,7 +117,7 @@ class TestFileJpeg: assert test(100, 200) == (100, 200) assert test(0) is None # square pixels - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_icc(self, tmp_path): # Test ICC support with Image.open("Tests/images/rgb.jpg") as im1: @@ -156,7 +157,7 @@ class TestFileJpeg: test(ImageFile.MAXBLOCK + 1) # full buffer block plus one byte test(ImageFile.MAXBLOCK * 4 + 3) # large block - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_large_icc_meta(self, tmp_path): # https://github.com/python-pillow/Pillow/issues/148 # Sometimes the meta data on the icc_profile block is bigger than @@ -423,7 +424,7 @@ class TestFileJpeg: with Image.open(filename): pass - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_truncated_jpeg_should_read_all_the_data(self): filename = "Tests/images/truncated_jpeg.jpg" ImageFile.LOAD_TRUNCATED_IMAGES = True @@ -442,7 +443,7 @@ class TestFileJpeg: with pytest.raises(OSError): im.load() - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_qtables(self, tmp_path): def _n_qtables_helper(n, test_file): with Image.open(test_file) as im: @@ -726,7 +727,7 @@ class TestFileJpeg: # OSError for unidentified image. assert im.info.get("dpi") == (72, 72) - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_exif_x_resolution(self, tmp_path): with Image.open("Tests/images/flower.jpg") as im: exif = im.getexif() @@ -757,7 +758,7 @@ class TestFileJpeg: # Act / Assert assert im._getexif()[306] == "2017:03:13 23:03:09" - @pytest.mark.valgrind_known_error(reason="Backtrace in Python Core") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_photoshop(self): with Image.open("Tests/images/photoshop-200dpi.jpg") as im: assert im.info["photoshop"][0x03ED] == { diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 22b641b5f..c1c9df7b1 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -18,6 +18,7 @@ from .helper import ( assert_image_similar_tofile, hopper, skip_unless_feature, + mark_if_feature_version, ) @@ -822,13 +823,13 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: @@ -839,13 +840,13 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/flower2.jpg") - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index e5bba483a..1a9b4847c 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -8,7 +8,8 @@ import pytest from PIL import Image, PdfParser -from .helper import hopper +from .helper import hopper, mark_if_feature_version + def helper_save_as_pdf(tmp_path, mode, **kwargs): @@ -85,7 +86,7 @@ def test_unsupported_mode(tmp_path): im.save(outfile) -@pytest.mark.valgrind_known_error(reason="Known Failing") +@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_save_all(tmp_path): # Single frame image helper_save_as_pdf(tmp_path, "RGB", save_all=True) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index bbf5f5772..74bba7ce9 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -14,6 +14,7 @@ from .helper import ( is_big_endian, is_win32, skip_unless_feature, + mark_if_feature_version, ) # sample png stream @@ -679,7 +680,7 @@ class TestFilePng: exif = reloaded._getexif() assert exif[274] == 1 - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_exif_from_jpg(self, tmp_path): with Image.open("Tests/images/pil_sample_rgb.jpg") as im: test_file = str(tmp_path / "temp.png") diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index cb133e2c5..681d6fe7e 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -4,7 +4,8 @@ import pytest from PIL import Image -from .helper import skip_unless_feature +from .helper import skip_unless_feature, mark_if_feature_version + pytestmark = [ skip_unless_feature("webp"), @@ -41,7 +42,7 @@ def test_read_exif_metadata_without_prefix(): assert exif[305] == "Adobe Photoshop CS6 (Macintosh)" -@pytest.mark.valgrind_known_error(reason="Known Failing") +@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_write_exif_metadata(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() @@ -74,7 +75,7 @@ def test_read_icc_profile(): assert icc == expected_icc -@pytest.mark.valgrind_known_error(reason="Known Failing") +@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_write_icc_metadata(): file_path = "Tests/images/flower2.jpg" test_buffer = BytesIO() @@ -92,7 +93,7 @@ def test_write_icc_metadata(): assert webp_icc_profile == expected_icc_profile, "Webp ICC didn't match" -@pytest.mark.valgrind_known_error(reason="Known Failing") +@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_read_no_exif(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() diff --git a/Tests/test_image.py b/Tests/test_image.py index 30d093e15..f7b51773c 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -17,6 +17,7 @@ from .helper import ( hopper, is_win32, skip_unless_feature, + mark_if_feature_version, ) @@ -662,7 +663,7 @@ class TestImage: assert not fp.closed - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_exif_jpeg(self, tmp_path): with Image.open("Tests/images/exif-72dpi-int.jpg") as im: # Little endian exif = im.getexif() diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 69449198e..33d67fc15 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -4,7 +4,8 @@ import pytest from PIL import Image, ImageDraw -from .helper import assert_image_equal, assert_image_similar, hopper +from .helper import assert_image_equal, assert_image_similar, hopper, mark_if_feature_version + class TestImagingResampleVulnerability: @@ -455,7 +456,7 @@ class TestCoreResampleBox: tiled.paste(tile, (x0, y0)) return tiled - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_tiles(self): with Image.open("Tests/images/flower.jpg") as im: assert im.size == (480, 360) @@ -466,7 +467,7 @@ class TestCoreResampleBox: tiled = self.resize_tiled(im, dst_size, *tiles) assert_image_similar(reference, tiled, 0.01) - @pytest.mark.valgrind_known_error(reason="Known Failing") + @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") def test_subsample(self): # This test shows advantages of the subpixel resizing # after supersampling (e.g. during JPEG decoding). diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py index 6911ce460..dd140955d 100644 --- a/Tests/test_image_thumbnail.py +++ b/Tests/test_image_thumbnail.py @@ -88,6 +88,7 @@ def test_no_resize(): assert im.size == (64, 64) +# valgrind test is failing with memory allocated in libjpeg @pytest.mark.valgrind_known_error(reason="Known Failing") def test_DCT_scaling_edges(): # Make an image with red borders and size (N * 8) + 1 to cross DCT grid From 302ddc9b5e46249c2379bb44d1df19a52881cb80 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 10 Apr 2021 11:39:24 +1000 Subject: [PATCH 549/750] Corrected syntax --- docs/handbook/image-file-formats.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 9992c1339..eb10a51fa 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1242,9 +1242,10 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 3.0.0 **append_images** - A list of :py:class:`PIL.Image.Image`s to append as additional pages. Each of the - images in the list can be single or multiframe images. The ``save_all`` - parameter must be present and set to ``True`` in conjunction with ``append_images``. + A list of :py:class:`PIL.Image.Image` objects to append as additional pages. Each + of the images in the list can be single or multiframe images. The ``save_all`` + parameter must be present and set to ``True`` in conjunction with + ``append_images``. .. versionadded:: 4.2.0 From c94f66ad13d799af43d96d9883fcd20618f0b292 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 10 Apr 2021 12:03:15 +0200 Subject: [PATCH 550/750] make sure we return a mark decorator --- Tests/conftest.py | 5 +++++ Tests/helper.py | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index dd37e7ce5..66da7593c 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -13,6 +13,11 @@ def pytest_report_header(config): def pytest_configure(config): + config.addinivalue_line( + "markers", + "pil_noop_mark: A conditional mark where nothing special happens", + ) + # We're marking some tests to ignore valgrind errors and XFAIL them. # Ensure that the mark is defined # even in cases where pytest-valgrind isn't installed diff --git a/Tests/helper.py b/Tests/helper.py index 707926b98..20cdab63b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -175,12 +175,15 @@ def skip_unless_feature_version(feature, version_required, reason=None): def mark_if_feature_version(mark, feature, version_blacklist, reason=None): if not features.check(feature): - return + return pytest.mark.pil_noop_mark() if reason is None: reason = f"{feature} is {version_blacklist}" version_required = parse_version(version_blacklist) version_available = parse_version(features.version(feature)) - return mark(version_available == version_blacklist, reason=reason) + if (version_available.major == version_required.major and + version_available.minor == version_required.minor): + return mark(reason=reason) + return pytest.mark.pil_noop_mark() @pytest.mark.skipif(sys.platform.startswith("win32"), reason="Requires Unix or macOS") From af6fb9c5189faf04bdf7e77e0a839d18cbb5fbff Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 10 Apr 2021 12:03:39 +0200 Subject: [PATCH 551/750] xfail the fuzzer check as well --- Tests/oss-fuzz/test_fuzzers.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index a243c0260..98393d5a2 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -2,13 +2,17 @@ import subprocess import sys import fuzzers +import packaging import pytest -from PIL import Image +from PIL import Image, features if sys.platform.startswith("win32"): pytest.skip("Fuzzer is linux only", allow_module_level=True) - +if features.check('libjpeg_turbo'): + version = packaging.version.parse(features.version('libjpeg_turbo')) + if version.major == 2 and version.minor == 0: + pytestmark = pytest.mark.valgrind_known_error(reason="Known failing with libjpeg_turbo 2.0") @pytest.mark.parametrize( "path", From fc64064387613fc96c431c4de9d1d72395849cc1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 10 Apr 2021 22:11:20 +1000 Subject: [PATCH 552/750] Changed mode for 16-bit palette to BGR;15 --- Tests/images/p_16.png | Bin 0 -> 378 bytes Tests/images/p_16.tga | Bin 0 -> 21563 bytes Tests/test_file_tga.py | 7 ++++++- src/PIL/TgaImagePlugin.py | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Tests/images/p_16.png create mode 100644 Tests/images/p_16.tga diff --git a/Tests/images/p_16.png b/Tests/images/p_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e3588641277b804c0100707146a46a506f33d0d6 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^V083!aSW-L^Y-FF&I1Yp3dU-TpRTzGqbPll!n#6S85UMt5NDBe#3PaOd*KUhDkpE?3se!vg-0YBiU#s~Hf_7C>{v!= zl;#o#SynZgmrE)G`Jc^MDtS1W7EY=$Y<_RYdvfFKPBm8cC_yroap;OX9G2B Date: Sat, 10 Apr 2021 16:58:01 +0200 Subject: [PATCH 553/750] lint stuff --- Tests/helper.py | 6 ++++-- Tests/oss-fuzz/test_fuzzers.py | 9 ++++++--- Tests/test_file_eps.py | 6 ++++-- Tests/test_file_jpeg.py | 26 +++++++++++++++++++------- Tests/test_file_libtiff.py | 18 +++++++++++++----- Tests/test_file_pdf.py | 5 +++-- Tests/test_file_png.py | 6 ++++-- Tests/test_file_webp_metadata.py | 15 ++++++++++----- Tests/test_image.py | 6 ++++-- Tests/test_image_resample.py | 16 ++++++++++++---- 10 files changed, 79 insertions(+), 34 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 20cdab63b..8504993fb 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -180,8 +180,10 @@ def mark_if_feature_version(mark, feature, version_blacklist, reason=None): reason = f"{feature} is {version_blacklist}" version_required = parse_version(version_blacklist) version_available = parse_version(features.version(feature)) - if (version_available.major == version_required.major and - version_available.minor == version_required.minor): + if ( + version_available.major == version_required.major + and version_available.minor == version_required.minor + ): return mark(reason=reason) return pytest.mark.pil_noop_mark() diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index 98393d5a2..2ac1a0d7f 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -9,10 +9,13 @@ from PIL import Image, features if sys.platform.startswith("win32"): pytest.skip("Fuzzer is linux only", allow_module_level=True) -if features.check('libjpeg_turbo'): - version = packaging.version.parse(features.version('libjpeg_turbo')) +if features.check("libjpeg_turbo"): + version = packaging.version.parse(features.version("libjpeg_turbo")) if version.major == 2 and version.minor == 0: - pytestmark = pytest.mark.valgrind_known_error(reason="Known failing with libjpeg_turbo 2.0") + pytestmark = pytest.mark.valgrind_known_error( + reason="Known failing with libjpeg_turbo 2.0" + ) + @pytest.mark.parametrize( "path", diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 5007af6ef..1994a124c 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -8,8 +8,8 @@ from .helper import ( assert_image_similar, assert_image_similar_tofile, hopper, - skip_unless_feature, mark_if_feature_version, + skip_unless_feature, ) HAS_GHOSTSCRIPT = EpsImagePlugin.has_ghostscript() @@ -65,7 +65,9 @@ def test_invalid_file(): EpsImagePlugin.EpsImageFile(invalid_file) -@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") +@mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" +) @pytest.mark.skipif(not HAS_GHOSTSCRIPT, reason="Ghostscript not available") def test_cmyk(): with Image.open("Tests/images/pil_sample_cmyk.eps") as cmyk_image: diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 1c14bd205..18837156a 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -24,8 +24,8 @@ from .helper import ( djpeg_available, hopper, is_win32, - skip_unless_feature, mark_if_feature_version, + skip_unless_feature, ) TEST_FILE = "Tests/images/hopper.jpg" @@ -117,7 +117,9 @@ class TestFileJpeg: assert test(100, 200) == (100, 200) assert test(0) is None # square pixels - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_icc(self, tmp_path): # Test ICC support with Image.open("Tests/images/rgb.jpg") as im1: @@ -157,7 +159,9 @@ class TestFileJpeg: test(ImageFile.MAXBLOCK + 1) # full buffer block plus one byte test(ImageFile.MAXBLOCK * 4 + 3) # large block - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_large_icc_meta(self, tmp_path): # https://github.com/python-pillow/Pillow/issues/148 # Sometimes the meta data on the icc_profile block is bigger than @@ -424,7 +428,9 @@ class TestFileJpeg: with Image.open(filename): pass - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_truncated_jpeg_should_read_all_the_data(self): filename = "Tests/images/truncated_jpeg.jpg" ImageFile.LOAD_TRUNCATED_IMAGES = True @@ -443,7 +449,9 @@ class TestFileJpeg: with pytest.raises(OSError): im.load() - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_qtables(self, tmp_path): def _n_qtables_helper(n, test_file): with Image.open(test_file) as im: @@ -727,7 +735,9 @@ class TestFileJpeg: # OSError for unidentified image. assert im.info.get("dpi") == (72, 72) - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_exif_x_resolution(self, tmp_path): with Image.open("Tests/images/flower.jpg") as im: exif = im.getexif() @@ -758,7 +768,9 @@ class TestFileJpeg: # Act / Assert assert im._getexif()[306] == "2017:03:13 23:03:09" - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_photoshop(self): with Image.open("Tests/images/photoshop-200dpi.jpg") as im: assert im.info["photoshop"][0x03ED] == { diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c1c9df7b1..c0d09d6ce 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -17,8 +17,8 @@ from .helper import ( assert_image_similar, assert_image_similar_tofile, hopper, - skip_unless_feature, mark_if_feature_version, + skip_unless_feature, ) @@ -823,13 +823,17 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: @@ -840,13 +844,17 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/flower2.jpg") - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 1a9b4847c..715c5eab4 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -11,7 +11,6 @@ from PIL import Image, PdfParser from .helper import hopper, mark_if_feature_version - def helper_save_as_pdf(tmp_path, mode, **kwargs): # Arrange im = hopper(mode) @@ -86,7 +85,9 @@ def test_unsupported_mode(tmp_path): im.save(outfile) -@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") +@mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" +) def test_save_all(tmp_path): # Single frame image helper_save_as_pdf(tmp_path, "RGB", save_all=True) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 74bba7ce9..a1234b46a 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -13,8 +13,8 @@ from .helper import ( hopper, is_big_endian, is_win32, - skip_unless_feature, mark_if_feature_version, + skip_unless_feature, ) # sample png stream @@ -680,7 +680,9 @@ class TestFilePng: exif = reloaded._getexif() assert exif[274] == 1 - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_exif_from_jpg(self, tmp_path): with Image.open("Tests/images/pil_sample_rgb.jpg") as im: test_file = str(tmp_path / "temp.png") diff --git a/Tests/test_file_webp_metadata.py b/Tests/test_file_webp_metadata.py index 681d6fe7e..e6d6fc63f 100644 --- a/Tests/test_file_webp_metadata.py +++ b/Tests/test_file_webp_metadata.py @@ -4,8 +4,7 @@ import pytest from PIL import Image -from .helper import skip_unless_feature, mark_if_feature_version - +from .helper import mark_if_feature_version, skip_unless_feature pytestmark = [ skip_unless_feature("webp"), @@ -42,7 +41,9 @@ def test_read_exif_metadata_without_prefix(): assert exif[305] == "Adobe Photoshop CS6 (Macintosh)" -@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") +@mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" +) def test_write_exif_metadata(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() @@ -75,7 +76,9 @@ def test_read_icc_profile(): assert icc == expected_icc -@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") +@mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" +) def test_write_icc_metadata(): file_path = "Tests/images/flower2.jpg" test_buffer = BytesIO() @@ -93,7 +96,9 @@ def test_write_icc_metadata(): assert webp_icc_profile == expected_icc_profile, "Webp ICC didn't match" -@mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") +@mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" +) def test_read_no_exif(): file_path = "Tests/images/flower.jpg" test_buffer = BytesIO() diff --git a/Tests/test_image.py b/Tests/test_image.py index f7b51773c..82efefc1e 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -16,8 +16,8 @@ from .helper import ( assert_not_all_same, hopper, is_win32, - skip_unless_feature, mark_if_feature_version, + skip_unless_feature, ) @@ -663,7 +663,9 @@ class TestImage: assert not fp.closed - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_exif_jpeg(self, tmp_path): with Image.open("Tests/images/exif-72dpi-int.jpg") as im: # Little endian exif = im.getexif() diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 33d67fc15..8bf2ce916 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -4,8 +4,12 @@ import pytest from PIL import Image, ImageDraw -from .helper import assert_image_equal, assert_image_similar, hopper, mark_if_feature_version - +from .helper import ( + assert_image_equal, + assert_image_similar, + hopper, + mark_if_feature_version, +) class TestImagingResampleVulnerability: @@ -456,7 +460,9 @@ class TestCoreResampleBox: tiled.paste(tile, (x0, y0)) return tiled - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_tiles(self): with Image.open("Tests/images/flower.jpg") as im: assert im.size == (480, 360) @@ -467,7 +473,9 @@ class TestCoreResampleBox: tiled = self.resize_tiled(im, dst_size, *tiles) assert_image_similar(reference, tiled, 0.01) - @mark_if_feature_version(pytest.mark.valgrind_known_error, 'libjpeg_turbo', '2.0', reason="Known Failing") + @mark_if_feature_version( + pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" + ) def test_subsample(self): # This test shows advantages of the subpixel resizing # after supersampling (e.g. during JPEG decoding). From 75c60bd6bb8726374d2525ab051504c6beabd578 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 10 Apr 2021 17:47:18 +0200 Subject: [PATCH 554/750] Can't install valgrind in requirements, breaks doc building --- Makefile | 1 + requirements.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7d0c86abf..af3059f34 100644 --- a/Makefile +++ b/Makefile @@ -104,6 +104,7 @@ test: .PHONY: valgrind valgrind: + python3 -c "import pytest_valgrind" || pip3 install pytest-valgrind PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=no \ --log-file=/tmp/valgrind-output \ python3 -m pytest --no-memcheck -vv --valgrind --valgrind-log=/tmp/valgrind-output diff --git a/requirements.txt b/requirements.txt index 1b4a04a75..4b534ae53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,6 @@ pyroma pytest pytest-cov pytest-timeout -pytest-valgrind sphinx>=2.4 sphinx-issues sphinx-removed-in From ee41a133ddf89410a5293ca2dbcfca376e59ec39 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 10 Apr 2021 20:02:54 +0200 Subject: [PATCH 555/750] formatting --- src/libImaging/Jpeg2KDecode.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index e40a97fd6..151e0dc57 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -738,7 +738,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { If colorspace is unspecified, we assume: - Number of components Subsampling Colorspace + Number of components Subsampling Colorspace ------------------------------------------------------- 1 Any gray 2 Any gray (+ alpha) @@ -756,27 +756,30 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { switch (image->numcomps) { case 1: case 2: - color_space = OPJ_CLRSPC_GRAY; break; + color_space = OPJ_CLRSPC_GRAY; + break; case 3: case 4: switch (subsampling) { case -1: case 0: case 3: - color_space = OPJ_CLRSPC_SRGB; break; + color_space = OPJ_CLRSPC_SRGB; + break; case 1: case 2: - color_space = OPJ_CLRSPC_SYCC; break; + color_space = OPJ_CLRSPC_SYCC; + break; } break; } } - for (n = 0; n < sizeof(j2k_unpackers) / sizeof (j2k_unpackers[0]); ++n) { + for (n = 0; n < sizeof(j2k_unpackers) / sizeof(j2k_unpackers[0]); ++n) { if (color_space == j2k_unpackers[n].color_space && image->numcomps == j2k_unpackers[n].components && (j2k_unpackers[n].subsampling || (subsampling == -1)) && - strcmp (im->mode, j2k_unpackers[n].mode) == 0) { + strcmp(im->mode, j2k_unpackers[n].mode) == 0) { unpack = j2k_unpackers[n].unpacker; break; } From 65cdc2110599edf860944f7e404a782b1baede9a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 14:04:00 +1100 Subject: [PATCH 556/750] Changed quantize and quantize2 to static --- src/libImaging/Quant.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index 8ec99699f..b43c074d4 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -1243,7 +1243,7 @@ error_1: return 0; } -int +static int quantize( Pixel *pixelData, uint32_t nPixels, @@ -1511,7 +1511,7 @@ compute_distances(const HashTable *h, const Pixel pixel, uint32_t *dist, void *u } } -int +static int quantize2( Pixel *pixelData, uint32_t nPixels, From 5491bd5eda3b1c349d96e79248d53cfbe8693372 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Mar 2021 00:33:54 +1100 Subject: [PATCH 557/750] Merge parallel horizontal edges in ImagingDrawPolygon --- src/libImaging/Draw.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index b6f63b7e8..bec8f2582 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -734,7 +734,7 @@ ImagingDrawRectangle( int ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, int op) { - int i, n; + int i, n, x0, y0, x1, y1; DRAW *draw; INT32 ink; @@ -753,10 +753,28 @@ ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, i return -1; } for (i = n = 0; i < count - 1; i++) { - add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3]); + x0 = xy[i * 2]; + y0 = xy[i * 2 + 1]; + x1 = xy[i * 2 + 2]; + y1 = xy[i * 2 + 3]; + if (y0 == y1 && i != 0 && y0 == xy[i * 2 - 1]) { + // This is a horizontal line, + // that immediately follows another horizontal line + Edge *last_e = &e[n-1]; + if (x1 > x0 && x0 > xy[i * 2 - 2]) { + // They are both increasing in x + last_e->xmax = x1; + continue; + } else if (x1 < x0 && x0 < xy[i * 2 - 2]) { + // They are both decreasing in x + last_e->xmin = x1; + continue; + } + } + add_edge(&e[n++], x0, y0, x1, y1); } - if (xy[i + i] != xy[0] || xy[i + i + 1] != xy[1]) { - add_edge(&e[n++], xy[i + i], xy[i + i + 1], xy[0], xy[1]); + if (xy[i * 2] != xy[0] || xy[i * 2 + 1] != xy[1]) { + add_edge(&e[n++], xy[i * 2], xy[i * 2 + 1], xy[0], xy[1]); } draw->polygon(im, n, e, ink, 0); free(e); @@ -764,9 +782,9 @@ ImagingDrawPolygon(Imaging im, int count, int *xy, const void *ink_, int fill, i } else { /* Outline */ for (i = 0; i < count - 1; i++) { - draw->line(im, xy[i + i], xy[i + i + 1], xy[i + i + 2], xy[i + i + 3], ink); + draw->line(im, xy[i * 2], xy[i * 2 + 1], xy[i * 2 + 2], xy[i * 2 + 3], ink); } - draw->line(im, xy[i + i], xy[i + i + 1], xy[0], xy[1], ink); + draw->line(im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink); } return 0; From 824d2fa4f3fb20523768b650c2a305524c1af9aa Mon Sep 17 00:00:00 2001 From: Tsung-Po Sun Date: Sun, 31 Jan 2021 14:38:46 +0900 Subject: [PATCH 558/750] Add test --- .../continuous_horizontal_edges_polygon.png | Bin 0 -> 108 bytes Tests/test_imagedraw.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 Tests/images/imagedraw/continuous_horizontal_edges_polygon.png diff --git a/Tests/images/imagedraw/continuous_horizontal_edges_polygon.png b/Tests/images/imagedraw/continuous_horizontal_edges_polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..beffed5b918594f7952682238515cbd831a29b96 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|#-1*YAr*6yZ*0%M|NsC0PIXC- zpuPF`?b;qDGczkT?70w literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 7f31e1aaf..da17c6fa0 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1349,3 +1349,14 @@ def test_compute_regular_polygon_vertices_input_error_handling( with pytest.raises(expected_error) as e: ImageDraw._compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) assert str(e.value) == error_message + +def test_continuous_horizontal_edges_polygon(): + with Image.open( + os.path.join(IMAGES_PATH, "continuous_horizontal_edges_polygon.png") + ) as expected: + expected.load() + xy = [(2, 6), (12, 6), (12, 12), (8, 12), (8, 9), (8, 8), (5, 8), (4, 8), (3, 8), (2, 8), (2, 7)] + img, draw = create_base_image_draw((16, 16)) + draw.polygon(xy, BLACK) + assert_image_equal(img, expected, "continuous horizontal edges polygon failed") + \ No newline at end of file From 324d934128e72502f53587e1fa550ade969cafad Mon Sep 17 00:00:00 2001 From: Tsung-Po Sun Date: Sun, 31 Jan 2021 14:39:57 +0900 Subject: [PATCH 559/750] Remove spaces --- Tests/test_imagedraw.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index da17c6fa0..146ac7dc9 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1359,4 +1359,3 @@ def test_continuous_horizontal_edges_polygon(): img, draw = create_base_image_draw((16, 16)) draw.polygon(xy, BLACK) assert_image_equal(img, expected, "continuous horizontal edges polygon failed") - \ No newline at end of file From df0273e0244cdd62c71af51dd5a2b60c261969af Mon Sep 17 00:00:00 2001 From: Tsung-Po Sun Date: Sun, 31 Jan 2021 15:21:38 +0900 Subject: [PATCH 560/750] Reformat --- Tests/test_imagedraw.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 146ac7dc9..b5ac94e24 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1355,7 +1355,19 @@ def test_continuous_horizontal_edges_polygon(): os.path.join(IMAGES_PATH, "continuous_horizontal_edges_polygon.png") ) as expected: expected.load() - xy = [(2, 6), (12, 6), (12, 12), (8, 12), (8, 9), (8, 8), (5, 8), (4, 8), (3, 8), (2, 8), (2, 7)] + xy = [ + (2, 6), + (12, 6), + (12, 12), + (8, 12), + (8, 9), + (8, 8), + (5, 8), + (4, 8), + (3, 8), + (2, 8), + (2, 7) + ] img, draw = create_base_image_draw((16, 16)) draw.polygon(xy, BLACK) assert_image_equal(img, expected, "continuous horizontal edges polygon failed") From 87e7e88591de84ce8b633173c5c886c32daa154e Mon Sep 17 00:00:00 2001 From: Tsung-Po Sun Date: Sun, 31 Jan 2021 15:44:14 +0900 Subject: [PATCH 561/750] fix lint --- Tests/test_imagedraw.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index b5ac94e24..5718e4465 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1350,6 +1350,7 @@ def test_compute_regular_polygon_vertices_input_error_handling( ImageDraw._compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) assert str(e.value) == error_message + def test_continuous_horizontal_edges_polygon(): with Image.open( os.path.join(IMAGES_PATH, "continuous_horizontal_edges_polygon.png") @@ -1366,7 +1367,7 @@ def test_continuous_horizontal_edges_polygon(): (4, 8), (3, 8), (2, 8), - (2, 7) + (2, 7), ] img, draw = create_base_image_draw((16, 16)) draw.polygon(xy, BLACK) From 9a4b1301dee92d18ff89318793d89c3e945000e8 Mon Sep 17 00:00:00 2001 From: Tsung-Po Sun Date: Wed, 10 Feb 2021 00:04:28 +0900 Subject: [PATCH 562/750] Modify test code --- Tests/test_imagedraw.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 5718e4465..0faf304a8 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1361,13 +1361,9 @@ def test_continuous_horizontal_edges_polygon(): (12, 6), (12, 12), (8, 12), - (8, 9), (8, 8), - (5, 8), (4, 8), - (3, 8), (2, 8), - (2, 7), ] img, draw = create_base_image_draw((16, 16)) draw.polygon(xy, BLACK) From 006de79d60ad3a1d9f874a08726204ff5f013146 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Mar 2021 22:42:10 +1100 Subject: [PATCH 563/750] Use assert_image_equal_tofile --- Tests/test_imagedraw.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 0faf304a8..8d6195b27 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1352,19 +1352,18 @@ def test_compute_regular_polygon_vertices_input_error_handling( def test_continuous_horizontal_edges_polygon(): - with Image.open( - os.path.join(IMAGES_PATH, "continuous_horizontal_edges_polygon.png") - ) as expected: - expected.load() - xy = [ - (2, 6), - (12, 6), - (12, 12), - (8, 12), - (8, 8), - (4, 8), - (2, 8), - ] - img, draw = create_base_image_draw((16, 16)) - draw.polygon(xy, BLACK) - assert_image_equal(img, expected, "continuous horizontal edges polygon failed") + xy = [ + (2, 6), + (12, 6), + (12, 12), + (8, 12), + (8, 8), + (4, 8), + (2, 8), + ] + img, draw = create_base_image_draw((16, 16)) + draw.polygon(xy, BLACK) + expected = os.path.join(IMAGES_PATH, "continuous_horizontal_edges_polygon.png") + assert_image_equal_tofile( + img, expected, "continuous horizontal edges polygon failed" + ) From a3dbee9f0812b19236e776eaccf9fe13fb148a73 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Mar 2021 01:25:17 +1100 Subject: [PATCH 564/750] Cover horizontal lines both increasing in x --- Tests/test_imagedraw.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 8d6195b27..fa1fdddf1 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1354,6 +1354,7 @@ def test_compute_regular_polygon_vertices_input_error_handling( def test_continuous_horizontal_edges_polygon(): xy = [ (2, 6), + (6, 6), (12, 6), (12, 12), (8, 12), From 8803dd19f01060e09aaa825ed426b812479f2615 Mon Sep 17 00:00:00 2001 From: nulano Date: Mon, 12 Apr 2021 20:24:04 +0200 Subject: [PATCH 565/750] remove unused variables, PyPy 7.3.4 ships 64-bit binaries for Windows --- .github/workflows/test-windows.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index fe1aa1dfe..8f7706847 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -8,19 +8,13 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["pypy-3.6", "pypy-3.7", "3.6", "3.7", "3.8", "3.9", "3.10-dev"] + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10-dev"] architecture: ["x86", "x64"] include: - - architecture: "x86" - platform-vcvars: "x86" - platform-msbuild: "Win32" - - architecture: "x64" - platform-vcvars: "x86_amd64" - platform-msbuild: "x64" - exclude: - # PyPy does not support 64-bit on Windows + # PyPy3.6 only ships 32-bit binaries for Windows - python-version: "pypy-3.6" - architecture: "x64" + architecture: "x86" + # PyPy 7.3.4+ only ships 64-bit binaries for Windows - python-version: "pypy-3.7" architecture: "x64" timeout-minutes: 30 From 4dde8109d7927bfe674a406bd397e40d67ab464b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 14 Apr 2021 22:48:27 +1000 Subject: [PATCH 566/750] Resolved FIXME by reading mandatory FITS header items --- Tests/images/hopper_naxis_zero.fits | Bin 0 -> 54720 bytes Tests/test_file_fitsstub.py | 23 ++++++++++++--- src/PIL/FitsStubImagePlugin.py | 42 ++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 Tests/images/hopper_naxis_zero.fits diff --git a/Tests/images/hopper_naxis_zero.fits b/Tests/images/hopper_naxis_zero.fits new file mode 100644 index 0000000000000000000000000000000000000000..580cf3a2c003c6c4998e7c8ac4a1e85926fb6b33 GIT binary patch literal 54720 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_fitsstub.py b/Tests/test_file_fitsstub.py index 6dc7c4602..c77457947 100644 --- a/Tests/test_file_fitsstub.py +++ b/Tests/test_file_fitsstub.py @@ -1,3 +1,5 @@ +from io import BytesIO + import pytest from PIL import FitsStubImagePlugin, Image @@ -11,10 +13,8 @@ def test_open(): # Assert assert im.format == "FITS" - - # Dummy data from the stub - assert im.mode == "F" - assert im.size == (1, 1) + assert im.size == (128, 128) + assert im.mode == "L" def test_invalid_file(): @@ -35,6 +35,21 @@ def test_load(): im.load() +def test_truncated_fits(): + # No END to headers + image_data = b"SIMPLE = T" + b" " * 50 + b"TRUNCATE" + with pytest.raises(OSError): + FitsStubImagePlugin.FITSStubImageFile(BytesIO(image_data)) + + +def test_naxis_zero(): + # This test image has been manually hexedited + # to set the number of data axes to zero + with pytest.raises(ValueError): + with Image.open("Tests/images/hopper_naxis_zero.fits"): + pass + + def test_save(): # Arrange with Image.open(TEST_FILE) as im: diff --git a/src/PIL/FitsStubImagePlugin.py b/src/PIL/FitsStubImagePlugin.py index c2ce8651c..a3a94cf4b 100644 --- a/src/PIL/FitsStubImagePlugin.py +++ b/src/PIL/FitsStubImagePlugin.py @@ -38,21 +38,45 @@ class FITSStubImageFile(ImageFile.StubImageFile): format_description = "FITS" def _open(self): - offset = self.fp.tell() - if not _accept(self.fp.read(6)): - raise SyntaxError("Not a FITS file") + headers = {} + while True: + header = self.fp.read(80) + if not header: + raise OSError("Truncated FITS file") + keyword = header[:8].strip() + if keyword == b"END": + break + value = header[8:].strip() + if value.startswith(b"="): + value = value[1:].strip() + if not headers and (not _accept(keyword) or value != b"T"): + raise SyntaxError("Not a FITS file") + headers[keyword] = value - # FIXME: add more sanity checks here; mandatory header items - # include SIMPLE, BITPIX, NAXIS, etc. + naxis = int(headers[b"NAXIS"]) + if naxis == 0: + raise ValueError("No image data") + elif naxis == 1: + self._size = 1, int(headers[b"NAXIS1"]) + else: + self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"]) + + number_of_bits = int(headers[b"BITPIX"]) + if number_of_bits == 8: + self.mode = "L" + elif number_of_bits == 16: + self.mode = "I" + # rawmode = "I;16S" + elif number_of_bits == 32: + self.mode = "I" + elif number_of_bits in (-32, -64): + self.mode = "F" + # rawmode = "F" if number_of_bits == -32 else "F;64F" self.fp.seek(offset) - # make something up - self.mode = "F" - self._size = 1, 1 - loader = self._load() if loader: loader.open(self) From 8498bf725d04ef6bbd28c03abcfaa4f4b609fdee Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 Apr 2021 18:23:06 +1000 Subject: [PATCH 567/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9bbcbd8de..035f4ad59 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Fixed ensuring that GIF previous frame was loaded #5386 + [radarhere] + +- Valgrind fixes #5397 + [wiredfool] + +- Round down the radius in rounded_rectangle #5382 + [radarhere] + - Fixed reading uncompressed RGB data from DDS #5383 [radarhere] From a47072bcbe117324a2373cc96d733f07bee267d7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 Apr 2021 19:01:12 +1000 Subject: [PATCH 568/750] Treat previous contents of first frame as transparent --- Tests/images/dispose_prev_first_frame.gif | Bin 0 -> 530 bytes Tests/images/dispose_prev_first_frame_seeked.gif | Bin 0 -> 1028 bytes Tests/test_file_gif.py | 8 ++++++++ src/PIL/GifImagePlugin.py | 8 ++++++++ 4 files changed, 16 insertions(+) create mode 100644 Tests/images/dispose_prev_first_frame.gif create mode 100644 Tests/images/dispose_prev_first_frame_seeked.gif diff --git a/Tests/images/dispose_prev_first_frame.gif b/Tests/images/dispose_prev_first_frame.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c19dd1ed43d2347a7914062e63d8dcfd1f55d4a GIT binary patch literal 530 zcmZ?wbhEHbOkpr$Xk-9^|6meGDE?&OO##w6AOVm(1II%KMh+Q|4GRu7a|ny^9N4h% zaJzuA*PI^#3y*e7a0cBuv2pR?9tCH;FCLqoxKGqDo)zP1wA8y>CpoXi^Yel;vjwwX z$#iT^KRnmE_7}^l;0*soroE3`yn*Sc@Zy<5~$9r!M07uVZ!M`j1;yY8#~>&4O&@FC$48}D-$o1l-L$82Qn z+jty4rJR^nA0#$o=EJmebM3?V{_ZShxVS8E^1V5`zGR(R8@d0O&FsRQ8(RhMFPj@# qnty$ND*JKUIoqE$VEP&qD)2A?h5$1n1Xu=b2*_Xw0b?RVz#0H&uIHKn literal 0 HcmV?d00001 diff --git a/Tests/images/dispose_prev_first_frame_seeked.gif b/Tests/images/dispose_prev_first_frame_seeked.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc3eb1393c104f8490ecb8f26fc579f548c37516 GIT binary patch literal 1028 zcmV+f1pE6(Nk%w1VPpU@0EYko0003000000000001Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LWWB>pFEC2ui0Av6%06+-g00RgdNU)&6g9sBA1i-MN!-o(fN}Tvm zp~Z_B2~yn1v7^I`AVV(nNV4Qdktj2oTuCyeON%UHZhT4epv;>QYw8?`vuDGdJAL{D zs#9oBqBV`;L`qZXO{OoM%7p4tYD}srt+K?5QtL{tBE6af8&YgZvLMa2M2k_aN49O< za)f(P?p(SG?asuTP%lNkef>%Vj8O1k!UhfJL_AXQNya=KKZYDY@?^-Ce^M5hnc-&6 yoj+F&{kby$(WX(8-kiGhYRauyzs5Y9actPN5#OerS#@vMzhwu Date: Thu, 15 Apr 2021 19:05:04 +1000 Subject: [PATCH 569/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 035f4ad59..e280780db 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Use zero if GIF background color index is missing #5390 + [radarhere] + - Fixed ensuring that GIF previous frame was loaded #5386 [radarhere] From 9b6fe1b039e4a70d59a4f0115df813090bb230f6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 Apr 2021 20:26:31 +1000 Subject: [PATCH 570/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e280780db..ea1eee884 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Stop decoding BC1 punchthrough alpha in BC2&3 #4144 + [jansol] + - Use zero if GIF background color index is missing #5390 [radarhere] From 7a4bf3df0feb1dede00f280d25d98c5050400ef1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 Apr 2021 20:55:45 +1000 Subject: [PATCH 571/750] Changed exception type to be more specific --- src/PIL/JpegImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 48e0de535..e31c61ee8 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -141,7 +141,7 @@ def APP(self, marker): # extract Adobe custom properties try: adobe_transform = s[1] - except Exception: + except IndexError: pass else: self.info["adobe_transform"] = adobe_transform From 4351c37fc4baadbc5d81cf732db608438aa8eebb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 Apr 2021 21:49:51 +1000 Subject: [PATCH 572/750] Corrected adobe_transform value --- Tests/test_file_jpeg.py | 7 +++++++ src/PIL/JpegImagePlugin.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 18837156a..8c3bc76c6 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -795,6 +795,13 @@ class TestFileJpeg: apps_13_lengths = [len(v) for k, v in im.applist if k == "APP13"] assert [65504, 24] == apps_13_lengths + def test_adobe_transform(self): + with Image.open("Tests/images/pil_sample_rgb.jpg") as im: + assert im.info["adobe_transform"] == 1 + + with Image.open("Tests/images/pil_sample_cmyk.jpg") as im: + assert im.info["adobe_transform"] == 2 + def test_icc_after_SOF(self): with Image.open("Tests/images/icc-after-SOF.jpg") as im: assert im.info["icc_profile"] == b"profile" diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index e31c61ee8..f449a2dc0 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -140,7 +140,7 @@ def APP(self, marker): self.info["adobe"] = i16(s, 5) # extract Adobe custom properties try: - adobe_transform = s[1] + adobe_transform = s[11] except IndexError: pass else: From 01871b88dfbc36358a87fe408c9af28ccf76f329 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Apr 2021 09:23:16 +1000 Subject: [PATCH 573/750] Changed wording to avoid confusion with IMAGING_TYPE_SPECIAL [ci skip] --- docs/handbook/concepts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index c4cdda78d..66eeaf6f8 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -44,7 +44,7 @@ supports the following standard modes: * ``I`` (32-bit signed integer pixels) * ``F`` (32-bit floating point pixels) -Pillow also provides limited support for a few special modes, including: +Pillow also provides limited support for a few additional modes, including: * ``LA`` (L with alpha) * ``PA`` (P with alpha) From 7c0344bb9997bd7df6f37b4c9df55598ea0064ee Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Apr 2021 12:18:42 +1000 Subject: [PATCH 574/750] For special image modes, revert default resize resampling to NEAREST --- Tests/test_image_resize.py | 4 ++++ src/PIL/Image.py | 15 ++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index a49abe1b9..50c5a99bd 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -250,3 +250,7 @@ class TestImageResize: for mode in "1", "P": im = hopper(mode) assert im.resize((20, 20), Image.NEAREST) == im.resize((20, 20)) + + for mode in "I;16", "I;16L", "I;16B", "BGR;15", "BGR;16": + im = hopper(mode) + assert im.resize((20, 20), Image.NEAREST) == im.resize((20, 20)) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ebeaf3c74..6529db2be 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1849,7 +1849,7 @@ class Image: min(self.size[1], math.ceil(box[3] + support_y)), ) - def resize(self, size, resample=BICUBIC, box=None, reducing_gap=None): + def resize(self, size, resample=None, box=None, reducing_gap=None): """ Returns a resized copy of this image. @@ -1859,9 +1859,11 @@ class Image: one of :py:data:`PIL.Image.NEAREST`, :py:data:`PIL.Image.BOX`, :py:data:`PIL.Image.BILINEAR`, :py:data:`PIL.Image.HAMMING`, :py:data:`PIL.Image.BICUBIC` or :py:data:`PIL.Image.LANCZOS`. - Default filter is :py:data:`PIL.Image.BICUBIC`. - If the image has mode "1" or "P", it is - always set to :py:data:`PIL.Image.NEAREST`. + If the image has mode "1" or "P", it is always set to + :py:data:`PIL.Image.NEAREST`. + If the image mode specifies a number of bits, such as "I;16", then the + default filter is :py:data:`PIL.Image.NEAREST`. + Otherwise, the default filter is :py:data:`PIL.Image.BICUBIC`. See: :ref:`concept-filters`. :param box: An optional 4-tuple of floats providing the source image region to be scaled. @@ -1882,7 +1884,10 @@ class Image: :returns: An :py:class:`~PIL.Image.Image` object. """ - if resample not in (NEAREST, BILINEAR, BICUBIC, LANCZOS, BOX, HAMMING): + if resample is None: + type_special = ";" in self.mode + resample = NEAREST if type_special else BICUBIC + elif resample not in (NEAREST, BILINEAR, BICUBIC, LANCZOS, BOX, HAMMING): message = f"Unknown resampling filter ({resample})." filters = [ From 28eb57888d6906fa57da101d33206daf38553903 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 18 Apr 2021 12:33:00 +1000 Subject: [PATCH 575/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ea1eee884..e01153c8c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- JPEG2000: Support decoding subsampled RGB and YCbCr images #4996 + [nulano, radarhere] + - Stop decoding BC1 punchthrough alpha in BC2&3 #4144 [jansol] From 7e4fd9d84591a220d142cbc4652b18250984cf41 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 18 Apr 2021 14:47:05 +1000 Subject: [PATCH 576/750] Changed incorrect mode errors to ValueError --- Tests/test_imagemorph.py | 14 +++++++------- src/PIL/ImageMorph.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index eb41d2d08..368c2bba1 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -235,19 +235,19 @@ def test_negate(): ) -def test_non_binary_images(): +def test_incorrect_mode(): im = hopper("RGB") mop = ImageMorph.MorphOp(op_name="erosion8") - with pytest.raises(Exception) as e: + with pytest.raises(ValueError) as e: mop.apply(im) - assert str(e.value) == "Image must be binary, meaning it must use mode L" - with pytest.raises(Exception) as e: + assert str(e.value) == "Image mode must be L" + with pytest.raises(ValueError) as e: mop.match(im) - assert str(e.value) == "Image must be binary, meaning it must use mode L" - with pytest.raises(Exception) as e: + assert str(e.value) == "Image mode must be L" + with pytest.raises(ValueError) as e: mop.get_on_pixels(im) - assert str(e.value) == "Image must be binary, meaning it must use mode L" + assert str(e.value) == "Image mode must be L" def test_add_patterns(): diff --git a/src/PIL/ImageMorph.py b/src/PIL/ImageMorph.py index b76dfa01f..fe0083754 100644 --- a/src/PIL/ImageMorph.py +++ b/src/PIL/ImageMorph.py @@ -196,7 +196,7 @@ class MorphOp: raise Exception("No operator loaded") if image.mode != "L": - raise Exception("Image must be binary, meaning it must use mode L") + raise ValueError("Image mode must be L") outimage = Image.new(image.mode, image.size, None) count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) return count, outimage @@ -211,7 +211,7 @@ class MorphOp: raise Exception("No operator loaded") if image.mode != "L": - raise Exception("Image must be binary, meaning it must use mode L") + raise ValueError("Image mode must be L") return _imagingmorph.match(bytes(self.lut), image.im.id) def get_on_pixels(self, image): @@ -221,7 +221,7 @@ class MorphOp: of all matching pixels. See :ref:`coordinate-system`.""" if image.mode != "L": - raise Exception("Image must be binary, meaning it must use mode L") + raise ValueError("Image mode must be L") return _imagingmorph.get_on_pixels(image.im.id) def load_lut(self, filename): From 40eceec70db497385eb00b649288e326cc2da12e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Apr 2021 20:12:52 +1000 Subject: [PATCH 577/750] Added contain method --- Tests/test_imageops.py | 18 ++++++++++++++ src/PIL/ImageOps.py | 54 ++++++++++++++++++++++++++++-------------- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 93be34bf8..987a531df 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -37,6 +37,9 @@ def test_sanity(): ImageOps.pad(hopper("L"), (128, 128)) ImageOps.pad(hopper("RGB"), (128, 128)) + ImageOps.contain(hopper("L"), (128, 128)) + ImageOps.contain(hopper("RGB"), (128, 128)) + ImageOps.crop(hopper("L"), 1) ImageOps.crop(hopper("RGB"), 1) @@ -99,6 +102,21 @@ def test_fit_same_ratio(): assert new_im.size == (1000, 755) +def test_contain(): + # Same ratio + im = hopper() + new_size = (im.width * 2, im.height * 2) + new_im = ImageOps.contain(im, new_size) + assert new_im.size == new_size + + for new_size in [ + (im.width * 4, im.height * 2), + (im.width * 2, im.height * 4), + ]: + new_im = ImageOps.contain(im, new_size) + assert new_im.size == (im.width * 2, im.height * 2) + + def test_pad(): # Same ratio im = hopper() diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index d69a304ca..6c15957d8 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -236,6 +236,34 @@ def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoi return _lut(image, red + green + blue) +def contain(image, size, method=Image.BICUBIC): + """ + Returns a sized version of the image, expanded to fill the requested aspect ratio + and size. + + :param image: The image to size and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: What resampling method to use. Default is + :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio > dest_ratio: + new_height = int(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = int(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)): """ Returns a sized and padded version of the image, expanded to fill the @@ -257,27 +285,17 @@ def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)): :return: An image. """ - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio == dest_ratio: - out = image.resize(size, resample=method) + resized = contain(image, size, method) + if resized.size == size: + out = resized else: out = Image.new(image.mode, size, color) - if im_ratio > dest_ratio: - new_height = int(image.height / image.width * size[0]) - if new_height != size[1]: - image = image.resize((size[0], new_height), resample=method) - - y = int((size[1] - new_height) * max(0, min(centering[1], 1))) - out.paste(image, (0, y)) + if resized.width != size[0]: + x = int((size[0] - resized.width) * max(0, min(centering[0], 1))) + out.paste(resized, (x, 0)) else: - new_width = int(image.width / image.height * size[1]) - if new_width != size[0]: - image = image.resize((new_width, size[1]), resample=method) - - x = int((size[0] - new_width) * max(0, min(centering[0], 1))) - out.paste(image, (x, 0)) + y = int((size[1] - resized.height) * max(0, min(centering[1], 1))) + out.paste(resized, (0, y)) return out From cfc9ad46bc8e609e73cc52a6014f07ac2cfba8e9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 08:16:57 +1000 Subject: [PATCH 578/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e01153c8c..3e170d8be 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- For special image modes, revert default resize resampling to NEAREST #5411 + [radarhere] + - JPEG2000: Support decoding subsampled RGB and YCbCr images #4996 [nulano, radarhere] From 72d7d1d0ea7db9b95f95893eadabf73c01b231b6 Mon Sep 17 00:00:00 2001 From: gladiusglad Date: Tue, 20 Apr 2021 11:01:46 +0700 Subject: [PATCH 579/750] Add EXIF tags which are part of the EXIF 2.32 specification --- src/PIL/ExifTags.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/PIL/ExifTags.py b/src/PIL/ExifTags.py index f1c037e51..7da2ddae5 100644 --- a/src/PIL/ExifTags.py +++ b/src/PIL/ExifTags.py @@ -17,6 +17,7 @@ well-known EXIF tags. TAGS = { # possibly incomplete + 0x0001: "InteropIndex", 0x000B: "ProcessingSoftware", 0x00FE: "NewSubfileType", 0x00FF: "SubfileType", @@ -121,9 +122,18 @@ TAGS = { 0x8829: "Interlace", 0x882A: "TimeZoneOffset", 0x882B: "SelfTimerMode", + 0x8830: "SensitivityType", + 0x8831: "StandardOutputSensitivity", + 0x8832: "RecommendedExposureIndex", + 0x8833: "ISOSpeed", + 0x8834: "ISOSpeedLatitudeyyy", + 0x8835: "ISOSpeedLatitudezzz", 0x9000: "ExifVersion", 0x9003: "DateTimeOriginal", 0x9004: "DateTimeDigitized", + 0x9010: "OffsetTime", + 0x9011: "OffsetTimeOriginal", + 0x9012: "OffsetTimeDigitized", 0x9101: "ComponentsConfiguration", 0x9102: "CompressedBitsPerPixel", 0x9201: "ShutterSpeedValue", @@ -197,6 +207,9 @@ TAGS = { 0xA433: "LensMake", 0xA434: "LensModel", 0xA435: "LensSerialNumber", + 0xA460: "CompositeImage", + 0xA461: "CompositeImageCount", + 0xA462: "CompositeImageExposureTimes", 0xA500: "Gamma", 0xC4A5: "PrintImageMatching", 0xC612: "DNGVersion", From 8d52181123101a868efef787bd97f8901c0b8512 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 20:24:50 +1000 Subject: [PATCH 580/750] Corrected test --- Tests/test_file_ico.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 5ace0c55e..1a5a695fa 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -119,5 +119,4 @@ def test_draw_reloaded(tmp_path): im.save(outfile) with Image.open(outfile) as im: - im.save("Tests/images/hopper_draw.ico") assert_image_equal_tofile(im, "Tests/images/hopper_draw.ico") From 6967f3519f3622f7b9ab53470ea75f388beb5b2a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 20:53:50 +1000 Subject: [PATCH 581/750] Test when "adobe_transform" is unable to be read --- Tests/images/truncated_app14.jpg | Bin 0 -> 29342 bytes Tests/test_file_jpeg.py | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 Tests/images/truncated_app14.jpg diff --git a/Tests/images/truncated_app14.jpg b/Tests/images/truncated_app14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..232a4c35f8c5ac8cba5c873e698f7415165ccfb3 GIT binary patch literal 29342 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 8c3bc76c6..ab799c13f 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -802,6 +802,13 @@ class TestFileJpeg: with Image.open("Tests/images/pil_sample_cmyk.jpg") as im: assert im.info["adobe_transform"] == 2 + # This image has been manually hexedited + # so that the APP14 reports its length to be 11, + # leaving no room for "adobe_transform" + with Image.open("Tests/images/truncated_app14.jpg") as im: + assert "adobe" in im.info + assert "adobe_transform" not in im.info + def test_icc_after_SOF(self): with Image.open("Tests/images/icc-after-SOF.jpg") as im: assert im.info["icc_profile"] == b"profile" From ab8955b48e84b18c578d165e7d10868794311ce2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 21:47:21 +1000 Subject: [PATCH 582/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3e170d8be..e1c430278 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Treat previous contents of first GIF frame as transparent #5391 + [radarhere] + - For special image modes, revert default resize resampling to NEAREST #5411 [radarhere] From 510f93b8863883ce1a043c5bab636b1878439afa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 16 Apr 2021 23:01:01 +1000 Subject: [PATCH 583/750] Updated libtiff to 4.3.0 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 36ad351fc..a5ef99efd 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -141,9 +141,9 @@ deps = { "libs": [r"*.lib"], }, "libtiff": { - "url": "https://download.osgeo.org/libtiff/tiff-4.2.0.tar.gz", - "filename": "tiff-4.2.0.tar.gz", - "dir": "tiff-4.2.0", + "url": "https://download.osgeo.org/libtiff/tiff-4.3.0.tar.gz", + "filename": "tiff-4.3.0.tar.gz", + "dir": "tiff-4.3.0", "build": [ cmd_cmake("-DBUILD_SHARED_LIBS:BOOL=OFF"), cmd_nmake(target="clean"), From 9e80930ad837f34c1a7ccf92d43eafcb2bdccd74 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 22:36:45 +1000 Subject: [PATCH 584/750] Updated nasm to 2.15.05 --- .appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index b843b16ee..0cf1d5a9e 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -23,9 +23,9 @@ install: - 7z x pillow-depends.zip -oc:\ - mv c:\pillow-depends-master c:\pillow-depends - xcopy /S /Y c:\pillow-depends\test_images\* c:\pillow\tests\images -- 7z x ..\pillow-depends\nasm-2.14.02-win64.zip -oc:\ +- 7z x ..\pillow-depends\nasm-2.15.05-win64.zip -oc:\ - ..\pillow-depends\gs9540w32.exe /S -- path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.54.0\bin;%PATH% +- path c:\nasm-2.15.05;C:\Program Files (x86)\gs\gs9.54.0\bin;%PATH% - cd c:\pillow\winbuild\ - ps: | c:\python37\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\ From 4b066e66da9307337e0e7df574fb96293086a1ad Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Apr 2021 23:58:52 +1000 Subject: [PATCH 585/750] Added info about mode when saving for Windows [ci skip] --- src/PIL/IcoImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 5634bf8e9..ff92390fb 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -267,7 +267,8 @@ class IcoImageFile(ImageFile.ImageFile): Handles classic, XP and Vista icon formats. When saving, PNG compression is used. Support for this was only added in - Windows Vista. + Windows Vista. If you are unable to view the icon in Windows, convert the + image to "RGBA" mode before saving. This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis . From 8446c471b5b730f5d5c8689f30acd88b7721b2ac Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Tue, 20 Apr 2021 23:13:31 +0200 Subject: [PATCH 586/750] doc: add Raspberry Pi OS to platform support --- docs/installation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index be0ed84a6..3f2e823d4 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -532,6 +532,8 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Raspbian Stretch | 2.7, 3.5 | 4.0.0 |arm | +----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Raspberry Pi OS | 2.7, 3.6, 3.7, 3.8, 3.9 | 8.2.0 |arm | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7, 3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | FreeBSD 11.1 | 2.7, 3.4, 3.5, 3.6 | 4.3.0 |x86-64 | From 6b098a2c34300220bd0de4955f5a4951a9a75bf5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 21 Apr 2021 22:37:47 +1000 Subject: [PATCH 587/750] Changed TIFF tag 33723 length to 1 --- Tests/test_file_tiff_metadata.py | 6 ++++++ src/PIL/TiffTags.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 0f7f8adf1..af7528be0 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -179,6 +179,12 @@ def test_no_duplicate_50741_tag(): assert TAG_IDS["BestQualityScale"] == 50780 +def test_iptc(tmp_path): + out = str(tmp_path / "temp.tiff") + with Image.open("Tests/images/hopper.Lab.tif") as im: + im.save(out) + + def test_empty_metadata(): f = io.BytesIO(b"II*\x00\x08\x00\x00\x00") head = f.read(8) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 088272162..d7f732193 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -178,7 +178,7 @@ TAGS_V2 = { 532: ("ReferenceBlackWhite", RATIONAL, 6), 700: ("XMP", BYTE, 0), 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 0), + 33723: ("IptcNaaInfo", UNDEFINED, 1), 34377: ("PhotoshopInfo", BYTE, 0), # FIXME add more tags here 34665: ("ExifIFD", LONG, 1), From 0da88de5deeba17a80c2d8ad249bd153be746981 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 21 Apr 2021 23:38:20 +1000 Subject: [PATCH 588/750] Updated macOS tested Pillow versions [ci skip] --- docs/installation.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index be0ed84a6..3202a74f2 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -485,18 +485,18 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| macOS 11.0 Big Sur | 3.8, 3.9 | 8.1.2 |arm | +| macOS 11.0 Big Sur | 3.8, 3.9 | 8.2.0 |arm | | +------------------------------+--------------------------------+-----------------------+ -| | 3.6, 3.7, 3.8, 3.9 | 8.1.2 |x86-64 | +| | 3.6, 3.7, 3.8, 3.9 | 8.2.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9 | 8.0.1 |x86-64 | -| +------------------------------+--------------------------------+ + +| +------------------------------+--------------------------------+ | | | 3.5 | 7.2.0 | | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.14 Mojave | 3.5, 3.6, 3.7, 3.8 | 7.2.0 |x86-64 | -| +------------------------------+--------------------------------+ + +| +------------------------------+--------------------------------+ | | | 2.7 | 6.0.0 | | -| +------------------------------+--------------------------------+ + +| +------------------------------+--------------------------------+ | | | 3.4 | 5.4.1 | | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.13 High Sierra | 2.7, 3.4, 3.5, 3.6 | 4.2.1 |x86-64 | @@ -504,7 +504,7 @@ These platforms have been reported to work at the versions mentioned. | macOS 10.12 Sierra | 2.7, 3.4, 3.5, 3.6 | 4.1.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.11 El Capitan | 2.7, 3.4, 3.5, 3.6, 3.7 | 5.4.1 |x86-64 | -| +------------------------------+--------------------------------+ + +| +------------------------------+--------------------------------+ | | | 3.3 | 4.1.0 | | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Mac OS X 10.9 Mavericks | 2.7, 3.2, 3.3, 3.4 | 3.0.0 |x86-64 | From 5dce1fa607d0166513d98599f0eee7551ade027b Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Wed, 21 Apr 2021 19:40:56 +0200 Subject: [PATCH 589/750] update table for py27 on raspberry pi os --- docs/installation.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 3f2e823d4..ab847bff5 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -532,7 +532,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Raspbian Stretch | 2.7, 3.5 | 4.0.0 |arm | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| Raspberry Pi OS | 2.7, 3.6, 3.7, 3.8, 3.9 | 8.2.0 |arm | +| Raspberry Pi OS | 2.7 | 6.2.2 |arm | +| +------------------------------+--------------------------------+-----------------------+ +| | 3.6, 3.7, 3.8, 3.9 | 8.2.0 |arm | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7, 3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From ef23737ebc03d6efebae514383b1a5025f423839 Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Thu, 22 Apr 2021 00:22:21 +0200 Subject: [PATCH 590/750] Update docs/installation.rst Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/installation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index ab847bff5..d9d1af6e0 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -532,9 +532,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Raspbian Stretch | 2.7, 3.5 | 4.0.0 |arm | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| Raspberry Pi OS | 2.7 | 6.2.2 |arm | -| +------------------------------+--------------------------------+-----------------------+ -| | 3.6, 3.7, 3.8, 3.9 | 8.2.0 |arm | +| Raspberry Pi OS | 3.6, 3.7, 3.8, 3.9 | 8.2.0 |arm | +| +------------------------------+--------------------------------+ | +| | 2.7 | 6.2.2 | | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7, 3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From 900b849aa8f915461630cf738a2927eca505beb2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 22 Apr 2021 21:18:21 +1000 Subject: [PATCH 591/750] Use bpp from header --- Tests/images/black_and_white.ico | Bin 0 -> 198 bytes Tests/test_file_ico.py | 6 ++++++ src/PIL/IcoImagePlugin.py | 8 +------- 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 Tests/images/black_and_white.ico diff --git a/Tests/images/black_and_white.ico b/Tests/images/black_and_white.ico new file mode 100644 index 0000000000000000000000000000000000000000..f98d7ac8e8d2234a25ac5b8c90c8c7914733878b GIT binary patch literal 198 xcmZQzU<5(|0VXiLfq{WR42U&=SOAC>fEXl?5B&fCA4OXJ2Ll5!7)29>8~~Bo4=Mlv literal 0 HcmV?d00001 diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 5ace0c55e..edf3095f7 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -18,6 +18,12 @@ def test_sanity(): assert im.get_format_mimetype() == "image/x-icon" +def test_black_and_white(): + with Image.open("Tests/images/black_and_white.ico") as im: + assert im.mode == "RGBA" + assert im.size == (16, 16) + + def test_invalid_file(): with open("Tests/images/flower.jpg", "rb") as fp: with pytest.raises(SyntaxError): diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 5634bf8e9..6e15a8bdb 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -190,13 +190,7 @@ class IcoFile: im.tile[0] = d, (0, 0) + im.size, o, a # figure out where AND mask image starts - mode = a[0] - bpp = 8 - for k, v in BmpImagePlugin.BIT2MODE.items(): - if mode == v[1]: - bpp = k - break - + bpp = header["bpp"] if 32 == bpp: # 32-bit color depth icon image allows semitransparent areas # PIL's DIB format ignores transparency bits, recover them. From d62be3e3541d5456bca1290e6072900759e77245 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 22 Apr 2021 22:16:21 +1000 Subject: [PATCH 592/750] Switched to saving 1-bit PDFs with DCTDecode --- Tests/test_file_pdf.py | 3 ++- src/PIL/PdfImagePlugin.py | 8 +------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 005acdfdd..5ad40b011 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -42,7 +42,8 @@ def test_monochrome(tmp_path): mode = "1" # Act / Assert - helper_save_as_pdf(tmp_path, mode) + outfile = helper_save_as_pdf(tmp_path, mode) + assert os.path.getsize(outfile) < 15000 def test_greyscale(tmp_path): diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 36c8fb849..2ba4671d5 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -124,7 +124,7 @@ def _save(im, fp, filename, save_all=False): decode = None if im.mode == "1": - filter = "ASCIIHexDecode" + filter = "DCTDecode" colorspace = PdfParser.PdfName("DeviceGray") procset = "ImageB" # grayscale bits = 1 @@ -161,12 +161,6 @@ def _save(im, fp, filename, save_all=False): op = io.BytesIO() if filter == "ASCIIHexDecode": - if bits == 1: - # FIXME: the hex encoder doesn't support packed 1-bit - # images; do things the hard way... - data = im.tobytes("raw", "1") - im = Image.new("L", im.size) - im.putdata(data) ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) elif filter == "DCTDecode": Image.SAVE["JPEG"](im, op, filename) From 46a1ee20a16296399218ba457f387b4485164419 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Apr 2021 08:43:52 +1000 Subject: [PATCH 593/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e1c430278..aa3b73b0e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Changed ImageMorph incorrect mode errors to ValueError #5414 + [radarhere] + +- Add EXIF tags specified in EXIF 2.32 #5419 + [gladiusglad] + - Treat previous contents of first GIF frame as transparent #5391 [radarhere] From 0f7c15728e35892f8b6c1e65db63c0a4f43e1b02 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Apr 2021 08:51:13 +1000 Subject: [PATCH 594/750] Updated libjpeg-turbo to 2.1.0 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 36ad351fc..31a700c02 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -105,9 +105,9 @@ header = [ # dependencies, listed in order of compilation deps = { "libjpeg": { - "url": SF_MIRROR + "/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6.tar.gz", - "filename": "libjpeg-turbo-2.0.6.tar.gz", - "dir": "libjpeg-turbo-2.0.6", + "url": SF_MIRROR + "/project/libjpeg-turbo/2.1.0/libjpeg-turbo-2.1.0.tar.gz", + "filename": "libjpeg-turbo-2.1.0.tar.gz", + "dir": "libjpeg-turbo-2.1.0", "build": [ cmd_cmake( [ From 67fbb8b815401e4850839769ba5f0e0a7750861b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 21:35:21 +1000 Subject: [PATCH 595/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aa3b73b0e..573c44139 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Use bpp from ICO header #5429 + [radarhere] + +- Corrected JPEG APP14 transform value #5408 + [radarhere] + +- Changed TIFF tag 33723 length to 1 #5425 + [radarhere] + - Changed ImageMorph incorrect mode errors to ValueError #5414 [radarhere] From 5cae79b8e582d2cbf14195f9d56980628de1485c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 Apr 2021 20:27:00 +1000 Subject: [PATCH 596/750] Fixed Python 3.10 at alpha.7 --- .ci/install.sh | 2 +- .github/workflows/macos-install.sh | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 4917b3a7c..298eb9edc 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -31,7 +31,7 @@ python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 -if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi +if ! [ "$GHA_PYTHON_VERSION" == "3.10.0-alpha.7" ]; then python3 -m pip install numpy ; fi # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index f45824445..fafe329e0 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -15,7 +15,7 @@ python3 -m pip install test-image-results echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg # TODO Remove condition when numpy supports 3.10 -if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi +if ! [ "$GHA_PYTHON_VERSION" == "3.10.0-alpha.7" ]; then python3 -m pip install numpy ; fi # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e52fefc69..f35ff83fa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: python-version: [ "pypy-3.7", "pypy-3.6", - "3.10-dev", + "3.10.0-alpha.7", "3.9", "3.8", "3.7", From 12968c3269f2f54becfafdd62390a01a7535a4d2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 Apr 2021 21:43:00 +1000 Subject: [PATCH 597/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 573c44139..2fcd60b76 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Switched to saving 1-bit PDFs with DCTDecode #5430 + [radarhere] + - Use bpp from ICO header #5429 [radarhere] From f1b1e9465df735aa8c7173b748fb31516205fa8a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Apr 2021 07:51:11 +1000 Subject: [PATCH 598/750] Added Fedora 34 --- .github/workflows/test-docker.yml | 1 + docs/installation.rst | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 051f7865e..8274549d4 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -22,6 +22,7 @@ jobs: centos-8-amd64, debian-10-buster-x86, fedora-33-amd64, + fedora-34-amd64, ubuntu-18.04-bionic-amd64, ubuntu-20.04-focal-amd64, ] diff --git a/docs/installation.rst b/docs/installation.rst index 943041070..434330a0b 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -454,6 +454,8 @@ These platforms are built and tested for every change. +----------------------------------+--------------------------+-----------------------+ | Fedora 33 | 3.9 |x86-64 | +----------------------------------+--------------------------+-----------------------+ +| Fedora 34 | 3.9 |x86-64 | ++----------------------------------+--------------------------+-----------------------+ | macOS 10.15 Catalina | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | +----------------------------------+--------------------------+-----------------------+ | Ubuntu Linux 16.04 LTS (Xenial) | 3.6, 3.7, 3.8, 3.9, PyPy3|x86-64 | From 2c038008240f84c29f680b34b3484e6c7f99187a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Apr 2021 18:20:44 +1000 Subject: [PATCH 599/750] Changed default "method" value to 4 --- docs/handbook/image-file-formats.rst | 2 +- src/PIL/WebPImagePlugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index eb10a51fa..ea40ef6d7 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -940,7 +940,7 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: files compared to the slowest, but best, 100. **method** - Quality/speed trade-off (0=fast, 6=slower-better). Defaults to 0. + Quality/speed trade-off (0=fast, 6=slower-better). Defaults to 4. **icc_profile** The ICC Profile to include in the saved file. Only supported if diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index dfc8351ef..50b82feb0 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -314,7 +314,7 @@ def _save(im, fp, filename): if isinstance(exif, Image.Exif): exif = exif.tobytes() xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 0) + method = im.encoderinfo.get("method", 4) if im.mode not in _VALID_WEBP_LEGACY_MODES: alpha = ( From ef9a8e5f7f7cbc28309dd5431e626ebd36ce5c9f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 Apr 2021 21:18:54 +1000 Subject: [PATCH 600/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2fcd60b76..c1d4a02f4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Changed WebP default "method" value to 4 #5450 + [radarhere] + - Switched to saving 1-bit PDFs with DCTDecode #5430 [radarhere] From 976d9fa347a9f477b479e2c3fdb8cc8d284b0f25 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 21:37:45 +1000 Subject: [PATCH 601/750] Fixed UNDEFINED TIFF tag of length 0 being changed in roundtrip --- Tests/test_file_tiff_metadata.py | 15 +++++++++++++++ src/PIL/TiffImagePlugin.py | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index af7528be0..e2841163b 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -185,6 +185,21 @@ def test_iptc(tmp_path): im.save(out) +def test_undefined_zero(tmp_path): + # Check that the tag has not been changed since this test was created + tag = TiffTags.TAGS_V2[45059] + assert tag.type == TiffTags.UNDEFINED + assert tag.length == 0 + + info = TiffImagePlugin.ImageFileDirectory(b"II*\x00\x08\x00\x00\x00") + info[45059] = b"test" + + # Assert that the tag value does not change by setting it to itself + original = info[45059] + info[45059] = info[45059] + assert info[45059] == original + + def test_empty_metadata(): f = io.BytesIO(b"II*\x00\x08\x00\x00\x00") head = f.read(8) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9d821dcf9..17e29ba4c 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -565,7 +565,8 @@ class ImageFileDirectory_v2(MutableMapping): if self.tagtype[tag] == TiffTags.UNDEFINED: values = [ - value.encode("ascii", "replace") if isinstance(value, str) else value + v.encode("ascii", "replace") if isinstance(v, str) else v + for v in values ] elif self.tagtype[tag] == TiffTags.RATIONAL: values = [float(v) if isinstance(v, int) else v for v in values] From 622ba122cef01cc33abd58010fe7abe1e0e4175c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Apr 2021 19:46:49 +1000 Subject: [PATCH 602/750] Added Exif load_from_fp method to get TIFF tag_v2 data --- Tests/test_file_tiff.py | 44 +++++++++++++++++++++++++++++++++++ Tests/test_image.py | 21 +++++++++++++++++ src/PIL/Image.py | 51 ++++++++++++++++++++++++++++++++--------- 3 files changed, 105 insertions(+), 11 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index c24438c48..eef2d0578 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -389,6 +389,50 @@ class TestFileTiff: with Image.open("Tests/images/ifd_tag_type.tiff") as im: assert 0x8825 in im.tag_v2 + def test_exif(self): + with Image.open("Tests/images/ifd_tag_type.tiff") as im: + exif = im.getexif() + + assert sorted(exif.keys()) == [ + 256, + 257, + 258, + 259, + 262, + 271, + 272, + 273, + 277, + 278, + 279, + 282, + 283, + 284, + 296, + 297, + 305, + 339, + 700, + 34665, + 34853, + 50735, + ] + assert exif[256] == 640 + assert exif[271] == "FLIR" + + gps = exif.get_ifd(0x8825) + assert list(gps.keys()) == [0, 1, 2, 3, 4, 5, 6, 18] + assert gps[0] == b"\x03\x02\x00\x00" + assert gps[18] == "WGS-84" + + def test_exif_frames(self): + # Test that EXIF data can change across frames + with Image.open("Tests/images/g4-multi.tiff") as im: + assert im.getexif()[273] == (328, 815) + + im.seek(1) + assert im.getexif()[273] == (1408, 1907) + def test_seek(self): filename = "Tests/images/pil136.tiff" with Image.open(filename) as im: diff --git a/Tests/test_image.py b/Tests/test_image.py index 82efefc1e..b6e5873f4 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -773,6 +773,27 @@ class TestImage: reloaded_exif.load(exif.tobytes()) assert reloaded_exif.get_ifd(0x8769) == exif.get_ifd(0x8769) + def test_exif_load_from_fp(self): + with Image.open("Tests/images/flower.jpg") as im: + data = im.info["exif"] + if data.startswith(b"Exif\x00\x00"): + data = data[6:] + fp = io.BytesIO(data) + + exif = Image.Exif() + exif.load_from_fp(fp) + assert exif == { + 271: "Canon", + 272: "Canon PowerShot S40", + 274: 1, + 282: 180.0, + 283: 180.0, + 296: 2, + 306: "2003:12:14 12:01:44", + 531: 1, + 34665: 196, + } + @pytest.mark.skipif( sys.version_info < (3, 7), reason="Python 3.7 or greater required" ) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 6529db2be..c9153a4d2 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1317,11 +1317,16 @@ class Image: self._exif = Exif() exif_info = self.info.get("exif") - if exif_info is None and "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - self._exif.load(exif_info) + if exif_info is None: + if "Raw profile type exif" in self.info: + exif_info = bytes.fromhex( + "".join(self.info["Raw profile type exif"].split("\n")[3:]) + ) + elif hasattr(self, "tag_v2"): + self._exif.endian = self.tag_v2._endian + self._exif.load_from_fp(self.fp, self.tag_v2._offset) + if exif_info is not None: + self._exif.load(exif_info) # XMP tags if 0x0112 not in self._exif: @@ -3297,7 +3302,7 @@ atexit.register(core.clear_cache) class Exif(MutableMapping): - endian = "<" + endian = None def __init__(self): self._data = {} @@ -3332,6 +3337,12 @@ class Exif(MutableMapping): info.load(self.fp) return self._fixup_dict(info) + def _get_head(self): + if self.endian == "<": + return b"II\x2A\x00\x08\x00\x00\x00" + else: + return b"MM\x00\x2A\x00\x00\x00\x08" + def load(self, data): # Extract EXIF information. This is highly experimental, # and is likely to be replaced with something better in a future @@ -3344,8 +3355,8 @@ class Exif(MutableMapping): self._loaded_exif = data self._data.clear() self._ifds.clear() - self._info = None if not data: + self._info = None return if data.startswith(b"Exif\x00\x00"): @@ -3360,6 +3371,27 @@ class Exif(MutableMapping): self.fp.seek(self._info.next) self._info.load(self.fp) + def load_from_fp(self, fp, offset=None): + self._loaded_exif = None + self._data.clear() + self._ifds.clear() + + # process dictionary + from . import TiffImagePlugin + + self.fp = fp + if offset is not None: + self.head = self._get_head() + else: + self.head = self.fp.read(8) + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + if self.endian is None: + self.endian = self._info._endian + if offset is None: + offset = self._info.next + self.fp.seek(offset) + self._info.load(self.fp) + def _get_merged_dict(self): merged_dict = dict(self) @@ -3378,10 +3410,7 @@ class Exif(MutableMapping): def tobytes(self, offset=8): from . import TiffImagePlugin - if self.endian == "<": - head = b"II\x2A\x00\x08\x00\x00\x00" - else: - head = b"MM\x00\x2A\x00\x00\x00\x08" + head = self._get_head() ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) for tag, value in self.items(): if tag in [0x8769, 0x8225, 0x8825] and not isinstance(value, dict): From fae9afe35164c35aa1799e8a326d10601c12d586 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 14:21:00 +1000 Subject: [PATCH 603/750] Replace sys.stdout with sys.stdout.buffer when saving --- Tests/test_file_png.py | 19 +++++++++++++++++++ src/PIL/Image.py | 2 ++ src/PIL/ImageFile.py | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index a1234b46a..35c82a4fb 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -1,4 +1,5 @@ import re +import sys import zlib from io import BytesIO @@ -10,6 +11,7 @@ from .helper import ( PillowLeakTestCase, assert_image, assert_image_equal, + assert_image_equal_tofile, hopper, is_big_endian, is_win32, @@ -711,6 +713,23 @@ class TestFilePng: with pytest.raises(EOFError): im.seek(1) + def test_save_stdout(self): + old_stdout = sys.stdout.buffer + + class MyStdOut: + buffer = BytesIO() + + sys.stdout = mystdout = MyStdOut() + + with Image.open(TEST_PNG_FILE) as im: + im.save(sys.stdout, "PNG") + + # Reset stdout + sys.stdout = old_stdout + + reloaded = Image.open(mystdout.buffer) + assert_image_equal_tofile(reloaded, TEST_PNG_FILE) + @pytest.mark.skipif(is_win32(), reason="Requires Unix or macOS") @skip_unless_feature("zlib") diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 6529db2be..105dbb34d 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2135,6 +2135,8 @@ class Image: elif isinstance(fp, Path): filename = str(fp) open_fp = True + elif fp == sys.stdout: + fp = sys.stdout.buffer if not filename and hasattr(fp, "name") and isPath(fp.name): # only set the name for metadata purposes filename = fp.name diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 0258a2ec1..6917e09a2 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -493,7 +493,7 @@ def _save(im, fp, tile, bufsize=0): # But, it would need at least the image size in most cases. RawEncode is # a tricky case. bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - if fp == sys.stdout: + if fp == sys.stdout.buffer: fp.flush() return try: From bb12c8079e39934ba0b50ce60e7b03e3b169e97e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 12:40:31 +1000 Subject: [PATCH 604/750] Added missing import --- docs/reference/ImageDraw.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 37fb5f726..46e1595c2 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -18,6 +18,7 @@ Example: Draw a gray cross over an image .. code-block:: python + import sys from PIL import Image, ImageDraw with Image.open("hopper.jpg") as im: From 9c06ce044cde609ec7c464ddbcc28fd0078ec3ea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 15:33:36 +1000 Subject: [PATCH 605/750] Changed PSDraw default from sys.stdout to sys.stdout.buffer --- Tests/test_psdraw.py | 12 +++++--- docs/handbook/tutorial.rst | 2 +- src/PIL/PSDraw.py | 61 ++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 31f0f493b..30cd1c2e0 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -1,6 +1,6 @@ import os import sys -from io import StringIO +from io import BytesIO from PIL import Image, PSDraw @@ -46,8 +46,12 @@ def test_draw_postscript(tmp_path): def test_stdout(): # Temporarily redirect stdout - old_stdout = sys.stdout - sys.stdout = mystdout = StringIO() + old_stdout = sys.stdout.buffer + + class MyStdOut: + buffer = BytesIO() + + sys.stdout = mystdout = MyStdOut() ps = PSDraw.PSDraw() _create_document(ps) @@ -55,4 +59,4 @@ def test_stdout(): # Reset stdout sys.stdout = old_stdout - assert mystdout.getvalue() != "" + assert mystdout.buffer.getvalue() != b"" diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 6b68a0562..1102f09be 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -424,7 +424,7 @@ Drawing PostScript title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points - ps = PSDraw.PSDraw() # default is sys.stdout + ps = PSDraw.PSDraw() # default is sys.stdout.buffer ps.begin_document(title) # draw the image (75 dpi) diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index c1bd933d3..d62d3fd65 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -26,39 +26,33 @@ from . import EpsImagePlugin class PSDraw: """ Sets up printing to the given file. If ``fp`` is omitted, - :py:data:`sys.stdout` is assumed. + ``sys.stdout.buffer`` is assumed. """ def __init__(self, fp=None): if not fp: - fp = sys.stdout + fp = sys.stdout.buffer self.fp = fp - def _fp_write(self, to_write): - if self.fp == sys.stdout: - self.fp.write(to_write) - else: - self.fp.write(bytes(to_write, "UTF-8")) - def begin_document(self, id=None): """Set up printing of a document. (Write PostScript DSC header.)""" # FIXME: incomplete - self._fp_write( - "%!PS-Adobe-3.0\n" - "save\n" - "/showpage { } def\n" - "%%EndComments\n" - "%%BeginDocument\n" + self.fp.write( + b"%!PS-Adobe-3.0\n" + b"save\n" + b"/showpage { } def\n" + b"%%EndComments\n" + b"%%BeginDocument\n" ) - # self._fp_write(ERROR_PS) # debugging! - self._fp_write(EDROFF_PS) - self._fp_write(VDI_PS) - self._fp_write("%%EndProlog\n") + # self.fp.write(ERROR_PS) # debugging! + self.fp.write(EDROFF_PS) + self.fp.write(VDI_PS) + self.fp.write(b"%%EndProlog\n") self.isofont = {} def end_document(self): """Ends printing. (Write PostScript DSC footer.)""" - self._fp_write("%%EndDocument\nrestore showpage\n%%End\n") + self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") if hasattr(self.fp, "flush"): self.fp.flush() @@ -69,12 +63,13 @@ class PSDraw: :param font: A PostScript font name :param size: Size in points. """ + font = bytes(font, "UTF-8") if font not in self.isofont: # reencode font - self._fp_write(f"/PSDraw-{font} ISOLatin1Encoding /{font} E\n") + self.fp.write(b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font, font)) self.isofont[font] = 1 # rough - self._fp_write(f"/F0 {size} /PSDraw-{font} F\n") + self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font)) def line(self, xy0, xy1): """ @@ -82,7 +77,7 @@ class PSDraw: PostScript point coordinates (72 points per inch, (0, 0) is the lower left corner of the page). """ - self._fp_write("%d %d %d %d Vl\n" % (*xy0, *xy1)) + self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) def rectangle(self, box): """ @@ -97,16 +92,18 @@ class PSDraw: %d %d M %d %d 0 Vr\n """ - self._fp_write("%d %d M %d %d 0 Vr\n" % box) + self.fp.write(b"%d %d M %d %d 0 Vr\n" % box) def text(self, xy, text): """ Draws text at the given position. You must use :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. """ - text = "\\(".join(text.split("(")) - text = "\\)".join(text.split(")")) - self._fp_write(f"{xy[0]} {xy[1]} M ({text}) S\n") + text = bytes(text, "UTF-8") + text = b"\\(".join(text.split(b"(")) + text = b"\\)".join(text.split(b")")) + xy += (text,) + self.fp.write(b"%d %d M (%s) S\n" % xy) def image(self, box, im, dpi=None): """Draw a PIL image, centered in the given box.""" @@ -130,14 +127,14 @@ class PSDraw: y = ymax dx = (xmax - x) / 2 + box[0] dy = (ymax - y) / 2 + box[1] - self._fp_write(f"gsave\n{dx:f} {dy:f} translate\n") + self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) if (x, y) != im.size: # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) sx = x / im.size[0] sy = y / im.size[1] - self._fp_write(f"{sx:f} {sy:f} scale\n") + self.fp.write(b"%f %f scale\n" % (sx, sy)) EpsImagePlugin._save(im, self.fp, None, 0) - self._fp_write("\ngrestore\n") + self.fp.write(b"\ngrestore\n") # -------------------------------------------------------------------- @@ -153,7 +150,7 @@ class PSDraw: # -EDROFF_PS = """\ +EDROFF_PS = b"""\ /S { show } bind def /P { moveto show } bind def /M { moveto } bind def @@ -182,7 +179,7 @@ EDROFF_PS = """\ # Copyright (c) Fredrik Lundh 1994. # -VDI_PS = """\ +VDI_PS = b"""\ /Vm { moveto } bind def /Va { newpath arcn stroke } bind def /Vl { moveto lineto stroke } bind def @@ -207,7 +204,7 @@ VDI_PS = """\ # 89-11-21 fl: created (pslist 1.10) # -ERROR_PS = """\ +ERROR_PS = b"""\ /landscape false def /errorBUF 200 string def /errorNL { currentpoint 10 sub exch pop 72 exch moveto } def From ce3d69baf9b60cf37f2bb1506730e82960566ea2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Apr 2021 14:40:02 +1000 Subject: [PATCH 606/750] Simplified code by writing bytes instead of using wrapping to write strings --- src/PIL/EpsImagePlugin.py | 74 +++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 3bf8ee0ab..3b7eacbfc 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -354,56 +354,46 @@ def _save(im, fp, filename, eps=1): # # determine PostScript image mode if im.mode == "L": - operator = (8, 1, "image") + operator = (8, 1, b"image") elif im.mode == "RGB": - operator = (8, 3, "false 3 colorimage") + operator = (8, 3, b"false 3 colorimage") elif im.mode == "CMYK": - operator = (8, 4, "false 4 colorimage") + operator = (8, 4, b"false 4 colorimage") else: raise ValueError("image mode is not supported") - base_fp = fp - wrapped_fp = False - if fp != sys.stdout: - fp = io.TextIOWrapper(fp, encoding="latin-1") - wrapped_fp = True - - try: - if eps: - # - # write EPS header - fp.write("%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write("%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write("%%Pages: 1\n") - fp.write("%%EndComments\n") - fp.write("%%Page: 1 1\n") - fp.write("%%ImageData: %d %d " % im.size) - fp.write('%d %d 0 1 1 "%s"\n' % operator) - + if eps: # - # image header - fp.write("gsave\n") - fp.write("10 dict begin\n") - fp.write(f"/buf {im.size[0] * operator[1]} string def\n") - fp.write("%d %d scale\n" % im.size) - fp.write("%d %d 8\n" % im.size) # <= bits - fp.write(f"[{im.size[0]} 0 0 -{im.size[1]} 0 {im.size[1]}]\n") - fp.write("{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + "\n") - if hasattr(fp, "flush"): - fp.flush() + # write EPS header + fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write(b"%%Pages: 1\n") + fp.write(b"%%EndComments\n") + fp.write(b"%%Page: 1 1\n") + fp.write(b"%%ImageData: %d %d " % im.size) + fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - ImageFile._save(im, base_fp, [("eps", (0, 0) + im.size, 0, None)]) + # + # image header + fp.write(b"gsave\n") + fp.write(b"10 dict begin\n") + fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write(b"%d %d scale\n" % im.size) + fp.write(b"%d %d 8\n" % im.size) # <= bits + fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write(b"{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + b"\n") + if hasattr(fp, "flush"): + fp.flush() - fp.write("\n%%%%EndBinary\n") - fp.write("grestore end\n") - if hasattr(fp, "flush"): - fp.flush() - finally: - if wrapped_fp: - fp.detach() + ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) + + fp.write(b"\n%%%%EndBinary\n") + fp.write(b"grestore end\n") + if hasattr(fp, "flush"): + fp.flush() # From fd299e36cec4c12a0f201dbbbc1014dfaca7005a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 26 Apr 2021 20:27:34 +1000 Subject: [PATCH 607/750] Reset handle when seeking backwards as well --- Tests/test_file_libtiff.py | 11 +++++++++++ src/PIL/TiffImagePlugin.py | 8 +++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c0d09d6ce..5d3fe3742 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -578,6 +578,17 @@ class TestFileLibTiff(LibTiffTestCase): TiffImagePlugin.READ_LIBTIFF = False + def test_multipage_seek_backwards(self): + TiffImagePlugin.READ_LIBTIFF = True + with Image.open("Tests/images/multipage.tiff") as im: + im.seek(1) + im.load() + + im.seek(0) + assert im.convert("RGB").getpixel((0, 0)) == (0, 128, 0) + + TiffImagePlugin.READ_LIBTIFF = False + def test__next(self): TiffImagePlugin.READ_LIBTIFF = True with Image.open("Tests/images/hopper.tif") as im: diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9d821dcf9..7aa57f267 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1052,6 +1052,11 @@ class TiffImageFile(ImageFile.ImageFile): def _seek(self, frame): self.fp = self.__fp + + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + while len(self._frame_pos) <= frame: if not self.__next: raise EOFError("no more images in TIFF file") @@ -1059,9 +1064,6 @@ class TiffImageFile(ImageFile.ImageFile): f"Seeking to frame {frame}, on frame {self.__frame}, " f"__next {self.__next}, location: {self.fp.tell()}" ) - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() self.fp.seek(self.__next) self._frame_pos.append(self.__next) logger.debug("Loading tags, location: %s" % self.fp.tell()) From 537cd7a82e0f94bccb3732b7e0a6017631e54441 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Apr 2021 15:42:06 +1000 Subject: [PATCH 608/750] Removed TIFF DPI rounding --- ...r_roundUp_2.tif => hopper_float_dpi_2.tif} | Bin ...r_roundUp_3.tif => hopper_float_dpi_3.tif} | Bin ...dUp_None.tif => hopper_float_dpi_None.tif} | Bin Tests/images/hopper_roundDown_2.tif | Bin 49344 -> 0 bytes Tests/images/hopper_roundDown_3.tif | Bin 49344 -> 0 bytes Tests/images/hopper_roundDown_None.tif | Bin 49344 -> 0 bytes Tests/test_file_tiff.py | 33 ++++++++---------- src/PIL/TiffImagePlugin.py | 10 +++--- 8 files changed, 19 insertions(+), 24 deletions(-) rename Tests/images/{hopper_roundUp_2.tif => hopper_float_dpi_2.tif} (100%) rename Tests/images/{hopper_roundUp_3.tif => hopper_float_dpi_3.tif} (100%) rename Tests/images/{hopper_roundUp_None.tif => hopper_float_dpi_None.tif} (100%) delete mode 100644 Tests/images/hopper_roundDown_2.tif delete mode 100644 Tests/images/hopper_roundDown_3.tif delete mode 100644 Tests/images/hopper_roundDown_None.tif diff --git a/Tests/images/hopper_roundUp_2.tif b/Tests/images/hopper_float_dpi_2.tif similarity index 100% rename from Tests/images/hopper_roundUp_2.tif rename to Tests/images/hopper_float_dpi_2.tif diff --git a/Tests/images/hopper_roundUp_3.tif b/Tests/images/hopper_float_dpi_3.tif similarity index 100% rename from Tests/images/hopper_roundUp_3.tif rename to Tests/images/hopper_float_dpi_3.tif diff --git a/Tests/images/hopper_roundUp_None.tif b/Tests/images/hopper_float_dpi_None.tif similarity index 100% rename from Tests/images/hopper_roundUp_None.tif rename to Tests/images/hopper_float_dpi_None.tif diff --git a/Tests/images/hopper_roundDown_2.tif b/Tests/images/hopper_roundDown_2.tif deleted file mode 100644 index ac8cd057d61b8a815984cf6d26a934749da7bc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49344 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

ymHWg09tPv$C<8T@T*W*EmXn$1q* z3JZja!z0JvPl;{Ljc+JRypZA2nLpvzPU!Zfvz`-D=Y1ZFJj9 zazD_x+1%Ubt1ef5Ln z<*$p}-W0q4x^LSb2V%Z14*I4v?CqZT_eV2698UbUD)3R>=I-pxXM-2jx=q`&YQ!0@ znWsEwBgJ$uGN2$N0`u$Qla54Y)`jJ_`4!$FqF&POQ+P9=^rmO=wJn7WZbhvgg`F_R zAvqn}@;d|bTOjKHCcyrmMArrA?6h|dQvLArA?LK)qq~yi8%@}{2xlIde>BZvQ#g+$ z=W;}tuZ9w^NMS3K4`J}^4LLSk{y>4qRK-_0a#eHq8ZVJ)oJf<+mS!6AVpyzgOhzn| zoz9_(g~~jI=7!g%j;yH89VsWG7Pe;(?>WExcH;PkkjZtvpPt${q%CxO-Da}~VRqNn zGCDm4k0ULc{H(9|j0qYfiym$NusHmB^vd09hgWYHdCqs*jj(yAwvK5CoAoet<%5(J zoiPib-apG+_b_Aai~Ox{@=-f@k`?fxFziWwz_UEhr+HgDlGk1gnSWr*w8Y7l`Ev&) zj5Ere=WsE>Yj3hSYtAmm*`lmPh72NkPe(aIe=2L)b?+y3-I=8}`9z{)F zMQt$0!TIgm3OfS+KlsyY;U6r}J|uOS-s-@AgAXqJjlYO*hemywa1cgKQfw1GTLJJn zd@%4wsp~LtNp8oHiRu~k6qakyRs>2 zSxe07D?#%w2QE0{Ip?D9@}?-a=6Db6l)N6gygqEnDUYe!mkx;;Z|d(P-7-Kwc!=nT z?}Fyin8F};BMx`u@G1VGB~cj{LNc2Ia~}BTJq;;+>6Oz(N{0mvUWGTkig9i9$!iSA zYYHxe{rwN&$8v!ErA>g21vEz>|MU_dD(Iu+L-YLKCGa=?z?Q}z2LaId^LSE@P{tOj z;qCBvHX`Og4cp4xP;J8$PZcWMrIy=7rb!}Irbv>*6J)ZvNeoV$KCV=jK$Rhs#tQ{W zmddtm9=B72o0C_zrP_QrJ+m#&?xL5?$&GdgmYLQ0IM@4G-;1)jx`o>jYTOp>ROw

cdLs+GkH45I;uaX2o45)7xTUSnD?9TB2)xVN_nQ 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 J-5o#9*IxsER{j70 diff --git a/Tests/images/hopper_roundDown_3.tif b/Tests/images/hopper_roundDown_3.tif deleted file mode 100644 index 0542fab9aa8e387e6831ba2b18d47cf8412a5619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49344 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

ymHWg09tPv$C<8T@T*W*EmXn$1q* z3JZja!z0JvPl;{Ljc+JRypZA2nLpvzPU!Zfvz`-D=Y1ZFJj9 zazD_x+1%Ubt1ef5Ln z<*$p}-W0q4x^LSb2V%Z14*I4v?CqZT_eV2698UbUD)3R>=I-pxXM-2jx=q`&YQ!0@ znWsEwBgJ$uGN2$N0`u$Qla54Y)`jJ_`4!$FqF&POQ+P9=^rmO=wJn7WZbhvgg`F_R zAvqn}@;d|bTOjKHCcyrmMArrA?6h|dQvLArA?LK)qq~yi8%@}{2xlIde>BZvQ#g+$ z=W;}tuZ9w^NMS3K4`J}^4LLSk{y>4qRK-_0a#eHq8ZVJ)oJf<+mS!6AVpyzgOhzn| zoz9_(g~~jI=7!g%j;yH89VsWG7Pe;(?>WExcH;PkkjZtvpPt${q%CxO-Da}~VRqNn zGCDm4k0ULc{H(9|j0qYfiym$NusHmB^vd09hgWYHdCqs*jj(yAwvK5CoAoet<%5(J zoiPib-apG+_b_Aai~Ox{@=-f@k`?fxFziWwz_UEhr+HgDlGk1gnSWr*w8Y7l`Ev&) zj5Ere=WsE>Yj3hSYtAmm*`lmPh72NkPe(aIe=2L)b?+y3-I=8}`9z{)F zMQt$0!TIgm3OfS+KlsyY;U6r}J|uOS-s-@AgAXqJjlYO*hemywa1cgKQfw1GTLJJn zd@%4wsp~LtNp8oHiRu~k6qakyRs>2 zSxe07D?#%w2QE0{Ip?D9@}?-a=6Db6l)N6gygqEnDUYe!mkx;;Z|d(P-7-Kwc!=nT z?}Fyin8F};BMx`u@G1VGB~cj{LNc2Ia~}BTJq;;+>6Oz(N{0mvUWGTkig9i9$!iSA zYYHxe{rwN&$8v!ErA>g21vEz>|MU_dD(Iu+L-YLKCGa=?z?Q}z2LaId^LSE@P{tOj z;qCBvHX`Og4cp4xP;J8$PZcWMrIy=7rb!}Irbv>*6J)ZvNeoV$KCV=jK$Rhs#tQ{W zmddtm9=B72o0C_zrP_QrJ+m#&?xL5?$&GdgmYLQ0IM@4G-;1)jx`o>jYTOp>ROw

cdLs+GkH45I;uaX2o45)7xTUSnD?9TB2)xVN_nQ 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 J-5o#9*I&b&R{sD1 diff --git a/Tests/images/hopper_roundDown_None.tif b/Tests/images/hopper_roundDown_None.tif deleted file mode 100644 index 21c40e8fe6f43aec7fc9269d2a338b7588f3aeab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49344 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

ymHWg09tPv$C<8T@T*W*EmXn$1q* z3JZja!z0JvPl;{Ljc+JRypZA2nLpvzPU!Zfvz`-D=Y1ZFJj9 zazD_x+1%Ubt1ef5Ln z<*$p}-W0q4x^LSb2V%Z14*I4v?CqZT_eV2698UbUD)3R>=I-pxXM-2jx=q`&YQ!0@ znWsEwBgJ$uGN2$N0`u$Qla54Y)`jJ_`4!$FqF&POQ+P9=^rmO=wJn7WZbhvgg`F_R zAvqn}@;d|bTOjKHCcyrmMArrA?6h|dQvLArA?LK)qq~yi8%@}{2xlIde>BZvQ#g+$ z=W;}tuZ9w^NMS3K4`J}^4LLSk{y>4qRK-_0a#eHq8ZVJ)oJf<+mS!6AVpyzgOhzn| zoz9_(g~~jI=7!g%j;yH89VsWG7Pe;(?>WExcH;PkkjZtvpPt${q%CxO-Da}~VRqNn zGCDm4k0ULc{H(9|j0qYfiym$NusHmB^vd09hgWYHdCqs*jj(yAwvK5CoAoet<%5(J zoiPib-apG+_b_Aai~Ox{@=-f@k`?fxFziWwz_UEhr+HgDlGk1gnSWr*w8Y7l`Ev&) zj5Ere=WsE>Yj3hSYtAmm*`lmPh72NkPe(aIe=2L)b?+y3-I=8}`9z{)F zMQt$0!TIgm3OfS+KlsyY;U6r}J|uOS-s-@AgAXqJjlYO*hemywa1cgKQfw1GTLJJn zd@%4wsp~LtNp8oHiRu~k6qakyRs>2 zSxe07D?#%w2QE0{Ip?D9@}?-a=6Db6l)N6gygqEnDUYe!mkx;;Z|d(P-7-Kwc!=nT z?}Fyin8F};BMx`u@G1VGB~cj{LNc2Ia~}BTJq;;+>6Oz(N{0mvUWGTkig9i9$!iSA zYYHxe{rwN&$8v!ErA>g21vEz>|MU_dD(Iu+L-YLKCGa=?z?Q}z2LaId^LSE@P{tOj z;qCBvHX`Og4cp4xP;J8$PZcWMrIy=7rb!}Irbv>*6J)ZvNeoV$KCV=jK$Rhs#tQ{W zmddtm9=B72o0C_zrP_QrJ+m#&?xL5?$&GdgmYLQ0IM@4G-;1)jx`o>jYTOp>ROw

cdLs+GkH45I;uaX2o45)7xTUSnD?9TB2)xVN_nQ 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 J-5o#9*I$FtR{#J2 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index c24438c48..945e63e78 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -137,29 +137,24 @@ class TestFileTiff: im._setup() assert im.info["dpi"] == (71.0, 71.0) - def test_load_dpi_rounding(self): - for resolutionUnit, dpi in ((None, (72, 73)), (2, (72, 73)), (3, (183, 185))): - with Image.open( - "Tests/images/hopper_roundDown_" + str(resolutionUnit) + ".tif" - ) as im: - assert im.tag_v2.get(RESOLUTION_UNIT) == resolutionUnit - assert im.info["dpi"] == (dpi[0], dpi[0]) + @pytest.mark.parametrize( + "resolutionUnit, dpi", + [(None, 72.8), (2, 72.8), (3, 184.912)], + ) + def test_load_float_dpi(self, resolutionUnit, dpi): + with Image.open( + "Tests/images/hopper_float_dpi_" + str(resolutionUnit) + ".tif" + ) as im: + assert im.tag_v2.get(RESOLUTION_UNIT) == resolutionUnit + assert im.info["dpi"] == (dpi, dpi) - with Image.open( - "Tests/images/hopper_roundUp_" + str(resolutionUnit) + ".tif" - ) as im: - assert im.tag_v2.get(RESOLUTION_UNIT) == resolutionUnit - assert im.info["dpi"] == (dpi[1], dpi[1]) - - def test_save_dpi_rounding(self, tmp_path): + def test_save_float_dpi(self, tmp_path): outfile = str(tmp_path / "temp.tif") with Image.open("Tests/images/hopper.tif") as im: - for dpi in (72.2, 72.8): - im.save(outfile, dpi=(dpi, dpi)) + im.save(outfile, dpi=(72.2, 72.2)) - with Image.open(outfile) as reloaded: - reloaded.load() - assert (round(dpi), round(dpi)) == reloaded.info["dpi"] + with Image.open(outfile) as reloaded: + assert reloaded.info["dpi"] == (72.2, 72.2) def test_save_setting_missing_resolution(self): b = BytesIO() diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9d821dcf9..06f9e4f97 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1281,11 +1281,11 @@ class TiffImageFile(ImageFile.ImageFile): if xres and yres: resunit = self.tag_v2.get(RESOLUTION_UNIT) if resunit == 2: # dots per inch - self.info["dpi"] = int(xres + 0.5), int(yres + 0.5) + self.info["dpi"] = xres, yres elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = int(xres * 2.54 + 0.5), int(yres * 2.54 + 0.5) + self.info["dpi"] = xres * 2.54, yres * 2.54 elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = int(xres + 0.5), int(yres + 0.5) + self.info["dpi"] = xres, yres # For backward compatibility, # we also preserve the old behavior self.info["resolution"] = xres, yres @@ -1518,8 +1518,8 @@ def _save(im, fp, filename): dpi = im.encoderinfo.get("dpi") if dpi: ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = int(dpi[0] + 0.5) - ifd[Y_RESOLUTION] = int(dpi[1] + 0.5) + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] if bits != (1,): ifd[BITSPERSAMPLE] = bits From b78cf8cd751abc4474e488d1d8e18cb305eb4f57 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 Apr 2021 17:54:44 +1000 Subject: [PATCH 609/750] Added state methods to allow pickling of IFDRational --- Tests/test_file_tiff.py | 6 ++++-- src/PIL/TiffImagePlugin.py | 10 ++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 945e63e78..91506f980 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -146,7 +146,8 @@ class TestFileTiff: "Tests/images/hopper_float_dpi_" + str(resolutionUnit) + ".tif" ) as im: assert im.tag_v2.get(RESOLUTION_UNIT) == resolutionUnit - assert im.info["dpi"] == (dpi, dpi) + for reloaded_dpi in im.info["dpi"]: + assert float(reloaded_dpi) == dpi def test_save_float_dpi(self, tmp_path): outfile = str(tmp_path / "temp.tif") @@ -154,7 +155,8 @@ class TestFileTiff: im.save(outfile, dpi=(72.2, 72.2)) with Image.open(outfile) as reloaded: - assert reloaded.info["dpi"] == (72.2, 72.2) + for dpi in reloaded.info["dpi"]: + assert float(dpi) == 72.2 def test_save_setting_missing_resolution(self): b = BytesIO() diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 06f9e4f97..8356f6f3e 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -358,6 +358,16 @@ class IFDRational(Rational): other = other._val return self._val == other + def __getstate__(self): + return [self._val, self._numerator, self._denominator] + + def __setstate__(self, state): + IFDRational.__init__(self, 0) + _val, _numerator, _denominator = state + self._val = _val + self._numerator = _numerator + self._denominator = _denominator + def _delegate(op): def delegate(self, *args): return getattr(self._val, op)(*args) From 8bc19ac78cfa9d434e773279d4f8059ecd28116f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Apr 2021 11:14:18 +1000 Subject: [PATCH 610/750] Do not alter pixels outside mask when drawing text on an image with transparency --- Tests/images/transparent_background_text.png | Bin 1271 -> 1326 bytes .../images/transparent_background_text_L.png | Bin 0 -> 350 bytes Tests/test_image_paste.py | 2 +- Tests/test_imagefont.py | 3 +++ src/libImaging/Paste.c | 2 +- 5 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Tests/images/transparent_background_text_L.png diff --git a/Tests/images/transparent_background_text.png b/Tests/images/transparent_background_text.png index 40acd92b62243953ebc0910629922eef112424e1..8ddd65cc68b5b65bdeb47a9701c6dcf50c564b36 100644 GIT binary patch delta 1175 zcmV;I1ZeyB39br|By06aL_t(|obB6NsAgjv$MN5PLdvAcPI)Bj-a=G>&1K3x_dWFq$zk7``svg?HY0-@W&H+D_k3 zt=fD2pJ%P#UhVz7&wAF{iIZUj7Jq45z&zj={<3V8?f-8^aeaW}fZv+_GbdgX ziKX6V^wStPx9u1I-M0NNwC%rqm_SwaUR7;hRh8u8QMVr#;0m^OdRy&`j@nSys2`)a zK2`N>Rn189<|Iw;OLEU3=a8miyM7v1)dRqsBx|bbk+%JdfMb%JTva!ZI)CK9K~*gW z7ACo%sy^?iJ)GoWV0My+{=?Vk*CfCF-68bf)z=J5lUkc(p9$*wCi!BTviu!3Hk&jS z(=uQIOMth5AA$A2ICqac^MU7p@0;y;VEzaWz14sPEC*J!)%Qu40jr-p!0XLz z<)-HQ-GK*z4Zv#P=wW{dV1Fs_0kF9_<|RN)q3gyZ8-_i<)XUfhEa288OOsrhWVa-T zCV48!lfY5qK7W@yOOmWeaz~Oqo9(tFE1KFc)}}R!3b0+01xe-uJ2mxfW?22^sj8!z z^{6$#kx5=l@RF)%12-N81I! zE5P<$j&mrm3g|g#0vFN8Q?1F`19O0nfL*%Oc4=yRP4#?Tj&VG2XY=&};CA3HU~#kW zCSbuR@&F$L?*Iq(k#Dl=b2#vFGuU?4u4-mn6Fnuo0l0Rmd8B>~I>S1nI;8bU-093D z*HzUoorS7;Kgp^jhkp;4VGyS!xx1>?cgeFp$-PNV9pd=yw}dC9HIrPKYG@r~DX>JLVEKKrpk{6Qvv97dtT7%js@@%Q9?*@kzc*BS<}F3F;*dU4F>nW`_7%$=Y3zUM@ptLm9C<&u(&e}?r?l52n+x)rDR$w6HKSdV zT$JRoAMnfm70Y+IC}A4f~$dmr2e~YyIjEE7N*X zy4B2On)3AHu_Rl7mB0~AmIHw0NzO{^manVkA;D+Owtvk4EKNJ$t+pkoUjLf&S(kn% zHEq5JegNKYo|w(;Xg3Sk)N9SF=|5}G_HF$Z(R$ZuQ?or!>n-(BT%-GekGt$&2i(!4 z&y?~2hq3kl1-AQ!j;DKrTpwTta2fCk@DuPUt*3uG0&g_^Zs?M2Ht>0~&F=fcNs=T< pk|arzB$IjsWs`6O6d3<#zXM#lA-$@rYkL3y002ovPDHLkV1oB>VjKVf delta 1127 zcmV-t1ep7-3ik<+B!9k1L_t(|obB6Rh!s^F!11qQAtWJ6f7KvVA|fdwB8*bYpe%yu zA*Hq~D2alC3L*$1gtDOWp+6Lrz0^xq1f`Kym}pRhT2SIc>S{gIhVDjgZvJ{WXW8*K z_ujq#Mzrq-4(vVW%*>CuJLjJBn;DQKNs=T2Y;mFNkmjt=0(Ke z7_*|w{r_*J8|UZRh&YnBpVFY;+=!T6)+Tks#1{K62O^hkh5C(!`bRp9X*+NdFada= z2mO2HQO3?e0Jj#}me#a&dX8Grjq~#<>3`+xCjDLqUTO0fQd5&!?EfY(1K0(;Tc}?I zTm#$yJlmbnjytP>g@3@kz@D16cXF8ytl`8xNB;mvj&%?^akVV(0PsFAucBj@xeE9U7|dluuIp6ofVB#EsqlFgh?lE%3Z+sz@fa)2T4oHW)9{!q@Ji^z<+w4bOAgBoDN(Fd<=XD z%&*}1wfabd$ZFuMTwcg^eI4$*pEQetwA@}m8hB30b!9WGR^ypZ8a#FZmjhn`TS&2SS3xG>Vzxs!B-5~H9=^}eO zw^x<-m;pRSx_{^g3iTh6W-gmaGoAfy?!OFr@q-_9r6}Y*B{TG*nOGq=x^}uzxu77rh)k!=fq$K~&I_>S~Bh9cz zO4^=?4)thyqUd>EeRI_Uy>gA7|koq zBn@iah-U=&qwPq`%?5s`(>6@wSRp;?vc0PjNd@gL3CC+cX*u+HkB>86`+zwO+UL;z zauCw&Vt*=dF7PWUX-(ee`J`psaE0-->UYv0`b$aM1X6yjk#${ZbRA`+#XBZKnbE18X}x#v#&D?~_8^I^agqb4pdm(~1vBIkhr(17}tjiu7N- z9LA2BN8bpD*wKHwfw{%X{E z(w)-UnM)P%v|=r3skt7wEXOi8$9Nk@zui!48Yw})oALozs!o0z$3oQCAA|}=JZ|D3>jEILL;-`ohj)iVY4#@0&SCSl{?c>J_6bO`whgnT2W^t4~z@>APyPv*w)tng6`kvut#~ z?|b2T=iFM^{M}0*Dy&{z`6%Pw|MHc`0&VXJEIsn4Cckj;PMLOt-DUkg;z#Rpza+o= z?I${U>5*qwE&s4uybKGo+hZ#|`RzeX_qnw%-HWbAE^J-vD2qyDDs{g>^Y);a0?w`rx?=F93{Pq_Lz@61fO z(jSW~mxf19EZ$Z&>w`}F-=i~Us7;ryS7h7xuiR|C>GXy*i#|V`J=f;R+Xr`IramjX nerBiP%NZw`Kmmge8s7h4=D6sq_AT$-OOTwWtDnm{r-UW|IF_F* literal 0 HcmV?d00001 diff --git a/Tests/test_image_paste.py b/Tests/test_image_paste.py index 3740fbcdc..1d3ca8135 100644 --- a/Tests/test_image_paste.py +++ b/Tests/test_image_paste.py @@ -236,7 +236,7 @@ class TestImagingPaste: [ (127, 191, 254, 191), (111, 207, 206, 110), - (255, 255, 255, 0) if mode == "RGBA" else (127, 254, 127, 0), + (127, 254, 127, 0), (207, 207, 239, 239), (191, 191, 190, 191), (207, 206, 111, 112), diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 883c14170..e843351ab 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -131,6 +131,9 @@ class TestImageFont: target = "Tests/images/transparent_background_text.png" assert_image_similar_tofile(im, target, 4.09) + target = "Tests/images/transparent_background_text_L.png" + assert_image_similar_tofile(im.convert("L"), target, 0.01) + def test_textsize_equal(self): im = Image.new(mode="RGB", size=(300, 100)) draw = ImageDraw.Draw(im) diff --git a/src/libImaging/Paste.c b/src/libImaging/Paste.c index 03b17f571..a1bf18a92 100644 --- a/src/libImaging/Paste.c +++ b/src/libImaging/Paste.c @@ -436,7 +436,7 @@ fill_mask_L( strcmp(imOut->mode, "La") == 0 || strcmp(imOut->mode, "LA") == 0 || strcmp(imOut->mode, "PA") == 0) && - i != 3) { + i != 3 && channel_mask != 0) { channel_mask = 255 - (255 - channel_mask) * (1 - (255 - out[3]) / 255); } From ca3ad49de3337725992033f8430f3261c67e94d0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 Apr 2021 08:12:45 +1000 Subject: [PATCH 611/750] Fixed bug when checking FreeType2 version if it is not installed --- src/PIL/ImageFont.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 2f63ddae6..e99ca21b2 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -170,8 +170,10 @@ class FreeTypeFont: except ImportError: pass else: - freetype_version = parse_version(features.version_module("freetype2")) - if freetype_version < parse_version("2.8"): + freetype_version = features.version_module("freetype2") + if freetype_version is not None and parse_version( + freetype_version + ) < parse_version("2.8"): warnings.warn( "Support for FreeType 2.7 is deprecated and will be removed" " in Pillow 9 (2022-01-02). Please upgrade to FreeType 2.8 " From ee94f4e394efda2d711d62ef054a026239e6cc8b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 30 Apr 2021 11:35:27 +0300 Subject: [PATCH 612/750] Revert "Fixed Python 3.10 at alpha.7" --- .ci/install.sh | 2 +- .github/workflows/macos-install.sh | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 298eb9edc..4917b3a7c 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -31,7 +31,7 @@ python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 -if ! [ "$GHA_PYTHON_VERSION" == "3.10.0-alpha.7" ]; then python3 -m pip install numpy ; fi +if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index fafe329e0..f45824445 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -15,7 +15,7 @@ python3 -m pip install test-image-results echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg # TODO Remove condition when numpy supports 3.10 -if ! [ "$GHA_PYTHON_VERSION" == "3.10.0-alpha.7" ]; then python3 -m pip install numpy ; fi +if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f35ff83fa..e52fefc69 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: python-version: [ "pypy-3.7", "pypy-3.6", - "3.10.0-alpha.7", + "3.10-dev", "3.9", "3.8", "3.7", From 1c617a9877e1d73632feddb37358cc0f0bf77122 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 30 Apr 2021 19:36:30 +1000 Subject: [PATCH 613/750] Clarified error message --- src/decode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.c b/src/decode.c index dcd11eb5d..99e9cdc67 100644 --- a/src/decode.c +++ b/src/decode.c @@ -298,7 +298,7 @@ get_unpacker(ImagingDecoderObject *decoder, const char *mode, const char *rawmod unpack = ImagingFindUnpacker(mode, rawmode, &bits); if (!unpack) { Py_DECREF(decoder); - PyErr_SetString(PyExc_ValueError, "unknown raw mode"); + PyErr_SetString(PyExc_ValueError, "unknown raw mode for given image mode"); return -1; } From 11d145831617456525736825e717a5de8e24ef7a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 00:51:39 +1000 Subject: [PATCH 614/750] Replaced uint16 and uint32 with uint16_t and uint32_t to resolve TIFF deprecations --- src/decode.c | 2 +- src/libImaging/TiffDecode.c | 22 +++++++++++----------- src/libImaging/TiffDecode.h | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/decode.c b/src/decode.c index 99e9cdc67..ee1c5685f 100644 --- a/src/decode.c +++ b/src/decode.c @@ -499,7 +499,7 @@ PyImaging_LibTiffDecoderNew(PyObject *self, PyObject *args) { char *rawmode; char *compname; int fp; - uint32 ifdoffset; + uint32_t ifdoffset; if (!PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) { return NULL; diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index bae3afff4..0f0927e7a 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -181,7 +181,7 @@ _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { } int -ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { +ImagingLibTiffInit(ImagingCodecState state, int fp, uint32_t offset) { TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TRACE(("initing libtiff\n")); @@ -213,10 +213,10 @@ ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { } int -_pickUnpackers(Imaging im, ImagingCodecState state, TIFF *tiff, uint16 planarconfig, ImagingShuffler *unpackers) { +_pickUnpackers(Imaging im, ImagingCodecState state, TIFF *tiff, uint16_t planarconfig, ImagingShuffler *unpackers) { // if number of bands is 1, there is no difference with contig case if (planarconfig == PLANARCONFIG_SEPARATE && im->bands > 1) { - uint16 bits_per_sample = 8; + uint16_t bits_per_sample = 8; TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); if (bits_per_sample != 8 && bits_per_sample != 16) { @@ -545,10 +545,10 @@ ImagingLibTiffDecode( char *filename = "tempfile.tif"; char *mode = "r"; TIFF *tiff; - uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR - uint16 compression; + uint16_t photometric = 0; // init to not PHOTOMETRIC_YCBCR + uint16_t compression; int readAsRGBA = 0; - uint16 planarconfig = 0; + uint16_t planarconfig = 0; int planes = 1; ImagingShuffler unpackers[4]; UINT32 img_width, img_height; @@ -639,7 +639,7 @@ ImagingLibTiffDecode( if (clientstate->ifd) { int rv; - uint32 ifdoffset = clientstate->ifd; + uint32_t ifdoffset = clientstate->ifd; TRACE(("reading tiff ifd %u\n", ifdoffset)); rv = TIFFSetSubDirectory(tiff, ifdoffset); if (!rv) { @@ -697,8 +697,8 @@ ImagingLibTiffDecode( // Check if raw mode was RGBa and it was stored on separate planes // so we have to convert it to RGBA if (planes > 3 && strcmp(im->mode, "RGBA") == 0) { - uint16 extrasamples; - uint16* sampleinfo; + uint16_t extrasamples; + uint16_t* sampleinfo; ImagingShuffler shuffle; INT32 y; @@ -810,7 +810,7 @@ ImagingLibTiffMergeFieldInfo( ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length) { // Refer to libtiff docs (http://www.simplesystems.org/libtiff/addingtags.html) TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - uint32 n; + uint32_t n; int status = 0; // custom fields added with ImagingLibTiffMergeFieldInfo are only used for @@ -933,7 +933,7 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt state->xsize); if (TIFFWriteScanline( - tiff, (tdata_t)(state->buffer), (uint32)state->y, 0) == -1) { + tiff, (tdata_t)(state->buffer), (uint32_t)state->y, 0) == -1) { TRACE(("Encode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; TIFFClose(tiff); diff --git a/src/libImaging/TiffDecode.h b/src/libImaging/TiffDecode.h index 2c3d88caa..c7c7d48ed 100644 --- a/src/libImaging/TiffDecode.h +++ b/src/libImaging/TiffDecode.h @@ -32,17 +32,17 @@ typedef struct { toff_t loc; /* toff_t == uint32 */ tsize_t size; /* tsize_t == int32 */ int fp; - uint32 ifd; /* offset of the ifd, used for multipage - * Should be uint32 for libtiff 3.9.x - * uint64 for libtiff 4.0.x - */ + uint32_t ifd; /* offset of the ifd, used for multipage + * Should be uint32 for libtiff 3.9.x + * uint64 for libtiff 4.0.x + */ TIFF *tiff; /* Used in write */ toff_t eof; int flrealloc; /* may we realloc */ } TIFFSTATE; extern int -ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset); +ImagingLibTiffInit(ImagingCodecState state, int fp, uint32_t offset); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); extern int From bc935f9970f66c3b5c8d96718f9ddc476b0f1c44 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 12:13:09 +1000 Subject: [PATCH 615/750] Do not round dimensions when saving PDF --- Tests/test_file_pdf.py | 23 ++++++++++++++++++++++- src/PIL/PdfImagePlugin.py | 10 +++++----- src/PIL/PdfParser.py | 2 ++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 5ad40b011..40a027cc5 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -30,7 +30,7 @@ def helper_save_as_pdf(tmp_path, mode, **kwargs): with open(outfile, "rb") as fp: contents = fp.read() size = tuple( - int(d) for d in contents.split(b"/MediaBox [ 0 0 ")[1].split(b"]")[0].split() + float(d) for d in contents.split(b"/MediaBox [ 0 0 ")[1].split(b"]")[0].split() ) assert im.size == size @@ -86,6 +86,27 @@ def test_unsupported_mode(tmp_path): im.save(outfile) +def test_resolution(tmp_path): + im = hopper() + + outfile = str(tmp_path / "temp.pdf") + im.save(outfile, resolution=150) + + with open(outfile, "rb") as fp: + contents = fp.read() + + size = tuple( + float(d) + for d in contents.split(b"stream\nq ")[1].split(b" 0 0 cm")[0].split(b" 0 0 ") + ) + assert size == (61.44, 61.44) + + size = tuple( + float(d) for d in contents.split(b"/MediaBox [ 0 0 ")[1].split(b"]")[0].split() + ) + assert size == (61.44, 61.44) + + @mark_if_feature_version( pytest.mark.valgrind_known_error, "libjpeg_turbo", "2.0", reason="Known Failing" ) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 2ba4671d5..49ba077e6 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -202,8 +202,8 @@ def _save(im, fp, filename, save_all=False): MediaBox=[ 0, 0, - int(width * 72.0 / resolution), - int(height * 72.0 / resolution), + width * 72.0 / resolution, + height * 72.0 / resolution, ], Contents=contents_refs[pageNumber], ) @@ -211,9 +211,9 @@ def _save(im, fp, filename, save_all=False): # # page contents - page_contents = b"q %d 0 0 %d 0 0 cm /image Do Q\n" % ( - int(width * 72.0 / resolution), - int(height * 72.0 / resolution), + page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( + width * 72.0 / resolution, + height * 72.0 / resolution, ) existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 86d78a95c..b5279e0d7 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -330,6 +330,8 @@ def pdf_repr(x): return bytes(x) elif isinstance(x, int): return str(x).encode("us-ascii") + elif isinstance(x, float): + return str(x).encode("us-ascii") elif isinstance(x, time.struct_time): return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" elif isinstance(x, dict): From 91b3a9d6a10c57f1e1fe187e361df9f400422d8f Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 1 May 2021 21:56:49 +1000 Subject: [PATCH 616/750] Updated docstring Co-authored-by: Hugo van Kemenade --- src/PIL/ImageOps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 6c15957d8..4ac2ff33c 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -241,10 +241,10 @@ def contain(image, size, method=Image.BICUBIC): Returns a sized version of the image, expanded to fill the requested aspect ratio and size. - :param image: The image to size and crop. + :param image: The image to resize and crop. :param size: The requested output size in pixels, given as a (width, height) tuple. - :param method: What resampling method to use. Default is + :param method: Resampling method to use. Default is :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. :return: An image. """ From 38a520c109e725cae1a106f12882bb1915f52554 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 22:35:53 +1000 Subject: [PATCH 617/750] Updated docstrings --- src/PIL/ImageOps.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 4ac2ff33c..f9c35b2c6 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -238,8 +238,8 @@ def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoi def contain(image, size, method=Image.BICUBIC): """ - Returns a sized version of the image, expanded to fill the requested aspect ratio - and size. + Returns a resized version of the image, set to the maximum width and height + within the requested size, while maintaining the original aspect ratio. :param image: The image to resize and crop. :param size: The requested output size in pixels, given as a @@ -266,13 +266,13 @@ def contain(image, size, method=Image.BICUBIC): def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)): """ - Returns a sized and padded version of the image, expanded to fill the + Returns a resized and padded version of the image, expanded to fill the requested aspect ratio and size. - :param image: The image to size and crop. + :param image: The image to resize and crop. :param size: The requested output size in pixels, given as a (width, height) tuple. - :param method: What resampling method to use. Default is + :param method: Resampling method to use. Default is :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. :param color: The background color of the padded image. :param centering: Control the position of the original image within the @@ -322,7 +322,7 @@ def scale(image, factor, resample=Image.BICUBIC): :param image: The image to rescale. :param factor: The expansion factor, as a float. - :param resample: What resampling method to use. Default is + :param resample: Resampling method to use. Default is :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. :returns: An :py:class:`~PIL.Image.Image` object. """ @@ -399,15 +399,15 @@ def expand(image, border=0, fill=0): def fit(image, size, method=Image.BICUBIC, bleed=0.0, centering=(0.5, 0.5)): """ - Returns a sized and cropped version of the image, cropped to the + Returns a resized and cropped version of the image, cropped to the requested aspect ratio and size. This function was contributed by Kevin Cazabon. - :param image: The image to size and crop. + :param image: The image to resize and crop. :param size: The requested output size in pixels, given as a (width, height) tuple. - :param method: What resampling method to use. Default is + :param method: Resampling method to use. Default is :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. :param bleed: Remove a border around the outside of the image from all four edges. The value is a decimal percentage (use 0.01 for From d22fe41776f5c29cd693bd368cfe7b0dace096a6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 22:04:14 +1000 Subject: [PATCH 618/750] Reorganised test to use parametrize --- Tests/test_imageops.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 987a531df..ff2445a51 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -102,19 +102,11 @@ def test_fit_same_ratio(): assert new_im.size == (1000, 755) -def test_contain(): - # Same ratio +@pytest.mark.parametrize("new_size", ((256, 256), (512, 256), (256, 512))) +def test_contain(new_size): im = hopper() - new_size = (im.width * 2, im.height * 2) new_im = ImageOps.contain(im, new_size) - assert new_im.size == new_size - - for new_size in [ - (im.width * 4, im.height * 2), - (im.width * 2, im.height * 4), - ]: - new_im = ImageOps.contain(im, new_size) - assert new_im.size == (im.width * 2, im.height * 2) + assert new_im.size == (256, 256) def test_pad(): From b432f838f1d67fc280a6e33fe8d81cd328b06994 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 22:53:46 +1000 Subject: [PATCH 619/750] Documented ImageOps contain method --- docs/reference/ImageOps.rst | 1 + docs/releasenotes/8.3.0.rst | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 docs/releasenotes/8.3.0.rst diff --git a/docs/reference/ImageOps.rst b/docs/reference/ImageOps.rst index 9a16d6625..d1c43cf60 100644 --- a/docs/reference/ImageOps.rst +++ b/docs/reference/ImageOps.rst @@ -12,6 +12,7 @@ only work on L and RGB images. .. autofunction:: autocontrast .. autofunction:: colorize +.. autofunction:: contain .. autofunction:: pad .. autofunction:: crop .. autofunction:: scale diff --git a/docs/releasenotes/8.3.0.rst b/docs/releasenotes/8.3.0.rst new file mode 100644 index 000000000..4459083ea --- /dev/null +++ b/docs/releasenotes/8.3.0.rst @@ -0,0 +1,49 @@ +8.3.0 +----- + +Deprecations +============ + +TODO +^^^^ + +TODO + +API Changes +=========== + +TODO +^^^^ + +TODO + +API Additions +============= + +ImageOps.contain +^^^^^^^^^^^^^^^^ + +Returns a resized version of the image, set to the maximum width and height within +``size``, while maintaining the original aspect ratio. + +To compare it to other ImageOps methods: +- :py:meth:`~PIL.ImageOps.fit` expands an image until is fills ``size``, cropping the +parts of the image that do not fit. +- :py:meth:`~PIL.ImageOps.pad` expands an image to fill ``size``, without cropping, but +instead filling the extra space with ``color``. +- :py:meth:`~PIL.ImageOps.contain` is similar to :py:meth:`~PIL.ImageOps.pad`, but +it does not fill the extra space. Instead, the original aspect ratio is maintained. So +unlike the other two methods, it is not guaranteed to return an image of ``size``. + +Security +======== + +TODO + +Other Changes +============= + +TODO +^^^^ + +TODO From f45f7dcc23801202ff89d7eec3faacb67a7268d0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 23:08:49 +1000 Subject: [PATCH 620/750] Documented #5450 --- docs/releasenotes/8.3.0.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.3.0.rst b/docs/releasenotes/8.3.0.rst index 4459083ea..958f1c48d 100644 --- a/docs/releasenotes/8.3.0.rst +++ b/docs/releasenotes/8.3.0.rst @@ -12,10 +12,11 @@ TODO API Changes =========== -TODO -^^^^ +Changed WebP default "method" value when saving +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +Previously, it was 0, for the best speed. The default has now been changed to 4, to +match WebP's default, for higher quality with still some speed optimisation. API Additions ============= From 5b0031c9fabd703b860502aeb8ca1aa748452db1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 23:09:20 +1000 Subject: [PATCH 621/750] Documented #5411 --- docs/releasenotes/8.3.0.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/releasenotes/8.3.0.rst b/docs/releasenotes/8.3.0.rst index 958f1c48d..312161da6 100644 --- a/docs/releasenotes/8.3.0.rst +++ b/docs/releasenotes/8.3.0.rst @@ -18,6 +18,13 @@ Changed WebP default "method" value when saving Previously, it was 0, for the best speed. The default has now been changed to 4, to match WebP's default, for higher quality with still some speed optimisation. +Default resampling filter for special image modes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pillow 7.0 changed the default resampling filter to ``Image.BICUBIC``. However, as this +is not supported yet for images with a custom number of bits, the default filter for +those modes has been reverted to ``Image.NEAREST``. + API Additions ============= From c0624109850d7af4f2aa0fe0c599d2c5baa982ec Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 May 2021 23:44:09 +1000 Subject: [PATCH 622/750] Documented #5414 --- docs/releasenotes/8.3.0.rst | 17 ++++++++++++----- docs/releasenotes/index.rst | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/8.3.0.rst b/docs/releasenotes/8.3.0.rst index 312161da6..a4b8cb88c 100644 --- a/docs/releasenotes/8.3.0.rst +++ b/docs/releasenotes/8.3.0.rst @@ -25,6 +25,12 @@ Pillow 7.0 changed the default resampling filter to ``Image.BICUBIC``. However, is not supported yet for images with a custom number of bits, the default filter for those modes has been reverted to ``Image.NEAREST``. +ImageMorph incorrect mode errors +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ``apply()``, ``match()`` and ``get_on_pixels()``, if the image mode is not L, an +:py:exc:`Exception` was thrown. This has now been changed to a :py:exc:`ValueError`. + API Additions ============= @@ -35,13 +41,14 @@ Returns a resized version of the image, set to the maximum width and height with ``size``, while maintaining the original aspect ratio. To compare it to other ImageOps methods: + - :py:meth:`~PIL.ImageOps.fit` expands an image until is fills ``size``, cropping the -parts of the image that do not fit. + parts of the image that do not fit. - :py:meth:`~PIL.ImageOps.pad` expands an image to fill ``size``, without cropping, but -instead filling the extra space with ``color``. -- :py:meth:`~PIL.ImageOps.contain` is similar to :py:meth:`~PIL.ImageOps.pad`, but -it does not fill the extra space. Instead, the original aspect ratio is maintained. So -unlike the other two methods, it is not guaranteed to return an image of ``size``. + instead filling the extra space with ``color``. +- :py:meth:`~PIL.ImageOps.contain` is similar to :py:meth:`~PIL.ImageOps.pad`, but it + does not fill the extra space. Instead, the original aspect ratio is maintained. So + unlike the other two methods, it is not guaranteed to return an image of ``size``. Security ======== diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 117738675..3e23e43d3 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -14,6 +14,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 8.3.0 8.2.0 8.1.2 8.1.1 From 1c52f674a367b65d4d3777e06caf93d68c096c38 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 2 May 2021 08:19:19 +1000 Subject: [PATCH 623/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index c1d4a02f4..f6fbc5eca 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Added ImageOps contain() #5417 + [radarhere, hugovk] + - Changed WebP default "method" value to 4 #5450 [radarhere] From e8f902f987599ace87774f0e95c32317a1cc24b3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 2 May 2021 21:32:51 +1000 Subject: [PATCH 624/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f6fbc5eca..f5e5c409c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Do not round dimensions when saving PDF #5459 + [radarhere] + - Added ImageOps contain() #5417 [radarhere, hugovk] From 0c9ffcfa1475dd6f8e42c4029d66ed6c82aa9d22 Mon Sep 17 00:00:00 2001 From: Stanislau Tsitsianok Date: Sun, 2 May 2021 17:12:07 +0300 Subject: [PATCH 625/750] Fixed #5432 --- src/libImaging/Draw.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index b6f63b7e8..004ff0fe5 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -1347,6 +1347,22 @@ pie_init(clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float s->root->l = lc; s->root->r = rc; s->root->type = ar - al < 180 ? CT_AND : CT_OR; + + // add one more semiplane to avoid spikes + if (ar - al < 90) { + clip_node *old_root = s->root; + clip_node *spike_clipper = s->nodes + s->node_count++; + s->root = s->nodes + s->node_count++; + s->root->l = old_root; + s->root->r = spike_clipper; + s->root->type = CT_AND; + + spike_clipper->l = spike_clipper->r = NULL; + spike_clipper->type = CT_CLIP; + spike_clipper->a = (xl + xr) / 2.0; + spike_clipper->b = (yl + yr) / 2.0; + spike_clipper->c = 0; + } } void From ca67a0c1a2a9762f7f461d499d98f4a176729c2b Mon Sep 17 00:00:00 2001 From: Stanislau Tsitsianok Date: Sun, 2 May 2021 17:12:27 +0300 Subject: [PATCH 626/750] Added test for #5432 --- Tests/test_imagedraw.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 7f31e1aaf..dbdd34bc8 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -538,6 +538,36 @@ def test_pieslice_wide(): assert_image_equal_tofile(im, "Tests/images/imagedraw_pieslice_wide.png") +def test_pieslice_no_spikes(): + im = Image.new("RGB", (161, 161), "white") + draw = ImageDraw.Draw(im) + cxs = ( + [140] * 3 + + list(range(140, 19, -20)) + + [20] * 5 + + list(range(20, 141, 20)) + + [140] * 2 + ) + cys = ( + list(range(80, 141, 20)) + + [140] * 5 + + list(range(140, 19, -20)) + + [20] * 5 + + list(range(20, 80, 20)) + ) + + for cx, cy, angle in zip(cxs, cys, range(0, 360, 15)): + draw.pieslice( + [cx - 100, cy - 100, cx + 100, cy + 100], angle, angle + 1, fill="black" + ) + draw.point([cx, cy], fill="red") + + im_pre_erase = im.copy() + draw.rectangle([21, 21, 139, 139], fill="white") + + assert_image_equal(im, im_pre_erase) + + def helper_point(points): # Arrange im = Image.new("RGB", (W, H)) From 502f497c57ab9283fe6dcc0cad1e073f0220499e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 3 May 2021 08:48:53 +1000 Subject: [PATCH 627/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f5e5c409c..f29d4324b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Fixed bug when checking FreeType2 version if it is not installed #5445 + [radarhere] + - Do not round dimensions when saving PDF #5459 [radarhere] From b2f92df1ba539a303661e603f979d89eb73222f1 Mon Sep 17 00:00:00 2001 From: Adrian Carpenter Date: Sun, 2 May 2021 23:18:26 -0700 Subject: [PATCH 628/750] Fix build with libraqm < 0.7.0 gcc's cpp doesn't short-circuit when RAQM_VERSION_ATLEAST is undefined so building fails on systems with old libraqm (e.g. Debian 10 for raspberry pi where wheels w/libraqm support may not be available). RAQM_VERSION_ATLEAST was introduced with 0.7.0, so the test is effectively equivalent. --- src/_imagingft.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 73f0f6362..44d2aca55 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -277,7 +277,7 @@ text_layout_raqm( direction = RAQM_DIRECTION_LTR; } else if (strcmp(dir, "ttb") == 0) { direction = RAQM_DIRECTION_TTB; -#if !defined(RAQM_VERSION_ATLEAST) || !RAQM_VERSION_ATLEAST(0, 7, 0) +#if !defined(RAQM_VERSION_ATLEAST) PyErr_SetString( PyExc_ValueError, "libraqm 0.7 or greater required for 'ttb' direction"); From 0f68e63793ec116728589264358050b2ce14f4df Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 3 May 2021 18:07:05 +1000 Subject: [PATCH 629/750] Allow for sys.stdout.buffer to be missing --- Tests/test_file_png.py | 19 ++++++++++++++----- Tests/test_psdraw.py | 21 ++++++++++++++++----- docs/handbook/tutorial.rst | 2 +- src/PIL/Image.py | 5 ++++- src/PIL/ImageFile.py | 2 +- src/PIL/PSDraw.py | 7 +++++-- 6 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 35c82a4fb..14ad6fae1 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -713,13 +713,20 @@ class TestFilePng: with pytest.raises(EOFError): im.seek(1) - def test_save_stdout(self): + @pytest.mark.parametrize("buffer", (True, False)) + def test_save_stdout(self, buffer): old_stdout = sys.stdout.buffer - class MyStdOut: - buffer = BytesIO() + if buffer: - sys.stdout = mystdout = MyStdOut() + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout with Image.open(TEST_PNG_FILE) as im: im.save(sys.stdout, "PNG") @@ -727,7 +734,9 @@ class TestFilePng: # Reset stdout sys.stdout = old_stdout - reloaded = Image.open(mystdout.buffer) + if buffer: + mystdout = mystdout.buffer + reloaded = Image.open(mystdout) assert_image_equal_tofile(reloaded, TEST_PNG_FILE) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 30cd1c2e0..cda6a2be1 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -2,6 +2,8 @@ import os import sys from io import BytesIO +import pytest + from PIL import Image, PSDraw @@ -44,14 +46,21 @@ def test_draw_postscript(tmp_path): assert os.path.getsize(tempfile) > 0 -def test_stdout(): +@pytest.mark.parametrize("buffer", (True, False)) +def test_stdout(buffer): # Temporarily redirect stdout old_stdout = sys.stdout.buffer - class MyStdOut: - buffer = BytesIO() + if buffer: - sys.stdout = mystdout = MyStdOut() + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout ps = PSDraw.PSDraw() _create_document(ps) @@ -59,4 +68,6 @@ def test_stdout(): # Reset stdout sys.stdout = old_stdout - assert mystdout.buffer.getvalue() != b"" + if buffer: + mystdout = mystdout.buffer + assert mystdout.getvalue() != b"" diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 1102f09be..cdac0ae2d 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -424,7 +424,7 @@ Drawing PostScript title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points - ps = PSDraw.PSDraw() # default is sys.stdout.buffer + ps = PSDraw.PSDraw() # default is sys.stdout or sys.stdout.buffer ps.begin_document(title) # draw the image (75 dpi) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 105dbb34d..73d8ce084 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2136,7 +2136,10 @@ class Image: filename = str(fp) open_fp = True elif fp == sys.stdout: - fp = sys.stdout.buffer + try: + fp = sys.stdout.buffer + except AttributeError: + pass if not filename and hasattr(fp, "name") and isPath(fp.name): # only set the name for metadata purposes filename = fp.name diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 6917e09a2..daf732de1 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -493,7 +493,7 @@ def _save(im, fp, tile, bufsize=0): # But, it would need at least the image size in most cases. RawEncode is # a tricky case. bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - if fp == sys.stdout.buffer: + if fp == sys.stdout or (hasattr(sys.stdout, "buffer") and fp == sys.stdout.buffer): fp.flush() return try: diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index d62d3fd65..743c35f01 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -26,12 +26,15 @@ from . import EpsImagePlugin class PSDraw: """ Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` is assumed. + ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. """ def __init__(self, fp=None): if not fp: - fp = sys.stdout.buffer + try: + fp = sys.stdout.buffer + except AttributeError: + fp = sys.stdout self.fp = fp def begin_document(self, id=None): From b3bf77361cdfb68814d2f031017d0d149594e041 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 4 May 2021 13:23:23 +1000 Subject: [PATCH 630/750] Updated harfbuzz to 2.8.1 --- winbuild/build_prepare.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index cafba067a..6e8ba4ee8 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -275,9 +275,9 @@ deps = { "libs": [r"*.lib"], }, "harfbuzz": { - "url": "https://github.com/harfbuzz/harfbuzz/archive/2.8.0.zip", - "filename": "harfbuzz-2.8.0.zip", - "dir": "harfbuzz-2.8.0", + "url": "https://github.com/harfbuzz/harfbuzz/archive/2.8.1.zip", + "filename": "harfbuzz-2.8.1.zip", + "dir": "harfbuzz-2.8.1", "build": [ cmd_cmake("-DHB_HAVE_FREETYPE:BOOL=TRUE"), cmd_nmake(target="clean"), From 6fc039a21c683b13c311e1759c3570bc4dc5f459 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 4 May 2021 16:50:12 +1000 Subject: [PATCH 631/750] Updated default value for SAMPLESPERPIXEL tag --- ...yle-jpeg-compression-no-samplesperpixel.tif | Bin 0 -> 213760 bytes Tests/test_file_libtiff.py | 9 +++++++-- src/PIL/TiffImagePlugin.py | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Tests/images/old-style-jpeg-compression-no-samplesperpixel.tif diff --git a/Tests/images/old-style-jpeg-compression-no-samplesperpixel.tif b/Tests/images/old-style-jpeg-compression-no-samplesperpixel.tif new file mode 100644 index 0000000000000000000000000000000000000000..d43ba919220b0c32287f5ab44c5caed524943759 GIT binary patch literal 213760 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

5tGWeuVX?Xbp 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%0A2anc2OkVj5Vky47ci5R;LxZU)B=f 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c0d09d6ce..ea9ee8eb5 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -901,8 +901,13 @@ class TestFileLibTiff(LibTiffTestCase): assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") def test_old_style_jpeg(self): - infile = "Tests/images/old-style-jpeg-compression.tif" - with Image.open(infile) as im: + with Image.open("Tests/images/old-style-jpeg-compression.tif") as im: + assert_image_equal_tofile(im, "Tests/images/old-style-jpeg-compression.png") + + def test_open_missing_samplesperpixel(self): + with Image.open( + "Tests/images/old-style-jpeg-compression-no-samplesperpixel.tif" + ) as im: assert_image_equal_tofile(im, "Tests/images/old-style-jpeg-compression.png") def test_no_rows_per_strip(self): diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 17e29ba4c..f7204009b 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1251,7 +1251,10 @@ class TiffImageFile(ImageFile.ImageFile): if bps_count > len(bps_tuple) and len(bps_tuple) == 1: bps_tuple = bps_tuple * bps_count - samplesPerPixel = self.tag_v2.get(SAMPLESPERPIXEL, 1) + samplesPerPixel = self.tag_v2.get( + SAMPLESPERPIXEL, + 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, + ) if len(bps_tuple) != samplesPerPixel: raise SyntaxError("unknown data organization") From ec0e93aa1067fdd924e5bb095f1f24a60baa14c1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 5 May 2021 00:42:14 +1000 Subject: [PATCH 632/750] Updated tested libtiff versions [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 434330a0b..64a9dd01e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -154,7 +154,7 @@ Many of Pillow's features require external libraries: * **libtiff** provides compressed TIFF functionality - * Pillow has been tested with libtiff versions **3.x** and **4.0-4.1** + * Pillow has been tested with libtiff versions **3.x** and **4.0-4.3** * **libfreetype** provides type related services From 0985de21af7c9eb0aa4dc9b9964df0f5820434e1 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 5 May 2021 15:03:00 +1000 Subject: [PATCH 633/750] Added comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ondrej Baranovič --- src/_imagingft.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/_imagingft.c b/src/_imagingft.c index 44d2aca55..2427bc685 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -278,6 +278,7 @@ text_layout_raqm( } else if (strcmp(dir, "ttb") == 0) { direction = RAQM_DIRECTION_TTB; #if !defined(RAQM_VERSION_ATLEAST) + /* RAQM_VERSION_ATLEAST was added in Raqm 0.7.0 */ PyErr_SetString( PyExc_ValueError, "libraqm 0.7 or greater required for 'ttb' direction"); From edc27719095a17462473911582760a5a8aaf3806 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 5 May 2021 23:52:59 +1000 Subject: [PATCH 634/750] Corrected code references in docstring --- src/PIL/TiffImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 17e29ba4c..5d046761a 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -446,12 +446,12 @@ class ImageFileDirectory_v2(MutableMapping): Tags will be found in the private attributes self._tagdata, and in self._tags_v2 once decoded. - Self.legacy_api is a value for internal use, and shouldn't be + self.legacy_api is a value for internal use, and shouldn't be changed from outside code. In cooperation with the ImageFileDirectory_v1 class, if legacy_api is true, then decoded - tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2 + tags will be populated into both _tags_v1 and _tags_v2. _tags_v2 will be used if this IFD is used in the TIFF save routine. Tags - should be read from tags_v1 if legacy_api == true. + should be read from _tags_v1 if legacy_api == true. """ From b9c571a3283597edb25190f3c47e9ec74d9faa1e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 6 May 2021 20:08:54 +1000 Subject: [PATCH 635/750] Removed WMF DPI rounding --- Tests/images/drawing_roundDown.emf | Bin 876 -> 0 bytes Tests/test_file_wmf.py | 9 ++------- src/PIL/WmfImagePlugin.py | 6 +++--- 3 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 Tests/images/drawing_roundDown.emf diff --git a/Tests/images/drawing_roundDown.emf b/Tests/images/drawing_roundDown.emf deleted file mode 100644 index 6c3e20248c8650f8b98d72bb050a4323fceb096d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876 zcmaiz-AV#c6ouEM{g4&?Q9%$xB^8LxPo`E9K?N0Ec^ib7iKHTS;oJniNbk}kbm>jc zVrvcO7!=rs@9aJMti8{fIcFRIp9I60s#8gS4|09%}-gHM`9__YVT zg}{K%>yAkp_i>lN;3A0|wDE#hR8c_(HMsDQMUj16bUB8|BS4N%`?#g1%_yYCW!B?- z4hQV`L~R8~>RAsa*i2gi@^Kow%pXtB*C?Pjx3my_4jW%#cm8NJ8F; zcZzg1j)*m0nb>q6q)D-OmRP;~xSB(5UYcpvt5*KMb)@lFr&{e%diindXiw5;E!Eon qm6%ih%y?ZCoryL3erYE3ZCKvlH!<6c&VxNhd40 Date: Fri, 7 May 2021 00:12:03 +1000 Subject: [PATCH 636/750] Include code in WebP error --- Tests/test_file_webp.py | 9 +++++++++ src/_webp.c | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index cde7020ed..7fdb32ef4 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -1,5 +1,6 @@ import io import re +import sys import pytest @@ -119,6 +120,14 @@ class TestFileWebp: self._roundtrip(tmp_path, "P", 50.0) + @pytest.mark.skipif(sys.maxsize <= 2 ** 32, reason="Requires 64-bit system") + def test_write_encoding_error_message(self, tmp_path): + temp_file = str(tmp_path / "temp.webp") + im = Image.new("RGB", (15000, 15000)) + with pytest.raises(ValueError) as e: + im.save(temp_file, method=0) + assert str(e.value) == "encoding error 6" + def test_WebPEncode_with_invalid_args(self): """ Calling encoder functions with no arguments should result in an error. diff --git a/src/_webp.c b/src/_webp.c index 4d51d99df..6c357dbb0 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -663,7 +663,7 @@ WebPEncode_wrapper(PyObject *self, PyObject *args) { WebPPictureFree(&pic); if (!ok) { - PyErr_SetString(PyExc_ValueError, "encoding error"); + PyErr_Format(PyExc_ValueError, "encoding error %d", (&pic)->error_code); return NULL; } output = writer.mem; From e7749abdf95154fb9a40ad686bf7a302b66c21f7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 20:44:46 +1000 Subject: [PATCH 637/750] Corrected error in restoring sys.stdout --- Tests/test_file_png.py | 2 +- Tests/test_psdraw.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 14ad6fae1..15d74ca6b 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -715,7 +715,7 @@ class TestFilePng: @pytest.mark.parametrize("buffer", (True, False)) def test_save_stdout(self, buffer): - old_stdout = sys.stdout.buffer + old_stdout = sys.stdout if buffer: diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index cda6a2be1..e74d79828 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -49,7 +49,7 @@ def test_draw_postscript(tmp_path): @pytest.mark.parametrize("buffer", (True, False)) def test_stdout(buffer): # Temporarily redirect stdout - old_stdout = sys.stdout.buffer + old_stdout = sys.stdout if buffer: From 9d72542c08b2bea805ebfb3389b1ab40b88bafdc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 20:39:05 +1000 Subject: [PATCH 638/750] Removed DPI rounding from PNG loading --- Tests/test_file_png.py | 21 ++++----------------- src/PIL/PngImagePlugin.py | 2 +- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 14ad6fae1..4e7714fd4 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -386,25 +386,12 @@ class TestFilePng: # Check dpi roundtripping with Image.open(TEST_PNG_FILE) as im: - im = roundtrip(im, dpi=(100, 100)) - assert im.info["dpi"] == (100, 100) + im = roundtrip(im, dpi=(100.33, 100.33)) + assert im.info["dpi"] == (100.33, 100.33) - def test_load_dpi_rounding(self): - # Round up + def test_load_float_dpi(self): with Image.open(TEST_PNG_FILE) as im: - assert im.info["dpi"] == (96, 96) - - # Round down - with Image.open("Tests/images/icc_profile_none.png") as im: - assert im.info["dpi"] == (72, 72) - - def test_save_dpi_rounding(self): - with Image.open(TEST_PNG_FILE) as im: - im = roundtrip(im, dpi=(72.2, 72.2)) - assert im.info["dpi"] == (72, 72) - - im = roundtrip(im, dpi=(72.8, 72.8)) - assert im.info["dpi"] == (73, 73) + assert im.info["dpi"] == (95.9866, 95.9866) def test_roundtrip_text(self): # Check text roundtripping diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 07bbc5228..9c256ca8f 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -500,7 +500,7 @@ class PngStream(ChunkStream): px, py = i32(s, 0), i32(s, 4) unit = s[8] if unit == 1: # meter - dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) + dpi = px * 0.0254, py * 0.0254 self.im_info["dpi"] = dpi elif unit == 0: self.im_info["aspect"] = px, py From 0de3beaeaf11ca1670148eface36317109cf995b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 20:50:18 +1000 Subject: [PATCH 639/750] Removed DPI rounding when BMP loading --- Tests/images/hopper_roundDown.bmp | Bin 49206 -> 0 bytes Tests/test_file_bmp.py | 27 +++++++-------------------- src/PIL/BmpImagePlugin.py | 4 +--- 3 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 Tests/images/hopper_roundDown.bmp diff --git a/Tests/images/hopper_roundDown.bmp b/Tests/images/hopper_roundDown.bmp deleted file mode 100644 index 62aada05067a1a541f41b03d72feb191a3446022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49206 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 Nz_nPQ^*_KW000}`Qt$u( diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index d5fe2a4dd..3374fe54e 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -63,7 +63,7 @@ def test_dpi(): output.seek(0) with Image.open(output) as reloaded: - assert reloaded.info["dpi"] == dpi + assert reloaded.info["dpi"] == (72.008961115161, 72.008961115161) def test_save_bmp_with_dpi(tmp_path): @@ -71,6 +71,7 @@ def test_save_bmp_with_dpi(tmp_path): # Arrange outfile = str(tmp_path / "temp.jpg") with Image.open("Tests/images/hopper.bmp") as im: + assert im.info["dpi"] == (95.98654816726399, 95.98654816726399) # Act im.save(outfile, "JPEG", dpi=im.info["dpi"]) @@ -78,31 +79,17 @@ def test_save_bmp_with_dpi(tmp_path): # Assert with Image.open(outfile) as reloaded: reloaded.load() - assert im.info["dpi"] == reloaded.info["dpi"] - assert im.size == reloaded.size + assert reloaded.info["dpi"] == (96, 96) + assert reloaded.size == im.size assert reloaded.format == "JPEG" -def test_load_dpi_rounding(): - # Round up - with Image.open("Tests/images/hopper.bmp") as im: - assert im.info["dpi"] == (96, 96) - - # Round down - with Image.open("Tests/images/hopper_roundDown.bmp") as im: - assert im.info["dpi"] == (72, 72) - - -def test_save_dpi_rounding(tmp_path): +def test_save_float_dpi(tmp_path): outfile = str(tmp_path / "temp.bmp") with Image.open("Tests/images/hopper.bmp") as im: - im.save(outfile, dpi=(72.2, 72.2)) + im.save(outfile, dpi=(72.21216100543306, 72.21216100543306)) with Image.open(outfile) as reloaded: - assert reloaded.info["dpi"] == (72, 72) - - im.save(outfile, dpi=(72.8, 72.8)) - with Image.open(outfile) as reloaded: - assert reloaded.info["dpi"] == (73, 73) + assert reloaded.info["dpi"] == (72.21216100543306, 72.21216100543306) def test_load_dib(): diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 98685be0b..821844484 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -115,9 +115,7 @@ class BmpImageFile(ImageFile.ImageFile): ) file_info["colors"] = i32(header_data, 28) file_info["palette_padding"] = 4 - self.info["dpi"] = tuple( - int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"] - ) + self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) if file_info["compression"] == self.BITFIELDS: if len(header_data) >= 52: for idx, mask in enumerate( From 18e204df05b534220a1e6330bd398c9c5a358f1d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 21:23:29 +1000 Subject: [PATCH 640/750] Removed DPI rounding from JPEG loading --- Tests/images/iptc_roundDown.jpg | Bin 21019 -> 0 bytes Tests/test_file_jpeg.py | 9 --------- src/PIL/JpegImagePlugin.py | 7 +++++-- 3 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 Tests/images/iptc_roundDown.jpg diff --git a/Tests/images/iptc_roundDown.jpg b/Tests/images/iptc_roundDown.jpg deleted file mode 100644 index f98206f1826f1844f1767cbb694f830de4ed403c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21019 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 z 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 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index ab799c13f..eb566e687 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -656,15 +656,6 @@ class TestFileJpeg: reloaded.load() assert im.info["dpi"] == reloaded.info["dpi"] - def test_load_dpi_rounding(self): - # Round up - with Image.open("Tests/images/iptc_roundUp.jpg") as im: - assert im.info["dpi"] == (44, 44) - - # Round down - with Image.open("Tests/images/iptc_roundDown.jpg") as im: - assert im.info["dpi"] == (2, 2) - def test_save_dpi_rounding(self, tmp_path): outfile = str(tmp_path / "temp.jpg") with Image.open("Tests/images/hopper.jpg") as im: diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index f449a2dc0..6d4bc70c5 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -33,6 +33,7 @@ # import array import io +import math import os import struct import subprocess @@ -162,15 +163,17 @@ def APP(self, marker): dpi = float(x_resolution[0]) / x_resolution[1] except TypeError: dpi = x_resolution + if math.isnan(dpi): + raise ValueError if resolution_unit == 3: # cm # 1 dpcm = 2.54 dpi dpi *= 2.54 - self.info["dpi"] = int(dpi + 0.5), int(dpi + 0.5) + self.info["dpi"] = dpi, dpi except (KeyError, SyntaxError, ValueError, ZeroDivisionError): # SyntaxError for invalid/unreadable EXIF # KeyError for dpi not included # ZeroDivisionError for invalid dpi rational value - # ValueError for x_resolution[0] being an invalid float + # ValueError for dpi being an invalid float self.info["dpi"] = 72, 72 From 9ac888262ae651166e65f0fe1936892b671606dd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 May 2021 00:25:47 +1000 Subject: [PATCH 641/750] Do not allow TIFF to seek to a past frame --- Tests/images/multipage_multiple_frame_loop.tiff | Bin 0 -> 816 bytes Tests/images/multipage_out_of_order.tiff | Bin 0 -> 816 bytes Tests/images/multipage_single_frame_loop.tiff | Bin 0 -> 816 bytes Tests/test_file_tiff.py | 13 +++++++++++++ src/PIL/TiffImagePlugin.py | 7 ++++++- 5 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Tests/images/multipage_multiple_frame_loop.tiff create mode 100644 Tests/images/multipage_out_of_order.tiff create mode 100644 Tests/images/multipage_single_frame_loop.tiff diff --git a/Tests/images/multipage_multiple_frame_loop.tiff b/Tests/images/multipage_multiple_frame_loop.tiff new file mode 100644 index 0000000000000000000000000000000000000000..b6759b08023f766caa9c66355849d9dd2ebfd610 GIT binary patch literal 816 zcmb_ayAHxI40IAes1sB?q|%WEHg*Qq{s21zNGuF2to>EHsS{tF54+R$xW7oIuEixkf8vkBzvhqL zz#llp-#~@HA2oqL*DEhTG4?J0rqS?^uGNX(&d&+skLCoA`A(-R2GP&S8vFY>$uMwU aryMw?lO-2)Dp2Efn)9%#rFHUI*6Rg47$3&~ literal 0 HcmV?d00001 diff --git a/Tests/images/multipage_out_of_order.tiff b/Tests/images/multipage_out_of_order.tiff new file mode 100644 index 0000000000000000000000000000000000000000..1576a549b58ae83da286c7481c1b8f7f797ad4fd GIT binary patch literal 816 zcmb`FEf2yl5QgtsSjZGCd?aHM0}hWsVD<;_2uLsp40gYVpM^xCNygi**Httjd^G9q zY45J<_qOb9>+{h#3Vuc1-xy#KjL0pL5sd z-oR7GcW@Ep&cO3**iY4T4O(fePV8!0DBge)|ThP?zBDbFJ^5~=Cmp)0+ daH3NNj_IUGd!2H`h)y#b-zX5*sqqmRyy?5o=-`rdS+cWwD&;04Ek}*QM}`FGAIf?N3nvwqX*3L`q7tnhv3 ilN5$?I%U8yofK)WQ;r&^(@e~2L-djO)Tzl4iC!;pIUn!< literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index c24438c48..dd312d6df 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -301,6 +301,19 @@ class TestFileTiff: assert im.size == (20, 20) assert im.convert("RGB").getpixel((0, 0)) == (0, 0, 255) + def test_frame_order(self): + # A frame can't progress to itself after reading + with Image.open("Tests/images/multipage_single_frame_loop.tiff") as im: + assert im.n_frames == 1 + + # A frame can't progress to a frame that has already been read + with Image.open("Tests/images/multipage_multiple_frame_loop.tiff") as im: + assert im.n_frames == 2 + + # Frames don't have to be in sequence + with Image.open("Tests/images/multipage_out_of_order.tiff") as im: + assert im.n_frames == 3 + def test___str__(self): filename = "Tests/images/pil136.tiff" with Image.open(filename) as im: diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 5d046761a..dd5004edd 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1067,7 +1067,12 @@ class TiffImageFile(ImageFile.ImageFile): self._frame_pos.append(self.__next) logger.debug("Loading tags, location: %s" % self.fp.tell()) self.tag_v2.load(self.fp) - self.__next = self.tag_v2.next + if self.tag_v2.next in self._frame_pos: + # This IFD has already been processed + # Declare this to be the end of the image + self.__next = 0 + else: + self.__next = self.tag_v2.next if self.__next == 0: self._n_frames = frame + 1 if len(self._frame_pos) == 1: From 3795772187d946107fed953c4ab790bdd16cd8e8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 May 2021 12:37:06 +1000 Subject: [PATCH 642/750] Use python3 --- docs/releasenotes/8.0.0.rst | 2 +- src/PIL/IcnsImagePlugin.py | 2 +- src/PIL/Image.py | 2 +- src/PIL/ImageShow.py | 2 +- src/PIL/SpiderImagePlugin.py | 2 +- src/PIL/features.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/releasenotes/8.0.0.rst b/docs/releasenotes/8.0.0.rst index 28dc8324d..2ff9b3799 100644 --- a/docs/releasenotes/8.0.0.rst +++ b/docs/releasenotes/8.0.0.rst @@ -78,7 +78,7 @@ Added a new ``formats`` parameter to :py:func:`.Image.open`: * A list or tuple of formats to attempt to load the file in. This can be used to restrict the set of formats checked. Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python -m PIL`` or using + available formats by running ``python3 -m PIL`` or using the :py:func:`PIL.features.pilinfo` function. ImageOps.autocontrast: add mask parameter diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index a38f2fc5c..5777d7264 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -375,7 +375,7 @@ if sys.platform == "darwin": if __name__ == "__main__": if len(sys.argv) < 2: - print("Syntax: python IcnsImagePlugin.py [file]") + print("Syntax: python3 IcnsImagePlugin.py [file]") sys.exit() with open(sys.argv[1], "rb") as fp: diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 73d8ce084..4c0cbe475 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2887,7 +2887,7 @@ def open(fp, mode="r", formats=None): :param formats: A list or tuple of formats to attempt to load the file in. This can be used to restrict the set of formats checked. Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python -m PIL`` or using + available formats by running ``python3 -m PIL`` or using the :py:func:`PIL.features.pilinfo` function. :returns: An :py:class:`~PIL.Image.Image` object. :exception FileNotFoundError: If the file cannot be found. diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index 6cc420d1b..0c6b9dc98 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -256,7 +256,7 @@ else: if __name__ == "__main__": if len(sys.argv) < 2: - print("Syntax: python ImageShow.py imagefile [title]") + print("Syntax: python3 ImageShow.py imagefile [title]") sys.exit() with Image.open(sys.argv[1]) as im: diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index 819f2ed0a..062af9f98 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -296,7 +296,7 @@ Image.register_save(SpiderImageFile.format, _save_spider) if __name__ == "__main__": if len(sys.argv) < 2: - print("Syntax: python SpiderImagePlugin.py [infile] [outfile]") + print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") sys.exit() filename = sys.argv[1] diff --git a/src/PIL/features.py b/src/PIL/features.py index 66d0ba10a..3838568f3 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -218,7 +218,7 @@ def get_supported(): def pilinfo(out=None, supported_formats=True): """ Prints information about this installation of Pillow. - This function can be called with ``python -m PIL``. + This function can be called with ``python3 -m PIL``. :param out: The output stream to print to. Defaults to ``sys.stdout`` if ``None``. From 6b59b5f4dd5f51c37fcf2b4570dc9ae6635b8963 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 9 May 2021 11:58:11 +1000 Subject: [PATCH 643/750] Updated libimagequant to 2.15.0 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 376d8ef9b..2613cc6b8 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.14.1 +archive=libimagequant-2.15.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 64a9dd01e..31c675e8e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -179,7 +179,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.14.1** + * Pillow has been tested with libimagequant **2.6-2.15.0** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From 43faa389525aacb7ea49da756192cdb15ec3434c Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 10 May 2021 07:54:47 +1000 Subject: [PATCH 644/750] Wrapped tuples in brackets Co-authored-by: Hugo van Kemenade --- src/PIL/TiffImagePlugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 8356f6f3e..dc2fd26b3 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1291,11 +1291,11 @@ class TiffImageFile(ImageFile.ImageFile): if xres and yres: resunit = self.tag_v2.get(RESOLUTION_UNIT) if resunit == 2: # dots per inch - self.info["dpi"] = xres, yres + self.info["dpi"] = (xres, yres) elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = xres * 2.54, yres * 2.54 + self.info["dpi"] = (xres * 2.54, yres * 2.54) elif resunit is None: # used to default to 1, but now 2) - self.info["dpi"] = xres, yres + self.info["dpi"] = (xres, yres) # For backward compatibility, # we also preserve the old behavior self.info["resolution"] = xres, yres From b256541c66f739d91870c1679d3b6ea1e14dfb1e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 May 2021 08:05:12 +1000 Subject: [PATCH 645/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f29d4324b..a8b1a0e2b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,21 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Include code in WebP error #5471 + [radarhere] + +- Do not alter pixels outside mask when drawing text on an image with transparency #5434 + [radarhere] + +- Reset handle when seeking backwards in TIFF #5443 + [radarhere] + +- Replace sys.stdout with sys.stdout.buffer when saving #5437 + [radarhere] + +- Fixed UNDEFINED TIFF tag of length 0 being changed in roundtrip #5426 + [radarhere] + - Fixed bug when checking FreeType2 version if it is not installed #5445 [radarhere] From ef22a740eb4ea04a4eea9030bc3e4d1f5fe28e77 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 May 2021 08:36:10 +1000 Subject: [PATCH 646/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a8b1a0e2b..be31c69f7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Removed TIFF DPI rounding #5446 + [radarhere, hugovk] + - Include code in WebP error #5471 [radarhere] From c04260b3f523871339f46969a46964f929d89708 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Apr 2021 15:39:42 +1000 Subject: [PATCH 647/750] Convert to float for comparison with float in IFDRational __eq__ --- Tests/test_tiff_ifdrational.py | 2 ++ src/PIL/TiffImagePlugin.py | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 1697a8d49..12f475df0 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -28,6 +28,8 @@ def test_sanity(): _test_equal(1, 2, Fraction(1, 2)) _test_equal(1, 2, IFDRational(1, 2)) + _test_equal(7, 5, 1.4) + def test_ranges(): for num in range(1, 10): diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 0e779248f..66d6f71e6 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -354,9 +354,12 @@ class IFDRational(Rational): return self._val.__hash__() def __eq__(self, other): + val = self._val if isinstance(other, IFDRational): other = other._val - return self._val == other + if isinstance(other, float): + val = float(val) + return val == other def __getstate__(self): return [self._val, self._numerator, self._denominator] From 7bfaffd5fadda4b1e1e3599db1832d161c133d6a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 May 2021 09:36:57 +1000 Subject: [PATCH 648/750] Simplified tests now that casting to float is not needed --- Tests/test_file_tiff.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 91506f980..682dc8fd9 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -146,25 +146,24 @@ class TestFileTiff: "Tests/images/hopper_float_dpi_" + str(resolutionUnit) + ".tif" ) as im: assert im.tag_v2.get(RESOLUTION_UNIT) == resolutionUnit - for reloaded_dpi in im.info["dpi"]: - assert float(reloaded_dpi) == dpi + assert im.info["dpi"] == (dpi, dpi) def test_save_float_dpi(self, tmp_path): outfile = str(tmp_path / "temp.tif") with Image.open("Tests/images/hopper.tif") as im: - im.save(outfile, dpi=(72.2, 72.2)) + dpi = (72.2, 72.2) + im.save(outfile, dpi=dpi) with Image.open(outfile) as reloaded: - for dpi in reloaded.info["dpi"]: - assert float(dpi) == 72.2 + assert reloaded.info["dpi"] == dpi def test_save_setting_missing_resolution(self): b = BytesIO() with Image.open("Tests/images/10ct_32bit_128.tiff") as im: im.save(b, format="tiff", resolution=123.45) with Image.open(b) as im: - assert float(im.tag_v2[X_RESOLUTION]) == 123.45 - assert float(im.tag_v2[Y_RESOLUTION]) == 123.45 + assert im.tag_v2[X_RESOLUTION] == 123.45 + assert im.tag_v2[Y_RESOLUTION] == 123.45 def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" From 2fa6537df39b037c159d4f12a25e9eb9335d5529 Mon Sep 17 00:00:00 2001 From: Alexander Karpinsky Date: Mon, 10 May 2021 14:14:36 +0300 Subject: [PATCH 649/750] HTTP link is not valid (wrong redirect) --- src/libImaging/BoxBlur.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/BoxBlur.c b/src/libImaging/BoxBlur.c index 88862eb73..2e45a3358 100644 --- a/src/libImaging/BoxBlur.c +++ b/src/libImaging/BoxBlur.c @@ -287,7 +287,7 @@ ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, int passes) { float sigma2, L, l, a; sigma2 = radius * radius / passes; - // from http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf + // from https://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf // [7] Box length. L = sqrt(12.0 * sigma2 + 1.0); // [11] Integer part of box radius. From b5fc91a5506002dea903aa991c1d5a674e76e488 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 May 2021 21:39:36 +1000 Subject: [PATCH 650/750] Removed GitHub Actions Ubuntu setuptools version requirement --- .ci/install.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 4917b3a7c..fbe85ded7 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -33,10 +33,6 @@ python3 -m pip install test-image-results # TODO Remove condition when numpy supports 3.10 if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi -# TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: -if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi -if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi - # PyQt5 doesn't support PyPy3 # Wheel doesn't yet support 3.10 if [[ $GHA_PYTHON_VERSION == 3.* && $GHA_PYTHON_VERSION != "3.10-dev" ]]; then From c844c07d3dad36a1f8c7358806d456b8865d5b17 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 May 2021 22:11:22 +1000 Subject: [PATCH 651/750] Updated badges for wheels --- README.md | 7 +++++-- docs/index.rst | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0408f4c28..29b5b8a6a 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,12 @@ As of 2019, Pillow development is AppVeyor CI build status (Windows) + GitHub Actions wheels build status (Wheels) Travis CI build status (macOS) + alt="Travis CI wheels build status (aarch64)" + src="https://img.shields.io/travis/com/python-pillow/pillow-wheels/master.svg?label=aarch64%20wheels"> Code coverage diff --git a/docs/index.rst b/docs/index.rst index d2aca4bc4..3348feb89 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -29,9 +29,13 @@ Pillow for enterprise is available via the Tidelift Subscription. `Learn more Date: Tue, 11 May 2021 20:16:44 +1000 Subject: [PATCH 652/750] Use METH_VARARGS flags --- src/_imaging.c | 278 +++++++++++++++++++++++----------------------- src/_imagingcms.c | 18 +-- src/decode.c | 8 +- src/display.c | 16 +-- src/encode.c | 12 +- src/outline.c | 10 +- src/path.c | 10 +- 7 files changed, 176 insertions(+), 176 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 32b928424..c184ac6ad 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2707,8 +2707,8 @@ _font_getsize(ImagingFontObject *self, PyObject *args) { } static struct PyMethodDef _font_methods[] = { - {"getmask", (PyCFunction)_font_getmask, 1}, - {"getsize", (PyCFunction)_font_getsize, 1}, + {"getmask", (PyCFunction)_font_getmask, METH_VARARGS}, + {"getsize", (PyCFunction)_font_getsize, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; @@ -3202,19 +3202,19 @@ _draw_rectangle(ImagingDrawObject *self, PyObject *args) { static struct PyMethodDef _draw_methods[] = { #ifdef WITH_IMAGEDRAW /* Graphics (ImageDraw) */ - {"draw_lines", (PyCFunction)_draw_lines, 1}, + {"draw_lines", (PyCFunction)_draw_lines, METH_VARARGS}, #ifdef WITH_ARROW - {"draw_outline", (PyCFunction)_draw_outline, 1}, + {"draw_outline", (PyCFunction)_draw_outline, METH_VARARGS}, #endif - {"draw_polygon", (PyCFunction)_draw_polygon, 1}, - {"draw_rectangle", (PyCFunction)_draw_rectangle, 1}, - {"draw_points", (PyCFunction)_draw_points, 1}, - {"draw_arc", (PyCFunction)_draw_arc, 1}, - {"draw_bitmap", (PyCFunction)_draw_bitmap, 1}, - {"draw_chord", (PyCFunction)_draw_chord, 1}, - {"draw_ellipse", (PyCFunction)_draw_ellipse, 1}, - {"draw_pieslice", (PyCFunction)_draw_pieslice, 1}, - {"draw_ink", (PyCFunction)_draw_ink, 1}, + {"draw_polygon", (PyCFunction)_draw_polygon, METH_VARARGS}, + {"draw_rectangle", (PyCFunction)_draw_rectangle, METH_VARARGS}, + {"draw_points", (PyCFunction)_draw_points, METH_VARARGS}, + {"draw_arc", (PyCFunction)_draw_arc, METH_VARARGS}, + {"draw_bitmap", (PyCFunction)_draw_bitmap, METH_VARARGS}, + {"draw_chord", (PyCFunction)_draw_chord, METH_VARARGS}, + {"draw_ellipse", (PyCFunction)_draw_ellipse, METH_VARARGS}, + {"draw_pieslice", (PyCFunction)_draw_pieslice, METH_VARARGS}, + {"draw_ink", (PyCFunction)_draw_ink, METH_VARARGS}, #endif {NULL, NULL} /* sentinel */ }; @@ -3421,100 +3421,100 @@ _save_ppm(ImagingObject *self, PyObject *args) { static struct PyMethodDef methods[] = { /* Put commonly used methods first */ - {"getpixel", (PyCFunction)_getpixel, 1}, - {"putpixel", (PyCFunction)_putpixel, 1}, + {"getpixel", (PyCFunction)_getpixel, METH_VARARGS}, + {"putpixel", (PyCFunction)_putpixel, METH_VARARGS}, - {"pixel_access", (PyCFunction)pixel_access_new, 1}, + {"pixel_access", (PyCFunction)pixel_access_new, METH_VARARGS}, /* Standard processing methods (Image) */ - {"color_lut_3d", (PyCFunction)_color_lut_3d, 1}, - {"convert", (PyCFunction)_convert, 1}, - {"convert2", (PyCFunction)_convert2, 1}, - {"convert_matrix", (PyCFunction)_convert_matrix, 1}, - {"convert_transparent", (PyCFunction)_convert_transparent, 1}, - {"copy", (PyCFunction)_copy, 1}, - {"crop", (PyCFunction)_crop, 1}, - {"expand", (PyCFunction)_expand_image, 1}, - {"filter", (PyCFunction)_filter, 1}, - {"histogram", (PyCFunction)_histogram, 1}, - {"entropy", (PyCFunction)_entropy, 1}, + {"color_lut_3d", (PyCFunction)_color_lut_3d, METH_VARARGS}, + {"convert", (PyCFunction)_convert, METH_VARARGS}, + {"convert2", (PyCFunction)_convert2, METH_VARARGS}, + {"convert_matrix", (PyCFunction)_convert_matrix, METH_VARARGS}, + {"convert_transparent", (PyCFunction)_convert_transparent, METH_VARARGS}, + {"copy", (PyCFunction)_copy, METH_VARARGS}, + {"crop", (PyCFunction)_crop, METH_VARARGS}, + {"expand", (PyCFunction)_expand_image, METH_VARARGS}, + {"filter", (PyCFunction)_filter, METH_VARARGS}, + {"histogram", (PyCFunction)_histogram, METH_VARARGS}, + {"entropy", (PyCFunction)_entropy, METH_VARARGS}, #ifdef WITH_MODEFILTER - {"modefilter", (PyCFunction)_modefilter, 1}, + {"modefilter", (PyCFunction)_modefilter, METH_VARARGS}, #endif - {"offset", (PyCFunction)_offset, 1}, - {"paste", (PyCFunction)_paste, 1}, - {"point", (PyCFunction)_point, 1}, - {"point_transform", (PyCFunction)_point_transform, 1}, - {"putdata", (PyCFunction)_putdata, 1}, + {"offset", (PyCFunction)_offset, METH_VARARGS}, + {"paste", (PyCFunction)_paste, METH_VARARGS}, + {"point", (PyCFunction)_point, METH_VARARGS}, + {"point_transform", (PyCFunction)_point_transform, METH_VARARGS}, + {"putdata", (PyCFunction)_putdata, METH_VARARGS}, #ifdef WITH_QUANTIZE - {"quantize", (PyCFunction)_quantize, 1}, + {"quantize", (PyCFunction)_quantize, METH_VARARGS}, #endif #ifdef WITH_RANKFILTER - {"rankfilter", (PyCFunction)_rankfilter, 1}, + {"rankfilter", (PyCFunction)_rankfilter, METH_VARARGS}, #endif - {"resize", (PyCFunction)_resize, 1}, - {"reduce", (PyCFunction)_reduce, 1}, - {"transpose", (PyCFunction)_transpose, 1}, - {"transform2", (PyCFunction)_transform2, 1}, + {"resize", (PyCFunction)_resize, METH_VARARGS}, + {"reduce", (PyCFunction)_reduce, METH_VARARGS}, + {"transpose", (PyCFunction)_transpose, METH_VARARGS}, + {"transform2", (PyCFunction)_transform2, METH_VARARGS}, - {"isblock", (PyCFunction)_isblock, 1}, + {"isblock", (PyCFunction)_isblock, METH_VARARGS}, - {"getbbox", (PyCFunction)_getbbox, 1}, - {"getcolors", (PyCFunction)_getcolors, 1}, - {"getextrema", (PyCFunction)_getextrema, 1}, - {"getprojection", (PyCFunction)_getprojection, 1}, + {"getbbox", (PyCFunction)_getbbox, METH_VARARGS}, + {"getcolors", (PyCFunction)_getcolors, METH_VARARGS}, + {"getextrema", (PyCFunction)_getextrema, METH_VARARGS}, + {"getprojection", (PyCFunction)_getprojection, METH_VARARGS}, - {"getband", (PyCFunction)_getband, 1}, - {"putband", (PyCFunction)_putband, 1}, - {"split", (PyCFunction)_split, 1}, - {"fillband", (PyCFunction)_fillband, 1}, + {"getband", (PyCFunction)_getband, METH_VARARGS}, + {"putband", (PyCFunction)_putband, METH_VARARGS}, + {"split", (PyCFunction)_split, METH_VARARGS}, + {"fillband", (PyCFunction)_fillband, METH_VARARGS}, - {"setmode", (PyCFunction)im_setmode, 1}, + {"setmode", (PyCFunction)im_setmode, METH_VARARGS}, - {"getpalette", (PyCFunction)_getpalette, 1}, - {"getpalettemode", (PyCFunction)_getpalettemode, 1}, - {"putpalette", (PyCFunction)_putpalette, 1}, - {"putpalettealpha", (PyCFunction)_putpalettealpha, 1}, - {"putpalettealphas", (PyCFunction)_putpalettealphas, 1}, + {"getpalette", (PyCFunction)_getpalette, METH_VARARGS}, + {"getpalettemode", (PyCFunction)_getpalettemode, METH_VARARGS}, + {"putpalette", (PyCFunction)_putpalette, METH_VARARGS}, + {"putpalettealpha", (PyCFunction)_putpalettealpha, METH_VARARGS}, + {"putpalettealphas", (PyCFunction)_putpalettealphas, METH_VARARGS}, #ifdef WITH_IMAGECHOPS /* Channel operations (ImageChops) */ - {"chop_invert", (PyCFunction)_chop_invert, 1}, - {"chop_lighter", (PyCFunction)_chop_lighter, 1}, - {"chop_darker", (PyCFunction)_chop_darker, 1}, - {"chop_difference", (PyCFunction)_chop_difference, 1}, - {"chop_multiply", (PyCFunction)_chop_multiply, 1}, - {"chop_screen", (PyCFunction)_chop_screen, 1}, - {"chop_add", (PyCFunction)_chop_add, 1}, - {"chop_subtract", (PyCFunction)_chop_subtract, 1}, - {"chop_add_modulo", (PyCFunction)_chop_add_modulo, 1}, - {"chop_subtract_modulo", (PyCFunction)_chop_subtract_modulo, 1}, - {"chop_and", (PyCFunction)_chop_and, 1}, - {"chop_or", (PyCFunction)_chop_or, 1}, - {"chop_xor", (PyCFunction)_chop_xor, 1}, - {"chop_soft_light", (PyCFunction)_chop_soft_light, 1}, - {"chop_hard_light", (PyCFunction)_chop_hard_light, 1}, - {"chop_overlay", (PyCFunction)_chop_overlay, 1}, + {"chop_invert", (PyCFunction)_chop_invert, METH_VARARGS}, + {"chop_lighter", (PyCFunction)_chop_lighter, METH_VARARGS}, + {"chop_darker", (PyCFunction)_chop_darker, METH_VARARGS}, + {"chop_difference", (PyCFunction)_chop_difference, METH_VARARGS}, + {"chop_multiply", (PyCFunction)_chop_multiply, METH_VARARGS}, + {"chop_screen", (PyCFunction)_chop_screen, METH_VARARGS}, + {"chop_add", (PyCFunction)_chop_add, METH_VARARGS}, + {"chop_subtract", (PyCFunction)_chop_subtract, METH_VARARGS}, + {"chop_add_modulo", (PyCFunction)_chop_add_modulo, METH_VARARGS}, + {"chop_subtract_modulo", (PyCFunction)_chop_subtract_modulo, METH_VARARGS}, + {"chop_and", (PyCFunction)_chop_and, METH_VARARGS}, + {"chop_or", (PyCFunction)_chop_or, METH_VARARGS}, + {"chop_xor", (PyCFunction)_chop_xor, METH_VARARGS}, + {"chop_soft_light", (PyCFunction)_chop_soft_light, METH_VARARGS}, + {"chop_hard_light", (PyCFunction)_chop_hard_light, METH_VARARGS}, + {"chop_overlay", (PyCFunction)_chop_overlay, METH_VARARGS}, #endif #ifdef WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask extension */ - {"gaussian_blur", (PyCFunction)_gaussian_blur, 1}, - {"unsharp_mask", (PyCFunction)_unsharp_mask, 1}, + {"gaussian_blur", (PyCFunction)_gaussian_blur, METH_VARARGS}, + {"unsharp_mask", (PyCFunction)_unsharp_mask, METH_VARARGS}, #endif - {"box_blur", (PyCFunction)_box_blur, 1}, + {"box_blur", (PyCFunction)_box_blur, METH_VARARGS}, #ifdef WITH_EFFECTS /* Special effects */ - {"effect_spread", (PyCFunction)_effect_spread, 1}, + {"effect_spread", (PyCFunction)_effect_spread, METH_VARARGS}, #endif /* Misc. */ - {"new_block", (PyCFunction)_new_block, 1}, + {"new_block", (PyCFunction)_new_block, METH_VARARGS}, - {"save_ppm", (PyCFunction)_save_ppm, 1}, + {"save_ppm", (PyCFunction)_save_ppm, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; @@ -3989,111 +3989,111 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args); static PyMethodDef functions[] = { /* Object factories */ - {"alpha_composite", (PyCFunction)_alpha_composite, 1}, - {"blend", (PyCFunction)_blend, 1}, - {"fill", (PyCFunction)_fill, 1}, - {"new", (PyCFunction)_new, 1}, - {"merge", (PyCFunction)_merge, 1}, + {"alpha_composite", (PyCFunction)_alpha_composite, METH_VARARGS}, + {"blend", (PyCFunction)_blend, METH_VARARGS}, + {"fill", (PyCFunction)_fill, METH_VARARGS}, + {"new", (PyCFunction)_new, METH_VARARGS}, + {"merge", (PyCFunction)_merge, METH_VARARGS}, /* Functions */ - {"convert", (PyCFunction)_convert2, 1}, + {"convert", (PyCFunction)_convert2, METH_VARARGS}, /* Codecs */ - {"bcn_decoder", (PyCFunction)PyImaging_BcnDecoderNew, 1}, - {"bit_decoder", (PyCFunction)PyImaging_BitDecoderNew, 1}, - {"eps_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, - {"fli_decoder", (PyCFunction)PyImaging_FliDecoderNew, 1}, - {"gif_decoder", (PyCFunction)PyImaging_GifDecoderNew, 1}, - {"gif_encoder", (PyCFunction)PyImaging_GifEncoderNew, 1}, - {"hex_decoder", (PyCFunction)PyImaging_HexDecoderNew, 1}, - {"hex_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, /* EPS=HEX! */ + {"bcn_decoder", (PyCFunction)PyImaging_BcnDecoderNew, METH_VARARGS}, + {"bit_decoder", (PyCFunction)PyImaging_BitDecoderNew, METH_VARARGS}, + {"eps_encoder", (PyCFunction)PyImaging_EpsEncoderNew, METH_VARARGS}, + {"fli_decoder", (PyCFunction)PyImaging_FliDecoderNew, METH_VARARGS}, + {"gif_decoder", (PyCFunction)PyImaging_GifDecoderNew, METH_VARARGS}, + {"gif_encoder", (PyCFunction)PyImaging_GifEncoderNew, METH_VARARGS}, + {"hex_decoder", (PyCFunction)PyImaging_HexDecoderNew, METH_VARARGS}, + {"hex_encoder", (PyCFunction)PyImaging_EpsEncoderNew, METH_VARARGS}, /* EPS=HEX! */ #ifdef HAVE_LIBJPEG - {"jpeg_decoder", (PyCFunction)PyImaging_JpegDecoderNew, 1}, - {"jpeg_encoder", (PyCFunction)PyImaging_JpegEncoderNew, 1}, + {"jpeg_decoder", (PyCFunction)PyImaging_JpegDecoderNew, METH_VARARGS}, + {"jpeg_encoder", (PyCFunction)PyImaging_JpegEncoderNew, METH_VARARGS}, #endif #ifdef HAVE_OPENJPEG - {"jpeg2k_decoder", (PyCFunction)PyImaging_Jpeg2KDecoderNew, 1}, - {"jpeg2k_encoder", (PyCFunction)PyImaging_Jpeg2KEncoderNew, 1}, + {"jpeg2k_decoder", (PyCFunction)PyImaging_Jpeg2KDecoderNew, METH_VARARGS}, + {"jpeg2k_encoder", (PyCFunction)PyImaging_Jpeg2KEncoderNew, METH_VARARGS}, #endif #ifdef HAVE_LIBTIFF - {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, 1}, - {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, 1}, + {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, METH_VARARGS}, + {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, METH_VARARGS}, #endif - {"packbits_decoder", (PyCFunction)PyImaging_PackbitsDecoderNew, 1}, - {"pcd_decoder", (PyCFunction)PyImaging_PcdDecoderNew, 1}, - {"pcx_decoder", (PyCFunction)PyImaging_PcxDecoderNew, 1}, - {"pcx_encoder", (PyCFunction)PyImaging_PcxEncoderNew, 1}, - {"raw_decoder", (PyCFunction)PyImaging_RawDecoderNew, 1}, - {"raw_encoder", (PyCFunction)PyImaging_RawEncoderNew, 1}, - {"sgi_rle_decoder", (PyCFunction)PyImaging_SgiRleDecoderNew, 1}, - {"sun_rle_decoder", (PyCFunction)PyImaging_SunRleDecoderNew, 1}, - {"tga_rle_decoder", (PyCFunction)PyImaging_TgaRleDecoderNew, 1}, - {"tga_rle_encoder", (PyCFunction)PyImaging_TgaRleEncoderNew, 1}, - {"xbm_decoder", (PyCFunction)PyImaging_XbmDecoderNew, 1}, - {"xbm_encoder", (PyCFunction)PyImaging_XbmEncoderNew, 1}, + {"packbits_decoder", (PyCFunction)PyImaging_PackbitsDecoderNew, METH_VARARGS}, + {"pcd_decoder", (PyCFunction)PyImaging_PcdDecoderNew, METH_VARARGS}, + {"pcx_decoder", (PyCFunction)PyImaging_PcxDecoderNew, METH_VARARGS}, + {"pcx_encoder", (PyCFunction)PyImaging_PcxEncoderNew, METH_VARARGS}, + {"raw_decoder", (PyCFunction)PyImaging_RawDecoderNew, METH_VARARGS}, + {"raw_encoder", (PyCFunction)PyImaging_RawEncoderNew, METH_VARARGS}, + {"sgi_rle_decoder", (PyCFunction)PyImaging_SgiRleDecoderNew, METH_VARARGS}, + {"sun_rle_decoder", (PyCFunction)PyImaging_SunRleDecoderNew, METH_VARARGS}, + {"tga_rle_decoder", (PyCFunction)PyImaging_TgaRleDecoderNew, METH_VARARGS}, + {"tga_rle_encoder", (PyCFunction)PyImaging_TgaRleEncoderNew, METH_VARARGS}, + {"xbm_decoder", (PyCFunction)PyImaging_XbmDecoderNew, METH_VARARGS}, + {"xbm_encoder", (PyCFunction)PyImaging_XbmEncoderNew, METH_VARARGS}, #ifdef HAVE_LIBZ - {"zip_decoder", (PyCFunction)PyImaging_ZipDecoderNew, 1}, - {"zip_encoder", (PyCFunction)PyImaging_ZipEncoderNew, 1}, + {"zip_decoder", (PyCFunction)PyImaging_ZipDecoderNew, METH_VARARGS}, + {"zip_encoder", (PyCFunction)PyImaging_ZipEncoderNew, METH_VARARGS}, #endif /* Memory mapping */ #ifdef WITH_MAPPING - {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, + {"map_buffer", (PyCFunction)PyImaging_MapBuffer, METH_VARARGS}, #endif /* Display support */ #ifdef _WIN32 - {"display", (PyCFunction)PyImaging_DisplayWin32, 1}, - {"display_mode", (PyCFunction)PyImaging_DisplayModeWin32, 1}, - {"grabscreen_win32", (PyCFunction)PyImaging_GrabScreenWin32, 1}, - {"grabclipboard_win32", (PyCFunction)PyImaging_GrabClipboardWin32, 1}, - {"createwindow", (PyCFunction)PyImaging_CreateWindowWin32, 1}, - {"eventloop", (PyCFunction)PyImaging_EventLoopWin32, 1}, - {"listwindows", (PyCFunction)PyImaging_ListWindowsWin32, 1}, - {"drawwmf", (PyCFunction)PyImaging_DrawWmf, 1}, + {"display", (PyCFunction)PyImaging_DisplayWin32, METH_VARARGS}, + {"display_mode", (PyCFunction)PyImaging_DisplayModeWin32, METH_VARARGS}, + {"grabscreen_win32", (PyCFunction)PyImaging_GrabScreenWin32, METH_VARARGS}, + {"grabclipboard_win32", (PyCFunction)PyImaging_GrabClipboardWin32, METH_VARARGS}, + {"createwindow", (PyCFunction)PyImaging_CreateWindowWin32, METH_VARARGS}, + {"eventloop", (PyCFunction)PyImaging_EventLoopWin32, METH_VARARGS}, + {"listwindows", (PyCFunction)PyImaging_ListWindowsWin32, METH_VARARGS}, + {"drawwmf", (PyCFunction)PyImaging_DrawWmf, METH_VARARGS}, #endif #ifdef HAVE_XCB - {"grabscreen_x11", (PyCFunction)PyImaging_GrabScreenX11, 1}, + {"grabscreen_x11", (PyCFunction)PyImaging_GrabScreenX11, METH_VARARGS}, #endif /* Utilities */ - {"getcodecstatus", (PyCFunction)_getcodecstatus, 1}, + {"getcodecstatus", (PyCFunction)_getcodecstatus, METH_VARARGS}, /* Special effects (experimental) */ #ifdef WITH_EFFECTS - {"effect_mandelbrot", (PyCFunction)_effect_mandelbrot, 1}, - {"effect_noise", (PyCFunction)_effect_noise, 1}, - {"linear_gradient", (PyCFunction)_linear_gradient, 1}, - {"radial_gradient", (PyCFunction)_radial_gradient, 1}, - {"wedge", (PyCFunction)_linear_gradient, 1}, /* Compatibility */ + {"effect_mandelbrot", (PyCFunction)_effect_mandelbrot, METH_VARARGS}, + {"effect_noise", (PyCFunction)_effect_noise, METH_VARARGS}, + {"linear_gradient", (PyCFunction)_linear_gradient, METH_VARARGS}, + {"radial_gradient", (PyCFunction)_radial_gradient, METH_VARARGS}, + {"wedge", (PyCFunction)_linear_gradient, METH_VARARGS}, /* Compatibility */ #endif /* Drawing support stuff */ #ifdef WITH_IMAGEDRAW - {"font", (PyCFunction)_font_new, 1}, - {"draw", (PyCFunction)_draw_new, 1}, + {"font", (PyCFunction)_font_new, METH_VARARGS}, + {"draw", (PyCFunction)_draw_new, METH_VARARGS}, #endif /* Experimental path stuff */ #ifdef WITH_IMAGEPATH - {"path", (PyCFunction)PyPath_Create, 1}, + {"path", (PyCFunction)PyPath_Create, METH_VARARGS}, #endif /* Experimental arrow graphics stuff */ #ifdef WITH_ARROW - {"outline", (PyCFunction)PyOutline_Create, 1}, + {"outline", (PyCFunction)PyOutline_Create, METH_VARARGS}, #endif /* Resource management */ - {"get_stats", (PyCFunction)_get_stats, 1}, - {"reset_stats", (PyCFunction)_reset_stats, 1}, - {"get_alignment", (PyCFunction)_get_alignment, 1}, - {"get_block_size", (PyCFunction)_get_block_size, 1}, - {"get_blocks_max", (PyCFunction)_get_blocks_max, 1}, - {"set_alignment", (PyCFunction)_set_alignment, 1}, - {"set_block_size", (PyCFunction)_set_block_size, 1}, - {"set_blocks_max", (PyCFunction)_set_blocks_max, 1}, - {"clear_cache", (PyCFunction)_clear_cache, 1}, + {"get_stats", (PyCFunction)_get_stats, METH_VARARGS}, + {"reset_stats", (PyCFunction)_reset_stats, METH_VARARGS}, + {"get_alignment", (PyCFunction)_get_alignment, METH_VARARGS}, + {"get_block_size", (PyCFunction)_get_block_size, METH_VARARGS}, + {"get_blocks_max", (PyCFunction)_get_blocks_max, METH_VARARGS}, + {"set_alignment", (PyCFunction)_set_alignment, METH_VARARGS}, + {"set_block_size", (PyCFunction)_set_block_size, METH_VARARGS}, + {"set_blocks_max", (PyCFunction)_set_blocks_max, METH_VARARGS}, + {"clear_cache", (PyCFunction)_clear_cache, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/_imagingcms.c b/src/_imagingcms.c index 314150420..1446bd02b 100644 --- a/src/_imagingcms.c +++ b/src/_imagingcms.c @@ -959,25 +959,25 @@ _is_intent_supported(CmsProfileObject *self, int clut) { static PyMethodDef pyCMSdll_methods[] = { - {"profile_open", cms_profile_open, 1}, - {"profile_frombytes", cms_profile_fromstring, 1}, - {"profile_fromstring", cms_profile_fromstring, 1}, - {"profile_tobytes", cms_profile_tobytes, 1}, + {"profile_open", cms_profile_open, METH_VARARGS}, + {"profile_frombytes", cms_profile_fromstring, METH_VARARGS}, + {"profile_fromstring", cms_profile_fromstring, METH_VARARGS}, + {"profile_tobytes", cms_profile_tobytes, METH_VARARGS}, /* profile and transform functions */ - {"buildTransform", buildTransform, 1}, - {"buildProofTransform", buildProofTransform, 1}, - {"createProfile", createProfile, 1}, + {"buildTransform", buildTransform, METH_VARARGS}, + {"buildProofTransform", buildProofTransform, METH_VARARGS}, + {"createProfile", createProfile, METH_VARARGS}, /* platform specific tools */ #ifdef _WIN32 - {"get_display_profile_win32", cms_get_display_profile_win32, 1}, + {"get_display_profile_win32", cms_get_display_profile_win32, METH_VARARGS}, #endif {NULL, NULL}}; static struct PyMethodDef cms_profile_methods[] = { - {"is_intent_supported", (PyCFunction)cms_profile_is_intent_supported, 1}, + {"is_intent_supported", (PyCFunction)cms_profile_is_intent_supported, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/decode.c b/src/decode.c index ee1c5685f..7bcbfdeef 100644 --- a/src/decode.c +++ b/src/decode.c @@ -239,10 +239,10 @@ _get_pulls_fd(ImagingDecoderObject *decoder) { } static struct PyMethodDef methods[] = { - {"decode", (PyCFunction)_decode, 1}, - {"cleanup", (PyCFunction)_decode_cleanup, 1}, - {"setimage", (PyCFunction)_setimage, 1}, - {"setfd", (PyCFunction)_setfd, 1}, + {"decode", (PyCFunction)_decode, METH_VARARGS}, + {"cleanup", (PyCFunction)_decode_cleanup, METH_VARARGS}, + {"setimage", (PyCFunction)_setimage, METH_VARARGS}, + {"setfd", (PyCFunction)_setfd, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/display.c b/src/display.c index 3541655cf..0ce10e249 100644 --- a/src/display.c +++ b/src/display.c @@ -224,14 +224,14 @@ _tobytes(ImagingDisplayObject *display, PyObject *args) { } static struct PyMethodDef methods[] = { - {"draw", (PyCFunction)_draw, 1}, - {"expose", (PyCFunction)_expose, 1}, - {"paste", (PyCFunction)_paste, 1}, - {"query_palette", (PyCFunction)_query_palette, 1}, - {"getdc", (PyCFunction)_getdc, 1}, - {"releasedc", (PyCFunction)_releasedc, 1}, - {"frombytes", (PyCFunction)_frombytes, 1}, - {"tobytes", (PyCFunction)_tobytes, 1}, + {"draw", (PyCFunction)_draw, METH_VARARGS}, + {"expose", (PyCFunction)_expose, METH_VARARGS}, + {"paste", (PyCFunction)_paste, METH_VARARGS}, + {"query_palette", (PyCFunction)_query_palette, METH_VARARGS}, + {"getdc", (PyCFunction)_getdc, METH_VARARGS}, + {"releasedc", (PyCFunction)_releasedc, METH_VARARGS}, + {"frombytes", (PyCFunction)_frombytes, METH_VARARGS}, + {"tobytes", (PyCFunction)_tobytes, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/encode.c b/src/encode.c index 582bdd651..daa806ff4 100644 --- a/src/encode.c +++ b/src/encode.c @@ -304,12 +304,12 @@ _get_pushes_fd(ImagingEncoderObject *encoder) { } static struct PyMethodDef methods[] = { - {"encode", (PyCFunction)_encode, 1}, - {"cleanup", (PyCFunction)_encode_cleanup, 1}, - {"encode_to_file", (PyCFunction)_encode_to_file, 1}, - {"encode_to_pyfd", (PyCFunction)_encode_to_pyfd, 1}, - {"setimage", (PyCFunction)_setimage, 1}, - {"setfd", (PyCFunction)_setfd, 1}, + {"encode", (PyCFunction)_encode, METH_VARARGS}, + {"cleanup", (PyCFunction)_encode_cleanup, METH_VARARGS}, + {"encode_to_file", (PyCFunction)_encode_to_file, METH_VARARGS}, + {"encode_to_pyfd", (PyCFunction)_encode_to_pyfd, METH_VARARGS}, + {"setimage", (PyCFunction)_setimage, METH_VARARGS}, + {"setfd", (PyCFunction)_setfd, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/outline.c b/src/outline.c index ba3e056cc..0a9a3646e 100644 --- a/src/outline.c +++ b/src/outline.c @@ -145,11 +145,11 @@ _outline_transform(OutlineObject *self, PyObject *args) { } static struct PyMethodDef _outline_methods[] = { - {"line", (PyCFunction)_outline_line, 1}, - {"curve", (PyCFunction)_outline_curve, 1}, - {"move", (PyCFunction)_outline_move, 1}, - {"close", (PyCFunction)_outline_close, 1}, - {"transform", (PyCFunction)_outline_transform, 1}, + {"line", (PyCFunction)_outline_line, METH_VARARGS}, + {"curve", (PyCFunction)_outline_curve, METH_VARARGS}, + {"move", (PyCFunction)_outline_move, METH_VARARGS}, + {"close", (PyCFunction)_outline_close, METH_VARARGS}, + {"transform", (PyCFunction)_outline_transform, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/src/path.c b/src/path.c index 8d1f68e84..4764c58aa 100644 --- a/src/path.c +++ b/src/path.c @@ -524,11 +524,11 @@ path_transform(PyPathObject *self, PyObject *args) { } static struct PyMethodDef methods[] = { - {"getbbox", (PyCFunction)path_getbbox, 1}, - {"tolist", (PyCFunction)path_tolist, 1}, - {"compact", (PyCFunction)path_compact, 1}, - {"map", (PyCFunction)path_map, 1}, - {"transform", (PyCFunction)path_transform, 1}, + {"getbbox", (PyCFunction)path_getbbox, METH_VARARGS}, + {"tolist", (PyCFunction)path_tolist, METH_VARARGS}, + {"compact", (PyCFunction)path_compact, METH_VARARGS}, + {"map", (PyCFunction)path_map, METH_VARARGS}, + {"transform", (PyCFunction)path_transform, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; From 29c6f53e99d2699edd88ae26419e6ac38a5c1ed4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 11 May 2021 20:19:17 +1000 Subject: [PATCH 653/750] Use METH_NOARGS when no arguments are required --- src/_imaging.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index c184ac6ad..9a57ea1e1 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -1086,7 +1086,7 @@ _getpalette(ImagingObject *self, PyObject *args) { } static PyObject * -_getpalettemode(ImagingObject *self, PyObject *args) { +_getpalettemode(ImagingObject *self) { if (!self->image->palette) { PyErr_SetString(PyExc_ValueError, no_palette); return NULL; @@ -2095,12 +2095,12 @@ _box_blur(ImagingObject *self, PyObject *args) { /* -------------------------------------------------------------------- */ static PyObject * -_isblock(ImagingObject *self, PyObject *args) { +_isblock(ImagingObject *self) { return PyBool_FromLong(self->image->block != NULL); } static PyObject * -_getbbox(ImagingObject *self, PyObject *args) { +_getbbox(ImagingObject *self) { int bbox[4]; if (!ImagingGetBBox(self->image, bbox)) { Py_INCREF(Py_None); @@ -2145,7 +2145,7 @@ _getcolors(ImagingObject *self, PyObject *args) { } static PyObject * -_getextrema(ImagingObject *self, PyObject *args) { +_getextrema(ImagingObject *self) { union { UINT8 u[2]; INT32 i[2]; @@ -2179,7 +2179,7 @@ _getextrema(ImagingObject *self, PyObject *args) { } static PyObject * -_getprojection(ImagingObject *self, PyObject *args) { +_getprojection(ImagingObject *self) { unsigned char *xprofile; unsigned char *yprofile; PyObject *result; @@ -2297,7 +2297,7 @@ _merge(PyObject *self, PyObject *args) { } static PyObject * -_split(ImagingObject *self, PyObject *args) { +_split(ImagingObject *self) { int fails = 0; Py_ssize_t i; PyObject *list; @@ -2328,7 +2328,7 @@ _split(ImagingObject *self, PyObject *args) { #ifdef WITH_IMAGECHOPS static PyObject * -_chop_invert(ImagingObject *self, PyObject *args) { +_chop_invert(ImagingObject *self) { return PyImagingNew(ImagingNegative(self->image)); } @@ -3457,29 +3457,29 @@ static struct PyMethodDef methods[] = { {"transpose", (PyCFunction)_transpose, METH_VARARGS}, {"transform2", (PyCFunction)_transform2, METH_VARARGS}, - {"isblock", (PyCFunction)_isblock, METH_VARARGS}, + {"isblock", (PyCFunction)_isblock, METH_NOARGS}, - {"getbbox", (PyCFunction)_getbbox, METH_VARARGS}, + {"getbbox", (PyCFunction)_getbbox, METH_NOARGS}, {"getcolors", (PyCFunction)_getcolors, METH_VARARGS}, - {"getextrema", (PyCFunction)_getextrema, METH_VARARGS}, - {"getprojection", (PyCFunction)_getprojection, METH_VARARGS}, + {"getextrema", (PyCFunction)_getextrema, METH_NOARGS}, + {"getprojection", (PyCFunction)_getprojection, METH_NOARGS}, {"getband", (PyCFunction)_getband, METH_VARARGS}, {"putband", (PyCFunction)_putband, METH_VARARGS}, - {"split", (PyCFunction)_split, METH_VARARGS}, + {"split", (PyCFunction)_split, METH_NOARGS}, {"fillband", (PyCFunction)_fillband, METH_VARARGS}, {"setmode", (PyCFunction)im_setmode, METH_VARARGS}, {"getpalette", (PyCFunction)_getpalette, METH_VARARGS}, - {"getpalettemode", (PyCFunction)_getpalettemode, METH_VARARGS}, + {"getpalettemode", (PyCFunction)_getpalettemode, METH_NOARGS}, {"putpalette", (PyCFunction)_putpalette, METH_VARARGS}, {"putpalettealpha", (PyCFunction)_putpalettealpha, METH_VARARGS}, {"putpalettealphas", (PyCFunction)_putpalettealphas, METH_VARARGS}, #ifdef WITH_IMAGECHOPS /* Channel operations (ImageChops) */ - {"chop_invert", (PyCFunction)_chop_invert, METH_VARARGS}, + {"chop_invert", (PyCFunction)_chop_invert, METH_NOARGS}, {"chop_lighter", (PyCFunction)_chop_lighter, METH_VARARGS}, {"chop_darker", (PyCFunction)_chop_darker, METH_VARARGS}, {"chop_difference", (PyCFunction)_chop_difference, METH_VARARGS}, From ff5eb51216f7a44d03a1a0a28ab4148e738db793 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 13 May 2021 22:13:07 +1000 Subject: [PATCH 654/750] Updated libimagequant to 2.15.1 --- depends/install_imagequant.sh | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 2613cc6b8..c6c7506a3 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.15.0 +archive=libimagequant-2.15.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/docs/installation.rst b/docs/installation.rst index 31c675e8e..6ce00eefd 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -179,7 +179,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.15.0** + * Pillow has been tested with libimagequant **2.6-2.15.1** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From bf97a92bc62bfba894e1f2a641c2bbd885f0f75e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 14 May 2021 13:18:49 +1000 Subject: [PATCH 655/750] Ensure PNG seeks to end of previous chunk at start of load_end --- Tests/images/padded_idat.png | Bin 0 -> 104 bytes Tests/test_file_png.py | 17 +++++++++++++++++ src/PIL/PngImagePlugin.py | 2 ++ 3 files changed, 19 insertions(+) create mode 100644 Tests/images/padded_idat.png diff --git a/Tests/images/padded_idat.png b/Tests/images/padded_idat.png new file mode 100644 index 0000000000000000000000000000000000000000..18c5a4990cdcaf8b31f71ee20f88c85d291de263 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5xHv#$-PijWKuX`!#WAE}&f5!)f(#5i%^S-8 rx%#v93$e=hZjU`?*}%5|8QZ?gVHD1NmlhaZ1Tw Date: Fri, 14 May 2021 18:50:56 +1000 Subject: [PATCH 656/750] Added CFAPattern, ExifVersion and FlashpixVersion UNDEFINED tags --- src/PIL/TiffTags.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index d7f732193..774e6b346 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -184,7 +184,9 @@ TAGS_V2 = { 34665: ("ExifIFD", LONG, 1), 34675: ("ICCProfile", UNDEFINED, 1), 34853: ("GPSInfoIFD", LONG, 1), + 36864: ("ExifVersion", UNDEFINED, 1), 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), # MPInfo 45056: ("MPFVersion", UNDEFINED, 1), 45057: ("NumberOfImages", LONG, 1), @@ -205,6 +207,7 @@ TAGS_V2 = { 45579: ("YawAngle", SIGNED_RATIONAL, 1), 45580: ("PitchAngle", SIGNED_RATIONAL, 1), 45581: ("RollAngle", SIGNED_RATIONAL, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), 50780: ("BestQualityScale", RATIONAL, 1), 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one From f132e4de8db924eb9bc4df35d30101db16e20583 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 14 May 2021 19:48:47 +1000 Subject: [PATCH 657/750] Removed setuptools version requirement --- .github/workflows/macos-install.sh | 4 ---- .github/workflows/test-windows.yml | 5 ----- 2 files changed, 9 deletions(-) diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index f45824445..b20ecb4dc 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -17,9 +17,5 @@ echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openbla # TODO Remove condition when numpy supports 3.10 if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi -# TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: -if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi -if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi - # extra test images pushd depends && ./install_extra_test_images.sh && popd diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 8f7706847..cdb8493dc 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -54,11 +54,6 @@ jobs: - name: python -m pip install wheel pytest pytest-cov pytest-timeout run: python -m pip install wheel pytest pytest-cov pytest-timeout - # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+: - - name: Upgrade setuptools - if: "contains(matrix.python-version, '3.8') || contains(matrix.python-version, '3.9')" - run: python -m pip install -U "setuptools>=49.3.2" - - name: Install dependencies id: install run: | From 3f01813a5053878e6dbfaa33789cf8c05edf33e2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 14 May 2021 23:39:44 +1000 Subject: [PATCH 658/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index be31c69f7..4620009f1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Remove spikes when drawing thin pieslices #5460 + [xtsm] + +- Updated default value for SAMPLESPERPIXEL TIFF tag #5452 + [radarhere] + - Removed TIFF DPI rounding #5446 [radarhere, hugovk] From 5caa04c2d1ea298774ef341f7e4cde9c753c8ded Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 11 May 2021 19:07:21 +0300 Subject: [PATCH 659/750] Build docs with sphinx_copybutton and sphinxext.opengraph --- .github/workflows/test.yml | 2 +- docs/conf.py | 6 ++++-- requirements.txt | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e52fefc69..cf7bcb6b9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -103,7 +103,7 @@ jobs: - name: Docs if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.9 run: | - python3 -m pip install sphinx-issues sphinx-removed-in sphinx-rtd-theme + python3 -m pip install sphinx_copybutton sphinx-issues sphinx-removed-in sphinx-rtd-theme sphinxext-opengraph make doccheck - name: After success diff --git a/docs/conf.py b/docs/conf.py index 123e93c9b..6d2f3df06 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,11 +29,13 @@ needs_sphinx = "2.4" # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ + "sphinx_copybutton", + "sphinx_issues", + "sphinx_removed_in", "sphinx.ext.autodoc", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", - "sphinx_issues", - "sphinx_removed_in", + "sphinxext.opengraph", ] intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} diff --git a/requirements.txt b/requirements.txt index 4b534ae53..fd2ede5fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,8 @@ pytest pytest-cov pytest-timeout sphinx>=2.4 +sphinx-copybutton sphinx-issues sphinx-removed-in sphinx-rtd-theme +sphinxext-opengraph From 7f9037a8cabfad45160a40ba4e4d44f3b730dd4b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 12 May 2021 00:01:51 +0300 Subject: [PATCH 660/750] Use code formatting --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 6ce00eefd..b1ef58509 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -6,9 +6,9 @@ Warnings .. warning:: Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL. -.. warning:: Pillow >= 1.0 no longer supports "import Image". Please use "from PIL import Image" instead. +.. warning:: Pillow >= 1.0 no longer supports ``import Image``. Please use ``from PIL import Image`` instead. -.. warning:: Pillow >= 2.1.0 no longer supports "import _imaging". Please use "from PIL.Image import core as _imaging" instead. +.. warning:: Pillow >= 2.1.0 no longer supports ``import _imaging``. Please use ``from PIL.Image import core as _imaging`` instead. Python Support -------------- From d49000beaa9374befc0f40973dced355cd870c23 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Fri, 14 May 2021 21:30:39 +0300 Subject: [PATCH 661/750] Add og:image --- docs/conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 6d2f3df06..88e1fcabf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -318,3 +318,9 @@ def setup(app): # GitHub repo for sphinx-issues issues_github_path = "python-pillow/Pillow" + +# sphinxext.opengraph +ogp_image = ( + "https://raw.githubusercontent.com/python-pillow/pillow-logo/master/" + "pillow-logo-dark-text-1280x640.png" +) From 23467636ad91656da1da17e692f832de558483f3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 May 2021 09:07:36 +1000 Subject: [PATCH 662/750] Set og:image:alt to be constant --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index 88e1fcabf..9b4eb669b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -324,3 +324,4 @@ ogp_image = ( "https://raw.githubusercontent.com/python-pillow/pillow-logo/master/" "pillow-logo-dark-text-1280x640.png" ) +ogp_image_alt = "Pillow" From ca97b16c0ac9dc9efe5fd08f941e36f4b87bad0f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 16 May 2021 09:46:00 +0300 Subject: [PATCH 663/750] Install normalised sphinx-copybutton Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf7bcb6b9..f2953072a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -103,7 +103,7 @@ jobs: - name: Docs if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.9 run: | - python3 -m pip install sphinx_copybutton sphinx-issues sphinx-removed-in sphinx-rtd-theme sphinxext-opengraph + python3 -m pip install sphinx-copybutton sphinx-issues sphinx-removed-in sphinx-rtd-theme sphinxext-opengraph make doccheck - name: After success From eed337eacc58bb77b1d20c194507693ed4a40a80 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 17 May 2021 08:31:27 +1000 Subject: [PATCH 664/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4620009f1..346a20065 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.3.0 (unreleased) ------------------ +- Removed DPI rounding from BMP, JPEG, PNG and WMF loading #5476, #5470 + [radarhere] + - Remove spikes when drawing thin pieslices #5460 [xtsm] From 68ac6d151e93345eb7a66d4c214160d0c04018fd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 17 May 2021 18:57:23 +1000 Subject: [PATCH 665/750] Added BC5_UNORM reading --- Tests/images/bc5_unorm.dds | Bin 0 -> 87556 bytes Tests/images/bc5_unorm.png | Bin 0 -> 96570 bytes Tests/test_file_dds.py | 14 ++++++++++++++ src/PIL/DdsImagePlugin.py | 7 ++++++- src/decode.c | 4 +++- 5 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 Tests/images/bc5_unorm.dds create mode 100644 Tests/images/bc5_unorm.png diff --git a/Tests/images/bc5_unorm.dds b/Tests/images/bc5_unorm.dds new file mode 100644 index 0000000000000000000000000000000000000000..a04a026eb1f666bd85e1053e4bbe8d9a115930a3 GIT binary patch literal 87556 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

01cA=6DfHO`|OfTigX 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 literal 0 HcmV?d00001 diff --git a/Tests/images/bc5_unorm.png b/Tests/images/bc5_unorm.png new file mode 100644 index 0000000000000000000000000000000000000000..05279ddfbe65e0b91d7ce07306db92133f9e638b GIT binary patch literal 96570 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

)5j8}0f6+sI@6 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 Date: Tue, 18 May 2021 17:43:50 +1000 Subject: [PATCH 666/750] Added BC5_SNORM reading --- Tests/images/bc5_snorm.dds | Bin 0 -> 87536 bytes Tests/images/bc5_snorm.png | Bin 0 -> 83763 bytes Tests/test_file_dds.py | 22 +++++++++-- src/PIL/DdsImagePlugin.py | 8 +++- src/decode.c | 11 +++--- src/libImaging/Bcn.h | 3 ++ src/libImaging/BcnDecode.c | 77 +++++++++++++++++++++++-------------- 7 files changed, 83 insertions(+), 38 deletions(-) create mode 100644 Tests/images/bc5_snorm.dds create mode 100644 Tests/images/bc5_snorm.png create mode 100644 src/libImaging/Bcn.h diff --git a/Tests/images/bc5_snorm.dds b/Tests/images/bc5_snorm.dds new file mode 100644 index 0000000000000000000000000000000000000000..0b999eed32005a4095bd23316396a594b02fd572 GIT binary patch literal 87536 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

T!*}83zCT$aQQ#mk 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index d6f4900cd..43e6daeaf 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -856,6 +856,52 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_strip_planar_rgb(self): + # gdal_translate -co TILED=no -co INTERLEAVE=BAND -co COMPRESS=LZW \ + # tiff_strip_raw.tif tiff_strip_planar_lzw.tiff + infile = "Tests/images/tiff_strip_planar_lzw.tiff" + with Image.open(infile) as im: + assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_tiled_planar_rgb(self): + # gdal_translate -co TILED=yes -co INTERLEAVE=BAND -co COMPRESS=LZW \ + # tiff_tiled_raw.tif tiff_tiled_planar_lzw.tiff + infile = "Tests/images/tiff_tiled_planar_lzw.tiff" + with Image.open(infile) as im: + assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_tiled_planar_16bit_RGB(self): + # gdal_translate -co TILED=yes -co INTERLEAVE=BAND -co COMPRESS=LZW \ + # tiff_16bit_RGB.tiff tiff_tiled_planar_16bit_RGB.tiff + with Image.open("Tests/images/tiff_tiled_planar_16bit_RGB.tiff") as im: + assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGB_target.png") + + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_strip_planar_16bit_RGB(self): + # gdal_translate -co TILED=no -co INTERLEAVE=BAND -co COMPRESS=LZW \ + # tiff_16bit_RGB.tiff tiff_strip_planar_16bit_RGB.tiff + with Image.open("Tests/images/tiff_strip_planar_16bit_RGB.tiff") as im: + assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGB_target.png") + + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_tiled_planar_16bit_RGBa(self): + # gdal_translate -co TILED=yes \ + # -co INTERLEAVE=BAND -co COMPRESS=LZW -co ALPHA=PREMULTIPLIED \ + # tiff_16bit_RGBa.tiff tiff_tiled_planar_16bit_RGBa.tiff + with Image.open("Tests/images/tiff_tiled_planar_16bit_RGBa.tiff") as im: + assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") + + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") + def test_strip_planar_16bit_RGBa(self): + # gdal_translate -co TILED=no \ + # -co INTERLEAVE=BAND -co COMPRESS=LZW -co ALPHA=PREMULTIPLIED \ + # tiff_16bit_RGBa.tiff tiff_strip_planar_16bit_RGBa.tiff + with Image.open("Tests/images/tiff_strip_planar_16bit_RGBa.tiff") as im: + assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") + @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_old_style_jpeg(self): infile = "Tests/images/old-style-jpeg-compression.tif" diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 8a1460346..af7eae935 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -320,6 +320,23 @@ class TestLibUnpack: self.assert_unpack("RGB", "G", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0)) self.assert_unpack("RGB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) + self.assert_unpack("RGB", "R;16B", 2, (1, 0, 0), (3, 0, 0), (5, 0, 0)) + self.assert_unpack("RGB", "G;16B", 2, (0, 1, 0), (0, 3, 0), (0, 5, 0)) + self.assert_unpack("RGB", "B;16B", 2, (0, 0, 1), (0, 0, 3), (0, 0, 5)) + + self.assert_unpack("RGB", "R;16L", 2, (2, 0, 0), (4, 0, 0), (6, 0, 0)) + self.assert_unpack("RGB", "G;16L", 2, (0, 2, 0), (0, 4, 0), (0, 6, 0)) + self.assert_unpack("RGB", "B;16L", 2, (0, 0, 2), (0, 0, 4), (0, 0, 6)) + + if sys.byteorder == "little": + self.assert_unpack("RGB", "R;16N", 2, (2, 0, 0), (4, 0, 0), (6, 0, 0)) + self.assert_unpack("RGB", "G;16N", 2, (0, 2, 0), (0, 4, 0), (0, 6, 0)) + self.assert_unpack("RGB", "B;16N", 2, (0, 0, 2), (0, 0, 4), (0, 0, 6)) + else: + self.assert_unpack("RGB", "R;16N", 2, (1, 0, 0), (3, 0, 0), (5, 0, 0)) + self.assert_unpack("RGB", "G;16N", 2, (0, 1, 0), (0, 3, 0), (0, 5, 0)) + self.assert_unpack("RGB", "B;16N", 2, (0, 0, 1), (0, 0, 3), (0, 0, 5)) + def test_RGBA(self): self.assert_unpack("RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6)) self.assert_unpack( @@ -450,6 +467,43 @@ class TestLibUnpack: self.assert_unpack("RGBA", "B", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) self.assert_unpack("RGBA", "A", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) + self.assert_unpack("RGBA", "R;16B", 2, (1, 0, 0, 0), (3, 0, 0, 0), (5, 0, 0, 0)) + self.assert_unpack("RGBA", "G;16B", 2, (0, 1, 0, 0), (0, 3, 0, 0), (0, 5, 0, 0)) + self.assert_unpack("RGBA", "B;16B", 2, (0, 0, 1, 0), (0, 0, 3, 0), (0, 0, 5, 0)) + self.assert_unpack("RGBA", "A;16B", 2, (0, 0, 0, 1), (0, 0, 0, 3), (0, 0, 0, 5)) + + self.assert_unpack("RGBA", "R;16L", 2, (2, 0, 0, 0), (4, 0, 0, 0), (6, 0, 0, 0)) + self.assert_unpack("RGBA", "G;16L", 2, (0, 2, 0, 0), (0, 4, 0, 0), (0, 6, 0, 0)) + self.assert_unpack("RGBA", "B;16L", 2, (0, 0, 2, 0), (0, 0, 4, 0), (0, 0, 6, 0)) + self.assert_unpack("RGBA", "A;16L", 2, (0, 0, 0, 2), (0, 0, 0, 4), (0, 0, 0, 6)) + + if sys.byteorder == "little": + self.assert_unpack( + "RGBA", "R;16N", 2, (2, 0, 0, 0), (4, 0, 0, 0), (6, 0, 0, 0) + ) + self.assert_unpack( + "RGBA", "G;16N", 2, (0, 2, 0, 0), (0, 4, 0, 0), (0, 6, 0, 0) + ) + self.assert_unpack( + "RGBA", "B;16N", 2, (0, 0, 2, 0), (0, 0, 4, 0), (0, 0, 6, 0) + ) + self.assert_unpack( + "RGBA", "A;16N", 2, (0, 0, 0, 2), (0, 0, 0, 4), (0, 0, 0, 6) + ) + else: + self.assert_unpack( + "RGBA", "R;16N", 2, (1, 0, 0, 0), (3, 0, 0, 0), (5, 0, 0, 0) + ) + self.assert_unpack( + "RGBA", "G;16N", 2, (0, 1, 0, 0), (0, 3, 0, 0), (0, 5, 0, 0) + ) + self.assert_unpack( + "RGBA", "B;16N", 2, (0, 0, 1, 0), (0, 0, 3, 0), (0, 0, 5, 0) + ) + self.assert_unpack( + "RGBA", "A;16N", 2, (0, 0, 0, 1), (0, 0, 0, 3), (0, 0, 0, 5) + ) + def test_RGBa(self): self.assert_unpack( "RGBa", "RGBa", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12) diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index b4ba283b2..5dac95c1d 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1363,6 +1363,94 @@ band3I(UINT8 *out, const UINT8 *in, int pixels) { } } +static void +band016B(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 0 only, big endian */ + for (i = 0; i < pixels; i++) { + out[0] = in[0]; + out += 4; in += 2; + } +} + +static void +band116B(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 1 only, big endian */ + for (i = 0; i < pixels; i++) { + out[1] = in[0]; + out += 4; in += 2; + } +} + +static void +band216B(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 2 only, big endian */ + for (i = 0; i < pixels; i++) { + out[2] = in[0]; + out += 4; in += 2; + } +} + +static void +band316B(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 3 only, big endian */ + for (i = 0; i < pixels; i++) { + out[3] = in[0]; + out += 4; in += 2; + } +} + +static void +band016L(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 0 only, little endian */ + for (i = 0; i < pixels; i++) { + out[0] = in[1]; + out += 4; in += 2; + } +} + +static void +band116L(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 1 only, little endian */ + for (i = 0; i < pixels; i++) { + out[1] = in[1]; + out += 4; in += 2; + } +} + +static void +band216L(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 2 only, little endian */ + for (i = 0; i < pixels; i++) { + out[2] = in[1]; + out += 4; in += 2; + } +} + +static void +band316L(UINT8* out, const UINT8* in, int pixels) +{ + int i; + /* band 3 only, little endian */ + for (i = 0; i < pixels; i++) { + out[3] = in[1]; + out += 4; in += 2; + } +} + static struct { const char *mode; const char *rawmode; @@ -1448,6 +1536,12 @@ static struct { {"RGB", "R", 8, band0}, {"RGB", "G", 8, band1}, {"RGB", "B", 8, band2}, + {"RGB", "R;16L", 16, band016L}, + {"RGB", "G;16L", 16, band116L}, + {"RGB", "B;16L", 16, band216L}, + {"RGB", "R;16B", 16, band016B}, + {"RGB", "G;16B", 16, band116B}, + {"RGB", "B;16B", 16, band216B}, /* true colour w. alpha */ {"RGBA", "LA", 16, unpackRGBALA}, @@ -1476,17 +1570,42 @@ static struct { {"RGBA", "G", 8, band1}, {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, + {"RGBA", "R;16L", 16, band016L}, + {"RGBA", "G;16L", 16, band116L}, + {"RGBA", "B;16L", 16, band216L}, + {"RGBA", "A;16L", 16, band316L}, + {"RGBA", "R;16B", 16, band016B}, + {"RGBA", "G;16B", 16, band116B}, + {"RGBA", "B;16B", 16, band216B}, + {"RGBA", "A;16B", 16, band316B}, #ifdef WORDS_BIGENDIAN {"RGB", "RGB;16N", 48, unpackRGB16B}, {"RGBA", "RGBa;16N", 64, unpackRGBa16B}, {"RGBA", "RGBA;16N", 64, unpackRGBA16B}, {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, + {"RGB", "R;16N", 16, band016B}, + {"RGB", "G;16N", 16, band116B}, + {"RGB", "B;16N", 16, band216B}, + + {"RGBA", "R;16N", 16, band016B}, + {"RGBA", "G;16N", 16, band116B}, + {"RGBA", "B;16N", 16, band216B}, + {"RGBA", "A;16N", 16, band316B}, #else {"RGB", "RGB;16N", 48, unpackRGB16L}, {"RGBA", "RGBa;16N", 64, unpackRGBa16L}, {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, - {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, + {"RGBX", "RGBX;16N", 64, unpackRGBA16L}, + {"RGB", "R;16N", 16, band016L}, + {"RGB", "G;16N", 16, band116L}, + {"RGB", "B;16N", 16, band216L}, + + + {"RGBA", "R;16N", 16, band016L}, + {"RGBA", "G;16N", 16, band116L}, + {"RGBA", "B;16N", 16, band216L}, + {"RGBA", "A;16N", 16, band316L}, #endif /* true colour w. alpha premultiplied */ From 64500434c21d2a038698dcc6c7b38cb04fce01e1 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 31 Dec 2020 13:01:35 +0100 Subject: [PATCH 472/750] Implementation for PlanarConfiguration=2 Tiffs, manually merged from f566c8a --- src/libImaging/TiffDecode.c | 222 ++++++++++++++++++++++-------------- 1 file changed, 139 insertions(+), 83 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 746994da3..f464ee23d 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -321,8 +321,8 @@ decodeycbcr_err: } int -_decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { - INT32 strip_row; +_decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, UINT8 planes, ImagingShuffler *unpackers) { + INT32 strip_row = 0; UINT8 *new_data; UINT32 rows_per_strip, row_byte_size; int ret; @@ -334,7 +334,7 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { TRACE(("RowsPerStrip: %u \n", rows_per_strip)); // We could use TIFFStripSize, but for YCbCr data it returns subsampled data size - row_byte_size = (state->xsize * state->bits + 7) / 8; + row_byte_size = (state->xsize * state->bits / planes + 7) / 8; /* overflow check for realloc */ if (INT_MAX / row_byte_size < rows_per_strip) { @@ -367,35 +367,35 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff) { state->buffer = new_data; for (; state->y < state->ysize; state->y += rows_per_strip) { - if (TIFFReadEncodedStrip( - tiff, - TIFFComputeStrip(tiff, state->y, 0), - (tdata_t)state->buffer, - -1) == -1) { - TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } + UINT8 plane; + for (plane = 0; plane < planes; plane++) { + ImagingShuffler shuffler = unpackers[plane]; + if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, plane), (tdata_t)state->buffer, -1) == -1) { + TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } - TRACE(("Decoded strip for row %d \n", state->y)); + TRACE(("Decoded strip for row %d \n", state->y)); - // iterate over each row in the strip and stuff data into image - for (strip_row = 0; - strip_row < min((INT32)rows_per_strip, state->ysize - state->y); - strip_row++) { - TRACE(("Writing data into line %d ; \n", state->y + strip_row)); + // iterate over each row in the strip and stuff data into image + for (strip_row = 0; + strip_row < min((INT32) rows_per_strip, state->ysize - state->y); + strip_row++) { + TRACE(("Writing data into line %d ; \n", state->y + strip_row)); - // UINT8 * bbb = state->buffer + strip_row * (state->bytes / - // rows_per_strip); TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], - // ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + // UINT8 * bbb = state->buffer + strip_row * (state->bytes / rows_per_strip); + // TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - state->shuffle( - (UINT8 *)im->image[state->y + state->yoff + strip_row] + + shuffler( + (UINT8*) im->image[state->y + state->yoff + strip_row] + state->xoff * im->pixelsize, - state->buffer + strip_row * row_byte_size, - state->xsize); + state->buffer + strip_row * row_byte_size, + state->xsize); + } } } + return 0; } @@ -408,6 +408,9 @@ ImagingLibTiffDecode( TIFF *tiff; uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR int isYCbCr = 0; + UINT8 planarconfig = 0; + UINT8 planes = 1; + ImagingShuffler unpackers[4]; /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ @@ -502,8 +505,38 @@ ImagingLibTiffDecode( } } + TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); isYCbCr = photometric == PHOTOMETRIC_YCBCR; + TIFFGetFieldDefaulted(tiff, TIFFTAG_PLANARCONFIG, &planarconfig); + + // YCbCr data is read as RGB by libtiff and we don't need to worry about planar storage in that case + // if number of bands is 1, there is no difference with contig case + if (planarconfig == PLANARCONFIG_SEPARATE && + im->bands > 1 && + photometric != PHOTOMETRIC_YCBCR) { + + uint16 bits_per_sample = 8; + + TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); + if (bits_per_sample != 8 && bits_per_sample != 16) { + TRACE(("Invalid value for bits per sample: %d\n", bits_per_sample)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } + + planes = im->bands; + + // We'll pick appropriate set of unpackers depending on planar_configuration + // It does not matter if data is RGB(A), CMYK or LUV really, + // we just copy it plane by plane + unpackers[0] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL); + unpackers[1] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL); + unpackers[2] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL); + unpackers[3] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL); + } else { + unpackers[0] = state->shuffle; + } if (TIFFIsTiled(tiff)) { INT32 x, y, tile_y; @@ -528,9 +561,8 @@ ImagingLibTiffDecode( goto decode_err; } } else { - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data - // size - row_byte_size = (tile_width * state->bits + 7) / 8; + // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size + row_byte_size = (tile_width * state->bits / planes + 7) / 8; } /* overflow check for realloc */ @@ -542,8 +574,7 @@ ImagingLibTiffDecode( state->bytes = row_byte_size * tile_length; if (TIFFTileSize(tiff) > state->bytes) { - // If the strip size as expected by LibTiff isn't what we're expecting, - // abort. + // If the tile size as expected by LibTiff isn't what we're expecting, abort. state->errcode = IMAGING_CODEC_MEMORY; goto decode_err; } @@ -561,75 +592,100 @@ ImagingLibTiffDecode( TRACE(("TIFFTileSize: %d\n", state->bytes)); for (y = state->yoff; y < state->ysize; y += tile_length) { - for (x = state->xoff; x < state->xsize; x += tile_width) { - /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions - have a different view of the size of the tiff than we're getting from - other functions. So, we need to check here. - */ - if (!TIFFCheckTile(tiff, x, y, 0, 0)) { - TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - if (isYCbCr) { - /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ - if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { - TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + UINT8 plane; + for (plane = 0; plane < planes; plane++) { + ImagingShuffler shuffler = unpackers[plane]; + for (x = state->xoff; x < state->xsize; x += tile_width) { + /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions + have a different view of the size of the tiff than we're getting from + other functions. So, we need to check here. + */ + if (!TIFFCheckTile(tiff, x, y, 0, plane)) { + TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); state->errcode = IMAGING_CODEC_BROKEN; goto decode_err; } - } else { - if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, 0) == -1) { - TRACE(("Decode Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - } - - TRACE(("Read tile at %dx%d; \n\n", x, y)); - - current_tile_width = min((INT32)tile_width, state->xsize - x); - current_tile_length = min((INT32)tile_length, state->ysize - y); - // iterate over each line in the tile and stuff data into image - for (tile_y = 0; tile_y < current_tile_length; tile_y++) { - TRACE( - ("Writing tile data at %dx%d using tile_width: %d; \n", - tile_y + y, - x, - current_tile_width)); - - // UINT8 * bbb = state->buffer + tile_y * row_byte_size; - // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], - // ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - /* - * For some reason the TIFFReadRGBATile() function - * chooses the lower left corner as the origin. - * Vertically mirror by shuffling the scanlines - * backwards - */ - if (isYCbCr) { - current_line = tile_length - tile_y - 1; + /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ + if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { + TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } } else { - current_line = tile_y; + if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { + TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } } - state->shuffle( - (UINT8 *)im->image[tile_y + y] + x * im->pixelsize, - state->buffer + current_line * row_byte_size, - current_tile_width); + TRACE(("Read tile at %dx%d; \n\n", x, y)); + + current_tile_width = min((INT32) tile_width, state->xsize - x); + current_tile_length = min((INT32) tile_length, state->ysize - y); + // iterate over each line in the tile and stuff data into image + for (tile_y = 0; tile_y < current_tile_length; tile_y++) { + TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); + + // UINT8 * bbb = state->buffer + tile_y * row_byte_size; + // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + /* + * For some reason the TIFFReadRGBATile() function + * chooses the lower left corner as the origin. + * Vertically mirror by shuffling the scanlines + * backwards + */ + + if (isYCbCr) { + current_line = tile_length - tile_y - 1; + } else { + current_line = tile_y; + } + + shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, + state->buffer + current_line * row_byte_size, + current_tile_width + ); + } } } } } else { if (!isYCbCr) { - _decodeStrip(im, state, tiff); - } else { + _decodeStrip(im, state, tiff, planes, unpackers); + } + else { _decodeStripYCbCr(im, state, tiff); } } -decode_err: + if (!state->errcode) { + // Check if raw mode was RGBa and it was stored on separate planes + // so we have to convert it to RGBA + if (planes > 3 && strcmp(im->mode, "RGBA") == 0) { + uint16 extrasamples; + uint16* sampleinfo; + ImagingShuffler shuffle; + INT32 y; + + TIFFGetFieldDefaulted(tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); + + if (extrasamples >= 1 && + (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED || sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA) + ) { + shuffle = ImagingFindUnpacker("RGBA", "RGBa", NULL); + + for (y = state->yoff; y < state->ysize; y++) { + UINT8* ptr = (UINT8*) im->image[y + state->yoff] + + state->xoff * im->pixelsize; + shuffle(ptr, ptr, state->xsize); + } + } + } + } + + decode_err: TIFFClose(tiff); TRACE(("Done Decoding, Returning \n")); // Returning -1 here to force ImageFile.load to break, rather than From 77a1a9aba3cc5a2d4c081cc81cd5c300ad3f9328 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 31 Dec 2020 14:35:26 +0100 Subject: [PATCH 473/750] initialize the unpackers --- src/libImaging/TiffDecode.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index f464ee23d..02c1c9f75 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -412,6 +412,8 @@ ImagingLibTiffDecode( UINT8 planes = 1; ImagingShuffler unpackers[4]; + memset(unpackers, 0, sizeof(ImagingShuffler *) * 4); + /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ From a921c01102b046df07809e1f3e3a2fc24d078198 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 9 Jan 2021 22:00:22 +0100 Subject: [PATCH 474/750] correct TIFFTAG_PLANARCONFIG size --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 02c1c9f75..b3a51f5b6 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -408,7 +408,7 @@ ImagingLibTiffDecode( TIFF *tiff; uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR int isYCbCr = 0; - UINT8 planarconfig = 0; + uint16 planarconfig = 0; UINT8 planes = 1; ImagingShuffler unpackers[4]; From 671837840a49613637f24555326747ba3a8ed991 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 9 Jan 2021 22:41:13 +0100 Subject: [PATCH 475/750] the previous commit also fixes these big-endian failures --- Tests/test_file_libtiff.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 43e6daeaf..c9f7d67c3 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -856,7 +856,6 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_planar_rgb(self): # gdal_translate -co TILED=no -co INTERLEAVE=BAND -co COMPRESS=LZW \ # tiff_strip_raw.tif tiff_strip_planar_lzw.tiff @@ -864,7 +863,6 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_planar_rgb(self): # gdal_translate -co TILED=yes -co INTERLEAVE=BAND -co COMPRESS=LZW \ # tiff_tiled_raw.tif tiff_tiled_planar_lzw.tiff @@ -872,21 +870,18 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_planar_16bit_RGB(self): # gdal_translate -co TILED=yes -co INTERLEAVE=BAND -co COMPRESS=LZW \ # tiff_16bit_RGB.tiff tiff_tiled_planar_16bit_RGB.tiff with Image.open("Tests/images/tiff_tiled_planar_16bit_RGB.tiff") as im: assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGB_target.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_planar_16bit_RGB(self): # gdal_translate -co TILED=no -co INTERLEAVE=BAND -co COMPRESS=LZW \ # tiff_16bit_RGB.tiff tiff_strip_planar_16bit_RGB.tiff with Image.open("Tests/images/tiff_strip_planar_16bit_RGB.tiff") as im: assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGB_target.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_planar_16bit_RGBa(self): # gdal_translate -co TILED=yes \ # -co INTERLEAVE=BAND -co COMPRESS=LZW -co ALPHA=PREMULTIPLIED \ @@ -894,7 +889,6 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open("Tests/images/tiff_tiled_planar_16bit_RGBa.tiff") as im: assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_planar_16bit_RGBa(self): # gdal_translate -co TILED=no \ # -co INTERLEAVE=BAND -co COMPRESS=LZW -co ALPHA=PREMULTIPLIED \ From daf7b6546e1bb9753062018cc7b0d987e2d66bf8 Mon Sep 17 00:00:00 2001 From: nulano Date: Sat, 9 Jan 2021 22:45:38 +0100 Subject: [PATCH 476/750] remove double pointer --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index b3a51f5b6..9b5916ac0 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -412,7 +412,7 @@ ImagingLibTiffDecode( UINT8 planes = 1; ImagingShuffler unpackers[4]; - memset(unpackers, 0, sizeof(ImagingShuffler *) * 4); + memset(unpackers, 0, sizeof(ImagingShuffler) * 4); /* buffer is the encoded file, bytes is the length of the encoded file */ /* it all ends up in state->buffer, which is a uint8* from Imaging.h */ From fda638befecca25f9eb75ce39600dfc8e88c2608 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 10 Jan 2021 19:29:56 +0100 Subject: [PATCH 477/750] Planes should be int, not uint --- src/libImaging/TiffDecode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 9b5916ac0..07e9ab2c7 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -321,7 +321,7 @@ decodeycbcr_err: } int -_decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, UINT8 planes, ImagingShuffler *unpackers) { +_decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, ImagingShuffler *unpackers) { INT32 strip_row = 0; UINT8 *new_data; UINT32 rows_per_strip, row_byte_size; @@ -409,7 +409,7 @@ ImagingLibTiffDecode( uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR int isYCbCr = 0; uint16 planarconfig = 0; - UINT8 planes = 1; + int planes = 1; ImagingShuffler unpackers[4]; memset(unpackers, 0, sizeof(ImagingShuffler) * 4); From c9ea87ecfd1f486e0ffdf278d7d000bbd78d7053 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 10 Jan 2021 19:31:56 +0100 Subject: [PATCH 478/750] Use flag instead of recalculating --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 07e9ab2c7..bae9b7a15 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -516,7 +516,7 @@ ImagingLibTiffDecode( // if number of bands is 1, there is no difference with contig case if (planarconfig == PLANARCONFIG_SEPARATE && im->bands > 1 && - photometric != PHOTOMETRIC_YCBCR) { + isYCbCr) { uint16 bits_per_sample = 8; From b1d3f0d5c21a935112794d06a5b70a2cb6c30e29 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 11 Jan 2021 20:57:08 +0100 Subject: [PATCH 479/750] not --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index bae9b7a15..7629aec95 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -516,7 +516,7 @@ ImagingLibTiffDecode( // if number of bands is 1, there is no difference with contig case if (planarconfig == PLANARCONFIG_SEPARATE && im->bands > 1 && - isYCbCr) { + !isYCbCr) { uint16 bits_per_sample = 8; From f2020eeab454814d57adfcbf4c6e932ded1f3a35 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 11 Jan 2021 22:28:23 +0100 Subject: [PATCH 480/750] UINT8 -> int for plane --- src/libImaging/TiffDecode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 7629aec95..232278985 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -367,7 +367,7 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin state->buffer = new_data; for (; state->y < state->ysize; state->y += rows_per_strip) { - UINT8 plane; + int plane; for (plane = 0; plane < planes; plane++) { ImagingShuffler shuffler = unpackers[plane]; if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, plane), (tdata_t)state->buffer, -1) == -1) { @@ -594,7 +594,7 @@ ImagingLibTiffDecode( TRACE(("TIFFTileSize: %d\n", state->bytes)); for (y = state->yoff; y < state->ysize; y += tile_length) { - UINT8 plane; + int plane; for (plane = 0; plane < planes; plane++) { ImagingShuffler shuffler = unpackers[plane]; for (x = state->xoff; x < state->xsize; x += tile_width) { From 169bb4842f10303c6d2c37adc25dc9983cb5e506 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Sat, 9 Jan 2021 15:05:36 -0800 Subject: [PATCH 481/750] only use TIFFReadRGBA* in case of o_jpeg compression --- Tests/test_file_libtiff.py | 4 ---- src/PIL/TiffImagePlugin.py | 9 +++++++++ src/libImaging/TiffDecode.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c9f7d67c3..3f2e5dbc1 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -824,14 +824,12 @@ class TestFileLibTiff(LibTiffTestCase): assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) @pytest.mark.valgrind_known_error(reason="Known Failing") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) @pytest.mark.valgrind_known_error(reason="Known Failing") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: @@ -843,14 +841,12 @@ class TestFileLibTiff(LibTiffTestCase): assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) @pytest.mark.valgrind_known_error(reason="Known Failing") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" with Image.open(infile) as im: assert_image_equal_tofile(im, "Tests/images/flower2.jpg") @pytest.mark.valgrind_known_error(reason="Known Failing") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" with Image.open(infile) as im: diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 19bcf4419..24821d130 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1324,6 +1324,15 @@ class TiffImageFile(ImageFile.ImageFile): if ";16L" in rawmode: rawmode = rawmode.replace(";16L", ";16N") + # YCbCr images with new jpeg compression with pixels in one plane + # unpacked straight into RGB values + if ( + photo == 6 + and self._compression == "jpeg" + and self._planar_configuration == 1 + ): + rawmode = "RGB" + # Offset in the tile tuple is 0, we go from 0,0 to # w,h, and we only do this once -- eds a = (rawmode, self._compression, False, self.tag_v2.offset) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 232278985..e20f57596 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -407,6 +407,7 @@ ImagingLibTiffDecode( char *mode = "r"; TIFF *tiff; uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR + uint16 compression; int isYCbCr = 0; uint16 planarconfig = 0; int planes = 1; @@ -509,9 +510,17 @@ ImagingLibTiffDecode( TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); - isYCbCr = photometric == PHOTOMETRIC_YCBCR; + TIFFGetField(tiff, TIFFTAG_COMPRESSION, &compression); TIFFGetFieldDefaulted(tiff, TIFFTAG_PLANARCONFIG, &planarconfig); + isYCbCr = photometric == PHOTOMETRIC_YCBCR; + + if (isYCbCr && compression == COMPRESSION_JPEG && planarconfig == PLANARCONFIG_CONTIG) { + // If using new JPEG compression, let libjpeg do RGB convertion + TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); + isYCbCr = 0; + } + // YCbCr data is read as RGB by libtiff and we don't need to worry about planar storage in that case // if number of bands is 1, there is no difference with contig case if (planarconfig == PLANARCONFIG_SEPARATE && From 4c2dfadf26b1d5a6a86e7dd66968f5222a1d24e3 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 11 Jan 2021 22:06:49 -0800 Subject: [PATCH 482/750] Swap pixel values on Big Endian --- Tests/test_file_libtiff.py | 2 -- src/libImaging/TiffDecode.c | 8 ++++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 3f2e5dbc1..22b641b5f 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -17,7 +17,6 @@ from .helper import ( assert_image_similar, assert_image_similar_tofile, hopper, - is_big_endian, skip_unless_feature, ) @@ -892,7 +891,6 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open("Tests/images/tiff_strip_planar_16bit_RGBa.tiff") as im: assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") - @pytest.mark.xfail(is_big_endian(), reason="Fails on big-endian") def test_old_style_jpeg(self): infile = "Tests/images/old-style-jpeg-compression.tif" with Image.open(infile) as im: diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index e20f57596..b1a30f449 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -292,6 +292,10 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { goto decodeycbcr_err; } +#if WORDS_BIGENDIAN + TIFFSwabArrayOfLong((UINT32 *)state->buffer, img.width * rows_to_read); +#endif + TRACE(("Decoded strip for row %d \n", state->y)); // iterate over each row in the strip and stuff data into image @@ -623,6 +627,10 @@ ImagingLibTiffDecode( state->errcode = IMAGING_CODEC_BROKEN; goto decode_err; } + +#if WORDS_BIGENDIAN + TIFFSwabArrayOfLong((UINT32 *)state->buffer, tile_width * tile_length); +#endif } else { if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { TRACE(("Decode Error, Tile at %dx%d\n", x, y)); From 4dd288c66c3e07cfffcc0f21e0bc7a9a2f4f2758 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 11 Jan 2021 23:28:58 -0800 Subject: [PATCH 483/750] unify reading of YCbCr Tiffs --- src/libImaging/TiffDecode.c | 291 +++++++++++++++++------------------- 1 file changed, 136 insertions(+), 155 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index b1a30f449..bbc190d27 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -213,24 +213,34 @@ ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { } int -_decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { +_decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { // To avoid dealing with YCbCr subsampling, let libtiff handle it // Use a TIFFRGBAImage wrapping the tiff image, and let libtiff handle // all of the conversion. Metadata read from the TIFFRGBAImage could // be different from the metadata that the base tiff returns. - INT32 strip_row; + INT32 current_row; UINT8 *new_data; - UINT32 rows_per_strip, row_byte_size, rows_to_read; + UINT32 rows_per_block, row_byte_size, rows_to_read; int ret; TIFFRGBAImage img; char emsg[1024] = ""; - ret = TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); - if (ret != 1) { - rows_per_strip = state->ysize; + // Since using TIFFRGBAImage* functions, we can read whole tiff into rastrr in one call + // Let's select smaller block size. Multiplying image width by (tile length OR rows per strip) + // gives us manageable block size in pixels + if (TIFFIsTiled(tiff)) { + ret = TIFFGetFieldDefaulted(tiff, TIFFTAG_TILELENGTH, &rows_per_block); } - TRACE(("RowsPerStrip: %u \n", rows_per_strip)); + else { + ret = TIFFGetFieldDefaulted(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_block); + } + + if (ret != 1) { + rows_per_block = state->ysize; + } + + TRACE(("RowsPerBlock: %u \n", rows_per_block)); if (!(TIFFRGBAImageOK(tiff, emsg) && TIFFRGBAImageBegin(&img, tiff, 0, emsg))) { TRACE(("Decode error, msg: %s", emsg)); @@ -263,14 +273,14 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { row_byte_size = img.width * 4; /* overflow check for realloc */ - if (INT_MAX / row_byte_size < rows_per_strip) { + if (INT_MAX / row_byte_size < rows_per_block) { state->errcode = IMAGING_CODEC_MEMORY; goto decodeycbcr_err; } - state->bytes = rows_per_strip * row_byte_size; + state->bytes = rows_per_block * row_byte_size; - TRACE(("StripSize: %d \n", state->bytes)); + TRACE(("BlockSize: %d \n", state->bytes)); /* realloc to fit whole strip */ /* malloc check above */ @@ -282,9 +292,9 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { state->buffer = new_data; - for (; state->y < state->ysize; state->y += rows_per_strip) { + for (; state->y < state->ysize; state->y += rows_per_block) { img.row_offset = state->y; - rows_to_read = min(rows_per_strip, img.height - state->y); + rows_to_read = min(rows_per_block, img.height - state->y); if (!TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read)) { TRACE(("Decode Error, y: %d\n", state->y)); @@ -299,19 +309,19 @@ _decodeStripYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { TRACE(("Decoded strip for row %d \n", state->y)); // iterate over each row in the strip and stuff data into image - for (strip_row = 0; - strip_row < min((INT32)rows_per_strip, state->ysize - state->y); - strip_row++) { - TRACE(("Writing data into line %d ; \n", state->y + strip_row)); + for (current_row = 0; + current_row < min((INT32)rows_per_block, state->ysize - state->y); + current_row++) { + TRACE(("Writing data into line %d ; \n", state->y + current_row)); - // UINT8 * bbb = state->buffer + strip_row * (state->bytes / - // rows_per_strip); TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], + // UINT8 * bbb = state->buffer + current_row * (state->bytes / + // rows_per_block); TRACE(("chars: %x %x %x %x\n", ((UINT8 *)bbb)[0], // ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); state->shuffle( - (UINT8 *)im->image[state->y + state->yoff + strip_row] + + (UINT8 *)im->image[state->y + state->yoff + current_row] + state->xoff * im->pixelsize, - state->buffer + strip_row * row_byte_size, + state->buffer + current_row * row_byte_size, state->xsize); } } @@ -525,180 +535,151 @@ ImagingLibTiffDecode( isYCbCr = 0; } - // YCbCr data is read as RGB by libtiff and we don't need to worry about planar storage in that case - // if number of bands is 1, there is no difference with contig case - if (planarconfig == PLANARCONFIG_SEPARATE && - im->bands > 1 && - !isYCbCr) { - - uint16 bits_per_sample = 8; - - TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); - if (bits_per_sample != 8 && bits_per_sample != 16) { - TRACE(("Invalid value for bits per sample: %d\n", bits_per_sample)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - - planes = im->bands; - - // We'll pick appropriate set of unpackers depending on planar_configuration - // It does not matter if data is RGB(A), CMYK or LUV really, - // we just copy it plane by plane - unpackers[0] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL); - unpackers[1] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL); - unpackers[2] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL); - unpackers[3] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL); - } else { - unpackers[0] = state->shuffle; + if (isYCbCr) { + _decodeYCbCr(im, state, tiff); } + else { + // YCbCr data is read as RGB by libtiff and we don't need to worry about planar storage in that case + // if number of bands is 1, there is no difference with contig case + if (planarconfig == PLANARCONFIG_SEPARATE && + im->bands > 1 && + !isYCbCr) { - if (TIFFIsTiled(tiff)) { - INT32 x, y, tile_y; - UINT32 tile_width, tile_length, current_tile_length, current_line, - current_tile_width, row_byte_size; - UINT8 *new_data; + uint16 bits_per_sample = 8; - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); - TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); - - /* overflow check for row_byte_size calculation */ - if ((UINT32)INT_MAX / state->bits < tile_width) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } - - if (isYCbCr) { - row_byte_size = tile_width * 4; - /* sanity check, we use this value in shuffle below */ - if (im->pixelsize != 4) { + TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); + if (bits_per_sample != 8 && bits_per_sample != 16) { + TRACE(("Invalid value for bits per sample: %d\n", bits_per_sample)); state->errcode = IMAGING_CODEC_BROKEN; goto decode_err; } + + planes = im->bands; + + // We'll pick appropriate set of unpackers depending on planar_configuration + // It does not matter if data is RGB(A), CMYK or LUV really, + // we just copy it plane by plane + unpackers[0] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL); + unpackers[1] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL); + unpackers[2] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL); + unpackers[3] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL); } else { - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data size + unpackers[0] = state->shuffle; + } + + if (TIFFIsTiled(tiff)) { + INT32 x, y, tile_y; + UINT32 tile_width, tile_length, current_tile_length, current_line, + current_tile_width, row_byte_size; + UINT8 *new_data; + + TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); + TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); + + /* overflow check for row_byte_size calculation */ + if ((UINT32)INT_MAX / state->bits < tile_width) { + state->errcode = IMAGING_CODEC_MEMORY; + goto decode_err; + } + + // We could use TIFFTileSize, but for YCbCr data it returns subsampled data + // size row_byte_size = (tile_width * state->bits / planes + 7) / 8; - } - /* overflow check for realloc */ - if (INT_MAX / row_byte_size < tile_length) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < tile_length) { + state->errcode = IMAGING_CODEC_MEMORY; + goto decode_err; + } - state->bytes = row_byte_size * tile_length; + state->bytes = row_byte_size * tile_length; - if (TIFFTileSize(tiff) > state->bytes) { - // If the tile size as expected by LibTiff isn't what we're expecting, abort. - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } + if (TIFFTileSize(tiff) > state->bytes) { + // If the tile size as expected by LibTiff isn't what we're expecting, + // abort. + state->errcode = IMAGING_CODEC_MEMORY; + goto decode_err; + } - /* realloc to fit whole tile */ - /* malloc check above */ - new_data = realloc(state->buffer, state->bytes); - if (!new_data) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } + /* realloc to fit whole tile */ + /* malloc check above */ + new_data = realloc(state->buffer, state->bytes); + if (!new_data) { + state->errcode = IMAGING_CODEC_MEMORY; + goto decode_err; + } - state->buffer = new_data; + state->buffer = new_data; - TRACE(("TIFFTileSize: %d\n", state->bytes)); + TRACE(("TIFFTileSize: %d\n", state->bytes)); - for (y = state->yoff; y < state->ysize; y += tile_length) { - int plane; - for (plane = 0; plane < planes; plane++) { - ImagingShuffler shuffler = unpackers[plane]; - for (x = state->xoff; x < state->xsize; x += tile_width) { - /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions - have a different view of the size of the tiff than we're getting from - other functions. So, we need to check here. - */ - if (!TIFFCheckTile(tiff, x, y, 0, plane)) { - TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - if (isYCbCr) { - /* To avoid dealing with YCbCr subsampling, let libtiff handle it */ - if (!TIFFReadRGBATile(tiff, x, y, (UINT32 *)state->buffer)) { - TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + for (y = state->yoff; y < state->ysize; y += tile_length) { + int plane; + for (plane = 0; plane < planes; plane++) { + ImagingShuffler shuffler = unpackers[plane]; + for (x = state->xoff; x < state->xsize; x += tile_width) { + /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions + have a different view of the size of the tiff than we're getting from + other functions. So, we need to check here. + */ + if (!TIFFCheckTile(tiff, x, y, 0, plane)) { + TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); state->errcode = IMAGING_CODEC_BROKEN; goto decode_err; } - -#if WORDS_BIGENDIAN - TIFFSwabArrayOfLong((UINT32 *)state->buffer, tile_width * tile_length); -#endif - } else { if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { TRACE(("Decode Error, Tile at %dx%d\n", x, y)); state->errcode = IMAGING_CODEC_BROKEN; goto decode_err; } - } - TRACE(("Read tile at %dx%d; \n\n", x, y)); + TRACE(("Read tile at %dx%d; \n\n", x, y)); - current_tile_width = min((INT32) tile_width, state->xsize - x); - current_tile_length = min((INT32) tile_length, state->ysize - y); - // iterate over each line in the tile and stuff data into image - for (tile_y = 0; tile_y < current_tile_length; tile_y++) { - TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); + current_tile_width = min((INT32) tile_width, state->xsize - x); + current_tile_length = min((INT32) tile_length, state->ysize - y); + // iterate over each line in the tile and stuff data into image + for (tile_y = 0; tile_y < current_tile_length; tile_y++) { + TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); - // UINT8 * bbb = state->buffer + tile_y * row_byte_size; - // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - /* - * For some reason the TIFFReadRGBATile() function - * chooses the lower left corner as the origin. - * Vertically mirror by shuffling the scanlines - * backwards - */ + // UINT8 * bbb = state->buffer + tile_y * row_byte_size; + // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - if (isYCbCr) { - current_line = tile_length - tile_y - 1; - } else { current_line = tile_y; - } - shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + current_line * row_byte_size, - current_tile_width - ); + shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, + state->buffer + current_line * row_byte_size, + current_tile_width + ); + } } } } } - } else { - if (!isYCbCr) { + else { _decodeStrip(im, state, tiff, planes, unpackers); } - else { - _decodeStripYCbCr(im, state, tiff); - } - } - if (!state->errcode) { - // Check if raw mode was RGBa and it was stored on separate planes - // so we have to convert it to RGBA - if (planes > 3 && strcmp(im->mode, "RGBA") == 0) { - uint16 extrasamples; - uint16* sampleinfo; - ImagingShuffler shuffle; - INT32 y; + if (!state->errcode) { + // Check if raw mode was RGBa and it was stored on separate planes + // so we have to convert it to RGBA + if (planes > 3 && strcmp(im->mode, "RGBA") == 0) { + uint16 extrasamples; + uint16* sampleinfo; + ImagingShuffler shuffle; + INT32 y; - TIFFGetFieldDefaulted(tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); + TIFFGetFieldDefaulted(tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); - if (extrasamples >= 1 && - (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED || sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA) - ) { - shuffle = ImagingFindUnpacker("RGBA", "RGBa", NULL); + if (extrasamples >= 1 && + (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED || sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA) + ) { + shuffle = ImagingFindUnpacker("RGBA", "RGBa", NULL); - for (y = state->yoff; y < state->ysize; y++) { - UINT8* ptr = (UINT8*) im->image[y + state->yoff] + - state->xoff * im->pixelsize; - shuffle(ptr, ptr, state->xsize); + for (y = state->yoff; y < state->ysize; y++) { + UINT8* ptr = (UINT8*) im->image[y + state->yoff] + + state->xoff * im->pixelsize; + shuffle(ptr, ptr, state->xsize); + } } } } From e43804620174e057774483230ffe0290d54d3d00 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Wed, 13 Jan 2021 18:33:49 -0800 Subject: [PATCH 484/750] Refactor into smaller functions --- src/libImaging/TiffDecode.c | 269 +++++++++++++++++++----------------- 1 file changed, 142 insertions(+), 127 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index bbc190d27..913b0742c 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -213,8 +213,37 @@ ImagingLibTiffInit(ImagingCodecState state, int fp, uint32 offset) { } int -_decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { - // To avoid dealing with YCbCr subsampling, let libtiff handle it +_pickUnpackers(Imaging im, ImagingCodecState state, TIFF *tiff, uint16 planarconfig, ImagingShuffler *unpackers) { + // if number of bands is 1, there is no difference with contig case + if (planarconfig == PLANARCONFIG_SEPARATE && im->bands > 1) { + uint16 bits_per_sample = 8; + + TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); + if (bits_per_sample != 8 && bits_per_sample != 16) { + TRACE(("Invalid value for bits per sample: %d\n", bits_per_sample)); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } + + // We'll pick appropriate set of unpackers depending on planar_configuration + // It does not matter if data is RGB(A), CMYK or LUV really, + // we just copy it plane by plane + unpackers[0] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL); + unpackers[1] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL); + unpackers[2] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL); + unpackers[3] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL); + + return im->bands; + } else { + unpackers[0] = state->shuffle; + + return 1; + } +} + +int +_decodeAsRGBA(Imaging im, ImagingCodecState state, TIFF *tiff) { + // To avoid dealing with YCbCr subsampling and other complications, let libtiff handle it // Use a TIFFRGBAImage wrapping the tiff image, and let libtiff handle // all of the conversion. Metadata read from the TIFFRGBAImage could // be different from the metadata that the base tiff returns. @@ -260,13 +289,13 @@ _decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { state->ysize, img.height)); state->errcode = IMAGING_CODEC_BROKEN; - goto decodeycbcr_err; + goto decodergba_err; } /* overflow check for row byte size */ if (INT_MAX / 4 < img.width) { state->errcode = IMAGING_CODEC_MEMORY; - goto decodeycbcr_err; + goto decodergba_err; } // TiffRGBAImages are 32bits/pixel. @@ -275,7 +304,7 @@ _decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { /* overflow check for realloc */ if (INT_MAX / row_byte_size < rows_per_block) { state->errcode = IMAGING_CODEC_MEMORY; - goto decodeycbcr_err; + goto decodergba_err; } state->bytes = rows_per_block * row_byte_size; @@ -287,7 +316,7 @@ _decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { new_data = realloc(state->buffer, state->bytes); if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; - goto decodeycbcr_err; + goto decodergba_err; } state->buffer = new_data; @@ -299,7 +328,7 @@ _decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { if (!TIFFRGBAImageGet(&img, (UINT32 *)state->buffer, img.width, rows_to_read)) { TRACE(("Decode Error, y: %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; - goto decodeycbcr_err; + goto decodergba_err; } #if WORDS_BIGENDIAN @@ -326,7 +355,7 @@ _decodeYCbCr(Imaging im, ImagingCodecState state, TIFF *tiff) { } } -decodeycbcr_err: +decodergba_err: TIFFRGBAImageEnd(&img); if (state->errcode != 0) { return -1; @@ -334,6 +363,98 @@ decodeycbcr_err: return 0; } +int +_decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, ImagingShuffler *unpackers) { + INT32 x, y, tile_y; + UINT32 tile_width, tile_length, current_tile_length, current_line, + current_tile_width, row_byte_size; + UINT8 *new_data; + + TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); + TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); + + /* overflow check for row_byte_size calculation */ + if ((UINT32)INT_MAX / state->bits < tile_width) { + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + + // We could use TIFFTileSize, but for YCbCr data it returns subsampled data + // size + row_byte_size = (tile_width * state->bits / planes + 7) / 8; + + /* overflow check for realloc */ + if (INT_MAX / row_byte_size < tile_length) { + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + + state->bytes = row_byte_size * tile_length; + + if (TIFFTileSize(tiff) > state->bytes) { + // If the tile size as expected by LibTiff isn't what we're expecting, + // abort. + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + + /* realloc to fit whole tile */ + /* malloc check above */ + new_data = realloc(state->buffer, state->bytes); + if (!new_data) { + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + + state->buffer = new_data; + + TRACE(("TIFFTileSize: %d\n", state->bytes)); + + for (y = state->yoff; y < state->ysize; y += tile_length) { + int plane; + for (plane = 0; plane < planes; plane++) { + ImagingShuffler shuffler = unpackers[plane]; + for (x = state->xoff; x < state->xsize; x += tile_width) { + /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions + have a different view of the size of the tiff than we're getting from + other functions. So, we need to check here. + */ + if (!TIFFCheckTile(tiff, x, y, 0, plane)) { + TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } + if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { + TRACE(("Decode Error, Tile at %dx%d\n", x, y)); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } + + TRACE(("Read tile at %dx%d; \n\n", x, y)); + + current_tile_width = min((INT32) tile_width, state->xsize - x); + current_tile_length = min((INT32) tile_length, state->ysize - y); + // iterate over each line in the tile and stuff data into image + for (tile_y = 0; tile_y < current_tile_length; tile_y++) { + TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); + + // UINT8 * bbb = state->buffer + tile_y * row_byte_size; + // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + + current_line = tile_y; + + shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, + state->buffer + current_line * row_byte_size, + current_tile_width + ); + } + } + } + } + + return 0; +} + int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, ImagingShuffler *unpackers) { INT32 strip_row = 0; @@ -422,7 +543,7 @@ ImagingLibTiffDecode( TIFF *tiff; uint16 photometric = 0; // init to not PHOTOMETRIC_YCBCR uint16 compression; - int isYCbCr = 0; + int readAsRGBA = 0; uint16 planarconfig = 0; int planes = 1; ImagingShuffler unpackers[4]; @@ -527,133 +648,27 @@ ImagingLibTiffDecode( TIFFGetField(tiff, TIFFTAG_COMPRESSION, &compression); TIFFGetFieldDefaulted(tiff, TIFFTAG_PLANARCONFIG, &planarconfig); - isYCbCr = photometric == PHOTOMETRIC_YCBCR; + // Dealing with YCbCr images is complicated in case if subsampling + // Let LibTiff read them as RGBA + readAsRGBA = photometric == PHOTOMETRIC_YCBCR; - if (isYCbCr && compression == COMPRESSION_JPEG && planarconfig == PLANARCONFIG_CONTIG) { - // If using new JPEG compression, let libjpeg do RGB convertion + if (readAsRGBA && compression == COMPRESSION_JPEG && planarconfig == PLANARCONFIG_CONTIG) { + // If using new JPEG compression, let libjpeg do RGB convertion for performance reasons TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); - isYCbCr = 0; + readAsRGBA = 0; } - if (isYCbCr) { - _decodeYCbCr(im, state, tiff); + if (readAsRGBA) { + _decodeAsRGBA(im, state, tiff); } else { - // YCbCr data is read as RGB by libtiff and we don't need to worry about planar storage in that case - // if number of bands is 1, there is no difference with contig case - if (planarconfig == PLANARCONFIG_SEPARATE && - im->bands > 1 && - !isYCbCr) { - - uint16 bits_per_sample = 8; - - TIFFGetFieldDefaulted(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); - if (bits_per_sample != 8 && bits_per_sample != 16) { - TRACE(("Invalid value for bits per sample: %d\n", bits_per_sample)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - - planes = im->bands; - - // We'll pick appropriate set of unpackers depending on planar_configuration - // It does not matter if data is RGB(A), CMYK or LUV really, - // we just copy it plane by plane - unpackers[0] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "R;16N" : "R", NULL); - unpackers[1] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "G;16N" : "G", NULL); - unpackers[2] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "B;16N" : "B", NULL); - unpackers[3] = ImagingFindUnpacker("RGBA", bits_per_sample == 16 ? "A;16N" : "A", NULL); - } else { - unpackers[0] = state->shuffle; + planes = _pickUnpackers(im, state, tiff, planarconfig, unpackers); + if (planes <= 0) { + goto decode_err; } if (TIFFIsTiled(tiff)) { - INT32 x, y, tile_y; - UINT32 tile_width, tile_length, current_tile_length, current_line, - current_tile_width, row_byte_size; - UINT8 *new_data; - - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); - TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); - - /* overflow check for row_byte_size calculation */ - if ((UINT32)INT_MAX / state->bits < tile_width) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } - - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data - // size - row_byte_size = (tile_width * state->bits / planes + 7) / 8; - - /* overflow check for realloc */ - if (INT_MAX / row_byte_size < tile_length) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } - - state->bytes = row_byte_size * tile_length; - - if (TIFFTileSize(tiff) > state->bytes) { - // If the tile size as expected by LibTiff isn't what we're expecting, - // abort. - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } - - /* realloc to fit whole tile */ - /* malloc check above */ - new_data = realloc(state->buffer, state->bytes); - if (!new_data) { - state->errcode = IMAGING_CODEC_MEMORY; - goto decode_err; - } - - state->buffer = new_data; - - TRACE(("TIFFTileSize: %d\n", state->bytes)); - - for (y = state->yoff; y < state->ysize; y += tile_length) { - int plane; - for (plane = 0; plane < planes; plane++) { - ImagingShuffler shuffler = unpackers[plane]; - for (x = state->xoff; x < state->xsize; x += tile_width) { - /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions - have a different view of the size of the tiff than we're getting from - other functions. So, we need to check here. - */ - if (!TIFFCheckTile(tiff, x, y, 0, plane)) { - TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { - TRACE(("Decode Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decode_err; - } - - TRACE(("Read tile at %dx%d; \n\n", x, y)); - - current_tile_width = min((INT32) tile_width, state->xsize - x); - current_tile_length = min((INT32) tile_length, state->ysize - y); - // iterate over each line in the tile and stuff data into image - for (tile_y = 0; tile_y < current_tile_length; tile_y++) { - TRACE(("Writing tile data at %dx%d using tile_width: %d; \n", tile_y + y, x, current_tile_width)); - - // UINT8 * bbb = state->buffer + tile_y * row_byte_size; - // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - - current_line = tile_y; - - shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + current_line * row_byte_size, - current_tile_width - ); - } - } - } - } + _decodeTile(im, state, tiff, planes, unpackers); } else { _decodeStrip(im, state, tiff, planes, unpackers); From 1c295bf43c3aab8c6044ee8c323bf39f3b4f5eee Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 25 Jan 2021 20:29:04 -0800 Subject: [PATCH 485/750] Check for dimensions and sizes to fit into int --- src/libImaging/TiffDecode.c | 82 +++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 913b0742c..cd44417aa 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -365,38 +365,34 @@ decodergba_err: int _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, ImagingShuffler *unpackers) { - INT32 x, y, tile_y; - UINT32 tile_width, tile_length, current_tile_length, current_line, - current_tile_width, row_byte_size; + INT32 x, y, tile_y, current_tile_length, current_tile_width; + UINT32 tile_width, tile_length; + tsize_t tile_bytes_size, row_byte_size; UINT8 *new_data; - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); - TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); + tile_bytes_size = TIFFTileSize(tiff); - /* overflow check for row_byte_size calculation */ - if ((UINT32)INT_MAX / state->bits < tile_width) { - state->errcode = IMAGING_CODEC_MEMORY; + if (tile_bytes_size == 0) { + TRACE(("Decode Error, Can not calculate TileSize\n")); + state->errcode = IMAGING_CODEC_BROKEN; return -1; } - // We could use TIFFTileSize, but for YCbCr data it returns subsampled data - // size - row_byte_size = (tile_width * state->bits / planes + 7) / 8; + row_byte_size = TIFFTileRowSize(tiff); + + if (row_byte_size == 0 || row_byte_size > tile_bytes_size) { + TRACE(("Decode Error, Can not calculate TileRowSize\n")); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } /* overflow check for realloc */ - if (INT_MAX / row_byte_size < tile_length) { + if (tile_bytes_size > INT_MAX - 1) { state->errcode = IMAGING_CODEC_MEMORY; return -1; } - state->bytes = row_byte_size * tile_length; - - if (TIFFTileSize(tiff) > state->bytes) { - // If the tile size as expected by LibTiff isn't what we're expecting, - // abort. - state->errcode = IMAGING_CODEC_MEMORY; - return -1; - } + state->bytes = tile_bytes_size; /* realloc to fit whole tile */ /* malloc check above */ @@ -405,9 +401,17 @@ _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imaging state->errcode = IMAGING_CODEC_MEMORY; return -1; } - state->buffer = new_data; + TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); + TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); + + if (tile_width > INT_MAX || tile_length > INT_MAX) { + // state->x and state->y are ints + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + TRACE(("TIFFTileSize: %d\n", state->bytes)); for (y = state->yoff; y < state->ysize; y += tile_length) { @@ -441,10 +445,8 @@ _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imaging // UINT8 * bbb = state->buffer + tile_y * row_byte_size; // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); - current_line = tile_y; - shuffler((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + current_line * row_byte_size, + state->buffer + tile_y * row_byte_size, current_tile_width ); } @@ -459,38 +461,40 @@ int _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, ImagingShuffler *unpackers) { INT32 strip_row = 0; UINT8 *new_data; - UINT32 rows_per_strip, row_byte_size; + UINT32 rows_per_strip; int ret; + tsize_t strip_size, row_byte_size; ret = TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); - if (ret != 1) { + if (ret != 1 || rows_per_strip==(UINT32)(-1)) { rows_per_strip = state->ysize; } - TRACE(("RowsPerStrip: %u \n", rows_per_strip)); - // We could use TIFFStripSize, but for YCbCr data it returns subsampled data size - row_byte_size = (state->xsize * state->bits / planes + 7) / 8; - - /* overflow check for realloc */ - if (INT_MAX / row_byte_size < rows_per_strip) { + if (rows_per_strip > INT_MAX) { state->errcode = IMAGING_CODEC_MEMORY; return -1; } - state->bytes = rows_per_strip * row_byte_size; + TRACE(("RowsPerStrip: %u\n", rows_per_strip)); + + strip_size = TIFFStripSize(tiff); + if (strip_size > INT_MAX - 1) { + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + state->bytes = strip_size; TRACE(("StripSize: %d \n", state->bytes)); - if (TIFFStripSize(tiff) > state->bytes) { - // If the strip size as expected by LibTiff isn't what we're expecting, abort. - // man: TIFFStripSize returns the equivalent size for a strip of data as it - // would be returned in a - // call to TIFFReadEncodedStrip ... + row_byte_size = TIFFScanlineSize(tiff); - state->errcode = IMAGING_CODEC_MEMORY; + if (row_byte_size == 0 || row_byte_size > strip_size) { + state->errcode = IMAGING_CODEC_BROKEN; return -1; } + TRACE(("RowsByteSize: %u \n", row_byte_size)); + /* realloc to fit whole strip */ /* malloc check above */ new_data = realloc(state->buffer, state->bytes); From ab24c98491fe9ce345d1f2194bfc25ce2ffd267c Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 25 Jan 2021 21:45:57 -0800 Subject: [PATCH 486/750] Add sanity check for memory overruns --- src/libImaging/TiffDecode.c | 39 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index cd44417aa..d6bc66907 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -392,17 +392,6 @@ _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imaging return -1; } - state->bytes = tile_bytes_size; - - /* realloc to fit whole tile */ - /* malloc check above */ - new_data = realloc(state->buffer, state->bytes); - if (!new_data) { - state->errcode = IMAGING_CODEC_MEMORY; - return -1; - } - state->buffer = new_data; - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width); TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length); @@ -412,8 +401,27 @@ _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imaging return -1; } + if (tile_bytes_size > ((tile_length * state->bits / planes + 7) / 8) * tile_width) { + // If the tile size as expected by LibTiff isn't what we're expecting, abort. + // man: TIFFTileSize returns the equivalent size for a tile of data as it would be returned in a + // call to TIFFReadTile ... + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } + + state->bytes = tile_bytes_size; + TRACE(("TIFFTileSize: %d\n", state->bytes)); + /* realloc to fit whole tile */ + /* malloc check above */ + new_data = realloc(state->buffer, state->bytes); + if (!new_data) { + state->errcode = IMAGING_CODEC_MEMORY; + return -1; + } + state->buffer = new_data; + for (y = state->yoff; y < state->ysize; y += tile_length) { int plane; for (plane = 0; plane < planes; plane++) { @@ -482,6 +490,15 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin state->errcode = IMAGING_CODEC_MEMORY; return -1; } + + if (strip_size > ((state->xsize * state->bits / planes + 7) / 8) * rows_per_strip) { + // If the strip size as expected by LibTiff isn't what we're expecting, abort. + // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a + // call to TIFFReadEncodedStrip ... + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } + state->bytes = strip_size; TRACE(("StripSize: %d \n", state->bytes)); From 52ecf1b142a9d9307411f41823fae7c3f9f920c7 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 8 Mar 2021 20:20:29 -0800 Subject: [PATCH 487/750] Stop guessing strip size and pass expected size --- src/libImaging/TiffDecode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index d6bc66907..021c2898c 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -526,7 +526,7 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin int plane; for (plane = 0; plane < planes; plane++) { ImagingShuffler shuffler = unpackers[plane]; - if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, plane), (tdata_t)state->buffer, -1) == -1) { + if (TIFFReadEncodedStrip(tiff, TIFFComputeStrip(tiff, state->y, plane), (tdata_t)state->buffer, strip_size) == -1) { TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))); state->errcode = IMAGING_CODEC_BROKEN; return -1; From 6eae8fd59213a6a403dd69f673ce596e5b9d7fa1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 Mar 2021 08:11:41 +1100 Subject: [PATCH 488/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dba9d263a..a2d40305f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Fixed linear_gradient and radial_gradient I and F modes #5274 + [radarhere] + +- Add support for reading TIFFs with PlanarConfiguration=2 #5364 + [kkopachev, wiredfool, nulano] + +- Deprecated categories #5351 + [radarhere] + - Do not premultiply alpha when resizing with Image.NEAREST resampling #5304 [nulano] From 9ea20c095efd3a17be121f96b18066843f6804b5 Mon Sep 17 00:00:00 2001 From: German Novikov Date: Mon, 29 Mar 2021 14:12:29 +0300 Subject: [PATCH 489/750] Update docs/releasenotes/8.2.0.rst Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/releasenotes/8.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 3bdfadacd..99e2ef97d 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -77,7 +77,7 @@ be specified through a keyword argument:: ImageOps.autocontrast: preserve_tone ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The default behaviour of the :py:meth:`~PIL.ImageOps.autocontrast` is to normalize +The default behaviour of :py:meth:`~PIL.ImageOps.autocontrast` is to normalize separate histograms for each color channel, changing the tone of the image. The new ``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram for all channels. From 7844c6e48354bb9c7e4e029a394376ce21a76eff Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 Mar 2021 23:26:34 +1100 Subject: [PATCH 490/750] Test that preserve_tone changes RGB images but not L images --- Tests/test_imageops.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 888afad37..93be34bf8 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -365,6 +365,15 @@ def test_autocontrast_mask_real_input(): ) +def test_autocontrast_preserve_tone(): + def autocontrast(mode, preserve_tone): + im = hopper(mode) + return ImageOps.autocontrast(im, preserve_tone=preserve_tone).histogram() + + assert autocontrast("RGB", True) != autocontrast("RGB", False) + assert autocontrast("L", True) == autocontrast("L", False) + + def test_autocontrast_preserve_gradient(): gradient = Image.linear_gradient("L") From 4f61637e7fccc9786f90e97e2d55daa44aa2fca2 Mon Sep 17 00:00:00 2001 From: nulano Date: Mon, 29 Mar 2021 17:45:12 +0200 Subject: [PATCH 491/750] document libraqm/fribidi linking, support fribidi-0.dll on Windows --- docs/installation.rst | 31 ++++++++++++++++++--------- docs/releasenotes/8.2.0.rst | 18 ++++++++++++++++ src/thirdparty/fribidi-shim/fribidi.c | 3 +++ winbuild/build.rst | 2 +- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f79469c7f..1e7b0d6b2 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -57,8 +57,9 @@ Windows Installation We provide Pillow binaries for Windows compiled for the matrix of supported Pythons in both 32 and 64-bit versions in the wheel format. -These binaries have all of the optional libraries included except -for raqm, libimagequant, and libxcb:: +These binaries include support for all optional libraries except +libimagequant and libxcb. Raqm support requires +fribidi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow @@ -71,8 +72,8 @@ macOS Installation We provide binaries for macOS for each of the supported Python versions in the wheel format. These include support for all optional -libraries except libimagequant and libxcb. Raqm support requires -libraqm, fribidi, and harfbuzz to be installed separately:: +libraries except libimagequant. Raqm support requires +fribidi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow @@ -83,7 +84,7 @@ Linux Installation We provide binaries for Linux for each of the supported Python versions in the manylinux wheel format. These include support for all optional libraries except libimagequant. Raqm support requires -libraqm, fribidi, and harfbuzz to be installed separately:: +fribidi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow @@ -191,11 +192,15 @@ Many of Pillow's features require external libraries: * libraqm depends on the following libraries: FreeType, HarfBuzz, FriBiDi, make sure that you install them before installing libraqm if not available as package in your system. - * setting text direction or font features is not supported without - libraqm. - * libraqm is dynamically loaded in Pillow 5.0.0 and above, so support - is available if all the libraries are installed. - * Windows support: Raqm is not included in prebuilt wheels + * Setting text direction or font features is not supported without libraqm. + * Pillow wheels since version 8.2.0 include a modified version of libraqm that + loads libfribidi at runtime if it is installed. + On Windows this requires compiling FriBiDi and installing ``fribidi.dll`` + into a directory listed in the `Dynamic-Link Library Search Order (Microsoft Docs) + `_ + (``fribidi-0.dll`` or ``libfribidi-0.dll`` are also detected). + See `Build Options`_ to see how to build this version. + * Previous versions of Pillow (5.0.0 to 8.1.2) linked libraqm dynamically at runtime. * **libxcb** provides X11 screengrab support. @@ -244,6 +249,12 @@ Build Options an exception if the libraries are not found. Webpmux (WebP metadata) relies on WebP support. Tcl and Tk also must be used together. +* Build flags: ``--vendor-raqm --vendor-fribidi`` + These flags are used to compile a modified version of libraqm and + a shim that dynamically loads libfribidi at runtime. These are + used to compile the standard Pillow wheels. Compiling libraqm requires + a C99-compliant compiler. + * Build flag: ``--disable-platform-guessing``. Skips all of the platform dependent guessing of include and library directories for automated build systems that configure the proper paths in the diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 3ef05894d..c76547c8e 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -91,6 +91,24 @@ TODO Other Changes ============= +Libraqm and FriBiDi linking +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The way the libraqm dependency for complex text scripts is linked has been changed: + +Source builds will now link against the system version of libraqm at build time +rather than at runtime by default. + +Binary wheels now include a statically linked modified version of libraqm that +links against FriBiDi at runtime instead. This change is intended to address +issues with the previous implementation on some platforms. These are created +by building Pillow with the new build flags ``--vendor-raqm --vendor-fribidi``. + +Windows users will now need to install ``fribidi.dll`` (or ``fribidi-0.dll``) only, +``libraqm.dll`` is no longer used. + +See :doc:`installation documentation<../installation>` for more information. + PyQt6 ^^^^^ diff --git a/src/thirdparty/fribidi-shim/fribidi.c b/src/thirdparty/fribidi-shim/fribidi.c index 55e2a6ab3..abbab07b0 100644 --- a/src/thirdparty/fribidi-shim/fribidi.c +++ b/src/thirdparty/fribidi-shim/fribidi.c @@ -56,6 +56,9 @@ int load_fribidi(void) { error = error || (func == 0); p_fribidi = LoadLibrary("fribidi"); + if (!p_fribidi) { + p_fribidi = LoadLibrary("fribidi-0"); + } /* MSYS2 */ if (!p_fribidi) { p_fribidi = LoadLibrary("libfribidi-0"); diff --git a/winbuild/build.rst b/winbuild/build.rst index cd4a45e87..7493c30e5 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -87,7 +87,7 @@ and install Pillow in develop mode (instead of ``python3 -m pip install --editab Testing Pillow -------------- -Some binary dependencies (e.g. ``libraqm.dll``) will be stored in the +Some binary dependencies (e.g. ``fribidi.dll``) will be stored in the ``winbuild\build\bin`` directory; this directory should be added to ``PATH`` before running tests. From 00cc32e3f92c990bd41df84e551813718368c9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondrej=20Baranovi=C4=8D?= Date: Mon, 29 Mar 2021 19:45:27 +0200 Subject: [PATCH 492/750] FriBiDi capitalization consistency Co-authored-by: Hugo van Kemenade --- docs/installation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 1e7b0d6b2..cc9c51039 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -59,7 +59,7 @@ We provide Pillow binaries for Windows compiled for the matrix of supported Pythons in both 32 and 64-bit versions in the wheel format. These binaries include support for all optional libraries except libimagequant and libxcb. Raqm support requires -fribidi to be installed separately:: +FriBiDi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow @@ -73,7 +73,7 @@ macOS Installation We provide binaries for macOS for each of the supported Python versions in the wheel format. These include support for all optional libraries except libimagequant. Raqm support requires -fribidi to be installed separately:: +FriBiDi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow @@ -84,7 +84,7 @@ Linux Installation We provide binaries for Linux for each of the supported Python versions in the manylinux wheel format. These include support for all optional libraries except libimagequant. Raqm support requires -fribidi to be installed separately:: +FriBiDi to be installed separately:: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow From 19a815dd7392cbbf7192c8065b32e561cd086bea Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 29 Mar 2021 11:27:50 -0700 Subject: [PATCH 493/750] Remove redundant check It's duplicated inside following call of TIFFReadTile --- src/libImaging/TiffDecode.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 021c2898c..26197c8f6 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -427,15 +427,6 @@ _decodeTile(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imaging for (plane = 0; plane < planes; plane++) { ImagingShuffler shuffler = unpackers[plane]; for (x = state->xoff; x < state->xsize; x += tile_width) { - /* Sanity Check. Apparently in some cases, the TiffReadRGBA* functions - have a different view of the size of the tiff than we're getting from - other functions. So, we need to check here. - */ - if (!TIFFCheckTile(tiff, x, y, 0, plane)) { - TRACE(("Check Tile Error, Tile at %dx%d\n", x, y)); - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } if (TIFFReadTile(tiff, (tdata_t)state->buffer, x, y, 0, plane) == -1) { TRACE(("Decode Error, Tile at %dx%d\n", x, y)); state->errcode = IMAGING_CODEC_BROKEN; From 9e5ecd682567f9e0cb4dba7a415d12f7055a4054 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 30 Mar 2021 08:00:58 +1100 Subject: [PATCH 494/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a2d40305f..3a16c0e50 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Add preserve_tone option to autocontrast #5350 + [elejke, radarhere] + - Fixed linear_gradient and radial_gradient I and F modes #5274 [radarhere] From 306d030fce71ec27cd1c561ed64ef763ecec19be Mon Sep 17 00:00:00 2001 From: Ray Gardner Date: Tue, 30 Mar 2021 17:35:21 -0600 Subject: [PATCH 495/750] Add comment to reference GIF LZW specification. --- src/libImaging/GifEncode.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libImaging/GifEncode.c b/src/libImaging/GifEncode.c index 0ac9dc605..f23245405 100644 --- a/src/libImaging/GifEncode.c +++ b/src/libImaging/GifEncode.c @@ -27,6 +27,12 @@ enum { INIT, ENCODE, FINISH }; /* GIF LZW encoder by Raymond Gardner. */ /* Released here under PIL license. */ +/* This LZW encoder conforms to the GIF LZW format specified in the original + * Compuserve GIF 87a and GIF 89a specifications (see e.g. + * https://www.w3.org/Graphics/GIF/spec-gif87.txt Appendix C and + * https://www.w3.org/Graphics/GIF/spec-gif89a.txt Appendix F). + */ + /* Return values */ #define GLZW_OK 0 #define GLZW_NO_INPUT_AVAIL 1 From d8b4a928068e038d7fb07a901a882864b5694de0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 31 Mar 2021 16:03:13 +1100 Subject: [PATCH 496/750] Updated Ghostscript to 9.54.0 --- .appveyor.yml | 4 ++-- .github/workflows/test-windows.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 4e2ca1071..b843b16ee 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,8 +24,8 @@ install: - mv c:\pillow-depends-master c:\pillow-depends - xcopy /S /Y c:\pillow-depends\test_images\* c:\pillow\tests\images - 7z x ..\pillow-depends\nasm-2.14.02-win64.zip -oc:\ -- ..\pillow-depends\gs9533w32.exe /S -- path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.53.3\bin;%PATH% +- ..\pillow-depends\gs9540w32.exe /S +- path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.54.0\bin;%PATH% - cd c:\pillow\winbuild\ - ps: | c:\python37\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\ diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index e3b2201a7..beb89ebeb 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -71,8 +71,8 @@ jobs: 7z x winbuild\depends\nasm-2.14.02-win64.zip "-o$env:RUNNER_WORKSPACE\" echo "$env:RUNNER_WORKSPACE\nasm-2.14.02" >> $env:GITHUB_PATH - winbuild\depends\gs9533w32.exe /S - echo "C:\Program Files (x86)\gs\gs9.53.3\bin" >> $env:GITHUB_PATH + winbuild\depends\gs9540w32.exe /S + echo "C:\Program Files (x86)\gs\gs9.54.0\bin" >> $env:GITHUB_PATH xcopy /S /Y winbuild\depends\test_images\* Tests\images\ From 7e940dea5e12326bafe68023f5f6cb6f0a695827 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 31 Mar 2021 19:22:31 +1100 Subject: [PATCH 497/750] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index cf90c1ae8..759ede9aa 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -45,6 +45,14 @@ This is now consistent with other IFDs, and must be accessed through These changes only affect :py:meth:`~PIL.Image.Image.getexif`, introduced in Pillow 6.0. The older ``_getexif()`` methods are unaffected. +Image._MODEINFO +^^^^^^^^^^^^^^^ + +This internal dictionary has been deprecated by a comment since PIL, and is now +removed. Instead, ``Image.getmodebase()``, ``Image.getmodetype()``, +``Image.getmodebandnames()``, ``Image.getmodebands()`` or ``ImageMode.getmode()`` +can be used. + API Additions ============= From d6dfdd361704a03512d5ff6705df6158a5a57dc9 Mon Sep 17 00:00:00 2001 From: Ray Gardner Date: Wed, 31 Mar 2021 06:48:17 -0600 Subject: [PATCH 498/750] Add GIF LZW encoding to 8.2.0 release notes. --- docs/releasenotes/8.2.0.rst | 55 +++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index d82bf45c2..0ad5d7f2f 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -10,6 +10,16 @@ Tk/Tcl 8.4 Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), when Tk/Tcl 8.5 will be the minimum supported. +Categories +^^^^^^^^^^ + +``im.category`` is deprecated and will be removed in Pillow 10.0.0 (2023-01-02), +along with the related ``Image.NORMAL``, ``Image.SEQUENCE`` and +``Image.CONTAINER`` attributes. + +To determine if an image has multiple frames or not, +``getattr(im, "is_animated", False)`` can be used instead. + API Changes =========== @@ -35,6 +45,14 @@ This is now consistent with other IFDs, and must be accessed through These changes only affect :py:meth:`~PIL.Image.Image.getexif`, introduced in Pillow 6.0. The older ``_getexif()`` methods are unaffected. +Image._MODEINFO +^^^^^^^^^^^^^^^ + +This internal dictionary has been deprecated by a comment since PIL, and is now +removed. Instead, ``Image.getmodebase()``, ``Image.getmodetype()``, +``Image.getmodebandnames()``, ``Image.getmodebands()`` or ``ImageMode.getmode()`` +can be used. + API Additions ============= @@ -73,6 +91,15 @@ be specified through a keyword argument:: im.save("out.tif", icc_profile=...) + +ImageOps.autocontrast: preserve_tone +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default behaviour of :py:meth:`~PIL.ImageOps.autocontrast` is to normalize +separate histograms for each color channel, changing the tone of the image. The new +``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram +for all channels. + Security ======== @@ -81,6 +108,34 @@ TODO Other Changes ============= +GIF writer uses LZW encoding +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +GIF files are now written using LZW encoding, which will generate smaller files, +typically about 70% of the size generated by the older encoder. + +The pixel data is encoded using the format specified in the [Compuserve GIF +standard](https://www.w3.org/Graphics/GIF/spec-gif89a.txt). The older encoder +used a variant of run-length encoding that was compatible but less efficient. + +Libraqm and FriBiDi linking +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The way the libraqm dependency for complex text scripts is linked has been changed: + +Source builds will now link against the system version of libraqm at build time +rather than at runtime by default. + +Binary wheels now include a statically linked modified version of libraqm that +links against FriBiDi at runtime instead. This change is intended to address +issues with the previous implementation on some platforms. These are created +by building Pillow with the new build flags ``--vendor-raqm --vendor-fribidi``. + +Windows users will now need to install ``fribidi.dll`` (or ``fribidi-0.dll``) only, +``libraqm.dll`` is no longer used. + +See :doc:`installation documentation<../installation>` for more information. + PyQt6 ^^^^^ From 95ac35d287be87a4cafc97f40008b3baa3a2780b Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 31 Mar 2021 21:28:29 +0300 Subject: [PATCH 499/750] Fix RST link [ci skip] --- docs/releasenotes/8.2.0.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 0ad5d7f2f..0f7318e3b 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -114,9 +114,11 @@ GIF writer uses LZW encoding GIF files are now written using LZW encoding, which will generate smaller files, typically about 70% of the size generated by the older encoder. -The pixel data is encoded using the format specified in the [Compuserve GIF -standard](https://www.w3.org/Graphics/GIF/spec-gif89a.txt). The older encoder -used a variant of run-length encoding that was compatible but less efficient. +The pixel data is encoded using the format specified in the `CompuServe GIF standard +`_. + +The older encoder used a variant of run-length encoding that was compatible but less +efficient. Libraqm and FriBiDi linking ^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 22a6893364c28e3125cbc40f22efa3173f3b851e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 11 Mar 2021 23:13:15 +0100 Subject: [PATCH 500/750] Fix pytest valgrind warnings --- Tests/conftest.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index 6f9945204..11ec820ac 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -19,13 +19,11 @@ def pytest_configure(config): # We're marking some tests to ignore valgrind errors and XFAIL them. # Ensure that the mark is defined # even in cases where pytest-valgrind isn't installed - - with warnings.catch_warnings(): - warnings.simplefilter("error") - try: - getattr(pytest.mark, "valgrind_known_error") - except Exception: - config.addinivalue_line( - "markers", - "valgrind_known_error: Tests that have known issues with valgrind", - ) + try: + config.addinivalue_line( + "markers", + "valgrind_known_error: Tests that have known issues with valgrind", + ) + except Exception: + # valgrind is already installed + pass From 45530d5ce1bcc9357907b7e5eeb6e54c6198358e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 21:04:59 +0200 Subject: [PATCH 501/750] fixes crash-74d2 --- ...d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif | Bin 0 -> 1026 bytes Tests/test_tiff_crashes.py | 2 ++ src/libImaging/TiffDecode.c | 28 ++++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif diff --git a/Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif b/Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif new file mode 100644 index 0000000000000000000000000000000000000000..053e4e4e952ca9a0139f6d7a2b726c64b305fdc1 GIT binary patch literal 1026 zcmebD)M8L#W?-26NO_Ufk^28Y@PtFO{{OiTAm;z4e1ftr?jVtWr;6q**8~y^Pc%Fctuf9vD_|E>4lw{G>W*cD#KZ)Jz_a~+ZtcPSMFTBzV~tz!TG{~zT~ zY-iQb2xz?QzubGlL>U_`{-v*dU;p~I|NpOl(`#eHOLhlL?cZ{3m7HjcK`I}Y^8f#z zGzuI}UbV0)_%^qu?{ysize; } @@ -281,17 +281,6 @@ _decodeAsRGBA(Imaging im, ImagingCodecState state, TIFF *tiff) { img.req_orientation = ORIENTATION_TOPLEFT; img.col_offset = 0; - if (state->xsize != img.width || state->ysize != img.height) { - TRACE( - ("Inconsistent Image Error: %d =? %d, %d =? %d", - state->xsize, - img.width, - state->ysize, - img.height)); - state->errcode = IMAGING_CODEC_BROKEN; - goto decodergba_err; - } - /* overflow check for row byte size */ if (INT_MAX / 4 < img.width) { state->errcode = IMAGING_CODEC_MEMORY; @@ -559,6 +548,7 @@ ImagingLibTiffDecode( uint16 planarconfig = 0; int planes = 1; ImagingShuffler unpackers[4]; + UINT32 img_width, img_height; memset(unpackers, 0, sizeof(ImagingShuffler) * 4); @@ -655,6 +645,20 @@ ImagingLibTiffDecode( } } + TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &img_width); + TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &img_height); + + if (state->xsize != img_width || state->ysize != img_height) { + TRACE( + ("Inconsistent Image Error: %d =? %d, %d =? %d", + state->xsize, + img_width, + state->ysize, + img_height)); + state->errcode = IMAGING_CODEC_BROKEN; + goto decode_err; + } + TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); TIFFGetField(tiff, TIFFTAG_COMPRESSION, &compression); From 53c80281d7f745cc1804901ec6f5b61d236688e0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 21:16:43 +0200 Subject: [PATCH 502/750] fix for crash-8115 --- ...81154a65438ba5aaeca73fd502fa4850fbde60f8.tif | Bin 0 -> 42224 bytes Tests/test_tiff_crashes.py | 1 + src/PIL/TiffImagePlugin.py | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif diff --git a/Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif b/Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif new file mode 100644 index 0000000000000000000000000000000000000000..56e824199684ab6a2fccf04f6c1002e7cbda63ff GIT binary patch literal 42224 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 literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 7b01d458e..a8e378ec1 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -34,6 +34,7 @@ from .helper import on_ci "Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif", "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", "Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif", + "Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif", ], ) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 24821d130..9d821dcf9 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1250,6 +1250,10 @@ class TiffImageFile(ImageFile.ImageFile): if bps_count > len(bps_tuple) and len(bps_tuple) == 1: bps_tuple = bps_tuple * bps_count + samplesPerPixel = self.tag_v2.get(SAMPLESPERPIXEL, 1) + if len(bps_tuple) != samplesPerPixel: + raise SyntaxError("unknown data organization") + # mode: check photometric interpretation and bits per pixel key = ( self.tag_v2.prefix, From 87934e22d056cb72ad6c7e9dc48e06d2a02e2dec Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 31 Mar 2021 23:17:20 +0200 Subject: [PATCH 503/750] Fix for crash-0da0 --- ...h-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif | Bin 0 -> 674 bytes Tests/test_tiff_crashes.py | 2 +- src/libImaging/TiffDecode.c | 9 ++++++--- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif diff --git a/Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif b/Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif new file mode 100644 index 0000000000000000000000000000000000000000..6e4e9b9caa53af34c5ee072974084618d9ffedc4 GIT binary patch literal 674 zcmebD)MB{6z`*eT|NnF?AJ#(FhuWH*0!*z3oY)%`H#mJzl=$>1l|#&9$!777mM_~_ z4yv_qH+g^Cy(PzS-owDkI_&ON8&CV46TU+R7PsdszGI(^TjfAc)1uiC#v>#x2C_pkhy z6aGc*dU6{mo*i4Y;_G_v+Siv;er5IVkdd-05NJH6n zK(-8$UOA|^8&F&x%Ju`YHK1yMOa@IL8$<(r$Y2O`n+1>+1{5#?vPFRGK8PfPenx(7 zs(xxwW^%E9KxR%(ez|@~YH>-ier9fBdTOzLx`}QYNVq5^wMe%FD5F=Bna1FqpO#pm z5a8mb;Fg(Fl3Jvot5B9&RGgWgr(mpSZmI{ew?UPGK>OV literal 0 HcmV?d00001 diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index a8e378ec1..6cdb8e44d 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -35,7 +35,7 @@ from .helper import on_ci "Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif", "Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif", "Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif", - + "Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif", ], ) @pytest.mark.filterwarnings("ignore:Possibly corrupt EXIF data") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 25616da24..bae3afff4 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -451,7 +451,7 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin UINT8 *new_data; UINT32 rows_per_strip; int ret; - tsize_t strip_size, row_byte_size; + tsize_t strip_size, row_byte_size, unpacker_row_byte_size; ret = TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip); if (ret != 1 || rows_per_strip==(UINT32)(-1)) { @@ -471,7 +471,8 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin return -1; } - if (strip_size > ((state->xsize * state->bits / planes + 7) / 8) * rows_per_strip) { + unpacker_row_byte_size = (state->xsize * state->bits / planes + 7) / 8; + if (strip_size > (unpacker_row_byte_size * rows_per_strip)) { // If the strip size as expected by LibTiff isn't what we're expecting, abort. // man: TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a // call to TIFFReadEncodedStrip ... @@ -485,7 +486,9 @@ _decodeStrip(Imaging im, ImagingCodecState state, TIFF *tiff, int planes, Imagin row_byte_size = TIFFScanlineSize(tiff); - if (row_byte_size == 0 || row_byte_size > strip_size) { + // if the unpacker calculated row size is > row byte size, (at least) the last + // row of the strip will have a read buffer overflow. + if (row_byte_size == 0 || unpacker_row_byte_size > row_byte_size) { state->errcode = IMAGING_CODEC_BROKEN; return -1; } From 682e3e2f6942f5e9efded72a4f2f643e19f9b03b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 11:53:33 +1100 Subject: [PATCH 504/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3a16c0e50..7d9dc6fbc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,21 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Do not load transparent pixels from subsequent GIF frames #5333 + [zewt, radarhere] + +- Use LZW encoding when saving GIF images #5291 + [raygard] + +- Set all transparent colors to be equal in quantize() #5282 + [radarhere] + +- Allow PixelAccess to use Python __int__ when parsing x and y #5206 + [radarhere] + +- Removed Image._MODEINFO #5316 + [radarhere] + - Add preserve_tone option to autocontrast #5350 [elejke, radarhere] From 37f9fcf93b2399db6b70ff363776ad4df5bad117 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 12:57:34 +1100 Subject: [PATCH 505/750] Removed unused imports --- Tests/conftest.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Tests/conftest.py b/Tests/conftest.py index 11ec820ac..dd37e7ce5 100644 --- a/Tests/conftest.py +++ b/Tests/conftest.py @@ -1,7 +1,4 @@ import io -import warnings - -import pytest def pytest_report_header(config): From 43c41720e99037dd5c7689c9cd8e64fbb46afbff Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 21:40:53 +1100 Subject: [PATCH 506/750] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7d9dc6fbc..2b685b309 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 8.2.0 (unreleased) ------------------ +- Added getxmp() method #5144 + [UrielMaD, radarhere] + +- Add ImageShow support for GraphicsMagick #5349 + [latosha-maltba, radarhere] + - Do not load transparent pixels from subsequent GIF frames #5333 [zewt, radarhere] From 2c8684c5254e8f5b9efaf0bfe216b732c55dd22b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 22:28:37 +1100 Subject: [PATCH 507/750] Moved getxmp() into JpegImageFile --- Tests/test_file_jpeg.py | 7 +++++++ Tests/test_image_getxmp.py | 9 --------- src/PIL/Image.py | 22 ---------------------- src/PIL/JpegImagePlugin.py | 23 +++++++++++++++++++++++ 4 files changed, 30 insertions(+), 31 deletions(-) delete mode 100644 Tests/test_image_getxmp.py diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 3ee33d65f..64f509a95 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -805,6 +805,13 @@ class TestFileJpeg: # Assert the entire file has not been read assert 0 < buffer.max_pos < size + def test_getxmp(self): + with Image.open("Tests/images/xmp_test.jpg") as im: + xmp = im.getxmp() + + assert isinstance(xmp, dict) + assert xmp["Description"]["Version"] == "10.4" + @pytest.mark.skipif(not is_win32(), reason="Windows only") @skip_unless_feature("jpg") diff --git a/Tests/test_image_getxmp.py b/Tests/test_image_getxmp.py deleted file mode 100644 index a684d6f0c..000000000 --- a/Tests/test_image_getxmp.py +++ /dev/null @@ -1,9 +0,0 @@ -from PIL import Image - - -def test_getxmp(): - with Image.open("Tests/images/xmp_test.jpg") as im: - xmp = im.getxmp() - - assert isinstance(xmp, dict) - assert xmp["Description"]["Version"] == "10.4" diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 062fa9280..ebeaf3c74 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -528,7 +528,6 @@ class Image: self.readonly = 0 self.pyaccess = None self._exif = None - self._xmp = None def __getattr__(self, name): if name == "category": @@ -1340,27 +1339,6 @@ class Image: return self._exif - def getxmp(self): - """ - Returns a dictionary containing the xmp tags for a given image. - :returns: XMP tags in a dictionary. - """ - - if self._xmp is None: - self._xmp = {} - - for segment, content in self.applist: - if segment == "APP1": - marker, xmp_tags = content.rsplit(b"\x00", 1) - if marker == b"http://ns.adobe.com/xap/1.0/": - root = xml.etree.ElementTree.fromstring(xmp_tags) - for element in root.findall(".//"): - self._xmp[element.tag.split("}")[1]] = { - child.split("}")[1]: value - for child, value in element.attrib.items() - } - return self._xmp - def getim(self): """ Returns a capsule that points to the internal image memory. diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index ad260acbd..09141f5b3 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -39,6 +39,7 @@ import subprocess import sys import tempfile import warnings +import xml.etree.ElementTree from . import Image, ImageFile, TiffImagePlugin from ._binary import i16be as i16 @@ -358,6 +359,7 @@ class JpegImageFile(ImageFile.ImageFile): self.app = {} # compatibility self.applist = [] self.icclist = [] + self._xmp = None while True: @@ -474,6 +476,27 @@ class JpegImageFile(ImageFile.ImageFile): def _getmp(self): return _getmp(self) + def getxmp(self): + """ + Returns a dictionary containing the xmp tags for a given image. + :returns: XMP tags in a dictionary. + """ + + if self._xmp is None: + self._xmp = {} + + for segment, content in self.applist: + if segment == "APP1": + marker, xmp_tags = content.rsplit(b"\x00", 1) + if marker == b"http://ns.adobe.com/xap/1.0/": + root = xml.etree.ElementTree.fromstring(xmp_tags) + for element in root.findall(".//"): + self._xmp[element.tag.split("}")[1]] = { + child.split("}")[1]: value + for child, value in element.attrib.items() + } + return self._xmp + def _getexif(self): if "exif" not in self.info: From e12d5042ad093be22c2df7fbce12c91d023e7a75 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 22:20:55 +1100 Subject: [PATCH 508/750] Adjusted docstring --- src/PIL/JpegImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 09141f5b3..48e0de535 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -478,7 +478,7 @@ class JpegImageFile(ImageFile.ImageFile): def getxmp(self): """ - Returns a dictionary containing the xmp tags for a given image. + Returns a dictionary containing the XMP tags. :returns: XMP tags in a dictionary. """ From ae7110a85d2251f52a5687f086f466137685dd6e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 1 Apr 2021 23:18:30 +1100 Subject: [PATCH 509/750] Added release notes [ci skip] --- docs/releasenotes/8.2.0.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 920b77dc8..a90b272c5 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -112,6 +112,20 @@ separate histograms for each color channel, changing the tone of the image. The ``preserve_tone`` argument keeps the tone unchanged by using one luminance histogram for all channels. +getxmp() for JPEG images +^^^^^^^^^^^^^^^^^^^^^^^^ + +A new method has been added to return +`XMP data `_ for JPEG +images. It reads the XML data into a dictionary of names and values. + +For example:: + + >>> from PIL import Image + >>> with Image.open("Tests/images/xmp_test.jpg") as im: + >>> print(im.getxmp()) + {'RDF': {}, 'Description': {'Version': '10.4', 'ProcessVersion': '10.0', ...}, ...} + Security ======== From 8ec027867f19633d9adfc5c8b7504d9b609fc5f1 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Thu, 1 Apr 2021 13:18:44 +0300 Subject: [PATCH 510/750] Add security release notes --- docs/releasenotes/8.2.0.rst | 54 +++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index a90b272c5..7ba5fc4a3 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -48,7 +48,7 @@ These changes only affect :py:meth:`~PIL.Image.Image.getexif`, introduced in Pil Image._MODEINFO ^^^^^^^^^^^^^^^ -This internal dictionary has been deprecated by a comment since PIL, and is now +This internal dictionary had been deprecated by a comment since PIL, and is now removed. Instead, ``Image.getmodebase()``, ``Image.getmodetype()``, ``Image.getmodebandnames()``, ``Image.getmodebands()`` or ``ImageMode.getmode()`` can be used. @@ -129,7 +129,56 @@ For example:: Security ======== -TODO +These were all found with `OSS-Fuzz`_. + +:cve:`CVE-2021-25287`, :cve:`CVE-2021-25288`: Fix OOB read in Jpeg2KDecode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* For J2k images with multiple bands, it's legal to have different widths for each band, + e.g. 1 byte for ``L``, 4 bytes for ``A``. +* This dates to Pillow 2.4.0. + +:cve:`CVE-2021-28675`: Fix DOS in PsdImagePlugin +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* :py:class:`.PsdImagePlugin.PsdImageFile` did not sanity check the number of input + layers with regard to the size of the data block, this could lead to a + denial-of-service on :py:meth:`~PIL.Image.open` prior to + :py:meth:`~PIL.Image.Image.load`. +* This dates to the PIL fork. + +:cve:`CVE-2021-28676`: Fix FLI DOS +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* ``FliDecode.c`` did not properly check that the block advance was non-zero, + potentially leading to an infinite loop on load. +* This dates to the PIL fork. + +:cve:`CVE-2021-28677`: Fix EPS DOS on _open +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The readline used in EPS has to deal with any combination of ``\r`` and ``\n`` as line + endings. It accidentally used a quadratic method of accumulating lines while looking + for a line ending. +* A malicious EPS file could use this to perform a denial-of-service of Pillow in the + open phase, before an image was accepted for opening. +* This dates to the PIL fork. + +:cve:`CVE-2021-28678`: Fix BLP DOS +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* ``BlpImagePlugin`` did not properly check that reads after jumping to file offsets + returned data. This could lead to a denial-of-service where the decoder could be run a + large number of times on empty data. +* This dates to Pillow 5.1.0. + +Fix memory DOS in ImageFont +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* A corrupt or specially crafted TTF font could have font metrics that lead to + unreasonably large sizes when rendering text in font. ``ImageFont.py`` did not check + the image size before allocating memory for it. +* This dates to the PIL fork. Other Changes ============= @@ -178,3 +227,4 @@ ImageMagick_ installed. If both are installed, the tests prefer ImageMagick. .. _GraphicsMagick: http://www.graphicsmagick.org/ .. _ImageMagick: https://imagemagick.org/ +.. _OSS-Fuzz: https://github.com/google/oss-fuzz From 3bf5eddb89afdf690eceaa52bc4d3546ba9a5f87 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 7 Mar 2021 12:32:12 +0100 Subject: [PATCH 511/750] Fix OOB Read in Jpeg2KDecode CVE-2021-25287,CVE-2021-25288 * For J2k images with multiple bands, it's legal in to have different widths for each band, e.g. 1 byte for L, 4 bytes for A * This dates to Pillow 2.4.0 --- ...b027452e6988530aa5dabee76eecacb3b79f8a.j2k | Bin 0 -> 335 bytes ...4c83eb92150fb8f1653a697703ae06ae7c4998.j2k | Bin 0 -> 335 bytes ...ca68ff40171fdae983d924e127a721cab2bd50.j2k | Bin 0 -> 335 bytes ...c93af851d3ab9a19e34503626368b2ecde9c03.j2k | Bin 0 -> 3886 bytes Tests/test_file_jpeg2k.py | 16 +++++++ src/libImaging/Jpeg2KDecode.c | 43 ++++++++++++------ 6 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 Tests/images/crash-4fb027452e6988530aa5dabee76eecacb3b79f8a.j2k create mode 100644 Tests/images/crash-7d4c83eb92150fb8f1653a697703ae06ae7c4998.j2k create mode 100644 Tests/images/crash-ccca68ff40171fdae983d924e127a721cab2bd50.j2k create mode 100644 Tests/images/crash-d2c93af851d3ab9a19e34503626368b2ecde9c03.j2k diff --git a/Tests/images/crash-4fb027452e6988530aa5dabee76eecacb3b79f8a.j2k b/Tests/images/crash-4fb027452e6988530aa5dabee76eecacb3b79f8a.j2k new file mode 100644 index 0000000000000000000000000000000000000000..c9bd7fc0a8dfe76af64b373351349c55a1e5de18 GIT binary patch literal 335 zcmZQzVBpCLP*C9IYUg5LU=T?wsVvAUFj4@r8KAT?kj?;d#WFKeih#5N7&Ec6GXfb5 z{K@$_MPL?#AdoAToRXTxzyy*30!APN1E3Mf|NZ|5GU$N03P2KsVL$=M0AUDVVsG3r zgOTxn5CacTfRTZfg@u9fe++}Lf=56=1Plducm(`U0b0uFotT}NQmR{Ks%NBU__0+v5uVf%dk00)ch;R~Sco^cBAMaSeyCLBPTkYfjHv!}sSR()c literal 0 HcmV?d00001 diff --git a/Tests/images/crash-7d4c83eb92150fb8f1653a697703ae06ae7c4998.j2k b/Tests/images/crash-7d4c83eb92150fb8f1653a697703ae06ae7c4998.j2k new file mode 100644 index 0000000000000000000000000000000000000000..fd2f4dd367773b472569bd41715b6892aa4f74b3 GIT binary patch literal 335 zcmZQzVBpCLP*C9IYUg5LU=T?wsVvAUFj4@r8KAT?kj?;d#WFKeih#5N7&Ec6GXfb5 z{K@$_MPL?#AdoAToRXTxzyy*30!APN1E3Mf|NZ|5GU$N03P2KsVL$=M0AUDV5^rQ= zXJq^z#J~d-U}RurVPRnWAHyK5;1LiI0Yd>E9s&PTfR-|PCuS$6lKW-7{-3}A z@(2S%4N%YI<5yT1X8;L~faMQZ*gl^>z`_$>WlejaJCOIozHBX{G&^n;(f8O#>WT$jAqG~@M=OACIoFwC8{l95GQ Z;KspEJPh&6k9REK-H`Btt@iQ%n*cICSFQj6 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-ccca68ff40171fdae983d924e127a721cab2bd50.j2k b/Tests/images/crash-ccca68ff40171fdae983d924e127a721cab2bd50.j2k new file mode 100644 index 0000000000000000000000000000000000000000..c3ad0d6330a7920f58a809e01c8691014ad70fe0 GIT binary patch literal 335 zcmZQzVBpCLP*C9IYUg5LU=T?wsVvAUFj4@r8KAT?kj?;d#WFKeih#5N7&Ec6GXfb5 z{K@$_MPL?#AdoAToRXTxzyy*30!APN1E3Mf|NZ|5GU$N03P2KsVL$=M0AUDVl8}&K zXJq^z#J~d-U}RurVPRnWAHyK5;1LiI0Yd>E9s&PTfR-|PCuS$6lKW-7{-3}A z@(2S%4N%YI<5yT1X8;L~faMQZ*gl^>z`_$>WlejaJCOIozHBX{G&^n;(f8O#>WT$jAqG~@M=OACIoFwC8{l95GQ Z;KspEJPh&6k9REK-H`Btt@iQ%n*jHaS6u)A literal 0 HcmV?d00001 diff --git a/Tests/images/crash-d2c93af851d3ab9a19e34503626368b2ecde9c03.j2k b/Tests/images/crash-d2c93af851d3ab9a19e34503626368b2ecde9c03.j2k new file mode 100644 index 0000000000000000000000000000000000000000..3aadfc3772717bef34360b9138f56365a07728da GIT binary patch literal 3886 zcmV+}57F@dPybN>DF6Tf002M$002M$0000000000002M$002M$00000000000S^H| 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 13ae09af5..5523d068b 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -231,3 +231,19 @@ def test_parser_feed(): # Assert assert p.image.size == (640, 480) + + +@pytest.mark.parametrize( + "test_file", + [ + "Tests/images/crash-4fb027452e6988530aa5dabee76eecacb3b79f8a.j2k", + "Tests/images/crash-7d4c83eb92150fb8f1653a697703ae06ae7c4998.j2k", + "Tests/images/crash-ccca68ff40171fdae983d924e127a721cab2bd50.j2k", + "Tests/images/crash-d2c93af851d3ab9a19e34503626368b2ecde9c03.j2k", + ], +) +def test_crashes(test_file): + with open(test_file, "rb") as f: + with Image.open(f) as im: + # Valgrind should not complain here + im.load() diff --git a/src/libImaging/Jpeg2KDecode.c b/src/libImaging/Jpeg2KDecode.c index a2a7354db..aa4fc58f7 100644 --- a/src/libImaging/Jpeg2KDecode.c +++ b/src/libImaging/Jpeg2KDecode.c @@ -644,7 +644,7 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { j2k_unpacker_t unpack = NULL; size_t buffer_size = 0, tile_bytes = 0; unsigned n, tile_height, tile_width; - int components; + int total_component_width = 0; stream = opj_stream_create(BUFFER_SIZE, OPJ_TRUE); @@ -814,23 +814,40 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) { goto quick_exit; } - /* Sometimes the tile_info.datasize we get back from openjpeg - is less than numcomps*w*h, and we overflow in the - shuffle stage */ - - tile_width = tile_info.x1 - tile_info.x0; - tile_height = tile_info.y1 - tile_info.y0; - components = tile_info.nb_comps == 3 ? 4 : tile_info.nb_comps; - if ((tile_width > UINT_MAX / components) || - (tile_height > UINT_MAX / components) || - (tile_width > UINT_MAX / (tile_height * components)) || - (tile_height > UINT_MAX / (tile_width * components))) { + if (tile_info.nb_comps != image->numcomps) { state->errcode = IMAGING_CODEC_BROKEN; state->state = J2K_STATE_FAILED; goto quick_exit; } - tile_bytes = tile_width * tile_height * components; + /* Sometimes the tile_info.datasize we get back from openjpeg + is less than sum(comp_bytes)*w*h, and we overflow in the + shuffle stage */ + + tile_width = tile_info.x1 - tile_info.x0; + tile_height = tile_info.y1 - tile_info.y0; + + /* Total component width = sum (component_width) e.g, it's + legal for an la file to have a 1 byte width for l, and 4 for + a. and then a malicious file could have a smaller tile_bytes + */ + + for (n=0; n < tile_info.nb_comps; n++) { + // see csize /acsize calcs + int csize = (image->comps[n].prec + 7) >> 3; + csize = (csize == 3) ? 4 : csize; + total_component_width += csize; + } + if ((tile_width > UINT_MAX / total_component_width) || + (tile_height > UINT_MAX / total_component_width) || + (tile_width > UINT_MAX / (tile_height * total_component_width)) || + (tile_height > UINT_MAX / (tile_width * total_component_width))) { + state->errcode = IMAGING_CODEC_BROKEN; + state->state = J2K_STATE_FAILED; + goto quick_exit; + } + + tile_bytes = tile_width * tile_height * total_component_width; if (tile_bytes > tile_info.data_size) { tile_info.data_size = tile_bytes; From 5a5e6db0abf4e7a638fb1b3408c4e495a096cb92 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 8 Mar 2021 20:31:41 +0100 Subject: [PATCH 512/750] Fix EPS DOS on _open -- CVE-2021-28677 * The readline used in EPS has to deal with any combination of \r and \n as line endings. It used an accidentally quadratic method of accumulating lines while looking for a line ending. * A malicious EPS file could use this to perform a DOS of Pillow in the open phase, before an image was accepted for opening. * This dates to the PIL Fork --- ...675703545fee17acab56e5fec644c19979175de.eps | Bin 0 -> 549784 bytes Tests/test_file_eps.py | 15 ++++++++++++++- src/PIL/EpsImagePlugin.py | 8 ++++---- 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Tests/images/timeout-d675703545fee17acab56e5fec644c19979175de.eps diff --git a/Tests/images/timeout-d675703545fee17acab56e5fec644c19979175de.eps b/Tests/images/timeout-d675703545fee17acab56e5fec644c19979175de.eps new file mode 100644 index 0000000000000000000000000000000000000000..5000ca9aa5574b9282ef371f857fdbc5b3528215 GIT binary patch literal 549784 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

J*y`E|NhqBN9x@@1S;pn@9*Inir->oKL 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 Gk^Oori0m2oAS* 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