From 07a86bacc977d3b699586bcacf880b9c7531643b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 6 Sep 2017 13:14:39 +1000 Subject: [PATCH 0001/1393] Removed duplicate code --- src/PIL/GdImageFile.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 09ab5ec6964..5b7dc3d7683 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -25,16 +25,9 @@ from . import ImageFile, ImagePalette from ._binary import i16be as i16 -from ._util import isPath __version__ = "0.1" -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - ## # Image plugin for the GD uncompressed format. Note that this format @@ -78,13 +71,7 @@ def open(fp, mode="r"): if mode != "r": raise ValueError("bad mode") - if isPath(fp): - filename = fp - fp = builtins.open(fp, "rb") - else: - filename = "" - try: - return GdImageFile(fp, filename) + return GdImageFile(fp) except SyntaxError: raise IOError("cannot identify this image file") From e0c6ca9b6141d64c2055ca36ba83455b65e3aa9f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 6 Sep 2017 13:14:47 +1000 Subject: [PATCH 0002/1393] Corrected info key --- src/PIL/GdImageFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 5b7dc3d7683..645aae6e348 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -51,7 +51,7 @@ def _open(self): # transparency index tindex = i16(s[5:7]) if tindex < 256: - self.info["transparent"] = tindex + self.info["transparency"] = tindex self.palette = ImagePalette.raw("RGB", s[7:]) From 6c61de97ad41f4ee993196bc17ebd6283f0d1603 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 17 Sep 2017 20:15:59 +1000 Subject: [PATCH 0003/1393] Added GD tests --- Tests/images/hopper.gd | Bin 0 -> 17421 bytes Tests/test_file_gd.py | 28 ++++++++++++++++++++++++++++ src/PIL/GdImageFile.py | 18 ++++++++++++------ 3 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 Tests/images/hopper.gd create mode 100644 Tests/test_file_gd.py diff --git a/Tests/images/hopper.gd b/Tests/images/hopper.gd new file mode 100644 index 0000000000000000000000000000000000000000..82d2408f93ef67c49ca6e7b09e00cfd9b040bac4 GIT binary patch literal 17421 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�<#b*Cc>oIKGFfE?U-<>R!pc6gWDuqOpV>V=-tzmgB)1 zIw4JX;SoK$D)5E>_hG~>5#UQeOKG*^fKTfNMxzn zlj(?m$@l!MB!H4;ieiBOt0((893goABu>2?u!}c$zgAVoI~_9rg)3gn2Wzf9Rd5Ke zG;rI=sooP}$VV*3!+xZH^eM^xlBxU?awezYVS*JMr*GJl7{H`o@C08})S)p3JOK@F zOZ7(>D9{$Ky&wx+q^=hnAb@ll+}$Tc+g0Ev!~S&acq5Rk2R4C|417tj^g`3prv}5) zwNj@a6*Z%>8r_hxV<44ZkNQf(K-rZR5mG7_?ajHa53VWA06!? zIXnOoE+30xlk21fA7Utxhp)wsWotdbfB3s$QWpeLUf*|6&xk?=Yn65Z#R{0xiD;?h zNT@?v+Xmp1|9SX(@EM!u?>}$NjhT<6^9us#B7Nc^P4Xx^uH@X~qkuz8kEbKcAUM}t z3IOm09{PQ)40CFzSV%&d3=W`Ek%qLu%61wTrOB|L9|sD3V9@$sM^yP=SUP+RE=e!= z&l_BYk0=_XA9Du?7uEtlt8wXZ`ezkNbzpKK@UJoWzkq?GzB>Qk=XrZq3-$3l8;UCV zpBhetp`g~*0sCP-p0K1-^V8$Tqd)!&;qJV$3m1;;&&kOdle53`hWBHv@uspu|16Pm zZ|UxNbCm-P9aP`Y-BWABbSlI@`{AEHd+o#5KKS>a{wfS40wjr&qvI4FBJOcK{=Oi? z>5V@;YuA}`cgo$RWk<&3**RuuGd`j>G5nvLJc^q}=8=`nx5hLczOd}p zg{4Q1j2Qz5bar;`zaY?u)W=|f>ng!eRayC+|JftBc*7MOW*Pu5QVtH3t@`#z)Ui)* zUETl7tsnmR=AYLL`t74{Ui-(B-98JS=2IK!g@I0yW_#&eJ?f7O_*@shNWZb>_^^3r z%gQ7IM>>xj*}rrt5)uTcaR}L;o?TF-S65xxef$^yvxvkC zWi&wIjRa8QtHO=5)z$m7GK|0hj~s*JQF1a@2R429;s1X4uXn%u=$A|1z4>nH@u!+z z`}Z4YKi!U}iB3=_Xy6-^q0rwO{*rwhg_tP$KFB~_ReHLFt_6F1h}gl==IUy?Y`~fD zg5y!~G84bLyu`QY$6XN3Q3x4;K~ARy_FLHH}M|B`p? z=~bApJYw(-30pEBzT-nU$Rt!x!%|61VGQaIZkvDg{xh#Xu6y#c4?o?%cGIlkhra#d zpJ%tc_wOg4eC?+vf4YWDAh#nCBnK$<_4U!wZ<63>5+p6XjkZVtETltN0gyKw#(x?i z8F_>CN`p+mKLaGqeB{*EQ@=i$zF}a8sw!S}(uIE#z*IdJiTJsa$`D0AC~IxX`g(8r z5tMXh7)X_$R}4buJDeST4l-mi`VyRn=aCZMDu+Yy(@3Uor48%PXGV_ literal 0 HcmV?d00001 diff --git a/Tests/test_file_gd.py b/Tests/test_file_gd.py new file mode 100644 index 00000000000..326b0c4b27d --- /dev/null +++ b/Tests/test_file_gd.py @@ -0,0 +1,28 @@ +from helper import unittest, PillowTestCase + +from PIL import GdImageFile + +import io + +TEST_GD_FILE = "Tests/images/hopper.gd" + + +class TestFileGd(PillowTestCase): + + def test_sanity(self): + im = GdImageFile.open(TEST_GD_FILE) + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, "GD") + + def test_bad_mode(self): + self.assertRaises(ValueError, + GdImageFile.open, TEST_GD_FILE, 'bad mode') + + def test_invalid_file(self): + invalid_file = "Tests/images/flower.jpg" + + self.assertRaises(IOError, GdImageFile.open, invalid_file) + + +if __name__ == '__main__': + unittest.main() diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 645aae6e348..2ca1e821854 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -24,7 +24,7 @@ from . import ImageFile, ImagePalette -from ._binary import i16be as i16 +from ._binary import i8, i16be as i16, i32be as i32 __version__ = "0.1" @@ -43,19 +43,25 @@ class GdImageFile(ImageFile.ImageFile): def _open(self): # Header - s = self.fp.read(775) + s = self.fp.read(1037) + + if not i16(s[:2]) in [65534, 65535]: + raise SyntaxError("Not a valid GD 2.x .gd file") self.mode = "L" # FIXME: "P" - self.size = i16(s[0:2]), i16(s[2:4]) + self.size = i16(s[2:4]), i16(s[4:6]) + + trueColor = i8(s[6]) + trueColorOffset = 2 if trueColor else 0 # transparency index - tindex = i16(s[5:7]) + tindex = i32(s[7+trueColorOffset:7+trueColorOffset+4]) if tindex < 256: self.info["transparency"] = tindex - self.palette = ImagePalette.raw("RGB", s[7:]) + self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4]) - self.tile = [("raw", (0, 0)+self.size, 775, ("L", 0, -1))] + self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, ("L", 0, 1))] def open(fp, mode="r"): From dc5e28078517e5fb8c45ce143375faf8e7fb11b3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Jan 2018 12:22:22 +1100 Subject: [PATCH 0004/1393] 5.1.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 f8f2a9841ff..fbf87ab58dc 100644 --- a/src/PIL/version.py +++ b/src/PIL/version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.0.0' +__version__ = '5.1.0.dev0' From 9572b28fd74e356f560b49915c67ab6b4a41854a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Jan 2018 12:51:54 +1100 Subject: [PATCH 0005/1393] Changed documentation references to 2.x to 2.7 [ci skip] --- .github/CONTRIBUTING.md | 2 +- docs/installation.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 5e467c4b138..6c6e9b61222 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 on both Python 2.x and 3.x. 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 [Coveralls](https://coveralls.io/repos/new) to see if the changed code is covered by tests. +- Run the test suite on Python 2.7 and 3.x. 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 [Coveralls](https://coveralls.io/repos/new) 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 diff --git a/docs/installation.rst b/docs/installation.rst index 893ed3556d1..f1877f6dbb0 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -88,7 +88,7 @@ Pillow can be installed on FreeBSD via the official Ports or Packages systems: The `Pillow FreeBSD port `_ and packages are tested by the ports team with all supported FreeBSD versions - and against Python 2.x and 3.x. + and against Python 2.7 and 3.x. Building From Source From 0fcfac8cdc6baf89bc938d40046d9a23528fc883 Mon Sep 17 00:00:00 2001 From: Hugo Posnic Date: Tue, 2 Jan 2018 19:15:55 +0100 Subject: [PATCH 0006/1393] Remove the broken Gratipay link This page doesn't exist anymore so... --- docs/index.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 55ba13bb712..8ee910bbdf0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -40,12 +40,6 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors - Support via Gratipay - - Indices and tables ================== From bad730ecff6fb05a59e7461dd3b1852efa263c4c Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 3 Jan 2018 10:28:27 +0000 Subject: [PATCH 0007/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9a33a67b9ac..434225d867a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,12 @@ Changelog (Pillow) ================== +5.1.0 (unreleased) +------------------ + +- Docs: Changed documentation references to 2.x to 2.7 #2921 + [radarhere] + 5.0.0 (2018-01-01) ------------------ From 62b2bdf909fb5c76513be5bc3aecd25d915d8949 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Jan 2018 14:56:18 +1100 Subject: [PATCH 0008/1393] Removed unused imports --- Tests/test_image_access.py | 1 - Tests/test_lib_pack.py | 4 ++-- Tests/test_uploader.py | 2 -- src/PIL/SgiImagePlugin.py | 3 +-- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index d0fcea1d444..464e0a20866 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -258,7 +258,6 @@ class TestEmbeddable(unittest.TestCase): def test_embeddable(self): import subprocess import ctypes - import setuptools from distutils import ccompiler, sysconfig with open('embed_pil.c', 'w') as fh: diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index c5eb2686cf5..771c5d5c8ea 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -1,6 +1,6 @@ import sys -from helper import unittest, PillowTestCase, py3 +from helper import unittest, PillowTestCase from PIL import Image @@ -223,7 +223,7 @@ def test_L(self): self.assert_unpack("L", "L;R", 1, 128, 64, 192, 32) self.assert_unpack("L", "L;16", 2, 2, 4, 6, 8) self.assert_unpack("L", "L;16B", 2, 1, 3, 5, 7) - self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) + self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) diff --git a/Tests/test_uploader.py b/Tests/test_uploader.py index b52ea10f6f3..9d1f164c2ab 100644 --- a/Tests/test_uploader.py +++ b/Tests/test_uploader.py @@ -1,7 +1,5 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image - class TestUploader(PillowTestCase): def check_upload_equal(self): diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 768f755882c..7966491d2c3 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -23,10 +23,9 @@ from . import Image, ImageFile -from ._binary import i8, o8, i16be as i16, o16be as o16 +from ._binary import i8, o8, i16be as i16 import struct import os -import sys __version__ = "0.3" From 30b2ddd070f5b00984877dad91010e727e176d5a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Jan 2018 15:40:46 +1100 Subject: [PATCH 0009/1393] Removed duplicate imports --- Tests/test_file_gif.py | 2 -- Tests/test_file_jpeg.py | 1 - Tests/test_file_tiff.py | 1 - 3 files changed, 4 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 22a2c007261..9d671561d56 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -475,8 +475,6 @@ def test_transparent_optimize(self): # that's > 128 items where the transparent color is actually # the top palette entry to trigger the bug. - from PIL import ImagePalette - data = bytes(bytearray(range(1, 254))) palette = ImagePalette.ImagePalette("RGB", list(range(256))*3) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 747c3d7dea3..7b58fc426ab 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -576,7 +576,6 @@ def setUp(self): def test_fd_leak(self): tmpfile = self.tempfile("temp.jpg") - import os with Image.open("Tests/images/hopper.jpg") as im: im.save(tmpfile) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 6edc94aed7d..393f4a7a46a 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -388,7 +388,6 @@ def test_with_underscores(self): 'y_resolution': 36} filename = self.tempfile("temp.tif") hopper("RGB").save(filename, **kwargs) - from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION im = Image.open(filename) # legacy interface From 3916563a1b5d219c4dc5c8f9aed5239b966bd4af Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 4 Jan 2018 09:33:10 +0200 Subject: [PATCH 0010/1393] Move Tk files to src --- setup.py | 4 ++-- {Tk => src/Tk}/_tkmini.h | 0 {Tk => src/Tk}/tkImaging.c | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {Tk => src/Tk}/_tkmini.h (100%) rename {Tk => src/Tk}/tkImaging.c (100%) diff --git a/setup.py b/setup.py index 98d482738fa..ebff9a17e82 100755 --- a/setup.py +++ b/setup.py @@ -657,8 +657,8 @@ def build_extensions(self): tk_libs = ['psapi'] if sys.platform == 'win32' else [] exts.append(Extension("PIL._imagingtk", - ["src/_imagingtk.c", "Tk/tkImaging.c"], - include_dirs=['Tk'], + ["src/_imagingtk.c", "src/Tk/tkImaging.c"], + include_dirs=['src/Tk'], libraries=tk_libs)) exts.append(Extension("PIL._imagingmath", ["src/_imagingmath.c"])) diff --git a/Tk/_tkmini.h b/src/Tk/_tkmini.h similarity index 100% rename from Tk/_tkmini.h rename to src/Tk/_tkmini.h diff --git a/Tk/tkImaging.c b/src/Tk/tkImaging.c similarity index 100% rename from Tk/tkImaging.c rename to src/Tk/tkImaging.c From a795b40b056cbbd4f69f73f0e4afb2867576df7f Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 4 Jan 2018 11:18:20 +0200 Subject: [PATCH 0011/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 434225d867a..9b4b38d0b2f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Remove unused and duplicate imports #2927 + [radarhere] + - Docs: Changed documentation references to 2.x to 2.7 #2921 [radarhere] From bfb0a94439232df52c8b8979c465e0ca9de87db8 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 4 Jan 2018 12:09:01 +0200 Subject: [PATCH 0012/1393] Add Twitter badge --- README.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index e217ba29d5e..d48e88bf73e 100644 --- a/README.rst +++ b/README.rst @@ -17,8 +17,8 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Thu, 4 Jan 2018 15:19:59 +0200 Subject: [PATCH 0013/1393] Docs: Escape the s next to inline code formatting --- docs/releasenotes/5.0.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/5.0.0.rst b/docs/releasenotes/5.0.0.rst index 2bbeed11f99..6f61fbd858e 100644 --- a/docs/releasenotes/5.0.0.rst +++ b/docs/releasenotes/5.0.0.rst @@ -17,7 +17,7 @@ Decompression Bombs now raise Exceptions Pillow has previously emitted warnings for images that are unexpectedly large and may be a denial of service. These warnings are -now upgraded to ``DecompressionBombError``s for images that are twice +now upgraded to ``DecompressionBombError``\s for images that are twice the size of images that trigger the ``DecompressionBombWarning``. The default threshold is 128Mpx, or 0.5GB for an ``RGB`` or ``RGBA`` image. This can be disabled or changed by setting From 928ff7f8c4b6e7141e4525f405e477956e24837b Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Thu, 4 Jan 2018 05:24:03 -0800 Subject: [PATCH 0014/1393] Sort requirements.txt alphabetically --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4cb3c090704..cd3de4e1ffc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,11 +13,11 @@ Jinja2 MarkupSafe olefile pycodestyle -pytest -pytest-cov pyflakes Pygments pyroma +pytest +pytest-cov pytz requests six From 9cf5371571d83cb3c393bcb7a088ca6a56d27888 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Thu, 4 Jan 2018 05:30:53 -0800 Subject: [PATCH 0015/1393] Enable pip cache in Travis CI Can speed up builds and reduce load on PyPI servers. For more information, see: https://docs.travis-ci.com/user/caching/#pip-cache --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1b8d854bcee..cc06084a50c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: python +cache: pip notifications: irc: "chat.freenode.net#pil" From 4e69b9c5531b3308725e023ce77e1574608451d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 4 Jan 2018 20:46:04 +1100 Subject: [PATCH 0016/1393] Skip outline if the draw operation fills with the same colour --- src/PIL/ImageDraw.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 89df2733811..80a9f6023a6 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -138,7 +138,7 @@ def chord(self, xy, start, end, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_chord(xy, start, end, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_chord(xy, start, end, ink, 0) def ellipse(self, xy, fill=None, outline=None): @@ -146,7 +146,7 @@ def ellipse(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_ellipse(xy, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_ellipse(xy, ink, 0) def line(self, xy, fill=None, width=0): @@ -161,7 +161,7 @@ def shape(self, shape, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_outline(shape, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_outline(shape, ink, 0) def pieslice(self, xy, start, end, fill=None, outline=None): @@ -169,7 +169,7 @@ def pieslice(self, xy, start, end, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_pieslice(xy, start, end, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_pieslice(xy, start, end, ink, 0) def point(self, xy, fill=None): @@ -183,7 +183,7 @@ def polygon(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_polygon(xy, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_polygon(xy, ink, 0) def rectangle(self, xy, fill=None, outline=None): @@ -191,7 +191,7 @@ def rectangle(self, xy, fill=None, outline=None): ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_rectangle(xy, fill, 1) - if ink is not None: + if ink is not None and ink != fill: self.draw.draw_rectangle(xy, ink, 0) def _multiline_check(self, text): From 4d3339b70376a25158156130a27788fdde6bf114 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 5 Jan 2018 11:26:24 +1100 Subject: [PATCH 0017/1393] Added tests --- Tests/images/imagedraw_outline_chord_L.png | Bin 0 -> 212 bytes Tests/images/imagedraw_outline_chord_RGB.png | Bin 0 -> 259 bytes Tests/images/imagedraw_outline_ellipse_L.png | Bin 0 -> 290 bytes .../images/imagedraw_outline_ellipse_RGB.png | Bin 0 -> 378 bytes Tests/images/imagedraw_outline_pieslice_L.png | Bin 0 -> 266 bytes .../images/imagedraw_outline_pieslice_RGB.png | Bin 0 -> 340 bytes Tests/images/imagedraw_outline_polygon_L.png | Bin 0 -> 309 bytes .../images/imagedraw_outline_polygon_RGB.png | Bin 0 -> 393 bytes .../images/imagedraw_outline_rectangle_L.png | Bin 0 -> 125 bytes .../imagedraw_outline_rectangle_RGB.png | Bin 0 -> 212 bytes Tests/images/imagedraw_outline_shape_L.png | Bin 0 -> 263 bytes Tests/images/imagedraw_outline_shape_RGB.png | Bin 0 -> 316 bytes Tests/test_imagedraw.py | 41 ++++++++++++++++++ 13 files changed, 41 insertions(+) create mode 100644 Tests/images/imagedraw_outline_chord_L.png create mode 100644 Tests/images/imagedraw_outline_chord_RGB.png create mode 100644 Tests/images/imagedraw_outline_ellipse_L.png create mode 100644 Tests/images/imagedraw_outline_ellipse_RGB.png create mode 100644 Tests/images/imagedraw_outline_pieslice_L.png create mode 100644 Tests/images/imagedraw_outline_pieslice_RGB.png create mode 100644 Tests/images/imagedraw_outline_polygon_L.png create mode 100644 Tests/images/imagedraw_outline_polygon_RGB.png create mode 100644 Tests/images/imagedraw_outline_rectangle_L.png create mode 100644 Tests/images/imagedraw_outline_rectangle_RGB.png create mode 100644 Tests/images/imagedraw_outline_shape_L.png create mode 100644 Tests/images/imagedraw_outline_shape_RGB.png diff --git a/Tests/images/imagedraw_outline_chord_L.png b/Tests/images/imagedraw_outline_chord_L.png new file mode 100644 index 0000000000000000000000000000000000000000..9c20ad217141450ac3ffd9bc6e6a6ae6e9ea6aeb GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5yWGui7$e$$~yckOl^Z2bE%#>1V}nANd-;FQjjRdFu*)*UA1hi7_Ad zl>B|;_m1=Av(OO#_bORSSFN@F7<}qfT1=i-ta-hE+ikDlt7VUtl$ieN`Je6g`=99? z+m+#lQKeRrp~mMd&I(L@R4bl$BC_xAYBt5=bN-aDF)$psTJ~?Z(DfyH1+pN!Jzf1= J);T3K0RW^dR@wjn literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_chord_RGB.png b/Tests/images/imagedraw_outline_chord_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9cb5af006f84b806867b586948cd1b21e668c3 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^DImsV8LPK9oMvXgoV7CaQ=eTc7-)eiJ}~<9U@pyZkS}A z?YBW|Zm7bVrhB_G+MWc>3G3t24hJGrTi3{Qkas zk*s?Y&zgt7?t44ebY}SXxZ?E8zs~l>Jv+<8?pGd@`_ZPYeLE>!>hpP}%GfvGe!T0y qVis0&X!^-0`z2*w3n5NBuy-$G&o4H|_cdiRKq8*5elF{r5}E)|>1!?k literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_ellipse_L.png b/Tests/images/imagedraw_outline_ellipse_L.png new file mode 100644 index 0000000000000000000000000000000000000000..53b76b62b4210515d1dc2901d7b6fc59116ac085 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5A0m|KGp8*o2aut|H!8*U{VQ;_tq~xSue{b)7#QE5%iKTOT$UNRNqW%)$m2rRnyit4Zk@Z>VkeA7@=s zH?o?QU%M;G+vmI*{|DQM)%GhdlXg)SKC&ew24b8@vT8jr(DqFt!C>3zCMszcS<|_y6tKO>1#*lz3%tFmJ;_esyMy# zAFFk7&(7+wcQ(o5H3$8}-gm@ip8fx9?FQpL`4z|9_nZWUDi9Q~KRzKBoyz#e9K`c< L^>bP0l+XkKcy*%w literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_pieslice_L.png b/Tests/images/imagedraw_outline_pieslice_L.png new file mode 100644 index 0000000000000000000000000000000000000000..92972d54cc927111bbf41eb7b793e277493f04f4 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5b!~gswEzg%q zKMH)+k$h50pn8Vbk)SGp#cD3{OS6SSZ)WcN68K9kaLV3k*@8y#>+h;XHv3%9-tFli z=dAQ!_OeHer*3%2$=JyYChhrPs9IhAH)vVWFR{KelkTfCF5Mux{#4A`Hx=J?mL?xv zedXLb!=HD$)>Nkd(UJ!w#Kfx%vWm%ZX&Ot)Nb2YJ%d L)z4*}Q$iB}XDe~C literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_pieslice_RGB.png b/Tests/images/imagedraw_outline_pieslice_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..4be4fc4afbbf34a16d3278dd597362399de0ed76 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^DIm&5H; z{@dSfz0e!R<9qB$;rUCw4<|7moCs781Kan`lY4Ndtm0DQ1wP|B7RP>76+EikxbIs3 zzqo(LOm6R8*2#AK*4j6wcGJYZ6?H5Pb-$!?ZQZWvp*o`9i@HNk8HC*}k~|g^seeAg zH77Y#XL_!V=$E3tseKWQ&o&nMFREMyKPBPFi`quD5e3+g`P!L3_gU?k8^i@}ll+ z_tNK8y**2-_gc9V a4ov0$CN31iGq1x9B8V+ZHr4o!2_x3LISRL{{F=aV--xaT)lN`S2 z@dRmX^;diu>+8-ZXzr%8@zO;drP75H9WrC(BHz8)&B?LfkaedPgQjARIPcE@0e_cs zyBGRtIpzAe-Q#k5dE$@#M+@QmdNRigLFl=ACF7Ud`XLHo5-y0C-!{qq_sP3SSDtguyUKhLrxanERCzpkvl6tx^<$`v0V_$^Pi>Zq=r#-7u zJ@>YI>EG{HrM%znEjnI$JSchn7f0reTfSA#>0J6NPV~Hd_tMtyrjp*Nd%NVUWxQ9v z%eI@gsru^G?Hx<^nCt8fo*r@QgRRujOQq{y-HF@yq&B{6qsZH<0XGe&ox8v1xtwqE z$xqc^dYATBZ%y6Wr@HxfQUB8YRi)Qr1iasOo7}(K7xC$b-1Q@uyx0G$nVod<@xEz4 im;En?hYbTmgYy1woJ>=gBP$PrL_J;oT-G@yGywpHPr0xF literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_rectangle_L.png b/Tests/images/imagedraw_outline_rectangle_L.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c47018fb435b7916a92051c6e3b78046c1828f GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5?LEc!(!8PgVbG9L%=Jzf1= J);T3K0RX!!He~<+ literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_shape_L.png b/Tests/images/imagedraw_outline_shape_L.png new file mode 100644 index 0000000000000000000000000000000000000000..20ebef1578cf9c919e8d4e6094bf231a5abe6fcb GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5zi$2M z)W*M`SRXD_+qQh}&ybT(n2IJm(4VQ|x!%HYlF9L@_Z>d1og@-wpF1g`&QEBoMy7se z>ck^1p6;F+t5uXv1$};~`$j%>?T;_#U&yAeHlOWZD=TlY+h*~bY~P#K%d1asyj!!Y z=1@xLCzT?OV3RDJKX(nDRw#GowQh{svi-wXgJ&MroqBC6O~R+fTnPDWuCmpeZO%lsV=7B^-+ki&`2`Bz?O_zrmzLe!>j?5DgQu&X%Q~lo FCIBt_Yasvt literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_outline_shape_RGB.png b/Tests/images/imagedraw_outline_shape_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb6f623e4b01621b35cb6e939343f1386734036 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^DImziq!6ST9>6{ZG7haGT> z+}x`@zq~r~^OvnNucS(BSiMH_*jDxAHSLQ3f8UIEd}Ab&pR~}0{V~76M&^_J_a0Qw zzp?T2eBZlwkDOz%`+arc`p&sFxf?h1`mgagcj$D+hD}YJ+Hr2?V&R&hU#rg@of>*J z`0w_IQ~eumy)XTGdCiXtZodqejBL$HynsGO1<$@QZZzczjaa`hA0*-F>gTe~DWM4f DE;olO literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index a79a75ca0dd..62b11e98c64 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -572,6 +572,47 @@ def test_textsize_empty_string(self): draw.textsize("\n") draw.textsize("test\n") + def test_same_color_outline(self): + # Prepare shape + x0, y0 = 5, 5 + x1, y1 = 5, 50 + x2, y2 = 95, 50 + x3, y3 = 95, 5 + + s = ImageDraw.Outline() + s.move(x0, y0) + s.curve(x1, y1, x2, y2, x3, y3) + s.line(x0, y0) + + # Begin + for mode in ["RGB", "L"]: + for fill, outline in [ + ["red", None], + ["red", "red"], + ["red", "#f00"] + ]: + for operation, args in { + 'chord':[BBOX1, 0, 180], + 'ellipse':[BBOX1], + 'shape':[s], + 'pieslice':[BBOX1, -90, 45], + 'polygon':[[(18, 30), (85, 30), (60, 72)]], + 'rectangle':[BBOX1] + }.items(): + # Arrange + im = Image.new(mode, (W, H)) + draw = ImageDraw.Draw(im) + + # Act + draw_method = getattr(draw, operation) + args += [fill, outline] + draw_method(*args) + + # Assert + expected = ("Tests/images/imagedraw_outline" + "_{}_{}.png".format(operation, mode)) + self.assert_image_similar(im, Image.open(expected), 1) + if __name__ == '__main__': unittest.main() From baef2abb8e10c82800148802d026ede1f71d4756 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 5 Jan 2018 08:53:59 +0200 Subject: [PATCH 0018/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9b4b38d0b2f..d200ee69ea7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Enable pip cache in Travis CI #2933 + [jdufresne] + - Remove unused and duplicate imports #2927 [radarhere] From 0ac6d6ad52e9ae548a1340466bd2d4ddd0b8de7e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 5 Jan 2018 10:37:03 +0000 Subject: [PATCH 0019/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d200ee69ea7..c7fc708548c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Move Tk directory to src directory #2928 + [hugovk] + - Enable pip cache in Travis CI #2933 [jdufresne] From 4bc33d3e4aa3523d3dddca8adae3216f5628622f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 5 Jan 2018 15:53:50 +0000 Subject: [PATCH 0020/1393] Remove _imaging.crc32 in favor or builtin python crc32 implementation --- setup.py | 2 +- src/PIL/PngImagePlugin.py | 17 ++++---- src/_imaging.c | 21 ---------- src/libImaging/Crc32.c | 87 --------------------------------------- 4 files changed, 9 insertions(+), 118 deletions(-) delete mode 100644 src/libImaging/Crc32.c diff --git a/setup.py b/setup.py index 98d482738fa..d964194493a 100755 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ _LIB_IMAGING = ( "Access", "AlphaComposite", "Resample", "Bands", "BcnDecode", "BitDecode", - "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crc32", "Crop", + "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crop", "Dib", "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", "Histo", "JpegDecode", "JpegEncode", "Matrix", "ModeFilter", diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 2031b179eb4..fd89213ed75 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -85,6 +85,9 @@ def _safe_zlib_decompress(s): raise ValueError("Decompressed Data Too Large") return plaintext +def _crc32(data, seed=0): + return zlib.crc32(data, seed) & 0xffffffff + # -------------------------------------------------------------------- # Support classes. Suitable for PNG and related formats like MNG etc. @@ -96,9 +99,6 @@ def __init__(self, fp): self.fp = fp self.queue = [] - if not hasattr(Image.core, "crc32"): - self.crc = self.crc_skip - def read(self): "Fetch a new chunk. Returns header information." cid = None @@ -147,8 +147,8 @@ def crc(self, cid, data): return try: - crc1 = Image.core.crc32(data, Image.core.crc32(cid)) - crc2 = i16(self.fp.read(2)), i16(self.fp.read(2)) + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) if crc1 != crc2: raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid) @@ -668,8 +668,8 @@ def putchunk(fp, cid, *data): fp.write(o32(len(data)) + cid) fp.write(data) - hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) - fp.write(o16(hi) + o16(lo)) + crc = _crc32(data, _crc32(cid)) + fp.write(o32(crc)) class _idat(object): @@ -843,8 +843,7 @@ def append(self, chunk): def append(fp, cid, *data): data = b"".join(data) - hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) - crc = o16(hi) + o16(lo) + crc = o32(_crc32(data, _crc32(cid))) fp.append((cid, data, crc)) fp = collector() diff --git a/src/_imaging.c b/src/_imaging.c index d90f23477bd..e50a06e84b6 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2920,26 +2920,6 @@ _effect_spread(ImagingObject* self, PyObject* args) /* UTILITIES */ /* -------------------------------------------------------------------- */ -static PyObject* -_crc32(PyObject* self, PyObject* args) -{ - unsigned char* buffer; - int bytes; - int hi, lo; - UINT32 crc; - - hi = lo = 0; - - if (!PyArg_ParseTuple(args, PY_ARG_BYTES_LENGTH"|(ii)", - &buffer, &bytes, &hi, &lo)) - return NULL; - - crc = ((UINT32) (hi & 0xFFFF) << 16) + (lo & 0xFFFF); - - crc = ImagingCRC32(crc, (unsigned char *)buffer, bytes); - - return Py_BuildValue("ii", (crc >> 16) & 0xFFFF, crc & 0xFFFF); -} static PyObject* _getcodecstatus(PyObject* self, PyObject* args) @@ -3593,7 +3573,6 @@ static PyMethodDef functions[] = { #endif /* Utilities */ - {"crc32", (PyCFunction)_crc32, 1}, {"getcodecstatus", (PyCFunction)_getcodecstatus, 1}, /* Special effects (experimental) */ diff --git a/src/libImaging/Crc32.c b/src/libImaging/Crc32.c deleted file mode 100644 index d83d0fbacb0..00000000000 --- a/src/libImaging/Crc32.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * The Python Imaging Library - * $Id$ - * - * calculate ISO 3307 checksum - * - * history: - * 96-12-10 fl: Created (based on example in the PNG spec) - * - * Copyright (c) Fredrik Lundh 1996. - * Copyright (c) Secret Labs AB 1997. - * - * See the README file for information on usage and redistribution. - */ - - -#include "Imaging.h" - - -/* Precalculated CRC values (created by makecrctable.py) */ - -static UINT32 crc32table[] = { 0x0, 0x77073096L, 0xEE0E612CL, -0x990951BAL, 0x76DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, -0xEDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x9B64C2BL, -0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, -0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, -0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, -0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, -0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, -0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, -0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, -0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, -0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, -0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, -0xB6662D3DL, 0x76DC4190L, 0x1DB7106L, 0x98D220BCL, 0xEFD5102AL, -0x71B18589L, 0x6B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, -0xF00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x86D3D2DL, -0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, -0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, -0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, -0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, -0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, -0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, -0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, -0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, -0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, -0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, -0xEDB88320L, 0x9ABFB3B6L, 0x3B6E20CL, 0x74B1D29AL, 0xEAD54739L, -0x9DD277AFL, 0x4DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, -0xD6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0xA00AE27L, -0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, -0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, -0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, -0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, -0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, -0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, -0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, -0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, -0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, -0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, -0xEC63F226L, 0x756AA39CL, 0x26D930AL, 0x9C0906A9L, 0xEB0E363FL, -0x72076785L, 0x5005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, -0xCB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0xBDBDF21L, -0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, -0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, -0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, -0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, -0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, -0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, -0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, -0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, -0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, -0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; - - -UINT32 -ImagingCRC32(UINT32 crc, UINT8* buffer, int bytes) -{ - int i; - - crc ^= 0xFFFFFFFFL; - - for (i = 0; i < bytes; i++) - crc = crc32table[(UINT8) crc ^ buffer[i]] ^ (crc >> 8); - - return crc ^ 0xFFFFFFFFL; -} From 59b9d1dc46ec8db95e93f2d2dac4f99bafa79a84 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Jan 2018 21:40:12 +1100 Subject: [PATCH 0021/1393] Simplified Image.open call --- src/PIL/IcnsImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 5c5bd7cf9e7..21fd558f234 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -359,7 +359,7 @@ def _save(im, fp, filename): imf.load() im = imf.im im.save('out-%s-%s-%s.png' % size) - im = Image.open(open(sys.argv[1], "rb")) + im = Image.open(sys.argv[1]) im.save("out.png") if sys.platform == 'windows': os.startfile("out.png") From 3c73043509c5c7b2a5e385fcbb5de1a341b4314f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Jan 2018 21:47:14 +1100 Subject: [PATCH 0022/1393] Simplified use of sys.argv --- src/PIL/SpiderImagePlugin.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index 5e5dde5a675..013560fe955 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -286,7 +286,7 @@ def _save_spider(im, fp, filename): if __name__ == "__main__": - if not sys.argv[1:]: + if len(sys.argv) < 2: print("Syntax: python SpiderImagePlugin.py [infile] [outfile]") sys.exit() @@ -295,10 +295,6 @@ def _save_spider(im, fp, filename): print("input image must be in Spider format") sys.exit() - outfile = "" - if len(sys.argv[1:]) > 1: - outfile = sys.argv[2] - im = Image.open(filename) print("image: " + str(im)) print("format: " + str(im.format)) @@ -307,7 +303,9 @@ def _save_spider(im, fp, filename): print("max, min: ", end=' ') print(im.getextrema()) - if outfile != "": + if len(sys.argv) > 2: + outfile = sys.argv[2] + # perform some image operation im = im.transpose(Image.FLIP_LEFT_RIGHT) print( From b7aab522e1f022e9f9fd101de1c6a4ad4d580685 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Jan 2018 21:51:45 +1100 Subject: [PATCH 0023/1393] Added syntax print statements --- src/PIL/IcnsImagePlugin.py | 5 +++++ src/PIL/ImageShow.py | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 21fd558f234..7c1bd5882c8 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -353,6 +353,11 @@ def _save(im, fp, filename): if __name__ == '__main__': + + if len(sys.argv) < 2: + print("Syntax: python IcnsImagePlugin.py [file]") + sys.exit() + imf = IcnsImageFile(open(sys.argv[1], 'rb')) for size in imf.info['sizes']: imf.size = size diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index bf8c67eb54c..fdd739920de 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -186,5 +186,9 @@ def get_command_ex(self, file, title=None, **options): register(XVViewer) if __name__ == "__main__": - # usage: python ImageShow.py imagefile [title] + + if len(sys.argv) < 2: + print("Syntax: python ImageShow.py imagefile [title]") + sys.exit() + print(show(Image.open(sys.argv[1]), *sys.argv[2:])) From 696b3819e89d203029a96ae747c034b6d44f7c66 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 6 Jan 2018 21:58:05 +1100 Subject: [PATCH 0024/1393] Combined two excerpt statements --- src/PIL/SpiderImagePlugin.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index 013560fe955..b65f181d80b 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -48,9 +48,7 @@ def isInt(f): return 1 else: return 0 - except ValueError: - return 0 - except OverflowError: + except (ValueError, OverflowError): return 0 iforms = [1, 3, -11, -12, -21, -22] From dca1247c472358753405e0d0f04919107c4c58e6 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 6 Jan 2018 20:45:17 +0200 Subject: [PATCH 0025/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index c7fc708548c..06a1f0e0505 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Remove _imaging.crc32 in favor or builtin Python crc32 implementation #2935 + [wiredfool] + - Move Tk directory to src directory #2928 [hugovk] From 1f4fd49a80ca090a7427efa02de035508cbeb6e8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 6 Jan 2018 17:55:29 +0300 Subject: [PATCH 0026/1393] unpack CMYK TIFFs optional channels --- src/PIL/TiffImagePlugin.py | 4 ++++ src/libImaging/Unpack.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index db3eaa50ec1..ec67506a2dd 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -233,6 +233,10 @@ (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), (II, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 691eec7c1d8..b9a882c6218 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1041,6 +1041,28 @@ copy4(UINT8* out, const UINT8* in, int pixels) memcpy(out, in, 4 * pixels); } +static void +copy4skip1(UINT8* _out, const UINT8* in, int pixels) +{ + int i; + UINT32* out = (UINT32*) _out; + for (i = 0; i < pixels; i++) { + out[i] = *(UINT32*)&in[0]; + in += 5; + } +} + +static void +copy4skip2(UINT8* _out, const UINT8* in, int pixels) +{ + int i; + UINT32* out = (UINT32*) _out; + for (i = 0; i < pixels; i++) { + out[i] = *(UINT32*)&in[0]; + in += 6; + } +} + /* Unpack to "I" and "F" images */ @@ -1344,6 +1366,8 @@ static struct { /* 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", "C", 8, band0}, From dc127273f437365cc0c986ef2c8488b1e86d4c4c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 6 Jan 2018 18:27:54 +0300 Subject: [PATCH 0027/1393] Add RGBXX RGBXXX YCbCrXX YCbCrXXX rawmodes for TIFFs --- Tests/test_lib_pack.py | 17 ++++++++++++++--- src/PIL/TiffImagePlugin.py | 10 ++++++++++ src/libImaging/Unpack.c | 4 ++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index c5eb2686cf5..e0aa0324de1 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -223,7 +223,7 @@ def test_L(self): self.assert_unpack("L", "L;R", 1, 128, 64, 192, 32) self.assert_unpack("L", "L;16", 2, 2, 4, 6, 8) self.assert_unpack("L", "L;16B", 2, 1, 3, 5, 7) - self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) + self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) @@ -339,6 +339,10 @@ def test_RGBX(self): self.assert_unpack("RGBX", "RGB;4B", 2, (17,0,34,X), (51,0,68,X)) self.assert_unpack("RGBX", "RGBX", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_unpack("RGBX", "RGBXX", 5, + (1,2,3,4), (6,7,8,9), (11,12,13,14)) + self.assert_unpack("RGBX", "RGBXXX", 6, + (1,2,3,4), (7,8,9,10), (13,14,15,16)) self.assert_unpack("RGBX", "RGBX;L", 4, (1,4,7,10), (2,5,8,11), (3,6,9,12)) self.assert_unpack("RGBX", "RGBX;16L", 8, (2,4,6,8), (10,12,14,16)) @@ -355,7 +359,12 @@ def test_RGBX(self): self.assert_unpack("RGBX", "X", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) def test_CMYK(self): - self.assert_unpack("CMYK", "CMYK", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_unpack("CMYK", "CMYK", 4, + (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_unpack("CMYK", "CMYKX", 5, + (1,2,3,4), (6,7,8,9), (11,12,13,14)) + self.assert_unpack("CMYK", "CMYKXX", 6, + (1,2,3,4), (7,8,9,10), (13,14,15,16)) self.assert_unpack("CMYK", "CMYK;I", 4, (254,253,252,251), (250,249,248,247), (246,245,244,243)) self.assert_unpack("CMYK", "CMYK;L", 4, @@ -376,8 +385,10 @@ def test_CMYK(self): def test_YCbCr(self): self.assert_unpack("YCbCr", "YCbCr", 3, (1,2,3), (4,5,6), (7,8,9)) self.assert_unpack("YCbCr", "YCbCr;L", 3, (1,4,7), (2,5,8), (3,6,9)) - self.assert_unpack("YCbCr", "YCbCrX", 4, (1,2,3), (5,6,7), (9,10,11)) self.assert_unpack("YCbCr", "YCbCrK", 4, (1,2,3), (5,6,7), (9,10,11)) + self.assert_unpack("YCbCr", "YCbCrX", 4, (1,2,3), (5,6,7), (9,10,11)) + self.assert_unpack("YCbCr", "YCbCrXX", 5, (1,2,3), (6,7,8), (11,12,13)) + self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1,2,3), (7,8,9), (13,14,15)) def test_LAB(self): self.assert_unpack("LAB", "LAB", 3, diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index ec67506a2dd..17f45693044 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -194,6 +194,10 @@ (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), @@ -240,6 +244,12 @@ (II, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), + (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), + (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index b9a882c6218..036cec5e482 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1352,6 +1352,8 @@ static struct { {"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}, @@ -1383,6 +1385,8 @@ static struct { {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, {"YCbCr", "YCbCr;L", 24, unpackRGBL}, {"YCbCr", "YCbCrX", 32, copy4}, + {"YCbCr", "YCbCrXX", 40, copy4skip1}, + {"YCbCr", "YCbCrXXX", 48, copy4skip2}, {"YCbCr", "YCbCrK", 32, copy4}, /* LAB Color */ From 4bde7258d4eddb221ce905b89d6a57c61fc89fa1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 10 Jan 2018 22:22:44 +1100 Subject: [PATCH 0028/1393] Fixed typo [ci skip] --- CHANGES.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 06a1f0e0505..aca922149b2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,12 +5,12 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ -- Remove _imaging.crc32 in favor or builtin Python crc32 implementation #2935 +- Remove _imaging.crc32 in favor of builtin Python crc32 implementation #2935 [wiredfool] - Move Tk directory to src directory #2928 [hugovk] - + - Enable pip cache in Travis CI #2933 [jdufresne] @@ -34,13 +34,13 @@ Changelog (Pillow) - Dynamically link libraqm #2753 [wiredfool] - + - Removed scripts directory #2901 [wiredfool] - + - TIFF: Run all compressed tiffs through libtiff decoder #2899 [wiredfool] - + - GIF: Add disposal option when saving GIFs #2902 [linnil1, wiredfool] @@ -57,7 +57,7 @@ Changelog (Pillow) [wiredfool] - Test: avoid random failure in test_effect_noise #2894 - [hugovk] + [hugovk] - Increased epsilon for test_file_eps.py:test_showpage due to Arch update. #2896 [wiredfool] From 8f88d6b60acb68ecf526a3e9d5ec178a75d702ec Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 9 Jan 2018 17:24:57 +0200 Subject: [PATCH 0029/1393] Only extract first Exif segment --- src/PIL/JpegImagePlugin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index d286f793f78..434a2fbdb51 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -83,8 +83,9 @@ def APP(self, marker): self.info["jfif_unit"] = jfif_unit self.info["jfif_density"] = jfif_density elif marker == 0xFFE1 and s[:5] == b"Exif\0": - # extract Exif information (incomplete) - self.info["exif"] = s # FIXME: value will change + if "exif" not in self.info: + # extract Exif information (incomplete) + self.info["exif"] = s # FIXME: value will change elif marker == 0xFFE2 and s[:5] == b"FPXR\0": # extract FlashPix information (incomplete) self.info["flashpix"] = s # FIXME: value will change From a65049146bcb07ed5869d995d68d7807b5c37b94 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 10 Jan 2018 16:30:13 +0200 Subject: [PATCH 0030/1393] Either codecov.yml or .codecov.yml is allowed, let's group with other dotfiles --- codecov.yml => .codecov.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename codecov.yml => .codecov.yml (100%) diff --git a/codecov.yml b/.codecov.yml similarity index 100% rename from codecov.yml rename to .codecov.yml From 75ea204b0869dc313669610f18d57cbc2be4033a Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 10 Jan 2018 16:33:15 +0200 Subject: [PATCH 0031/1393] Avoid "Missing base report" due to committing CHANGES.rst with "[CI skip]" --- .codecov.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.codecov.yml b/.codecov.yml index db2472009c6..3e147d1511f 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1 +1,9 @@ +# Documentation: https://docs.codecov.io/docs/codecov-yaml + +codecov: + # Avoid "Missing base report" due to committing CHANGES.rst with "[CI skip]" + # https://github.com/codecov/support/issues/363 + # https://docs.codecov.io/v4.3.6/docs/comparing-commits + allow_coverage_offsets: true + comment: off From 8edbc79e7f5cf32307caf609b1a346456f8d9fb4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 11 Jan 2018 12:45:52 +0200 Subject: [PATCH 0032/1393] Fix "TypeError: 'NoneType' object is not iterable" for PPC and CRUX --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index df80c5d9b28..e2c16235b4f 100755 --- a/setup.py +++ b/setup.py @@ -368,7 +368,7 @@ def build_extensions(self): for platform_ in arch_tp: dirs = libdirs.get(platform_, None) - if not platform_: + if not dirs: continue for path in dirs: _add_directory(library_dirs, path) From 454ffe4a01a0fa054cdf588ab59c0655329e5c88 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 12 Jan 2018 20:46:16 +1100 Subject: [PATCH 0033/1393] Changed tutorial code to use docstring [ci skip] --- docs/handbook/tutorial.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index e822f5a084b..52d98f69487 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -175,8 +175,7 @@ Rolling an image :: def roll(image, delta): - "Roll an image sideways" - + """Roll an image sideways.""" xsize, ysize = image.size delta = delta % xsize From 4afed260dc8a2b926a8dccfeed45b085d67425ca Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 13 Jan 2018 06:26:42 +1100 Subject: [PATCH 0034/1393] Updated freetype to 2.9 --- Tests/test_imagefont.py | 7 +++++-- winbuild/config.py | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index c437e76b29a..fb79872757b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -58,6 +58,9 @@ class TestImageFont(PillowTestCase): ('2', '8'): {'multiline': 6.2, 'textsize': 2.5, 'getters': (12, 16)}, + ('2', '9'): {'multiline': 6.2, + 'textsize': 2.5, + 'getters': (12, 16)}, 'Default': {'multiline': 0.5, 'textsize': 0.5, 'getters': (12, 16)}, @@ -406,10 +409,10 @@ def test_render_empty(self): im = Image.new(mode='RGB', size=(300, 100)) target = im.copy() draw = ImageDraw.Draw(im) - #should not crash here. + #should not crash here. draw.text((10, 10), '', font=font) self.assert_image_equal(im, target) - + def test_unicode_pilfont(self): # should not segfault, should return UnicodeDecodeError # issue #2826 diff --git a/winbuild/config.py b/winbuild/config.py index e755577b556..1a8ef3a0b59 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -34,9 +34,9 @@ 'dir': 'tiff-4.0.9', }, 'freetype': { - 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.8.1.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.8.1.tar.gz', - 'dir': 'freetype-2.8.1', + 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.9.tar.gz', + 'dir': 'freetype-2.9', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', From 1aefc90cb0e980992057f9d1618d4854624a9178 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Jan 2018 06:21:52 +1100 Subject: [PATCH 0035/1393] Removed __main__ code --- src/PIL/ImageCms.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 40fb1ad0a68..a1aad304eef 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -952,22 +952,3 @@ def versions(): VERSION, core.littlecms_version, sys.version.split()[0], Image.VERSION ) - -# -------------------------------------------------------------------- - -if __name__ == "__main__": - # create a cheap manual from the __doc__ strings for the functions above - - print(__doc__) - - for f in dir(sys.modules[__name__]): - doc = None - try: - exec("doc = %s.__doc__" % (f)) - if "pyCMS" in doc: - # so we don't get the __doc__ string for imported modules - print("=" * 80) - print("%s" % f) - print(doc) - except (AttributeError, TypeError): - pass From cca94054aa50191c070ea38eca1aa1c38963d641 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 17 Jan 2018 22:01:37 +1100 Subject: [PATCH 0036/1393] Changed assert statements to unittest calls --- Tests/test_file_jpeg.py | 2 +- Tests/test_image_quantize.py | 4 ++-- Tests/test_image_resample.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 7b58fc426ab..f4641437091 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -119,7 +119,7 @@ def test(n): # using a 4-byte test code should allow us to detect out of # order issues. icc_profile = (b"Test"*int(n/4+1))[:n] - assert len(icc_profile) == n # sanity + self.assertEqual(len(icc_profile), n) # sanity im1 = self.roundtrip(hopper(), icc_profile=icc_profile) self.assertEqual(im1.info.get("icc_profile"), icc_profile or None) test(0) diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index d9f52fb0398..6a9ff1187e8 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -27,14 +27,14 @@ def test_libimagequant_quantize(self): raise self.assert_image(converted, 'P', converted.size) self.assert_image_similar(converted.convert('RGB'), image, 15) - assert len(converted.getcolors()) == 100 + self.assertEqual(len(converted.getcolors()), 100) def test_octree_quantize(self): image = hopper() converted = image.quantize(100, Image.FASTOCTREE) self.assert_image(converted, 'P', converted.size) self.assert_image_similar(converted.convert('RGB'), image, 20) - assert len(converted.getcolors()) == 100 + self.assertEqual(len(converted.getcolors()), 100) def test_rgba_quantize(self): image = hopper('RGBA') diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index ee5a062c652..4223db53076 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -422,7 +422,7 @@ def split_range(size, tiles): def test_tiles(self): im = Image.open("Tests/images/flower.jpg") - assert im.size == (480, 360) + self.assertEqual(im.size, (480, 360)) dst_size = (251, 188) reference = im.resize(dst_size, Image.BICUBIC) @@ -434,7 +434,7 @@ def test_subsample(self): # This test shows advantages of the subpixel resizing # after supersampling (e.g. during JPEG decoding). im = Image.open("Tests/images/flower.jpg") - assert im.size == (480, 360) + self.assertEqual(im.size, (480, 360)) dst_size = (48, 36) # Reference is cropped image resized to destination reference = im.crop((0, 0, 473, 353)).resize(dst_size, Image.BICUBIC) From 6207b44ab1ff4a91d8ddc7579619876d0bb191a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 18 Jan 2018 14:33:11 +0100 Subject: [PATCH 0037/1393] issue #2959: support appending to existing PDFs --- src/PIL/Image.py | 9 +- src/PIL/PdfImagePlugin.py | 202 +++++------- src/PIL/pdfParser.py | 659 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 746 insertions(+), 124 deletions(-) create mode 100644 src/PIL/pdfParser.py diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 8d4d9c8a841..7c3dc1fd7f8 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1922,9 +1922,12 @@ def save(self, fp, format=None, **params): save_handler = SAVE[format.upper()] if open_fp: - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "w+b") + if params.get('append', False): + fp = builtins.open(filename, "r+b") + else: + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "w+b") try: save_handler(self, fp, filename) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 86bc9c8e93a..35b9b5cee8d 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -20,11 +20,11 @@ # Image plugin for PDF images (output only). ## -from . import Image, ImageFile, ImageSequence +from . import Image, ImageFile, ImageSequence, pdfParser from ._binary import i8 import io -__version__ = "0.4" +__version__ = "0.5" # @@ -37,19 +37,6 @@ # 4. page # 5. page contents -def _obj(fp, obj, **dictionary): - fp.write("%d 0 obj\n" % obj) - if dictionary: - fp.write("<<\n") - for k, v in dictionary.items(): - if v is not None: - fp.write("/%s %s\n" % (k, v)) - fp.write(">>\n") - - -def _endobj(fp): - fp.write("endobj\n") - def _save_all(im, fp, filename): _save(im, fp, filename, save_all=True) @@ -60,13 +47,17 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): resolution = im.encoderinfo.get("resolution", 72.0) + is_appending = im.encoderinfo.get("append", False) + if is_appending: + existing_pdf = pdfParser.PdfParser(f=fp, filename=filename) + fp.seek(0, io.SEEK_END) + else: + existing_pdf = pdfParser.PdfParser() # # make sure image data is available im.load() - xref = [0] - class TextWriter(object): def __init__(self, fp): self.fp = fp @@ -77,59 +68,19 @@ def __getattr__(self, name): def write(self, value): self.fp.write(value.encode('latin-1')) - fp = TextWriter(fp) - - fp.write("%PDF-1.2\n") - fp.write("% created by PIL PDF driver " + __version__ + "\n") - - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) - # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports - # Flatedecode (zip compression). - - bits = 8 - params = None - - if im.mode == "1": - filter = "/ASCIIHexDecode" - colorspace = "/DeviceGray" - procset = "/ImageB" # grayscale - bits = 1 - elif im.mode == "L": - filter = "/DCTDecode" - # params = "<< /Predictor 15 /Columns %d >>" % (width-2) - colorspace = "/DeviceGray" - procset = "/ImageB" # grayscale - elif im.mode == "P": - filter = "/ASCIIHexDecode" - colorspace = "[ /Indexed /DeviceRGB 255 <" - palette = im.im.getpalette("RGB") - for i in range(256): - r = i8(palette[i*3]) - g = i8(palette[i*3+1]) - b = i8(palette[i*3+2]) - colorspace += "%02x%02x%02x " % (r, g, b) - colorspace += "> ]" - procset = "/ImageI" # indexed color - elif im.mode == "RGB": - filter = "/DCTDecode" - colorspace = "/DeviceRGB" - procset = "/ImageC" # color images - elif im.mode == "CMYK": - filter = "/DCTDecode" - colorspace = "/DeviceCMYK" - procset = "/ImageC" # color images - else: - raise ValueError("cannot save mode %s" % im.mode) + #fp = TextWriter(fp) + + fp.write(b"%PDF-1.2\n") + fp.write(b"% created by PIL PDF driver " + __version__.encode("us-ascii") + b"\n") # # catalogue - xref.append(fp.tell()) - _obj( - fp, 1, - Type="/Catalog", - Pages="2 0 R") - _endobj(fp) + catalog_ref = existing_pdf.next_object_id(fp.tell()) + pages_ref = existing_pdf.next_object_id(0) + existing_pdf.write_obj(fp, catalog_ref, + Type=pdfParser.PdfName(b"Catalog"), + Pages=pages_ref) # # pages @@ -137,11 +88,12 @@ def write(self, value): if save_all: append_images = im.encoderinfo.get("append_images", []) for append_im in append_images: - if append_im.mode != im.mode: - append_im = append_im.convert(im.mode) append_im.encoderinfo = im.encoderinfo.copy() ims.append(append_im) numberOfPages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] for im in ims: im_numberOfPages = 1 if save_all: @@ -151,26 +103,59 @@ def write(self, value): # Image format does not have n_frames. It is a single frame image pass numberOfPages += im_numberOfPages - pages = [str(pageNumber*3+4)+" 0 R" - for pageNumber in range(0, numberOfPages)] + for i in range(im_numberOfPages): + image_refs.append(existing_pdf.next_object_id(0)) + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) - xref.append(fp.tell()) - _obj( - fp, 2, - Type="/Pages", - Count=len(pages), - Kids="["+"\n".join(pages)+"]") - _endobj(fp) + existing_pdf.write_obj(fp, pages_ref, + Type=pdfParser.PdfName("Pages"), + Count=len(existing_pdf.pages), + Kids=existing_pdf.pages) pageNumber = 0 for imSequence in ims: for im in ImageSequence.Iterator(imSequence): + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) + # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports + # Flatedecode (zip compression). + + bits = 8 + params = None + + if im.mode == "1": + filter = "ASCIIHexDecode" + colorspace = pdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + bits = 1 + elif im.mode == "L": + filter = "DCTDecode" + # params = "<< /Predictor 15 /Columns %d >>" % (width-2) + colorspace = pdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "P": + filter = "ASCIIHexDecode" + palette = im.im.getpalette("RGB") + colorspace = [pdfParser.PdfName("Indexed"), pdfParser.PdfName("DeviceRGB"), 255, pdfParser.PdfBinary(palette)] + procset = "ImageI" # indexed color + elif im.mode == "RGB": + filter = "DCTDecode" + colorspace = pdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "CMYK": + filter = "DCTDecode" + colorspace = pdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + else: + raise ValueError("cannot save mode %s" % im.mode) + # # image op = io.BytesIO() - if filter == "/ASCIIHexDecode": + if filter == "ASCIIHexDecode": if bits == 1: # FIXME: the hex encoder doesn't support packed 1-bit # images; do things the hard way... @@ -178,11 +163,11 @@ def write(self, value): im = Image.new("L", (len(data), 1), None) im.putdata(data) ImageFile._save(im, op, [("hex", (0, 0)+im.size, 0, im.mode)]) - elif filter == "/DCTDecode": + elif filter == "DCTDecode": Image.SAVE["JPEG"](im, op, filename) - elif filter == "/FlateDecode": + elif filter == "FlateDecode": ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) - elif filter == "/RunLengthDecode": + elif filter == "RunLengthDecode": ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) else: raise ValueError("unsupported PDF filter (%s)" % filter) @@ -192,41 +177,28 @@ def write(self, value): width, height = im.size - xref.append(fp.tell()) - _obj( - fp, pageNumber*3+3, - Type="/XObject", - Subtype="/Image", + existing_pdf.write_obj(fp, image_refs[pageNumber], stream=op.getvalue(), + Type=pdfParser.PdfName("XObject"), + Subtype=pdfParser.PdfName("Image"), Width=width, # * 72.0 / resolution, Height=height, # * 72.0 / resolution, - Length=len(op.getvalue()), - Filter=filter, + Filter=pdfParser.PdfName(filter), BitsPerComponent=bits, DecodeParams=params, ColorSpace=colorspace) - fp.write("stream\n") - fp.fp.write(op.getvalue()) - fp.write("\nendstream\n") - - _endobj(fp) - # # page - xref.append(fp.tell()) - _obj(fp, pageNumber*3+4) - fp.write( - "<<\n/Type /Page\n/Parent 2 0 R\n" - "/Resources <<\n/ProcSet [ /PDF %s ]\n" - "/XObject << /image %d 0 R >>\n>>\n" - "/MediaBox [ 0 0 %d %d ]\n/Contents %d 0 R\n>>\n" % ( - procset, - pageNumber*3+3, - int(width * 72.0 / resolution), - int(height * 72.0 / resolution), - pageNumber*3+5)) - _endobj(fp) + existing_pdf.write_obj(fp, page_refs[pageNumber], + Type=pdfParser.PdfName("Page"), + Parent=pages_ref, + Resources=pdfParser.PdfDict( + ProcSet=[pdfParser.PdfName("PDF"), pdfParser.PdfName(procset)], + XObject=pdfParser.PdfDict(image=image_refs[pageNumber])), + MediaBox=[0, 0, int(width * 72.0 / resolution), int(height * 72.0 / resolution)], + Contents=contents_refs[pageNumber] + ) # # page contents @@ -238,25 +210,13 @@ def write(self, value): int(width * 72.0 / resolution), int(height * 72.0 / resolution))) - xref.append(fp.tell()) - _obj(fp, pageNumber*3+5, Length=len(op.fp.getvalue())) - - fp.write("stream\n") - fp.fp.write(op.fp.getvalue()) - fp.write("\nendstream\n") - - _endobj(fp) + existing_pdf.write_obj(fp, contents_refs[pageNumber], stream=op.fp.getvalue()) pageNumber += 1 # # trailer - startxref = fp.tell() - fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) - for x in xref[1:]: - fp.write("%010d 00000 n \n" % x) - fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) - fp.write("startxref\n%d\n%%%%EOF\n" % startxref) + existing_pdf.write_xref_and_trailer(fp, catalog_ref) if hasattr(fp, "flush"): fp.flush() diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py new file mode 100644 index 00000000000..3d02a68cc10 --- /dev/null +++ b/src/PIL/pdfParser.py @@ -0,0 +1,659 @@ +import collections +import io +import mmap +import re +import sys + +try: + from UserDict import UserDict +except ImportError: + UserDict = collections.UserDict + + +class PdfFormatError(RuntimeError): + pass + + +def check_format_condition(condition, error_message): + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReference(collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"])): + def __str__(self): + return "%s %s R" % self + + def __bytes__(self): + return self.__str__().encode("us-ascii") + + def __eq__(self, other): + return isinstance(other, IndirectReference) and other.object_id == self.object_id and other.generation == self.generation + + +class IndirectObjectDef(IndirectReference): + def __str__(self): + return "%s %s obj" % self + + def __eq__(self, other): + return isinstance(other, IndirectObjectDef) and other.object_id == self.object_id and other.generation == self.generation + + +class XrefTable: + def __init__(self): + self.existing_entries = {} # object ID => (offset, generation) + self.new_entries = {} # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key, value): + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key): + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key): + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + raise IndexError("object ID " + str(key) + " cannot be deleted because it doesn't exist") + + def __contains__(self, key): + return key in self.existing_entries or key in self.new_entries + + def __len__(self): + return len(set(self.existing_entries.keys()) | set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + + def keys(self): + return (set(self.existing_entries.keys()) - set(self.deleted_entries.keys())) | set(self.new_entries.keys()) + + def write(self, f): + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev = None + for index, key in enumerate(keys): + if prev is None or prev+1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = None + f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + else: + this_deleted_object_id = deleted_keys.pop(0) + assert object_id == this_deleted_object_id + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write(b"%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id])) + return startxref + + +class PdfName(): + def __init__(self, name): + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("utf-8") + + @classmethod + def from_pdf_stream(klass, data): + return klass(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33,127)) - set((ord(c) for c in "#%/()<>[]{}")) + def __bytes__(self): + if sys.version_info.major >= 3: + result = bytearray(b"/") + for b in self.name: + if b in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % b) + else: + result = bytearray(b"/") + for b in self.name: + if ord(b) in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % ord(b)) + return bytes(result) + + __str__ = __bytes__ + + +class PdfArray(list): + def __bytes__(self): + return b"[ %s ]" % b" ".join(pdf_repr(x) for x in self) + + __str__ = __bytes__ + + +class PdfDict(UserDict): + #def __init__(self, *args, orig_ref=None, pdf=None, **kwargs): + def __init__(self, *args, **kwargs): + UserDict.__init__(self, *args, **kwargs) + #self.orig_ref = kwargs.pop("orig_ref", None) + #self.pdf = kwargs.pop("pdf", None) + #self.is_changed = False + + def __setitem__(self, key, value): + self.is_changed = True + UserDict.__setitem__(self, key, value) + + def __bytes__(self): + #if self.orig_ref is not None: + # if self.is_changed: + # if self.pdf is not None: + # del self.pdf.xref_table[self.orig_ref.object_id] + # else: + # return bytes(self.orig_ref) + out = b"<<" + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out += b"\n%s %s" % (PdfName(key), value) + return out + b"\n>>" + + __str__ = __bytes__ + + #def write(self, f, orig_ref=None, pdf=None): + # self.orig_ref = orig_ref + # self.pdf = pdf + # f.write(bytes(self)) + + +class PdfBinary: + def __init__(self, data): + self.data = data + + if sys.version_info.major >= 3: + def __bytes__(self): + return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + + def __str__(self): + return bytes(self).decode("us-ascii") + + else: + def __str__(self): + return "<%s>" % "".join("%02X" % ord(b) for b in self.data) + + +def pdf_repr(x): + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, PdfName) or isinstance(x, PdfDict) or isinstance(x, PdfArray) or isinstance(x, PdfBinary): + return bytes(x) + elif isinstance(x, int): + return str(x).encode("us-ascii") + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif isinstance(x, str) and sys.version_info.major >= 3: + return pdf_repr(x.encode("utf-8")) + elif isinstance(x, bytes): + return b"(%s)" % x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") # XXX escape more chars? handle binary garbage + else: + return bytes(x) + + +class PdfParser: + """Based on http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__(self, filename=None, f=None, buf=None, start_offset=0): + self.filename = filename + self.buf = buf + self.start_offset = start_offset + if buf: + self.read_pdf_info() + elif f: + self.read_pdf_info_from_file(f) + elif filename: + with open(filename, "rb") as f: + self.read_pdf_info_from_file(f) + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = {} + self.pages = [] + self.last_xref_section_offset = None + self.trailer_dict = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + + def write_xref_and_trailer(self, f, new_root_ref): + self.del_root() + if self.info: + self.info_ref = self.write_obj(f, None, self.info) + start_xref = self.xref_table.write(f) + num_entries = len(self.xref_table) + trailer_dict = {b"Root": new_root_ref, b"Size": num_entries} + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + f.write(b"trailer\n%s\nstartxref\n%d\n%%%%EOF" % (PdfDict(trailer_dict), start_xref)) + + def write_obj(self, f, ref, *objs, **dict_obj): + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self): + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + # XXX TODO delete Pages tree recursively + + def read_pdf_info_from_file(self, f): + self.buf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + try: + self.read_pdf_info() + finally: + self.buf.close() + self.buf = None + + def read_pdf_info(self): + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + self.root_ref = self.trailer_dict[b"Root"] + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + #print(repr(self.root)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition(self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog") + check_format_condition(b"Pages" in self.root, "/Pages missing in Root") + check_format_condition(isinstance(self.root[b"Pages"], IndirectReference), "/Pages in Root is not an indirect reference") + self.page_tree_root = self.read_indirect(self.root[b"Pages"]) + #print("page_tree_root: " + str(self.page_tree_root)) + self.pages = self.linearize_page_tree(self.page_tree_root) + #print("pages: " + str(self.pages)) + + def next_object_id(self, offset=None): + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = br"[][()<>{}/%]" + delimiter_or_ws = br"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = br"[\000\011\012\014\015\040]" + whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + newline_only = br"[\r\n]+" + newline = whitespace_optional + newline_only + whitespace_optional + re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_mandatory + br"\<\<(.*\>\>)" + newline \ + + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) + re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_mandatory + br"\<\<(.*\>\>)" + newline \ + + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) + def read_trailer(self): + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + data_at_end = self.buf[search_start_offset:] + m = self.re_trailer_end.search(data_at_end) + check_format_condition(m, "trailer end not found") + trailer_data = m.group(1) + #print(trailer_data) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + #print(self.xref_table) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer(self, xref_section_offset): + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search(self.buf[trailer_offset:trailer_offset+16384]) + check_format_condition(m, "previous trailer not found") + trailer_data = m.group(1) + #print(trailer_data) + check_format_condition(int(m.group(2)) == xref_section_offset, "xref section offset in previous trailer doesn't match what was expected") + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + self.read_prev_trailer(trailer_dict[b"Prev"]) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile(whitespace_optional + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + delimiter_or_ws + br")") + re_dict_start = re.compile(whitespace_optional + br"\<\<") + re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) + @classmethod + def interpret_trailer(klass, trailer_data): + trailer = {} + offset = 0 + while True: + m = klass.re_name.match(trailer_data, offset) + if not m: + m = klass.re_dict_end.match(trailer_data, offset) + check_format_condition(m and m.end() == len(trailer_data), "name not found in trailer, remaining data: " + repr(trailer_data[offset:])) + break + key = klass.interpret_name(m.group(1)) + #print(key) + value, offset = klass.get_value(trailer_data, m.end()) + #print(value) + trailer[key] = value + check_format_condition(b"Size" in trailer and isinstance(trailer[b"Size"], int), "/Size not in trailer or not an integer") + check_format_condition(b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), "/Root not in trailer or not an indirect reference") + return trailer + + re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") + @classmethod + def interpret_name(klass, raw, as_text=False): + name = b"" + for m in klass.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + br"null(?=" + delimiter_or_ws + br")") + re_true = re.compile(whitespace_optional + br"true(?=" + delimiter_or_ws + br")") + re_false = re.compile(whitespace_optional + br"false(?=" + delimiter_or_ws + br")") + re_int = re.compile(whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")") + re_real = re.compile(whitespace_optional + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + delimiter_or_ws + br")") + re_array_start = re.compile(whitespace_optional + br"\[") + re_array_end = re.compile(whitespace_optional + br"]") + re_string_hex = re.compile(whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>") + re_string_lit = re.compile(whitespace_optional + br"\(") + re_indirect_reference = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"R(?=" + delimiter_or_ws + br")") + re_indirect_def_start = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"obj(?=" + delimiter_or_ws + br")") + re_indirect_def_end = re.compile(whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")") + re_comment = re.compile(br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") + @classmethod + def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): + #if max_nesting == 0: + # return None, None + m = klass.re_comment.match(data, offset) + if m: + offset = m.end() + m = klass.re_indirect_def_start.match(data, offset) + if m: + assert int(m.group(1)) > 0 + assert int(m.group(2)) >= 0 + check_format_condition(expect_indirect is None or expect_indirect == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected") + object, offset = klass.get_value(data, m.end(), max_nesting=max_nesting-1) + if offset is None: + return object, None + m = klass.re_indirect_def_end.match(data, offset) + check_format_condition(m, "indirect object definition end not found") + return object, m.end() + check_format_condition(not expect_indirect, "indirect object definition not found") + m = klass.re_indirect_reference.match(data, offset) + if m: + assert int(m.group(1)) > 0 + assert int(m.group(2)) >= 0 + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = klass.re_dict_start.match(data, offset) + if m: + offset = m.end() + result = {} + #print("<<") + m = klass.re_dict_end.match(data, offset) + while not m: + key, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + #print ("key " + str(key)) + if offset is None: + return result, None + value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + result[key] = value + #print ("value " + str(value)) + if offset is None: + return result, None + m = klass.re_dict_end.match(data, offset) + #print(">>") + return result, m.end() + m = klass.re_array_start.match(data, offset) + if m: + offset = m.end() + result = [] + m = klass.re_array_end.match(data, offset) + while not m: + value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + result.append(value) + #print ("item " + str(value)) + if offset is None: + return result, None + m = klass.re_array_end.match(data, offset) + return result, m.end() + m = klass.re_null.match(data, offset) + if m: + return None, m.end() + m = klass.re_true.match(data, offset) + if m: + return True, m.end() + m = klass.re_false.match(data, offset) + if m: + return False, m.end() + m = klass.re_name.match(data, offset) + if m: + return klass.interpret_name(m.group(1)), m.end() + m = klass.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = klass.re_real.match(data, offset) + if m: + return float(m.group(1)), m.end() # XXX Decimal instead of float??? + m = klass.re_string_hex.match(data, offset) + if m: + hex_string = bytearray([b for b in m.group(1) if b in b"0123456789abcdefABCDEF"]) # filter out whitespace + if len(hex_string) % 2 == 1: + hex_string.append(ord(b"0")) # append a 0 if the length is not even - yes, at the end + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = klass.re_string_lit.match(data, offset) + if m: + return klass.get_literal_string(data, m.end()) + # XXX TODO: stream + #return None, offset # fallback (only for debugging) + raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) + + + re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + } + @classmethod + def get_literal_string(klass, data, offset): + nesting_depth = 0 + result = bytearray() + for m in klass.re_lit_str_token.finditer(data, offset): + result.extend(data[offset:m.start()]) + if m.group(1): + result.extend(klass.escaped_chars[m.group(1)[1]]) + elif m.group(2): + #result.append(eval(m.group(1))) + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + raise PdfFormatError("unfinished literal string") + + + re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline) + re_xref_subsection_start = re.compile(whitespace_optional + br"([0-9]+)" + whitespace_mandatory + br"([0-9]+)" + whitespace_optional + newline_only) + re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + def read_xref_table(self, xref_section_offset): + subsection_found = False + m = self.re_xref_section_start.match(self.buf, xref_section_offset + self.start_offset) + check_format_condition(m, "xref section start not found") + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition(subsection_found, "xref subsection start not found") + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object+num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m, "xref entry not found") + offset = m.end() + is_free = m.group(3) == b"f" + generation = int(m.group(2)) + if not is_free: + new_entry = (int(m.group(1)), generation) + check_format_condition(i not in self.xref_table or self.xref_table[i] == new_entry, "xref entry duplicated (and not identical)") + self.xref_table[i] = new_entry + return offset + + + def read_indirect(self, ref, max_nesting=-1): + offset, generation = self.xref_table[ref[0]] + assert generation == ref[1] + return self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] + + + def linearize_page_tree(self, node=None): + if node is None: + node = self.page_tree_root + check_format_condition(node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages") + pages = [] + for kid in node[b"Kids"]: + kid_object = self.read_indirect(kid, max_nesting=3) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages + + +def selftest(): + assert PdfParser.interpret_name(b"Name#23Hash") == b"Name#Hash" + assert PdfParser.interpret_name(b"Name#23Hash", as_text=True) == "Name#Hash" + assert bytes(IndirectReference(1,2)) == b"1 2 R" + assert bytes(IndirectObjectDef(*IndirectReference(1,2))) == b"1 2 obj" + assert bytes(PdfName(b"Name#Hash")) == b"/Name#23Hash" + assert bytes(PdfName("Name#Hash")) == b"/Name#23Hash" + assert bytes(PdfDict({b"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" + assert bytes(PdfDict({"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" + assert pdf_repr(IndirectReference(1,2)) == b"1 2 R" + assert pdf_repr(IndirectObjectDef(*IndirectReference(1,2))) == b"1 2 obj" + assert pdf_repr(PdfName(b"Name#Hash")) == b"/Name#23Hash" + assert pdf_repr(PdfName("Name#Hash")) == b"/Name#23Hash" + assert pdf_repr(PdfDict({b"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" + assert pdf_repr(PdfDict({"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" + assert pdf_repr(123) == b"123" + assert pdf_repr(True) == b"true" + assert pdf_repr(False) == b"false" + assert pdf_repr(None) == b"null" + assert pdf_repr(b"a)/b\\(c") == br"(a\)/b\\\(c)" + assert pdf_repr([123, True, {"a": PdfName(b"b")}]) == b"[ 123 true <<\n/a /b\n>> ]" + assert pdf_repr(PdfBinary(b"\x90\x1F\xA0")) == b"<901FA0>" + assert PdfParser.get_value(b"1 2 R ", 0) == (IndirectReference(1, 2), 5) + assert PdfParser.get_value(b"true[", 0) == (True, 4) + assert PdfParser.get_value(b"false%", 0) == (False, 5) + assert PdfParser.get_value(b"null<", 0) == (None, 4) + assert PdfParser.get_value(b"%cmt\n %cmt\n 123\n", 0) == (123, 15) + assert PdfParser.get_value(b"<901FA3>", 0) == (b"\x90\x1F\xA3", 8) + assert PdfParser.get_value(b"asd < 9 0 1 f A > qwe", 3) == (b"\x90\x1F\xA0", 17) + assert PdfParser.get_value(b"(asd)", 0) == (b"asd", 5) + assert PdfParser.get_value(b"(asd(qwe)zxc)zzz(aaa)", 0) == (b"asd(qwe)zxc", 13) + assert PdfParser.get_value(b"(Two \\\nwords.)", 0) == (b"Two words.", 14) + assert PdfParser.get_value(b"(Two\nlines.)", 0) == (b"Two\nlines.", 12) + assert PdfParser.get_value(b"(Two\r\nlines.)", 0) == (b"Two\nlines.", 13) + assert PdfParser.get_value(b"(Two\\nlines.)", 0) == (b"Two\nlines.", 13) + assert PdfParser.get_value(b"(One\\(paren).", 0) == (b"One(paren", 12) + assert PdfParser.get_value(b"(One\\)paren).", 0) == (b"One)paren", 12) + assert PdfParser.get_value(b"(\\0053)", 0) == (b"\x053", 7) + assert PdfParser.get_value(b"(\\053)", 0) == (b"\x2B", 6) + assert PdfParser.get_value(b"(\\53)", 0) == (b"\x2B", 5) + assert PdfParser.get_value(b"(\\53a)", 0) == (b"\x2Ba", 6) + assert PdfParser.get_value(b"(\\1111)", 0) == (b"\x491", 7) + + +if __name__ == "__main__": + selftest() From bf6b35dc10f5fe3823557ae62e5b022661738f79 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Jan 2018 07:14:31 +1100 Subject: [PATCH 0038/1393] Updated libimagequant to 2.11.7 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index 1ab3a6981e5..c0a76f89191 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.11.4 +archive=libimagequant-2.11.7 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 788128e84fb4723392bad47ab99b0ce751d2afbf Mon Sep 17 00:00:00 2001 From: Nehal J Wani Date: Sun, 21 Jan 2018 20:48:50 +0530 Subject: [PATCH 0039/1393] Add libdirs for ppc64le and armv7l This patch has been taken from: http://pkgs.fedoraproject.org/cgit/rpms/python-pillow.git/tree/python-pillow_libdirs.patch --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index df80c5d9b28..98009f8a7f4 100755 --- a/setup.py +++ b/setup.py @@ -358,8 +358,10 @@ def build_extensions(self): 'aarch64': ["/usr/lib64", "/usr/lib/aarch64-linux-gnu"], 'arm': ["/usr/lib/arm-linux-gnueabi"], 'armv71': ["/usr/lib/arm-linux-gnueabi"], + 'armv7l': ["/usr/lib"], 'ppc64': ["/usr/lib64", "/usr/lib/ppc64-linux-gnu", "/usr/lib/powerpc64-linux-gnu"], + 'ppc64le': ["/usr/lib64"], 'ppc': ["/usr/lib/ppc-linux-gnu", "/usr/lib/powerpc-linux-gnu"], 's390x': ["/usr/lib64", "/usr/lib/s390x-linux-gnu"], From 96cfcddadd9f9a98cbd39d448c1da257549268a1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Jan 2018 06:15:45 +1100 Subject: [PATCH 0040/1393] Updated raqm to 0.4.0 --- 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 7b10df7d434..22d70d68c1b 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -2,7 +2,7 @@ # install raqm -archive=raqm-0.3.0 +archive=raqm-0.4.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 65112bad7e4a692ea01980a642e540ec4c0a2fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Mon, 22 Jan 2018 16:39:08 +0100 Subject: [PATCH 0041/1393] issue #2959: fix Python 3.4 not supporting bytes%tuple --- src/PIL/pdfParser.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 3d02a68cc10..bdf55dc93f6 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -10,6 +10,13 @@ UserDict = collections.UserDict +if sys.version_info.major >= 3: + def make_bytes(s): + return s.encode("us-ascii") +else: + make_bytes = lambda s: s + + class PdfFormatError(RuntimeError): pass @@ -99,10 +106,10 @@ def write(self, f): else: contiguous_keys = keys keys = None - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + f.write(make_bytes("%d %d\n" % (contiguous_keys[0], len(contiguous_keys)))) for object_id in contiguous_keys: if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id])) else: this_deleted_object_id = deleted_keys.pop(0) assert object_id == this_deleted_object_id @@ -110,7 +117,7 @@ def write(self, f): next_in_linked_list = deleted_keys[0] except IndexError: next_in_linked_list = 0 - f.write(b"%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id])) + f.write(make_bytes("%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id]))) return startxref @@ -135,7 +142,7 @@ def __bytes__(self): if b in self.allowed_chars: result.append(b) else: - result.extend(b"#%02X" % b) + result.extend(make_bytes("#%02X" % b)) else: result = bytearray(b"/") for b in self.name: @@ -150,7 +157,7 @@ def __bytes__(self): class PdfArray(list): def __bytes__(self): - return b"[ %s ]" % b" ".join(pdf_repr(x) for x in self) + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" __str__ = __bytes__ @@ -174,13 +181,19 @@ def __bytes__(self): # del self.pdf.xref_table[self.orig_ref.object_id] # else: # return bytes(self.orig_ref) - out = b"<<" + out = bytearray(b"<<") for key, value in self.items(): if value is None: continue value = pdf_repr(value) - out += b"\n%s %s" % (PdfName(key), value) - return out + b"\n>>" + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + #out += b"\n%s %s" % (PdfName(key), value) + out.extend(b"\n>>") + return bytes(out) + #return out + b"\n>>" __str__ = __bytes__ @@ -196,7 +209,7 @@ def __init__(self, data): if sys.version_info.major >= 3: def __bytes__(self): - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) def __str__(self): return bytes(self).decode("us-ascii") @@ -224,7 +237,7 @@ def pdf_repr(x): elif isinstance(x, str) and sys.version_info.major >= 3: return pdf_repr(x.encode("utf-8")) elif isinstance(x, bytes): - return b"(%s)" % x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") # XXX escape more chars? handle binary garbage + return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage else: return bytes(x) @@ -270,7 +283,7 @@ def write_xref_and_trailer(self, f, new_root_ref): if self.info: trailer_dict[b"Info"] = self.info_ref self.last_xref_section_offset = start_xref - f.write(b"trailer\n%s\nstartxref\n%d\n%%%%EOF" % (PdfDict(trailer_dict), start_xref)) + f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) def write_obj(self, f, ref, *objs, **dict_obj): if ref is None: From ba211ff549f9df6c4d316f5a9a87271218a5c597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Mon, 22 Jan 2018 21:35:55 +0100 Subject: [PATCH 0042/1393] issue #2959: pdfParser selftest --- Tests/test_file_pdf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index ee02d0694fa..3518e3b3d6a 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -1,5 +1,5 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image +from PIL import Image, pdfParser import os.path @@ -97,6 +97,9 @@ def imGenerator(ims): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + def test_pdf_parser(self): + pdfParser.selftest() + if __name__ == '__main__': unittest.main() From a187a361cbeea79a69c1613bc13b0aee4d3d4d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 24 Jan 2018 02:28:39 +0100 Subject: [PATCH 0043/1393] issue #2959: add tests and fixes, text encoding, remove remnants of text writing from PdfImagePlugin --- Tests/test_file_pdf.py | 67 ++++++++++++++++++++++++++++++++ src/PIL/PdfImagePlugin.py | 44 +++++---------------- src/PIL/pdfParser.py | 81 ++++++++++++++++++++++++++++++++------- 3 files changed, 143 insertions(+), 49 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 3518e3b3d6a..d6090543098 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, pdfParser +import os import os.path +import tempfile class TestFilePdf(PillowTestCase): @@ -20,6 +22,8 @@ def helper_save_as_pdf(self, mode, save_all=False): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + return outfile + def test_monochrome(self): # Arrange mode = "1" @@ -97,6 +101,69 @@ def imGenerator(ims): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + def test_pdf_open(self): + # fail on empty buffer + self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray()) + # fail on a buffer full of null bytes + self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray(65536)) + # make an empty PDF object + empty_pdf = pdfParser.PdfParser() + self.assertEqual(len(empty_pdf.pages), 0) + # make a PDF file + pdf_filename = self.helper_save_as_pdf("RGB") + # open the PDF file + hopper_pdf = pdfParser.PdfParser(filename=pdf_filename) + self.assertEqual(len(hopper_pdf.pages), 1) + # read a PDF file from a buffer with a non-zero offset + with open(pdf_filename, "rb") as f: + content = b"xyzzy" + f.read() + hopper_pdf = pdfParser.PdfParser(buf=content, start_offset=5) + self.assertEqual(len(hopper_pdf.pages), 1) + # read a PDF file from an already open file + with open(pdf_filename, "rb") as f: + hopper_pdf = pdfParser.PdfParser(f=f) + self.assertEqual(len(hopper_pdf.pages), 1) + + def test_pdf_append_fails_on_nonexistent_file(self): + im = hopper("RGB") + temp_dir = tempfile.mkdtemp() + try: + self.assertRaises(OSError, im.save, os.path.join(temp_dir, "nonexistent.pdf"), append=True) + finally: + os.rmdir(temp_dir) + + def test_pdf_append(self): + # make a PDF file + pdf_filename = self.helper_save_as_pdf("RGB") + # open it, check pages and info + pdf = pdfParser.PdfParser(pdf_filename) + self.assertEqual(len(pdf.pages), 1) + self.assertEqual(len(pdf.info), 0) + # append some info + pdf.info[b"Title"] = b"abc" + pdf.info[b"Author"] = b"def" + pdf.info[b"Subject"] = pdfParser.encode_text("ghi") + pdf.info[b"Keywords"] = b"jkl" + pdf.info[b"Creator"] = b"hopper()" + pdf.info[b"Producer"] = b"pdfParser" + with open(pdf_filename, "r+b") as f: + f.seek(0, os.SEEK_END) + pdf.write_xref_and_trailer(f) + # open it again, check pages and info again + pdf = pdfParser.PdfParser(pdf_filename) + self.assertEqual(len(pdf.pages), 1) + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdf.info[b"Title"], b"abc") + # append two images + mode_CMYK = hopper("CMYK") + mode_P = hopper("P") + mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P]) + # open the PDF again, check pages and info again + pdf = pdfParser.PdfParser(pdf_filename) + self.assertEqual(len(pdf.pages), 3) + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdf.info[b"Title"], b"abc") + def test_pdf_parser(self): pdfParser.selftest() diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 35b9b5cee8d..be467d014fc 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -58,29 +58,8 @@ def _save(im, fp, filename, save_all=False): # make sure image data is available im.load() - class TextWriter(object): - def __init__(self, fp): - self.fp = fp - - def __getattr__(self, name): - return getattr(self.fp, name) - - def write(self, value): - self.fp.write(value.encode('latin-1')) - - #fp = TextWriter(fp) - - fp.write(b"%PDF-1.2\n") - fp.write(b"% created by PIL PDF driver " + __version__.encode("us-ascii") + b"\n") - - # - # catalogue - - catalog_ref = existing_pdf.next_object_id(fp.tell()) - pages_ref = existing_pdf.next_object_id(0) - existing_pdf.write_obj(fp, catalog_ref, - Type=pdfParser.PdfName(b"Catalog"), - Pages=pages_ref) + existing_pdf.write_header(fp) + existing_pdf.write_comment(fp, "created by PIL PDF driver " + __version__) # # pages @@ -109,10 +88,9 @@ def write(self, value): contents_refs.append(existing_pdf.next_object_id(0)) existing_pdf.pages.append(page_refs[-1]) - existing_pdf.write_obj(fp, pages_ref, - Type=pdfParser.PdfName("Pages"), - Count=len(existing_pdf.pages), - Kids=existing_pdf.pages) + # + # catalog and list of pages + existing_pdf.write_catalog(fp) pageNumber = 0 for imSequence in ims: @@ -190,9 +168,7 @@ def write(self, value): # # page - existing_pdf.write_obj(fp, page_refs[pageNumber], - Type=pdfParser.PdfName("Page"), - Parent=pages_ref, + existing_pdf.write_page(fp, page_refs[pageNumber], Resources=pdfParser.PdfDict( ProcSet=[pdfParser.PdfName("PDF"), pdfParser.PdfName(procset)], XObject=pdfParser.PdfDict(image=image_refs[pageNumber])), @@ -203,20 +179,18 @@ def write(self, value): # # page contents - op = TextWriter(io.BytesIO()) - - op.write( + page_contents = pdfParser.make_bytes( "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( int(width * 72.0 / resolution), int(height * 72.0 / resolution))) - existing_pdf.write_obj(fp, contents_refs[pageNumber], stream=op.fp.getvalue()) + existing_pdf.write_obj(fp, contents_refs[pageNumber], stream=page_contents) pageNumber += 1 # # trailer - existing_pdf.write_xref_and_trailer(fp, catalog_ref) + existing_pdf.write_xref_and_trailer(fp) if hasattr(fp, "flush"): fp.flush() diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index bdf55dc93f6..ade599d0549 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -1,3 +1,4 @@ +import codecs import collections import io import mmap @@ -14,7 +15,11 @@ def make_bytes(s): return s.encode("us-ascii") else: - make_bytes = lambda s: s + make_bytes = lambda s: s # pragma: no cover + + +def encode_text(s): + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") class PdfFormatError(RuntimeError): @@ -34,16 +39,16 @@ def __bytes__(self): return self.__str__().encode("us-ascii") def __eq__(self, other): - return isinstance(other, IndirectReference) and other.object_id == self.object_id and other.generation == self.generation + return other.__class__ is self.__class__ and other.object_id == self.object_id and other.generation == self.generation + + def __ne__(self, other): + return not (self == other) class IndirectObjectDef(IndirectReference): def __str__(self): return "%s %s obj" % self - def __eq__(self, other): - return isinstance(other, IndirectObjectDef) and other.object_id == self.object_id and other.generation == self.generation - class XrefTable: def __init__(self): @@ -251,11 +256,11 @@ def __init__(self, filename=None, f=None, buf=None, start_offset=0): self.filename = filename self.buf = buf self.start_offset = start_offset - if buf: + if buf is not None: self.read_pdf_info() - elif f: + elif f is not None: self.read_pdf_info_from_file(f) - elif filename: + elif filename is not None: with open(filename, "rb") as f: self.read_pdf_info_from_file(f) else: @@ -266,18 +271,40 @@ def __init__(self, filename=None, f=None, buf=None, start_offset=0): self.info_ref = None self.page_tree_root = {} self.pages = [] + self.pages_ref = None self.last_xref_section_offset = None self.trailer_dict = {} self.xref_table = XrefTable() self.xref_table.reading_finished = True - def write_xref_and_trailer(self, f, new_root_ref): + def write_header(self, f): + f.write(b"%PDF-1.4\n") + + def write_comment(self, f, s): + f.write(("%% %s\n" % (s,)).encode("utf-8")) + + def write_catalog(self, f): self.del_root() + self.root_ref = self.next_object_id(f.tell()) + self.pages_ref = self.next_object_id(0) + self.write_obj(f, self.root_ref, + Type=PdfName(b"Catalog"), + Pages=self.pages_ref) + self.write_obj(f, self.pages_ref, + Type=PdfName("Pages"), + Count=len(self.pages), + Kids=self.pages) + return self.root_ref + + def write_xref_and_trailer(self, f, new_root_ref=None): + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref if self.info: self.info_ref = self.write_obj(f, None, self.info) start_xref = self.xref_table.write(f) num_entries = len(self.xref_table) - trailer_dict = {b"Root": new_root_ref, b"Size": num_entries} + trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} if self.last_xref_section_offset is not None: trailer_dict[b"Prev"] = self.last_xref_section_offset if self.info: @@ -285,6 +312,15 @@ def write_xref_and_trailer(self, f, new_root_ref): self.last_xref_section_offset = start_xref f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) + def write_page(self, f, ref, *objs, **dict_obj): + if isinstance(ref, int): + ref = self.pages[ref] + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName("Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(f, ref, *objs, **dict_obj) + def write_obj(self, f, ref, *objs, **dict_obj): if ref is None: ref = self.next_object_id(f.tell()) @@ -336,7 +372,8 @@ def read_pdf_info(self): check_format_condition(self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog") check_format_condition(b"Pages" in self.root, "/Pages missing in Root") check_format_condition(isinstance(self.root[b"Pages"], IndirectReference), "/Pages in Root is not an indirect reference") - self.page_tree_root = self.read_indirect(self.root[b"Pages"]) + self.pages_ref = self.root[b"Pages"] + self.page_tree_root = self.read_indirect(self.pages_ref) #print("page_tree_root: " + str(self.page_tree_root)) self.pages = self.linearize_page_tree(self.page_tree_root) #print("pages: " + str(self.pages)) @@ -361,15 +398,23 @@ def next_object_id(self, offset=None): newline = whitespace_optional + newline_only + whitespace_optional re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_mandatory + br"\<\<(.*\>\>)" + newline \ + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) - re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_mandatory + br"\<\<(.*\>\>)" + newline \ + re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_mandatory + br"\<\<(.*?\>\>)" + newline \ + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) def read_trailer(self): search_start_offset = len(self.buf) - 16384 if search_start_offset < self.start_offset: search_start_offset = self.start_offset - data_at_end = self.buf[search_start_offset:] - m = self.re_trailer_end.search(data_at_end) + #data_at_end = self.buf[search_start_offset:] + #m = self.re_trailer_end.search(data_at_end) + m = self.re_trailer_end.search(self.buf, search_start_offset) check_format_condition(m, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start()+16) + if not m: + m = last_match trailer_data = m.group(1) #print(trailer_data) self.last_xref_section_offset = int(m.group(2)) @@ -627,6 +672,14 @@ def linearize_page_tree(self, node=None): def selftest(): assert PdfParser.interpret_name(b"Name#23Hash") == b"Name#Hash" assert PdfParser.interpret_name(b"Name#23Hash", as_text=True) == "Name#Hash" + assert IndirectReference(1,2) == IndirectReference(1,2) + assert IndirectReference(1,2) != IndirectReference(1,3) + assert IndirectReference(1,2) != IndirectObjectDef(1,2) + assert IndirectReference(1,2) != (1,2) + assert IndirectObjectDef(1,2) == IndirectObjectDef(1,2) + assert IndirectObjectDef(1,2) != IndirectObjectDef(1,3) + assert IndirectObjectDef(1,2) != IndirectReference(1,2) + assert IndirectObjectDef(1,2) != (1,2) assert bytes(IndirectReference(1,2)) == b"1 2 R" assert bytes(IndirectObjectDef(*IndirectReference(1,2))) == b"1 2 obj" assert bytes(PdfName(b"Name#Hash")) == b"/Name#23Hash" From cfacf8bff88e330feff136a3a8ee9c73bbca7811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 24 Jan 2018 02:39:15 +0100 Subject: [PATCH 0044/1393] issue #2959: fix test for nonexistent PDF file --- Tests/test_file_pdf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index d6090543098..ba4523f9c71 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -128,7 +128,7 @@ def test_pdf_append_fails_on_nonexistent_file(self): im = hopper("RGB") temp_dir = tempfile.mkdtemp() try: - self.assertRaises(OSError, im.save, os.path.join(temp_dir, "nonexistent.pdf"), append=True) + self.assertRaises(IOError, im.save, os.path.join(temp_dir, "nonexistent.pdf"), append=True) finally: os.rmdir(temp_dir) From 25e72d58567e701d87f4d7d278a77cf08e9007bf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 14 Jan 2018 12:09:05 +1100 Subject: [PATCH 0045/1393] Fixed typos --- CHANGES.rst | 2 +- src/PIL/JpegImagePlugin.py | 2 +- src/libImaging/Storage.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index aca922149b2..eb15f379277 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -140,7 +140,7 @@ Changelog (Pillow) - GIF: Permit LZW code lengths up to 12 bits in GIF decode #2813 [wiredfool] -- Fix unterminiated string and unchecked exception in _font_text_asBytes. #2825 +- Fix unterminated string and unchecked exception in _font_text_asBytes. #2825 [wiredfool] - PPM: Use fixed list of whitespace, rather relying on locale, fixes #272. #2831 diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index d286f793f78..9a190fb4ab4 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -724,7 +724,7 @@ def validate_qtables(qtables): ) # if we optimize, libjpeg needs a buffer big enough to hold the whole image - # in a shot. Guessing on the size, at im.size bytes. (raw pizel size is + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is # channels*size, this is a value that's been used in a django patch. # https://github.com/matthewwithanm/django-imagekit/issues/50 bufsize = 0 diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 8262d864af9..7e0c14339d7 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -327,7 +327,7 @@ memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) block.ptr = realloc(block.ptr, requested_size); } if ( ! block.ptr) { - // Can't allocate, free prevous pointer (it is still valid) + // 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; @@ -490,7 +490,7 @@ ImagingAllocateBlock(Imaging im) im->image[y] = im->block + i; i += im->linesize; } - + im->destroy = ImagingDestroyBlock; return im; From e902e46019e00f7080cd8ed479bf00c9721d426b Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 24 Jan 2018 10:59:17 +0000 Subject: [PATCH 0046/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index eb15f379277..5121bf6fc05 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Removed __main__ code from ImageCms #2942 + [radarhere] + +- Test: Changed assert statements to unittest calls #2961 + [radarhere] + +- Depends: Updated libimagequant to 2.11.7, raqm to 0.4.0, freetype to 2.9 #2967, #2969, #2957 + [radarhere] + - Remove _imaging.crc32 in favor of builtin Python crc32 implementation #2935 [wiredfool] @@ -19,6 +28,16 @@ Changelog (Pillow) - Docs: Changed documentation references to 2.x to 2.7 #2921 [radarhere] + + +5.0.1 (unreleased) +------------------ + +- Setup: Fix "TypeError: 'NoneType' object is not iterable" for PPC and CRUX #2951 + [hugovk] + +- Setup: Add libdirs for ppc64le and armv7l #2968 + [nehaljwani] 5.0.0 (2018-01-01) ------------------ @@ -140,7 +159,7 @@ Changelog (Pillow) - GIF: Permit LZW code lengths up to 12 bits in GIF decode #2813 [wiredfool] -- Fix unterminated string and unchecked exception in _font_text_asBytes. #2825 +- Fix unterminiated string and unchecked exception in _font_text_asBytes. #2825 [wiredfool] - PPM: Use fixed list of whitespace, rather relying on locale, fixes #272. #2831 From 90478081e842abc0370cecd29ec73f323678f3d6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 24 Jan 2018 11:10:45 +0000 Subject: [PATCH 0047/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5121bf6fc05..ddbe0e5f829 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Tiff: Open 8 bit Tiffs with 5 or 6 channels, discarding extra channels #2938 + [homm] + +- Readme: Added Twitter badge #2930 + [hugovk] + - Removed __main__ code from ImageCms #2942 [radarhere] From 0da68dee98d035f398c8241110e749cc2befdae5 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Jan 2018 13:22:51 +0000 Subject: [PATCH 0048/1393] Fix leak opening _webp files --- src/_webp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/_webp.c b/src/_webp.c index 67a9e6b667b..f82feb46a4a 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -410,6 +410,7 @@ PyObject* _anim_decoder_get_next(PyObject* self, PyObject* args) uint8_t* buf; int timestamp; PyObject* bytes; + PyObject* ret; WebPAnimDecoderObject* decp = (WebPAnimDecoderObject*)self; if (!WebPAnimDecoderGetNext(decp->dec, &buf, ×tamp)) { @@ -419,7 +420,11 @@ PyObject* _anim_decoder_get_next(PyObject* self, PyObject* args) bytes = PyBytes_FromStringAndSize((char *)buf, decp->info.canvas_width * 4 * decp->info.canvas_height); - return Py_BuildValue("Si", bytes, timestamp); + + ret = Py_BuildValue("Si", bytes, timestamp); + + Py_DECREF(bytes); + return ret; } PyObject* _anim_decoder_has_more_frames(PyObject* self, PyObject* args) From 379d3ccce249d60a60eb02d31c381d2d2a4e2a3e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Jan 2018 14:02:33 +0000 Subject: [PATCH 0049/1393] Fixed up the webp leak check --- Tests/check_webp_leaks.py | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/Tests/check_webp_leaks.py b/Tests/check_webp_leaks.py index 0f54f382d33..82599bbbbde 100644 --- a/Tests/check_webp_leaks.py +++ b/Tests/check_webp_leaks.py @@ -1,38 +1,25 @@ -from __future__ import division -from helper import unittest, PillowTestCase -import sys -from PIL import Image +from helper import unittest, PillowLeakTestCase +from PIL import Image, features from io import BytesIO -# Limits for testing the leak -mem_limit = 16 # max increase in MB -iterations = 5000 test_file = "Tests/images/hopper.webp" +@unittest.skipUnless(features.check('webp'), "WebP is not installed") +class TestWebPLeaks(PillowLeakTestCase): -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") -class TestWebPLeaks(PillowTestCase): - - def setUp(self): - try: - from PIL import _webp - except ImportError: - self.skipTest('WebP support not installed') - - def _get_mem_usage(self): - from resource import getpagesize, getrusage, RUSAGE_SELF - mem = getrusage(RUSAGE_SELF).ru_maxrss - return mem * getpagesize() / 1024 / 1024 + mem_limit = 3 * 1024 # kb + iterations = 100 def test_leak_load(self): with open(test_file, 'rb') as f: im_data = f.read() - start_mem = self._get_mem_usage() - for _ in range(iterations): + + def core(): with Image.open(BytesIO(im_data)) as im: im.load() - mem = (self._get_mem_usage() - start_mem) - self.assertLess(mem, mem_limit, msg='memory usage limit exceeded') + + self._test_leak(core) + if __name__ == '__main__': unittest.main() From 1b06cbc3bb637e19fb2e4d140ff9c5a1173c06e7 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 24 Jan 2018 14:02:58 +0000 Subject: [PATCH 0050/1393] run webp leak check by default --- Tests/{check_webp_leaks.py => test_webp_leaks.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tests/{check_webp_leaks.py => test_webp_leaks.py} (100%) diff --git a/Tests/check_webp_leaks.py b/Tests/test_webp_leaks.py similarity index 100% rename from Tests/check_webp_leaks.py rename to Tests/test_webp_leaks.py From 991f832d91d797fc740eee05fc5a376e26959a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 24 Jan 2018 22:45:37 +0100 Subject: [PATCH 0051/1393] issue #2959: change Py3 detection, fix trailer location for some PDFs --- src/PIL/pdfParser.py | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index ade599d0549..63ae5c4e70f 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -11,11 +11,11 @@ UserDict = collections.UserDict -if sys.version_info.major >= 3: +if str == bytes: # Python 2.x + make_bytes = lambda s: s # pragma: no cover +else: # Python 3.x def make_bytes(s): return s.encode("us-ascii") -else: - make_bytes = lambda s: s # pragma: no cover def encode_text(s): @@ -141,20 +141,20 @@ def from_pdf_stream(klass, data): allowed_chars = set(range(33,127)) - set((ord(c) for c in "#%/()<>[]{}")) def __bytes__(self): - if sys.version_info.major >= 3: + if str == bytes: # Python 2.x result = bytearray(b"/") for b in self.name: - if b in self.allowed_chars: + if ord(b) in self.allowed_chars: result.append(b) else: - result.extend(make_bytes("#%02X" % b)) - else: + result.extend(b"#%02X" % ord(b)) + else: # Python 3.x result = bytearray(b"/") for b in self.name: - if ord(b) in self.allowed_chars: + if b in self.allowed_chars: result.append(b) else: - result.extend(b"#%02X" % ord(b)) + result.extend(make_bytes("#%02X" % b)) return bytes(result) __str__ = __bytes__ @@ -212,17 +212,14 @@ class PdfBinary: def __init__(self, data): self.data = data - if sys.version_info.major >= 3: - def __bytes__(self): - return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) - - def __str__(self): - return bytes(self).decode("us-ascii") - - else: + if str == bytes: # Python 2.x def __str__(self): return "<%s>" % "".join("%02X" % ord(b) for b in self.data) + else: # Python 3.x + def __bytes__(self): + return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) + def pdf_repr(x): if x is True: @@ -239,7 +236,7 @@ def pdf_repr(x): return bytes(PdfDict(x)) elif isinstance(x, list): return bytes(PdfArray(x)) - elif isinstance(x, str) and sys.version_info.major >= 3: + elif isinstance(x, str) and str != bytes: return pdf_repr(x.encode("utf-8")) elif isinstance(x, bytes): return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage @@ -396,9 +393,9 @@ def next_object_id(self, offset=None): whitespace_mandatory = whitespace + b"+" newline_only = br"[\r\n]+" newline = whitespace_optional + newline_only + whitespace_optional - re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_mandatory + br"\<\<(.*\>\>)" + newline \ + re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_optional + br"\<\<(.*\>\>)" + newline \ + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) - re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_mandatory + br"\<\<(.*?\>\>)" + newline \ + re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_optional + br"\<\<(.*?\>\>)" + newline \ + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) def read_trailer(self): search_start_offset = len(self.buf) - 16384 From 13fe1a5ba7c00f98cfa35b3c8a028f004dcf6d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 25 Jan 2018 00:20:18 +0100 Subject: [PATCH 0052/1393] issue #2959: text string decoding, support for Info dict, updated tests --- Tests/test_file_pdf.py | 26 +++++++++--------- src/PIL/PdfImagePlugin.py | 20 ++++++++++++++ src/PIL/pdfParser.py | 57 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 14 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index ba4523f9c71..8edf875cdca 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -7,16 +7,13 @@ class TestFilePdf(PillowTestCase): - def helper_save_as_pdf(self, mode, save_all=False): + def helper_save_as_pdf(self, mode, **kwargs): # Arrange im = hopper(mode) outfile = self.tempfile("temp_" + mode + ".pdf") # Act - if save_all: - im.save(outfile, save_all=True) - else: - im.save(outfile) + im.save(outfile, **kwargs) # Assert self.assertTrue(os.path.isfile(outfile)) @@ -134,18 +131,18 @@ def test_pdf_append_fails_on_nonexistent_file(self): def test_pdf_append(self): # make a PDF file - pdf_filename = self.helper_save_as_pdf("RGB") + pdf_filename = self.helper_save_as_pdf("RGB", producer="pdfParser") # open it, check pages and info pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) - self.assertEqual(len(pdf.info), 0) + self.assertEqual(len(pdf.info), 1) + self.assertEqual(pdfParser.decode_text(pdf.info[b"Producer"]), "pdfParser") # append some info - pdf.info[b"Title"] = b"abc" - pdf.info[b"Author"] = b"def" + pdf.info[b"Title"] = pdfParser.encode_text("abc") + pdf.info[b"Author"] = pdfParser.encode_text("def") pdf.info[b"Subject"] = pdfParser.encode_text("ghi") - pdf.info[b"Keywords"] = b"jkl" - pdf.info[b"Creator"] = b"hopper()" - pdf.info[b"Producer"] = b"pdfParser" + pdf.info[b"Keywords"] = pdfParser.encode_text("jkl") + pdf.info[b"Creator"] = pdfParser.encode_text("hopper()") with open(pdf_filename, "r+b") as f: f.seek(0, os.SEEK_END) pdf.write_xref_and_trailer(f) @@ -153,7 +150,7 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdf.info[b"Title"], b"abc") + self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") @@ -162,7 +159,8 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 3) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdf.info[b"Title"], b"abc") + self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") + self.assertEqual(pdfParser.decode_text(pdf.info[b"Producer"]), "pdfParser") def test_pdf_parser(self): pdfParser.selftest() diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index be467d014fc..c836175d36e 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -48,12 +48,32 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): resolution = im.encoderinfo.get("resolution", 72.0) is_appending = im.encoderinfo.get("append", False) + title = im.encoderinfo.get("title", None) + author = im.encoderinfo.get("author", None) + subject = im.encoderinfo.get("subject", None) + keywords = im.encoderinfo.get("keywords", None) + creator = im.encoderinfo.get("creator", None) + producer = im.encoderinfo.get("producer", None) + if is_appending: existing_pdf = pdfParser.PdfParser(f=fp, filename=filename) fp.seek(0, io.SEEK_END) else: existing_pdf = pdfParser.PdfParser() + if title: + existing_pdf.info[b"Title"] = pdfParser.encode_text(title) + if author: + existing_pdf.info[b"Author"] = pdfParser.encode_text(author) + if subject: + existing_pdf.info[b"Subject"] = pdfParser.encode_text(subject) + if keywords: + existing_pdf.info[b"Keywords"] = pdfParser.encode_text(keywords) + if creator: + existing_pdf.info[b"Creator"] = pdfParser.encode_text(creator) + if producer: + existing_pdf.info[b"Producer"] = pdfParser.encode_text(producer) + # # make sure image data is available im.load() diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 63ae5c4e70f..3a386f493ff 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -18,10 +18,63 @@ def make_bytes(s): return s.encode("us-ascii") +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set on page 656 def encode_text(s): return codecs.BOM_UTF16_BE + s.encode("utf_16_be") +PDFDocEncoding = { + 0x16: u"\u0017", + 0x18: u"\u02D8", + 0x19: u"\u02C7", + 0x1A: u"\u02C6", + 0x1B: u"\u02D9", + 0x1C: u"\u02DD", + 0x1D: u"\u02DB", + 0x1E: u"\u02DA", + 0x1F: u"\u02DC", + 0x80: u"\u2022", + 0x81: u"\u2020", + 0x82: u"\u2021", + 0x83: u"\u2026", + 0x84: u"\u2014", + 0x85: u"\u2013", + 0x86: u"\u0192", + 0x87: u"\u2044", + 0x88: u"\u2039", + 0x89: u"\u203A", + 0x8A: u"\u2212", + 0x8B: u"\u2030", + 0x8C: u"\u201E", + 0x8D: u"\u201C", + 0x8E: u"\u201D", + 0x8F: u"\u2018", + 0x90: u"\u2019", + 0x91: u"\u201A", + 0x92: u"\u2122", + 0x93: u"\uFB01", + 0x94: u"\uFB02", + 0x95: u"\u0141", + 0x96: u"\u0152", + 0x97: u"\u0160", + 0x98: u"\u0178", + 0x99: u"\u017D", + 0x9A: u"\u0131", + 0x9B: u"\u0142", + 0x9C: u"\u0153", + 0x9D: u"\u0161", + 0x9E: u"\u017E", + 0xA0: u"\u20AC", + } +def decode_text(b): + if b[:len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE):].decode("utf_16_be") + elif str == bytes: # Python 2.x + return u"".join(PDFDocEncoding.get(ord(byte), byte) for byte in b) + else: + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + + class PdfFormatError(RuntimeError): pass @@ -667,6 +720,10 @@ def linearize_page_tree(self, node=None): def selftest(): + assert encode_text("abc") == b"\xFE\xFF\x00a\x00b\x00c" + assert decode_text(b"\xFE\xFF\x00a\x00b\x00c") == "abc" + assert decode_text(b"abc") == "abc" + assert decode_text(b"\x1B a \x1C") == u"\u02D9 a \u02DD" assert PdfParser.interpret_name(b"Name#23Hash") == b"Name#Hash" assert PdfParser.interpret_name(b"Name#23Hash", as_text=True) == "Name#Hash" assert IndirectReference(1,2) == IndirectReference(1,2) From bc01bb6aae0e2566b3ac713bedebabf7f78c7789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 25 Jan 2018 00:22:03 +0100 Subject: [PATCH 0053/1393] issue #2959: update documentation --- docs/handbook/image-file-formats.rst | 72 ++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 1ee6540ea6a..fb6b3f2a88d 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -612,6 +612,14 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 3.4.0 +**append_images** + A list of images to append as additional frames. Each of the + images in the list can be single or multiframe images. Note however, that for + correct results, all the appended images should have the same + encoderinfo and encoderconfig properties. + + .. versionadded:: 4.2.0 + **tiffinfo** A :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` object or dict object containing tiff tags and values. The TIFF field type is @@ -944,14 +952,68 @@ The format code is ``Palm``, the extension is ``.palm``. PDF ^^^ -PIL can write PDF (Acrobat) images. Such images are written as binary PDF 1.1 +PIL can write PDF (Acrobat) images. Such images are written as binary PDF 1.4 files, using either JPEG or HEX encoding depending on the image mode (and whether JPEG support is available or not). -When calling :py:meth:`~PIL.Image.Image.save`, if a multiframe image is used, -by default, only the first image will be saved. To save all frames, each frame -to a separate page of the PDF, the ``save_all`` parameter must be present and -set to ``True``. +The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments: + +**save_all** + If a multiframe image is used, by default, only the first image will be saved. + To save all frames, each frame to a separate page of the PDF, the ``save_all`` + parameter must be present and set to ``True``. + + .. 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. + + .. versionadded:: 4.2.0 + +**append** + Set to True to append pages to an existing PDF file. If the file doesn't + exist, an IOError will be raised. + + .. versionadded:: 5.1.0 + +**resolution** + Image resolution in DPI. This, together with the number of pixels in the + image, will determine the physical dimensions of the page that will be + saved in the PDF. + +**title** + The document’s title. + + .. versionadded:: 5.1.0 + +**author** + The name of the person who created the document. + + .. versionadded:: 5.1.0 + +**subject** + The subject of the document. + + .. versionadded:: 5.1.0 + +**keywords** + Keywords associated with the document. + + .. versionadded:: 5.1.0 + +**creator** + If the document was converted to PDF from another format, the name of the + conforming product that created the original document from which it was + converted. + + .. versionadded:: 5.1.0 + +**producer** + If the document was converted to PDF from another format, the name of the + conforming product that converted it to PDF. + + .. versionadded:: 5.1.0 XV Thumbnails ^^^^^^^^^^^^^ From 84f87471f5e5ad972b2c304bd4505b54cbf3a5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 25 Jan 2018 00:44:59 +0100 Subject: [PATCH 0054/1393] issue #2959: support io.BytesIO objects --- Tests/test_file_pdf.py | 12 ++++++++++++ src/PIL/pdfParser.py | 13 +++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 8edf875cdca..fe460d96545 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -1,5 +1,6 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, pdfParser +import io import os import os.path import tempfile @@ -162,6 +163,17 @@ def test_pdf_append(self): self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") self.assertEqual(pdfParser.decode_text(pdf.info[b"Producer"]), "pdfParser") + def test_pdf_append_to_bytesio(self): + im = hopper("RGB") + f = io.BytesIO() + im.save(f, format="PDF") + initial_size = len(f.getvalue()) + self.assertGreater(initial_size, 0) + im = hopper("P") + f = io.BytesIO(f.getvalue()) + im.save(f, format="PDF", append=True) + self.assertGreater(len(f.getvalue()), initial_size) + def test_pdf_parser(self): pdfParser.selftest() diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 3a386f493ff..c5755dae40a 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -399,11 +399,20 @@ def del_root(self): # XXX TODO delete Pages tree recursively def read_pdf_info_from_file(self, f): - self.buf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + if hasattr(f, "getbuffer"): + self.buf = f.getbuffer() + need_close = False + elif hasattr(f, "getvalue"): + self.buf = f.getvalue() + need_close = False + else: + self.buf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + need_close = True try: self.read_pdf_info() finally: - self.buf.close() + if need_close: + self.buf.close() self.buf = None def read_pdf_info(self): From 95f5c8d4ff1b36e74f99ec1593d43acd466768c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 25 Jan 2018 01:12:32 +0100 Subject: [PATCH 0055/1393] issue #2959: move pdfParser self tests to Tests directory --- Tests/test_pdfparser.py | 71 +++++++++++++++++++++++++++++++++++++++++ src/PIL/pdfParser.py | 60 ---------------------------------- 2 files changed, 71 insertions(+), 60 deletions(-) create mode 100644 Tests/test_pdfparser.py diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py new file mode 100644 index 00000000000..511674c31f2 --- /dev/null +++ b/Tests/test_pdfparser.py @@ -0,0 +1,71 @@ +from helper import unittest, PillowTestCase + +from PIL.pdfParser import * + + +class TestPdfParser(PillowTestCase): + + def test_text_encode_decode(self): + self.assertEqual(encode_text("abc"), b"\xFE\xFF\x00a\x00b\x00c") + self.assertEqual(decode_text(b"\xFE\xFF\x00a\x00b\x00c"), "abc") + self.assertEqual(decode_text(b"abc"), "abc") + self.assertEqual(decode_text(b"\x1B a \x1C"), u"\u02D9 a \u02DD") + + def test_indirect_refs(self): + self.assertEqual(IndirectReference(1,2), IndirectReference(1,2)) + self.assertNotEqual(IndirectReference(1,2), IndirectReference(1,3)) + self.assertNotEqual(IndirectReference(1,2), IndirectObjectDef(1,2)) + self.assertNotEqual(IndirectReference(1,2), (1,2)) + self.assertEqual(IndirectObjectDef(1,2), IndirectObjectDef(1,2)) + self.assertNotEqual(IndirectObjectDef(1,2), IndirectObjectDef(1,3)) + self.assertNotEqual(IndirectObjectDef(1,2), IndirectReference(1,2)) + self.assertNotEqual(IndirectObjectDef(1,2), (1,2)) + + def test_parsing(self): + self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"), b"Name#Hash") + self.assertEqual(PdfParser.interpret_name(b"Name#23Hash", as_text=True), "Name#Hash") + self.assertEqual(PdfParser.get_value(b"1 2 R ", 0), (IndirectReference(1, 2), 5)) + self.assertEqual(PdfParser.get_value(b"true[", 0), (True, 4)) + self.assertEqual(PdfParser.get_value(b"false%", 0), (False, 5)) + self.assertEqual(PdfParser.get_value(b"null<", 0), (None, 4)) + self.assertEqual(PdfParser.get_value(b"%cmt\n %cmt\n 123\n", 0), (123, 15)) + self.assertEqual(PdfParser.get_value(b"<901FA3>", 0), (b"\x90\x1F\xA3", 8)) + self.assertEqual(PdfParser.get_value(b"asd < 9 0 1 f A > qwe", 3), (b"\x90\x1F\xA0", 17)) + self.assertEqual(PdfParser.get_value(b"(asd)", 0), (b"asd", 5)) + self.assertEqual(PdfParser.get_value(b"(asd(qwe)zxc)zzz(aaa)", 0), (b"asd(qwe)zxc", 13)) + self.assertEqual(PdfParser.get_value(b"(Two \\\nwords.)", 0), (b"Two words.", 14)) + self.assertEqual(PdfParser.get_value(b"(Two\nlines.)", 0), (b"Two\nlines.", 12)) + self.assertEqual(PdfParser.get_value(b"(Two\r\nlines.)", 0), (b"Two\nlines.", 13)) + self.assertEqual(PdfParser.get_value(b"(Two\\nlines.)", 0), (b"Two\nlines.", 13)) + self.assertEqual(PdfParser.get_value(b"(One\\(paren).", 0), (b"One(paren", 12)) + self.assertEqual(PdfParser.get_value(b"(One\\)paren).", 0), (b"One)paren", 12)) + self.assertEqual(PdfParser.get_value(b"(\\0053)", 0), (b"\x053", 7)) + self.assertEqual(PdfParser.get_value(b"(\\053)", 0), (b"\x2B", 6)) + self.assertEqual(PdfParser.get_value(b"(\\53)", 0), (b"\x2B", 5)) + self.assertEqual(PdfParser.get_value(b"(\\53a)", 0), (b"\x2Ba", 6)) + self.assertEqual(PdfParser.get_value(b"(\\1111)", 0), (b"\x491", 7)) + + def test_pdf_repr(self): + self.assertEqual(bytes(IndirectReference(1,2)), b"1 2 R") + self.assertEqual(bytes(IndirectObjectDef(*IndirectReference(1,2))), b"1 2 obj") + self.assertEqual(bytes(PdfName(b"Name#Hash")), b"/Name#23Hash") + self.assertEqual(bytes(PdfName("Name#Hash")), b"/Name#23Hash") + self.assertEqual(bytes(PdfDict({b"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(bytes(PdfDict({"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(IndirectReference(1,2)), b"1 2 R") + self.assertEqual(pdf_repr(IndirectObjectDef(*IndirectReference(1,2))), b"1 2 obj") + self.assertEqual(pdf_repr(PdfName(b"Name#Hash")), b"/Name#23Hash") + self.assertEqual(pdf_repr(PdfName("Name#Hash")), b"/Name#23Hash") + self.assertEqual(pdf_repr(PdfDict({b"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(PdfDict({"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(123), b"123") + self.assertEqual(pdf_repr(True), b"true") + self.assertEqual(pdf_repr(False), b"false") + self.assertEqual(pdf_repr(None), b"null") + self.assertEqual(pdf_repr(b"a)/b\\(c"), br"(a\)/b\\\(c)") + self.assertEqual(pdf_repr([123, True, {"a": PdfName(b"b")}]), b"[ 123 true <<\n/a /b\n>> ]") + self.assertEqual(pdf_repr(PdfBinary(b"\x90\x1F\xA0")), b"<901FA0>") + + +if __name__ == '__main__': + unittest.main() diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index c5755dae40a..05e6a1c54ad 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -726,63 +726,3 @@ def linearize_page_tree(self, node=None): else: pages.extend(self.linearize_page_tree(node=kid_object)) return pages - - -def selftest(): - assert encode_text("abc") == b"\xFE\xFF\x00a\x00b\x00c" - assert decode_text(b"\xFE\xFF\x00a\x00b\x00c") == "abc" - assert decode_text(b"abc") == "abc" - assert decode_text(b"\x1B a \x1C") == u"\u02D9 a \u02DD" - assert PdfParser.interpret_name(b"Name#23Hash") == b"Name#Hash" - assert PdfParser.interpret_name(b"Name#23Hash", as_text=True) == "Name#Hash" - assert IndirectReference(1,2) == IndirectReference(1,2) - assert IndirectReference(1,2) != IndirectReference(1,3) - assert IndirectReference(1,2) != IndirectObjectDef(1,2) - assert IndirectReference(1,2) != (1,2) - assert IndirectObjectDef(1,2) == IndirectObjectDef(1,2) - assert IndirectObjectDef(1,2) != IndirectObjectDef(1,3) - assert IndirectObjectDef(1,2) != IndirectReference(1,2) - assert IndirectObjectDef(1,2) != (1,2) - assert bytes(IndirectReference(1,2)) == b"1 2 R" - assert bytes(IndirectObjectDef(*IndirectReference(1,2))) == b"1 2 obj" - assert bytes(PdfName(b"Name#Hash")) == b"/Name#23Hash" - assert bytes(PdfName("Name#Hash")) == b"/Name#23Hash" - assert bytes(PdfDict({b"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" - assert bytes(PdfDict({"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" - assert pdf_repr(IndirectReference(1,2)) == b"1 2 R" - assert pdf_repr(IndirectObjectDef(*IndirectReference(1,2))) == b"1 2 obj" - assert pdf_repr(PdfName(b"Name#Hash")) == b"/Name#23Hash" - assert pdf_repr(PdfName("Name#Hash")) == b"/Name#23Hash" - assert pdf_repr(PdfDict({b"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" - assert pdf_repr(PdfDict({"Name": IndirectReference(1,2)})) == b"<<\n/Name 1 2 R\n>>" - assert pdf_repr(123) == b"123" - assert pdf_repr(True) == b"true" - assert pdf_repr(False) == b"false" - assert pdf_repr(None) == b"null" - assert pdf_repr(b"a)/b\\(c") == br"(a\)/b\\\(c)" - assert pdf_repr([123, True, {"a": PdfName(b"b")}]) == b"[ 123 true <<\n/a /b\n>> ]" - assert pdf_repr(PdfBinary(b"\x90\x1F\xA0")) == b"<901FA0>" - assert PdfParser.get_value(b"1 2 R ", 0) == (IndirectReference(1, 2), 5) - assert PdfParser.get_value(b"true[", 0) == (True, 4) - assert PdfParser.get_value(b"false%", 0) == (False, 5) - assert PdfParser.get_value(b"null<", 0) == (None, 4) - assert PdfParser.get_value(b"%cmt\n %cmt\n 123\n", 0) == (123, 15) - assert PdfParser.get_value(b"<901FA3>", 0) == (b"\x90\x1F\xA3", 8) - assert PdfParser.get_value(b"asd < 9 0 1 f A > qwe", 3) == (b"\x90\x1F\xA0", 17) - assert PdfParser.get_value(b"(asd)", 0) == (b"asd", 5) - assert PdfParser.get_value(b"(asd(qwe)zxc)zzz(aaa)", 0) == (b"asd(qwe)zxc", 13) - assert PdfParser.get_value(b"(Two \\\nwords.)", 0) == (b"Two words.", 14) - assert PdfParser.get_value(b"(Two\nlines.)", 0) == (b"Two\nlines.", 12) - assert PdfParser.get_value(b"(Two\r\nlines.)", 0) == (b"Two\nlines.", 13) - assert PdfParser.get_value(b"(Two\\nlines.)", 0) == (b"Two\nlines.", 13) - assert PdfParser.get_value(b"(One\\(paren).", 0) == (b"One(paren", 12) - assert PdfParser.get_value(b"(One\\)paren).", 0) == (b"One)paren", 12) - assert PdfParser.get_value(b"(\\0053)", 0) == (b"\x053", 7) - assert PdfParser.get_value(b"(\\053)", 0) == (b"\x2B", 6) - assert PdfParser.get_value(b"(\\53)", 0) == (b"\x2B", 5) - assert PdfParser.get_value(b"(\\53a)", 0) == (b"\x2Ba", 6) - assert PdfParser.get_value(b"(\\1111)", 0) == (b"\x491", 7) - - -if __name__ == "__main__": - selftest() From f9566877f3221f9786bedce325495351d2d3e504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Thu, 25 Jan 2018 01:19:25 +0100 Subject: [PATCH 0056/1393] issue #2959: fix broken test --- Tests/test_file_pdf.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index fe460d96545..fc5ee2469c1 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -174,9 +174,6 @@ def test_pdf_append_to_bytesio(self): im.save(f, format="PDF", append=True) self.assertGreater(len(f.getvalue()), initial_size) - def test_pdf_parser(self): - pdfParser.selftest() - if __name__ == '__main__': unittest.main() From 8f4dc0d9635bba0d175379d3e66477aa7c857008 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 25 Jan 2018 10:52:01 +0200 Subject: [PATCH 0057/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ddbe0e5f829..b8228c1ed93 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Fix memory leak when opening webp files #2974 + [wiredfool] + - Tiff: Open 8 bit Tiffs with 5 or 6 channels, discarding extra channels #2938 [homm] From 1cfda448e0196aa0de527fb002b9d30cf7422dfa Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 25 Jan 2018 10:52:24 +0200 Subject: [PATCH 0058/1393] Update CHANGES.rst --- CHANGES.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b8228c1ed93..da26d836737 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,9 +5,6 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ -- Fix memory leak when opening webp files #2974 - [wiredfool] - - Tiff: Open 8 bit Tiffs with 5 or 6 channels, discarding extra channels #2938 [homm] @@ -42,6 +39,9 @@ Changelog (Pillow) 5.0.1 (unreleased) ------------------ +- Fix memory leak when opening webp files #2974 + [wiredfool] + - Setup: Fix "TypeError: 'NoneType' object is not iterable" for PPC and CRUX #2951 [hugovk] From 29818f30f026260419a17e6378366883061d3e5c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Jan 2018 19:57:58 +1100 Subject: [PATCH 0059/1393] Fixed typo [ci skip] --- CHANGES.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index da26d836737..ca20888863d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,7 +10,7 @@ Changelog (Pillow) - Readme: Added Twitter badge #2930 [hugovk] - + - Removed __main__ code from ImageCms #2942 [radarhere] @@ -19,7 +19,7 @@ Changelog (Pillow) - Depends: Updated libimagequant to 2.11.7, raqm to 0.4.0, freetype to 2.9 #2967, #2969, #2957 [radarhere] - + - Remove _imaging.crc32 in favor of builtin Python crc32 implementation #2935 [wiredfool] @@ -34,7 +34,7 @@ Changelog (Pillow) - Docs: Changed documentation references to 2.x to 2.7 #2921 [radarhere] - + 5.0.1 (unreleased) ------------------ @@ -168,7 +168,7 @@ Changelog (Pillow) - GIF: Permit LZW code lengths up to 12 bits in GIF decode #2813 [wiredfool] -- Fix unterminiated string and unchecked exception in _font_text_asBytes. #2825 +- Fix unterminated string and unchecked exception in _font_text_asBytes. #2825 [wiredfool] - PPM: Use fixed list of whitespace, rather relying on locale, fixes #272. #2831 From c255948860db6197e7f1a8afdd40b54cce7c5121 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 26 Jan 2018 16:52:07 +1100 Subject: [PATCH 0060/1393] Fixed typo --- src/PIL/ImageCms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index a1aad304eef..85cdf6daafe 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -363,7 +363,7 @@ def getOpenProfile(profileFilename): The PyCMSProfile object can be passed back into pyCMS for use in creating transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). - If profileFilename is not a vaild filename for an ICC profile, a PyCMSError + If profileFilename is not a valid filename for an ICC profile, a PyCMSError will be raised. :param profileFilename: String, as a valid filename path to the ICC profile From 4d3b13fb08d949516b16ce7350e30bc3b9d77446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 12:11:10 +0100 Subject: [PATCH 0061/1393] issue #2959: improve Info setting and dumping --- Tests/test_file_pdf.py | 18 +++++++++--------- src/PIL/PdfImagePlugin.py | 12 ++++++------ src/PIL/pdfParser.py | 25 +++---------------------- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index fc5ee2469c1..a5813bf7afe 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -137,13 +137,13 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 1) - self.assertEqual(pdfParser.decode_text(pdf.info[b"Producer"]), "pdfParser") + self.assertEqual(pdfParser.decode_text(pdf.info["Producer"]), "pdfParser") # append some info - pdf.info[b"Title"] = pdfParser.encode_text("abc") - pdf.info[b"Author"] = pdfParser.encode_text("def") - pdf.info[b"Subject"] = pdfParser.encode_text("ghi") - pdf.info[b"Keywords"] = pdfParser.encode_text("jkl") - pdf.info[b"Creator"] = pdfParser.encode_text("hopper()") + pdf.info["Title"] = "abc" + pdf.info["Author"] = "def" + pdf.info["Subject"] = "ghi" + pdf.info["Keywords"] = "jkl" + pdf.info["Creator"] = "hopper()" with open(pdf_filename, "r+b") as f: f.seek(0, os.SEEK_END) pdf.write_xref_and_trailer(f) @@ -151,7 +151,7 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") + self.assertEqual(pdfParser.decode_text(pdf.info["Title"]), "abc") # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") @@ -160,8 +160,8 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 3) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") - self.assertEqual(pdfParser.decode_text(pdf.info[b"Producer"]), "pdfParser") + self.assertEqual(pdfParser.decode_text(pdf.info["Title"]), "abc") + self.assertEqual(pdfParser.decode_text(pdf.info["Producer"]), "pdfParser") def test_pdf_append_to_bytesio(self): im = hopper("RGB") diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index c836175d36e..2f1da8bd5aa 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -62,17 +62,17 @@ def _save(im, fp, filename, save_all=False): existing_pdf = pdfParser.PdfParser() if title: - existing_pdf.info[b"Title"] = pdfParser.encode_text(title) + existing_pdf.info["Title"] = title if author: - existing_pdf.info[b"Author"] = pdfParser.encode_text(author) + existing_pdf.info["Author"] = author if subject: - existing_pdf.info[b"Subject"] = pdfParser.encode_text(subject) + existing_pdf.info["Subject"] = subject if keywords: - existing_pdf.info[b"Keywords"] = pdfParser.encode_text(keywords) + existing_pdf.info["Keywords"] = keywords if creator: - existing_pdf.info[b"Creator"] = pdfParser.encode_text(creator) + existing_pdf.info["Creator"] = creator if producer: - existing_pdf.info[b"Producer"] = pdfParser.encode_text(producer) + existing_pdf.info["Producer"] = producer # # make sure image data is available diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 05e6a1c54ad..c64e13a0663 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -221,24 +221,10 @@ def __bytes__(self): class PdfDict(UserDict): - #def __init__(self, *args, orig_ref=None, pdf=None, **kwargs): def __init__(self, *args, **kwargs): UserDict.__init__(self, *args, **kwargs) - #self.orig_ref = kwargs.pop("orig_ref", None) - #self.pdf = kwargs.pop("pdf", None) - #self.is_changed = False - - def __setitem__(self, key, value): - self.is_changed = True - UserDict.__setitem__(self, key, value) def __bytes__(self): - #if self.orig_ref is not None: - # if self.is_changed: - # if self.pdf is not None: - # del self.pdf.xref_table[self.orig_ref.object_id] - # else: - # return bytes(self.orig_ref) out = bytearray(b"<<") for key, value in self.items(): if value is None: @@ -248,17 +234,12 @@ def __bytes__(self): out.extend(bytes(PdfName(key))) out.extend(b" ") out.extend(value) - #out += b"\n%s %s" % (PdfName(key), value) out.extend(b"\n>>") return bytes(out) #return out + b"\n>>" - __str__ = __bytes__ - - #def write(self, f, orig_ref=None, pdf=None): - # self.orig_ref = orig_ref - # self.pdf = pdf - # f.write(bytes(self)) + if str == bytes: + __str__ = __bytes__ class PdfBinary: @@ -290,7 +271,7 @@ def pdf_repr(x): elif isinstance(x, list): return bytes(PdfArray(x)) elif isinstance(x, str) and str != bytes: - return pdf_repr(x.encode("utf-8")) + return pdf_repr(encode_text(x)) elif isinstance(x, bytes): return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage else: From 53ce9ec4fb7fc3ef8aab75b88869c6ee8d099840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 13:42:11 +0100 Subject: [PATCH 0062/1393] issue #2959: fix PdfDict attribute access, text decoding, tests --- Tests/test_file_pdf.py | 21 ++++++++++++--------- src/PIL/PdfImagePlugin.py | 12 ++++++------ src/PIL/pdfParser.py | 22 +++++++++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index a5813bf7afe..0599b7033af 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -137,13 +137,13 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 1) - self.assertEqual(pdfParser.decode_text(pdf.info["Producer"]), "pdfParser") + self.assertEqual(pdf.info.Producer, "pdfParser") # append some info - pdf.info["Title"] = "abc" - pdf.info["Author"] = "def" - pdf.info["Subject"] = "ghi" - pdf.info["Keywords"] = "jkl" - pdf.info["Creator"] = "hopper()" + pdf.info.Title = "abc" + pdf.info.Author = "def" + pdf.info.Subject = u"ghi\uABCD" + pdf.info.Keywords = "qw)e\\r(ty" + pdf.info.Creator = "hopper()" with open(pdf_filename, "r+b") as f: f.seek(0, os.SEEK_END) pdf.write_xref_and_trailer(f) @@ -151,7 +151,7 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info["Title"]), "abc") + self.assertEqual(pdf.info.Title, "abc") # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") @@ -160,8 +160,11 @@ def test_pdf_append(self): pdf = pdfParser.PdfParser(pdf_filename) self.assertEqual(len(pdf.pages), 3) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info["Title"]), "abc") - self.assertEqual(pdfParser.decode_text(pdf.info["Producer"]), "pdfParser") + self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") + self.assertEqual(pdf.info.Title, "abc") + self.assertEqual(pdf.info.Producer, "pdfParser") + self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") + self.assertEqual(pdf.info.Subject, u"ghi\uABCD") def test_pdf_append_to_bytesio(self): im = hopper("RGB") diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 2f1da8bd5aa..f744c786cb7 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -62,17 +62,17 @@ def _save(im, fp, filename, save_all=False): existing_pdf = pdfParser.PdfParser() if title: - existing_pdf.info["Title"] = title + existing_pdf.info.Title = title if author: - existing_pdf.info["Author"] = author + existing_pdf.info.Author = author if subject: - existing_pdf.info["Subject"] = subject + existing_pdf.info.Subject = subject if keywords: - existing_pdf.info["Keywords"] = keywords + existing_pdf.info.Keywords = keywords if creator: - existing_pdf.info["Creator"] = creator + existing_pdf.info.Creator = creator if producer: - existing_pdf.info["Producer"] = producer + existing_pdf.info.Producer = producer # # make sure image data is available diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index c64e13a0663..3eb18633d62 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -186,7 +186,7 @@ def __init__(self, name): elif isinstance(name, bytes): self.name = name else: - self.name = name.encode("utf-8") + self.name = name.encode("us-ascii") @classmethod def from_pdf_stream(klass, data): @@ -224,6 +224,24 @@ class PdfDict(UserDict): def __init__(self, *args, **kwargs): UserDict.__init__(self, *args, **kwargs) + def __setattr__(self, key, value): + if key == "data": + UserDict.__setattr__(self, key, value) + else: + if isinstance(key, str): + key = key.encode("us-ascii") + self[key] = value + + def __getattr__(self, key): + try: + value = self[key] + except KeyError: + value = self[key.encode("us-ascii")] + if isinstance(value, bytes): + return decode_text(value) + else: + return value + def __bytes__(self): out = bytearray(b"<<") for key, value in self.items(): @@ -624,6 +642,7 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): b"f": b"\f", b"(": b"(", b")": b")", + b"\\": b"\\", ord(b"n"): b"\n", ord(b"r"): b"\r", ord(b"t"): b"\t", @@ -631,6 +650,7 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): ord(b"f"): b"\f", ord(b"("): b"(", ord(b")"): b")", + ord(b"\\"): b"\\", } @classmethod def get_literal_string(klass, data, offset): From 51bed10d4e4ee03d2908a7479ec91fd88fb3d2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 14:54:49 +0100 Subject: [PATCH 0063/1393] issue #2959: oops, hopefully fix Python 2.x --- src/PIL/pdfParser.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 3eb18633d62..6b3162bf035 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -226,7 +226,10 @@ def __init__(self, *args, **kwargs): def __setattr__(self, key, value): if key == "data": - UserDict.__setattr__(self, key, value) + if hasattr(UserDict, "__setattr__"): + UserDict.__setattr__(self, key, value) + else: + self.__dict__[key] = value else: if isinstance(key, str): key = key.encode("us-ascii") From 524addc4993e2d653f86bbaadce3d29a6b3d6d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 15:32:54 +0100 Subject: [PATCH 0064/1393] issue #2959: argh, do we really need to support Python 2.x? ;-) --- src/PIL/pdfParser.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 6b3162bf035..aa0f2b38ad7 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -239,7 +239,10 @@ def __getattr__(self, key): try: value = self[key] except KeyError: - value = self[key.encode("us-ascii")] + try: + value = self[key.encode("us-ascii")] + except KeyError: + raise AttributeError(key) if isinstance(value, bytes): return decode_text(value) else: From 971837cc002e5b28f4278ca754ac8d19350db59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 16:12:39 +0100 Subject: [PATCH 0065/1393] issue #2959: another Py2 bugfix --- src/PIL/pdfParser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index aa0f2b38ad7..9601b2a5a5b 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -294,7 +294,7 @@ def pdf_repr(x): return bytes(PdfDict(x)) elif isinstance(x, list): return bytes(PdfArray(x)) - elif isinstance(x, str) and str != bytes: + elif (str == bytes and isinstance(x, unicode)) or (str != bytes and isinstance(x, str)): return pdf_repr(encode_text(x)) elif isinstance(x, bytes): return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage From 78fe32a431fd95dd4d181998c65499f6811d2bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 17:15:38 +0100 Subject: [PATCH 0066/1393] issue #2959: support streams, add some tests --- Tests/test_file_pdf.py | 13 +++++++++++ Tests/test_pdfparser.py | 18 ++++++++++++++ src/PIL/pdfParser.py | 52 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 0599b7033af..fa27e6730fe 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -166,6 +166,19 @@ def test_pdf_append(self): self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") self.assertEqual(pdf.info.Subject, u"ghi\uABCD") + def test_pdf_append(self): + # make a PDF file + pdf_filename = self.helper_save_as_pdf("RGB", title="title", author="author", subject="subject", keywords="keywords", creator="creator", producer="producer") + # open it, check pages and info + pdf = pdfParser.PdfParser(pdf_filename) + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdf.info.Title, "title") + self.assertEqual(pdf.info.Author, "author") + self.assertEqual(pdf.info.Subject, "subject") + self.assertEqual(pdf.info.Keywords, "keywords") + self.assertEqual(pdf.info.Creator, "creator") + self.assertEqual(pdf.info.Producer, "producer") + def test_pdf_append_to_bytesio(self): im = hopper("RGB") f = io.BytesIO() diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index 511674c31f2..bf1066ff198 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -44,6 +44,24 @@ def test_parsing(self): self.assertEqual(PdfParser.get_value(b"(\\53)", 0), (b"\x2B", 5)) self.assertEqual(PdfParser.get_value(b"(\\53a)", 0), (b"\x2Ba", 6)) self.assertEqual(PdfParser.get_value(b"(\\1111)", 0), (b"\x491", 7)) + self.assertEqual(PdfParser.get_value(b" 123 (", 0), (123, 4)) + self.assertAlmostEqual(PdfParser.get_value(b" 123.4 %", 0)[0], 123.4) + self.assertEqual(PdfParser.get_value(b" 123.4 %", 0)[1], 6) + self.assertRaises(PdfFormatError, PdfParser.get_value, b"]", 0) + d = PdfParser.get_value(b"<>", 0)[0] + self.assertIsInstance(d, PdfDict) + self.assertEqual(len(d), 2) + self.assertEqual(d.Name, "value") + self.assertEqual(d[b"Name"], b"value") + self.assertEqual(d.N, PdfName("V")) + a = PdfParser.get_value(b"[/Name (value) /N /V]", 0)[0] + self.assertIsInstance(a, list) + self.assertEqual(len(a), 4) + self.assertEqual(a[0], PdfName("Name")) + s = PdfParser.get_value(b"<>\nstream\nabcde\nendstream<<...", 0)[0] + self.assertIsInstance(s, PdfStream) + self.assertEqual(s.dictionary.Name, "value") + self.assertEqual(s.decode(), b"abcde") def test_pdf_repr(self): self.assertEqual(bytes(IndirectReference(1,2)), b"1 2 R") diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index 9601b2a5a5b..f07d53f688e 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -4,6 +4,7 @@ import mmap import re import sys +import zlib try: from UserDict import UserDict @@ -188,6 +189,15 @@ def __init__(self, name): else: self.name = name.encode("us-ascii") + def __eq__(self, other): + return (isinstance(other, PdfName) and other.name == self.name) or other == self.name + + def __hash__(self): + return hash(self.name) + + def __repr__(self): + return "PdfName(%s)" % repr(self.name) + @classmethod def from_pdf_stream(klass, data): return klass(PdfParser.interpret_name(data)) @@ -260,7 +270,6 @@ def __bytes__(self): out.extend(value) out.extend(b"\n>>") return bytes(out) - #return out + b"\n>>" if str == bytes: __str__ = __bytes__ @@ -279,6 +288,26 @@ def __bytes__(self): return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) +class PdfStream: + def __init__(self, dictionary, buf): + self.dictionary = dictionary + self.buf = buf + + def decode(self): + try: + filter = self.dictionary.Filter + except AttributeError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary.DL + except AttributeError: + expected_length = self.dictionary.Length + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + raise NotImplementedError("stream filter %s unknown/unsupported" % repr(self.dictionary.Filter)) + + def pdf_repr(x): if x is True: return b"true" @@ -550,6 +579,8 @@ def interpret_name(klass, raw, as_text=False): re_indirect_def_start = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"obj(?=" + delimiter_or_ws + br")") re_indirect_def_end = re.compile(whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")") re_comment = re.compile(br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") + re_stream_start = re.compile(whitespace_optional + br"stream\r?\n") + re_stream_end = re.compile(whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") @classmethod def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): #if max_nesting == 0: @@ -593,7 +624,21 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): return result, None m = klass.re_dict_end.match(data, offset) #print(">>") - return result, m.end() + offset = m.end() + m = klass.re_stream_start.match(data, offset) + if m: + try: + stream_len = int(result[b"Length"]) + except: + raise PdfFormatError("bad or missing Length in stream dict (%r)" % result.get(b"Length", None)) + stream_data = data[m.end():m.end() + stream_len] + m = klass.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m, "stream end not found") + offset = m.end() + result = PdfStream(PdfDict(result), stream_data) + else: + result = PdfDict(result) + return result, offset m = klass.re_array_start.match(data, offset) if m: offset = m.end() @@ -618,7 +663,7 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): return False, m.end() m = klass.re_name.match(data, offset) if m: - return klass.interpret_name(m.group(1)), m.end() + return PdfName(klass.interpret_name(m.group(1))), m.end() m = klass.re_int.match(data, offset) if m: return int(m.group(1)), m.end() @@ -634,7 +679,6 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): m = klass.re_string_lit.match(data, offset) if m: return klass.get_literal_string(data, m.end()) - # XXX TODO: stream #return None, offset # fallback (only for debugging) raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) From ede57b91e0f91e5c0558f247165d398cda23fe46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Fri, 26 Jan 2018 19:07:43 +0100 Subject: [PATCH 0067/1393] issue #2959: keep file open, add context manager, add methods to support writing, eliminate the passing of file or buffer --- Tests/test_file_pdf.py | 95 +++++++++++++++++++--------------- src/PIL/PdfImagePlugin.py | 21 ++++---- src/PIL/pdfParser.py | 105 +++++++++++++++++++++++++------------- 3 files changed, 134 insertions(+), 87 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index fa27e6730fe..824f6149aa6 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -19,6 +19,11 @@ def helper_save_as_pdf(self, mode, **kwargs): # Assert self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + with pdfParser.PdfParser(outfile) as pdf: + if kwargs.get("append_images", False) or kwargs.get("append", False): + self.assertGreater(len(pdf.pages), 1) + else: + self.assertGreater(len(pdf.pages), 0) return outfile @@ -100,27 +105,34 @@ def imGenerator(ims): self.assertGreater(os.path.getsize(outfile), 0) def test_pdf_open(self): - # fail on empty buffer - self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray()) # fail on a buffer full of null bytes self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray(65536)) # make an empty PDF object - empty_pdf = pdfParser.PdfParser() - self.assertEqual(len(empty_pdf.pages), 0) + with pdfParser.PdfParser() as empty_pdf: + self.assertEqual(len(empty_pdf.pages), 0) + self.assertEqual(len(empty_pdf.info), 0) + self.assertFalse(empty_pdf.should_close_buf) + self.assertFalse(empty_pdf.should_close_file) # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB") # open the PDF file - hopper_pdf = pdfParser.PdfParser(filename=pdf_filename) - self.assertEqual(len(hopper_pdf.pages), 1) + with pdfParser.PdfParser(filename=pdf_filename) as hopper_pdf: + self.assertEqual(len(hopper_pdf.pages), 1) + self.assertTrue(hopper_pdf.should_close_buf) + self.assertTrue(hopper_pdf.should_close_file) # read a PDF file from a buffer with a non-zero offset with open(pdf_filename, "rb") as f: content = b"xyzzy" + f.read() - hopper_pdf = pdfParser.PdfParser(buf=content, start_offset=5) - self.assertEqual(len(hopper_pdf.pages), 1) + with pdfParser.PdfParser(buf=content, start_offset=5) as hopper_pdf: + self.assertEqual(len(hopper_pdf.pages), 1) + self.assertFalse(hopper_pdf.should_close_buf) + self.assertFalse(hopper_pdf.should_close_file) # read a PDF file from an already open file with open(pdf_filename, "rb") as f: - hopper_pdf = pdfParser.PdfParser(f=f) - self.assertEqual(len(hopper_pdf.pages), 1) + with pdfParser.PdfParser(f=f) as hopper_pdf: + self.assertEqual(len(hopper_pdf.pages), 1) + self.assertTrue(hopper_pdf.should_close_buf) + self.assertFalse(hopper_pdf.should_close_file) def test_pdf_append_fails_on_nonexistent_file(self): im = hopper("RGB") @@ -134,50 +146,49 @@ def test_pdf_append(self): # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB", producer="pdfParser") # open it, check pages and info - pdf = pdfParser.PdfParser(pdf_filename) - self.assertEqual(len(pdf.pages), 1) - self.assertEqual(len(pdf.info), 1) - self.assertEqual(pdf.info.Producer, "pdfParser") - # append some info - pdf.info.Title = "abc" - pdf.info.Author = "def" - pdf.info.Subject = u"ghi\uABCD" - pdf.info.Keywords = "qw)e\\r(ty" - pdf.info.Creator = "hopper()" - with open(pdf_filename, "r+b") as f: - f.seek(0, os.SEEK_END) + with pdfParser.PdfParser(pdf_filename, mode="r+b") as pdf: + self.assertEqual(len(pdf.pages), 1) + self.assertEqual(len(pdf.info), 1) + self.assertEqual(pdf.info.Producer, "pdfParser") + # append some info + pdf.info.Title = "abc" + pdf.info.Author = "def" + pdf.info.Subject = u"ghi\uABCD" + pdf.info.Keywords = "qw)e\\r(ty" + pdf.info.Creator = "hopper()" + pdf.start_writing() pdf.write_xref_and_trailer(f) # open it again, check pages and info again - pdf = pdfParser.PdfParser(pdf_filename) - self.assertEqual(len(pdf.pages), 1) - self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdf.info.Title, "abc") + with pdfParser.PdfParser(pdf_filename) as pdf: + self.assertEqual(len(pdf.pages), 1) + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdf.info.Title, "abc") # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P]) # open the PDF again, check pages and info again - pdf = pdfParser.PdfParser(pdf_filename) - self.assertEqual(len(pdf.pages), 3) - self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") - self.assertEqual(pdf.info.Title, "abc") - self.assertEqual(pdf.info.Producer, "pdfParser") - self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") - self.assertEqual(pdf.info.Subject, u"ghi\uABCD") + with pdfParser.PdfParser(pdf_filename) as pdf: + self.assertEqual(len(pdf.pages), 3) + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") + self.assertEqual(pdf.info.Title, "abc") + self.assertEqual(pdf.info.Producer, "pdfParser") + self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") + self.assertEqual(pdf.info.Subject, u"ghi\uABCD") def test_pdf_append(self): # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB", title="title", author="author", subject="subject", keywords="keywords", creator="creator", producer="producer") # open it, check pages and info - pdf = pdfParser.PdfParser(pdf_filename) - self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdf.info.Title, "title") - self.assertEqual(pdf.info.Author, "author") - self.assertEqual(pdf.info.Subject, "subject") - self.assertEqual(pdf.info.Keywords, "keywords") - self.assertEqual(pdf.info.Creator, "creator") - self.assertEqual(pdf.info.Producer, "producer") + with pdfParser.PdfParser(pdf_filename) as pdf: + self.assertEqual(len(pdf.info), 6) + self.assertEqual(pdf.info.Title, "title") + self.assertEqual(pdf.info.Author, "author") + self.assertEqual(pdf.info.Subject, "subject") + self.assertEqual(pdf.info.Keywords, "keywords") + self.assertEqual(pdf.info.Creator, "creator") + self.assertEqual(pdf.info.Producer, "producer") def test_pdf_append_to_bytesio(self): im = hopper("RGB") diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index f744c786cb7..6b90db12eb5 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -56,10 +56,9 @@ def _save(im, fp, filename, save_all=False): producer = im.encoderinfo.get("producer", None) if is_appending: - existing_pdf = pdfParser.PdfParser(f=fp, filename=filename) - fp.seek(0, io.SEEK_END) + existing_pdf = pdfParser.PdfParser(f=fp, filename=filename, mode="r+b") else: - existing_pdf = pdfParser.PdfParser() + existing_pdf = pdfParser.PdfParser(f=fp, filename=filename, mode="w+b") if title: existing_pdf.info.Title = title @@ -78,8 +77,9 @@ def _save(im, fp, filename, save_all=False): # make sure image data is available im.load() - existing_pdf.write_header(fp) - existing_pdf.write_comment(fp, "created by PIL PDF driver " + __version__) + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment("created by PIL PDF driver " + __version__) # # pages @@ -110,7 +110,7 @@ def _save(im, fp, filename, save_all=False): # # catalog and list of pages - existing_pdf.write_catalog(fp) + existing_pdf.write_catalog() pageNumber = 0 for imSequence in ims: @@ -175,7 +175,7 @@ def _save(im, fp, filename, save_all=False): width, height = im.size - existing_pdf.write_obj(fp, image_refs[pageNumber], stream=op.getvalue(), + existing_pdf.write_obj(image_refs[pageNumber], stream=op.getvalue(), Type=pdfParser.PdfName("XObject"), Subtype=pdfParser.PdfName("Image"), Width=width, # * 72.0 / resolution, @@ -188,7 +188,7 @@ def _save(im, fp, filename, save_all=False): # # page - existing_pdf.write_page(fp, page_refs[pageNumber], + existing_pdf.write_page(page_refs[pageNumber], Resources=pdfParser.PdfDict( ProcSet=[pdfParser.PdfName("PDF"), pdfParser.PdfName(procset)], XObject=pdfParser.PdfDict(image=image_refs[pageNumber])), @@ -204,15 +204,16 @@ def _save(im, fp, filename, save_all=False): int(width * 72.0 / resolution), int(height * 72.0 / resolution))) - existing_pdf.write_obj(fp, contents_refs[pageNumber], stream=page_contents) + existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) pageNumber += 1 # # trailer - existing_pdf.write_xref_and_trailer(fp) + existing_pdf.write_xref_and_trailer() if hasattr(fp, "flush"): fp.flush() + existing_pdf.close() # # -------------------------------------------------------------------- diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index f07d53f688e..be4f2ccf10f 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -2,6 +2,7 @@ import collections import io import mmap +import os import re import sys import zlib @@ -336,17 +337,25 @@ class PdfParser: Supports PDF up to 1.4 """ - def __init__(self, filename=None, f=None, buf=None, start_offset=0): + def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): + # type: (PdfParser, str, file, Union[bytes, bytearray], int, str) -> None + assert not (buf and f) self.filename = filename self.buf = buf + self.f = f self.start_offset = start_offset - if buf is not None: + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + if buf: self.read_pdf_info() - elif f is not None: - self.read_pdf_info_from_file(f) - elif filename is not None: - with open(filename, "rb") as f: - self.read_pdf_info_from_file(f) else: self.file_size_total = self.file_size_this = 0 self.root = PdfDict() @@ -360,33 +369,63 @@ def __init__(self, filename=None, f=None, buf=None, start_offset=0): self.trailer_dict = {} self.xref_table = XrefTable() self.xref_table.reading_finished = True + if f: + self.seek_end() - def write_header(self, f): - f.write(b"%PDF-1.4\n") + def __enter__(self): + return self - def write_comment(self, f, s): - f.write(("%% %s\n" % (s,)).encode("utf-8")) + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False # do not suppress exceptions - def write_catalog(self, f): + def start_writing(self): + self.close_buf() + self.seek_end() + + def close_buf(self): + try: + self.buf.close() + except AttributeError: + pass + self.buf = None + + def close(self): + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self): + self.f.seek(0, os.SEEK_END) + + def write_header(self): + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s): + self.f.write(("%% %s\n" % (s,)).encode("utf-8")) + + def write_catalog(self): self.del_root() - self.root_ref = self.next_object_id(f.tell()) + self.root_ref = self.next_object_id(self.f.tell()) self.pages_ref = self.next_object_id(0) - self.write_obj(f, self.root_ref, + self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj(f, self.pages_ref, + self.write_obj(self.pages_ref, Type=PdfName("Pages"), Count=len(self.pages), Kids=self.pages) return self.root_ref - def write_xref_and_trailer(self, f, new_root_ref=None): + def write_xref_and_trailer(self, new_root_ref=None): if new_root_ref: self.del_root() self.root_ref = new_root_ref if self.info: - self.info_ref = self.write_obj(f, None, self.info) - start_xref = self.xref_table.write(f) + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) num_entries = len(self.xref_table) trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} if self.last_xref_section_offset is not None: @@ -394,18 +433,19 @@ def write_xref_and_trailer(self, f, new_root_ref=None): if self.info: trailer_dict[b"Info"] = self.info_ref self.last_xref_section_offset = start_xref - f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) + self.f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) - def write_page(self, f, ref, *objs, **dict_obj): + def write_page(self, ref, *objs, **dict_obj): if isinstance(ref, int): ref = self.pages[ref] if "Type" not in dict_obj: dict_obj["Type"] = PdfName("Page") if "Parent" not in dict_obj: dict_obj["Parent"] = self.pages_ref - return self.write_obj(f, ref, *objs, **dict_obj) + return self.write_obj(ref, *objs, **dict_obj) - def write_obj(self, f, ref, *objs, **dict_obj): + def write_obj(self, ref, *objs, **dict_obj): + f = self.f if ref is None: ref = self.next_object_id(f.tell()) else: @@ -432,22 +472,17 @@ def del_root(self): del self.xref_table[self.root[b"Pages"].object_id] # XXX TODO delete Pages tree recursively - def read_pdf_info_from_file(self, f): + @staticmethod + def get_buf_from_file(f): if hasattr(f, "getbuffer"): - self.buf = f.getbuffer() - need_close = False + return f.getbuffer() elif hasattr(f, "getvalue"): - self.buf = f.getvalue() - need_close = False + return f.getvalue() else: - self.buf = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - need_close = True - try: - self.read_pdf_info() - finally: - if need_close: - self.buf.close() - self.buf = None + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" def read_pdf_info(self): self.file_size_total = len(self.buf) From 5e0de385198f7c77b98ed8545a7b198e6173e022 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 27 Jan 2018 10:09:51 +1100 Subject: [PATCH 0068/1393] Removed duplicate line --- Tests/test_image_tobitmap.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_image_tobitmap.py b/Tests/test_image_tobitmap.py index 5c47eade729..f93fce6a840 100644 --- a/Tests/test_image_tobitmap.py +++ b/Tests/test_image_tobitmap.py @@ -6,7 +6,6 @@ class TestImageToBitmap(PillowTestCase): def test_sanity(self): self.assertRaises(ValueError, lambda: hopper().tobitmap()) - hopper().convert("1").tobitmap() im1 = hopper().convert("1") From d212808e3db1934ad602e3bd4b7903a0251b4e23 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 27 Jan 2018 16:19:02 +1100 Subject: [PATCH 0069/1393] Fixed typo --- 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 8d4d9c8a841..1a763b65380 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1457,7 +1457,7 @@ def point(self, lut, mode=None): """ Maps this image through a lookup table or function. - :param lut: A lookup table, containing 256 (or 65336 if + :param lut: A lookup table, containing 256 (or 65536 if self.mode=="I" and mode == "L") values per band in the image. A function can be used instead, it should take a single argument. The function is called once for each @@ -2102,7 +2102,7 @@ def transform(self, size, method, data=None, resample=NEAREST, in the output image. :returns: An :py:class:`~PIL.Image.Image` object. """ - + if self.mode == 'LA': return self.convert('La').transform( size, method, data, resample, fill).convert('LA') From 22a59ac839d16c370c542136dfacb197159b22cc Mon Sep 17 00:00:00 2001 From: Metallicow Date: Sat, 27 Jan 2018 00:02:56 -0600 Subject: [PATCH 0070/1393] Trim trailing whitespace src dir --- src/PIL/DcxImagePlugin.py | 2 +- src/PIL/Image.py | 2 +- src/PIL/ImageTk.py | 2 +- src/PIL/MpoImagePlugin.py | 2 +- src/PIL/PngImagePlugin.py | 2 +- src/PIL/TiffTags.py | 6 +++--- src/_imaging.c | 20 ++++++++++---------- src/_imagingft.c | 8 ++++---- src/libImaging/Resample.c | 2 +- src/libImaging/SgiRleDecode.c | 20 ++++++++++---------- src/libImaging/Unpack.c | 4 ++-- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/PIL/DcxImagePlugin.py b/src/PIL/DcxImagePlugin.py index 0d920ad3c37..2045927596f 100644 --- a/src/PIL/DcxImagePlugin.py +++ b/src/PIL/DcxImagePlugin.py @@ -42,7 +42,7 @@ class DcxImageFile(PcxImageFile): format = "DCX" format_description = "Intel DCX" _close_exclusive_fp_after_loading = False - + def _open(self): # Header diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 8d4d9c8a841..a5bb5a00d3b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2102,7 +2102,7 @@ def transform(self, size, method, data=None, resample=NEAREST, in the output image. :returns: An :py:class:`~PIL.Image.Image` object. """ - + if self.mode == 'LA': return self.convert('La').transform( size, method, data, resample, fill).convert('LA') diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index a19ed1d0d3f..78ba6d1cbfd 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -278,7 +278,7 @@ def __str__(self): def getimage(photo): """ This function is unimplemented """ - + """Copies the contents of a PhotoImage to a PIL image memory.""" photo.tk.call("PyImagingPhotoGet", photo) diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index 8ad27b919c6..460ccec27f7 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -40,7 +40,7 @@ class MpoImageFile(JpegImagePlugin.JpegImageFile): format = "MPO" format_description = "MPO (CIPA DC-007)" _close_exclusive_fp_after_loading = False - + def _open(self): self.fp.seek(0) # prep the fp in order to pass the JPEG test JpegImagePlugin.JpegImageFile._open(self) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index fd89213ed75..4b9f5da5e16 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -750,7 +750,7 @@ def _save(im, fp, filename, chunk=putchunk): name = b"ICC Profile" data = name + b"\0\0" + zlib.compress(icc) chunk(fp, b"iCCP", data) - + # You must either have sRGB or iCCP. # Disallow sRGB chunks when an iCCP-chunk has been emitted. chunks.remove(b"sRGB") diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index eba88ef8dd4..d3150775c8c 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -143,7 +143,7 @@ def lookup(tag): 342: ("TransferRange", SHORT, 6), 347: ("JPEGTables", UNDEFINED, 1), - + # obsolete JPEG tags 512: ("JPEGProc", SHORT, 1), 513: ("JPEGInterchangeFormat", LONG, 1), @@ -161,7 +161,7 @@ def lookup(tag): 532: ("ReferenceBlackWhite", LONG, 0), 700: ('XMP', BYTE, 1), - + 33432: ("Copyright", ASCII, 1), 34377: ('PhotoshopInfo', BYTE, 1), @@ -193,7 +193,7 @@ def lookup(tag): 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one 50839: ("ImageJMetaData", UNDEFINED, 1) # see Issue #2006 } diff --git a/src/_imaging.c b/src/_imaging.c index e50a06e84b6..11f5f6ea487 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -1499,11 +1499,11 @@ _resize(ImagingObject* self, PyObject* args) int xsize, ysize; int filter = IMAGING_TRANSFORM_NEAREST; float box[4] = {0, 0, 0, 0}; - + imIn = self->image; 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])) return NULL; @@ -3325,7 +3325,7 @@ _reset_stats(PyObject* self, PyObject* args) if (!PyArg_ParseTuple(args, ":reset_stats")) return NULL; - + arena->stats_new_count = 0; arena->stats_allocated_blocks = 0; arena->stats_reused_blocks = 0; @@ -3341,7 +3341,7 @@ _get_alignment(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":get_alignment")) return NULL; - + return PyInt_FromLong(ImagingDefaultArena.alignment); } @@ -3350,7 +3350,7 @@ _get_block_size(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":get_block_size")) return NULL; - + return PyInt_FromLong(ImagingDefaultArena.block_size); } @@ -3359,7 +3359,7 @@ _get_blocks_max(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, ":get_blocks_max")) return NULL; - + return PyInt_FromLong(ImagingDefaultArena.blocks_max); } @@ -3369,7 +3369,7 @@ _set_alignment(PyObject* self, PyObject* args) int alignment; if (!PyArg_ParseTuple(args, "i:set_alignment", &alignment)) return NULL; - + if (alignment < 1 || alignment > 128) { PyErr_SetString(PyExc_ValueError, "alignment should be from 1 to 128"); return NULL; @@ -3392,7 +3392,7 @@ _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"); @@ -3417,7 +3417,7 @@ _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"); @@ -3440,7 +3440,7 @@ _clear_cache(PyObject* self, PyObject* args) if (!PyArg_ParseTuple(args, "|i:clear_cache", &i)) return NULL; - + ImagingMemoryClearCache(&ImagingDefaultArena, i); Py_INCREF(Py_None); diff --git a/src/_imagingft.c b/src/_imagingft.c index 92642e7338e..86e0fe45b8b 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -108,7 +108,7 @@ typedef struct { t_raqm_set_par_direction set_par_direction; t_raqm_add_font_feature add_font_feature; t_raqm_set_freetype_face set_freetype_face; - t_raqm_layout layout; + t_raqm_layout layout; t_raqm_get_glyphs get_glyphs; t_raqm_get_glyphs_01 get_glyphs_01; t_raqm_destroy destroy; @@ -247,7 +247,7 @@ getfont(PyObject* self_, PyObject* args, PyObject* kw) return NULL; } - if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|is"PY_ARG_BYTES_LENGTH"i", + if (!PyArg_ParseTupleAndKeywords(args, kw, "eti|is"PY_ARG_BYTES_LENGTH"i", kwlist, Py_FileSystemDefaultEncoding, &filename, &size, &index, &encoding, &font_bytes, @@ -458,7 +458,7 @@ text_layout_raqm(PyObject* string, FontObject* self, const char* dir, count = 0; goto failed; } - } else { /* version == 2 */ + } else { /* version == 2 */ glyphs = (*p_raqm.get_glyphs)(rq, &count); if (glyphs == NULL) { PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); @@ -654,7 +654,7 @@ font_getsize(FontObject* self, PyObject* args) PyMem_Free(glyph_info); glyph_info = NULL; } - + if (face) { /* left bearing */ diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index 877f25a9416..7cefdb2afb5 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -226,7 +226,7 @@ normalize_coeffs_8bpc(int outSize, int ksize, double *prekk) -void +void ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk) { diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index 1d41437fc13..9d8e56376ce 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -28,7 +28,7 @@ static void read4B(UINT32* dest, UINT8* buf) static int expandrow(UINT8* dest, UINT8* src, int n, int z) { UINT8 pixel, count; - + for (;n > 0; n--) { pixel = *src++; @@ -42,7 +42,7 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) *dest = *src++; dest += z; } - + } else { pixel = *src++; @@ -51,7 +51,7 @@ static int expandrow(UINT8* dest, UINT8* src, int n, int z) dest += z; } } - + } return 0; } @@ -60,7 +60,7 @@ static int expandrow2(UINT16* dest, UINT16* src, int n, int z) { UINT8 pixel, count; - + for (;n > 0; n--) { pixel = ((UINT8*)src)[1]; @@ -96,7 +96,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, SGISTATE *c; int err = 0; - /* Get all data from File descriptor */ + /* 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); @@ -155,7 +155,7 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, 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; - + /* row decompression */ if (c->bpc ==1) { if(expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands)) @@ -165,19 +165,19 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, if(expandrow2((UINT16*)&state->buffer[c->channo * 2], (UINT16*)&ptr[c->rleoffset], c->rlelength, im->bands)) 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); free(c->lengthtab); free(ptr); diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 036cec5e482..0e7462c6e96 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -188,7 +188,7 @@ unpack1IR(UINT8* out, const UINT8* in, int pixels) static void unpack18(UINT8* out, const UINT8* in, int pixels) { - /* Unpack a '|b1' image, which is a numpy boolean. + /* Unpack a '|b1' image, which is a numpy boolean. 1 == true, 0==false, in bytes */ int i; @@ -1334,7 +1334,7 @@ static struct { {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, #endif - + /* true colour w. alpha premultiplied */ {"RGBa", "RGBa", 32, copy4}, From b13025129bab38efba4c9540fe47df739d369927 Mon Sep 17 00:00:00 2001 From: Metallicow Date: Sat, 27 Jan 2018 00:04:46 -0600 Subject: [PATCH 0071/1393] Trim trailing whitespace docs dir --- docs/reference/Image.rst | 6 +++--- docs/reference/block_allocator.rst | 4 ++-- docs/reference/internal_design.rst | 4 ++-- docs/reference/open_files.rst | 28 ++++++++++++++-------------- docs/releasenotes/4.0.0.rst | 10 +++++----- docs/releasenotes/4.1.0.rst | 12 ++++++------ docs/releasenotes/4.3.0.rst | 8 ++++---- docs/releasenotes/5.0.0.rst | 4 ++-- 8 files changed, 38 insertions(+), 38 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 915f61c0467..216c71d620c 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -168,10 +168,10 @@ Instances of the :py:class:`Image` class have the following attributes: .. py:attribute:: filename - The filename or path of the source file. Only images created with the - factory function `open` have a filename attribute. If the input is a + The filename or path of the source file. Only images created with the + factory function `open` have a filename attribute. If the input is a file like object, the filename attribute is set to an empty string. - + :type: :py:class: `string` .. py:attribute:: format diff --git a/docs/reference/block_allocator.rst b/docs/reference/block_allocator.rst index da5b3b8d837..e70f9667c1b 100644 --- a/docs/reference/block_allocator.rst +++ b/docs/reference/block_allocator.rst @@ -40,8 +40,8 @@ variables: * ``PILLOW_BLOCK_SIZE``, in bytes, K, or M. Specifies the maximum block size for ``ImagingAllocateArray``. Valid values are - integers, with an optional `k` or `m` suffix. Defaults to 16M. + integers, with an optional `k` or `m` suffix. Defaults to 16M. * ``PILLOW_BLOCKS_MAX`` Specifies the number of freed blocks to retain to fill future memory requests. Any freed blocks over this - threshold will be returned to the OS immediately. Defaults to 0. + threshold will be returned to the OS immediately. Defaults to 0. diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst index 4c0fbb85d50..bbc9050cff0 100644 --- a/docs/reference/internal_design.rst +++ b/docs/reference/internal_design.rst @@ -3,8 +3,8 @@ Internal Reference Docs .. toctree:: :maxdepth: 2 - + open_files limits block_allocator - + diff --git a/docs/reference/open_files.rst b/docs/reference/open_files.rst index 143eb7209fd..d60f63a094f 100644 --- a/docs/reference/open_files.rst +++ b/docs/reference/open_files.rst @@ -4,7 +4,7 @@ File Handling in Pillow When opening a file as an image, Pillow requires a filename, pathlib.Path object, or a file-like object. Pillow uses the filename or Path to open a file, so for the rest of this article, they will all -be treated as a file-like object. +be treated as a file-like object. The first four of these items are equivalent, the last is dangerous and may fail:: @@ -12,14 +12,14 @@ and may fail:: from PIL import Image import io import pathlib - + im = Image.open('test.jpg') im2 = Image.open(pathlib.Path('test.jpg')) f = open('test.jpg', 'rb') im3 = Image.open(f) - + with open('test.jpg', 'rb') as f: im4 = Image.open(io.BytesIO(f.read())) @@ -31,10 +31,10 @@ and may fail:: The documentation specifies that the file will be closed after the ``Image.Image.load()`` method is called. This is an aspirational specification rather than an accurate reflection of the state of the -code. +code. Pillow cannot in general close and reopen a file, so any access to -that file needs to be prior to the close. +that file needs to be prior to the close. Issues ------ @@ -44,10 +44,10 @@ The current open file handling is inconsistent at best: * Most of the image plugins do not close the input file. * Multi-frame images behave badly when seeking through the file, as it's legal to seek backward in the file until the last image is - read, and then it's not. + read, and then it's not. * Using the file context manager to provide a file-like object to Pillow is dangerous unless the context of the image is limited to - the context of the file. + the context of the file. Image Lifecycle --------------- @@ -59,7 +59,7 @@ Image Lifecycle * ``Image.Image.load()`` when the pixel data from the image is required, ``load()`` is called. The current frame is read into memory. The image can now be used independently of the underlying - image file. + image file. * ``Image.Image.seek()`` in the case of multi-frame images (e.g. multipage TIFF and animated GIF) the image file left open so @@ -72,12 +72,12 @@ Image Lifecycle support. e.g.:: with Image.open('test.jpg') as img: - ... # image operations here. + ... # image operations here. The lifecycle of a single frame image is relatively simple. The file must remain open until the ``load()`` or ``close()`` function is -called. +called. Multi-frame images are more complicated. The ``load()`` method is not a terminal method, so it should not close the underlying file. The @@ -85,7 +85,7 @@ current behavior of ``seek()`` closing the underlying file on accessing the last frame is presumably a heuristic for closing the file after iterating through the entire sequence. In general, Pillow does not know if there are going to be any requests for additional -data until the caller has explicitly closed the image. +data until the caller has explicitly closed the image. Complications @@ -94,7 +94,7 @@ Complications * TiffImagePlugin has some code to pass the underlying file descriptor into libtiff (if working on an actual file). Since libtiff closes the file descriptor internally, it is duplicated prior to passing it - into libtiff. + into libtiff. * ``decoder.handles_eof`` This slightly misnamed flag indicates that the decoder wants to be called with a 0 length buffer when reads are @@ -118,8 +118,8 @@ Proposed File Handling * ``Image.Image.load()`` should close the image file, unless there are multiple frames. -* ``Image.Image.seek()`` should never close the image file. +* ``Image.Image.seek()`` should never close the image file. * Users of the library should call ``Image.Image.close()`` on any - multi-frame image to ensure that the underlying file is closed. + multi-frame image to ensure that the underlying file is closed. diff --git a/docs/releasenotes/4.0.0.rst b/docs/releasenotes/4.0.0.rst index 4d21a2e54fe..cbf131c9311 100644 --- a/docs/releasenotes/4.0.0.rst +++ b/docs/releasenotes/4.0.0.rst @@ -23,17 +23,17 @@ redirected to the olefile package. Direct accesses to ``PIL.OlefileIO`` raises a deprecation warning, then patches the upstream olefile into ``sys.modules`` in its place. -SGI image save +SGI image save ============== It is now possible to save images in modes ``L``, ``RGB``, and -``RGBA`` to the uncompressed SGI image format. +``RGBA`` to the uncompressed SGI image format. Zero sized images ================= Pillow 3.4.0 removed support for creating images with (0,0) size. This -has been reenabled, restoring pre 3.4 behavior. +has been reenabled, restoring pre 3.4 behavior. Internal handles_eof flag ========================= @@ -41,11 +41,11 @@ Internal handles_eof flag The ``handles_eof flag`` for decoding images has been removed, as there were no internal users of the flag. Anyone maintaining image decoders outside of the Pillow source tree should consider using the cleanup -function pointers instead. +function pointers instead. Image.core.stretch removed ========================== The stretch function on the core image object has been removed. This used to be for enlarging the image, but has been aliased to resize -recently. +recently. diff --git a/docs/releasenotes/4.1.0.rst b/docs/releasenotes/4.1.0.rst index a6fb9d2afec..dc5d734790c 100644 --- a/docs/releasenotes/4.1.0.rst +++ b/docs/releasenotes/4.1.0.rst @@ -12,7 +12,7 @@ Several deprecated items have been removed. * The methods :py:meth:`PIL.ImageDraw.ImageDraw.setink`, :py:meth:`PIL.ImageDraw.ImageDraw.setfill`, and - :py:meth:`PIL.ImageDraw.ImageDraw.setfont` have been removed. + :py:meth:`PIL.ImageDraw.ImageDraw.setfont` have been removed. Closing Files When Opening Images @@ -27,7 +27,7 @@ is specified: responsibility of the calling code to close the file. * For images where Pillow opens the file and the file is known to have - only one frame, the file is closed after loading. + only one frame, the file is closed after loading. * If the file has more than one frame, or if it can't be determined, then the file is left open to permit seeking to subsequent @@ -36,7 +36,7 @@ is specified: * If the image is memory mapped, then we can't close the mapping to the underlying file until we are done with the image. The mapping - will be closed in the ``close`` or ``__del__`` method. + will be closed in the ``close`` or ``__del__`` method. Changes to GIF Handling When Saving @@ -50,7 +50,7 @@ saving images. There are two external changes that arise from this: * The image to be saved is no longer modified in place by any of the operations of the save function. Previously it was modified when - optimizing the image palette. + optimizing the image palette. This refactor fixed some bugs with palette handling when saving multiple frame GIFs. @@ -60,7 +60,7 @@ New Method: Image.remap_palette The method :py:meth:`PIL.Image.Image.remap_palette()` has been added. This method was hoisted from the GifImagePlugin code used to -optimize the palette. +optimize the palette. Added Decoder Registry and Support for Python Based Decoders ============================================================ @@ -76,7 +76,7 @@ Tests ===== Many tests have been added, including correctness tests for image -formats that have been previously untested. +formats that have been previously untested. We are now running automated tests in Docker containers against more Linux versions than are provided on Travis CI, which is currently diff --git a/docs/releasenotes/4.3.0.rst b/docs/releasenotes/4.3.0.rst index 64913592220..827754230c2 100644 --- a/docs/releasenotes/4.3.0.rst +++ b/docs/releasenotes/4.3.0.rst @@ -20,7 +20,7 @@ TIFF Metadata Changes single element tuple. This is only with the new api, not the legacy api. This normalizes the handling of fields, so that the metadata with inferred or image specified counts are handled the same as - metadata with count specified in the TIFF spec. + metadata with count specified in the TIFF spec. * The ``PhotoshopInfo``, ``XMP``, and ``JPEGTables`` tags now have a defined type (bytes) and a count of 1. * The ``ImageJMetaDataByteCounts`` tag now has an arbitrary number of @@ -85,7 +85,7 @@ There is a new :py:class:`PIL.ImageFilter.MultibandFilter` base class for image filters that can run on all channels of an image in one operation. The original :py:class:`PIL.ImageFilter.Filter` class remains for image filters that can process only single band images, or -require splitting of channels prior to filtering. +require splitting of channels prior to filtering. Other Changes ============= @@ -109,7 +109,7 @@ images to and from RGB and RGBA formats. The image data is truncated to 8-bit precision. Pillow can now read RLE encoded SGI images in both 8 and 16-bit -precision. +precision. Performance ^^^^^^^^^^^ @@ -124,7 +124,7 @@ This release contains several performance improvements: * ``Image.transpose`` has been accelerated 15% or more by using a cache friendly algorithm. * ImageFilters based on Kernel convolution are significantly faster - due to the new MultibandFilter feature. + due to the new MultibandFilter feature. * All memory allocation for images is now done in blocks, rather than falling back to an allocation for each scan line for images larger than the block size. diff --git a/docs/releasenotes/5.0.0.rst b/docs/releasenotes/5.0.0.rst index 6f61fbd858e..509edbe6df8 100644 --- a/docs/releasenotes/5.0.0.rst +++ b/docs/releasenotes/5.0.0.rst @@ -69,7 +69,7 @@ GIF Disposal ^^^^^^^^^^^^ Multiframe GIF images now take an optional disposal parameter to -specify the disposal option for changed pixels. +specify the disposal option for changed pixels. Other Changes ============= @@ -88,7 +88,7 @@ Libraqm is now Dynamically Linked The libraqm dependency for complex text scripts is now linked dynamically at runtime rather than at packaging time. This allows us to release binaries with support for libraqm if it is installed on the -user's machine. +user's machine. Source Layout Changes ^^^^^^^^^^^^^^^^^^^^^ From 5e94cd0fc2cbca77db190ef407f03d9a3a086650 Mon Sep 17 00:00:00 2001 From: Metallicow Date: Sat, 27 Jan 2018 00:07:24 -0600 Subject: [PATCH 0072/1393] Trim trailing whitespace tests dir --- Tests/helper.py | 4 ++-- Tests/test_file_sgi.py | 2 +- Tests/test_file_tiff_metadata.py | 2 +- Tests/test_font_leaks.py | 4 ++-- Tests/test_font_pcf.py | 2 +- Tests/test_image_convert.py | 2 +- Tests/test_imagefontctl.py | 6 +++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index fdeb00c0cd2..607330122cb 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -16,7 +16,7 @@ HAS_UPLOADER = False if os.environ.get('SHOW_ERRORS', None): - # local img.show for errors. + # local img.show for errors. HAS_UPLOADER=True class test_image_results: @classmethod @@ -119,7 +119,7 @@ def assert_image_equal_tofile(self, a, filename, msg=None, mode=None): if mode: img = img.convert(mode) self.assert_image_equal(a, img, msg) - + def assert_image_similar(self, a, b, epsilon, msg=None): epsilon = float(epsilon) self.assertEqual( diff --git a/Tests/test_file_sgi.py b/Tests/test_file_sgi.py index f18fb13decd..aa33c9d931c 100644 --- a/Tests/test_file_sgi.py +++ b/Tests/test_file_sgi.py @@ -80,7 +80,7 @@ def test_write16(self): reloaded = Image.open(out) self.assert_image_equal(im, reloaded) - + def test_unsupported_mode(self): im = hopper('LA') out = self.tempfile('temp.sgi') diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index bb5768046e1..0f0031f7dde 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -70,7 +70,7 @@ def test_rt_metadata(self): self.assertAlmostEqual(loaded_double, doubledata) # check with 2 element ImageJMetaDataByteCounts, issue #2006 - + info[ImageJMetaDataByteCounts] = (8, len(bindata) - 8) img.save(f, tiffinfo=info) loaded = Image.open(f) diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index 709339233e0..009211aece8 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -14,7 +14,7 @@ def _test_font(self, font): draw = ImageDraw.ImageDraw(im) self._test_leak(lambda: draw.text((0, 0), "some text "*1024, #~10k font=font, fill="black")) - + @unittest.skipIf(not features.check('freetype2'), "Test requires freetype2") def test_leak(self): ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20) @@ -24,7 +24,7 @@ class TestDefaultFontLeak(TestTTypeFontLeak): # fails at iteration 37 in master iterations = 100 mem_limit = 1024 #k - + def test_leak(self): default_font = ImageFont.load_default() self._test_font(default_font) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index dc4c586c06f..75ff364f983 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -51,7 +51,7 @@ def test_draw(self): draw.text((0, 0), message, 'black', font=font) with Image.open('Tests/images/test_draw_pbm_target.png') as target: self.assert_image_similar(im, target, 0) - + def test_textsize(self): tempname = self.save_font() font = ImageFont.load(tempname) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 9fd0463d475..de88ff51911 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -89,7 +89,7 @@ def test_trns_p_rgba(self): self.assertNotIn('transparency', rgba.info) # https://github.com/python-pillow/Pillow/issues/2702 self.assertEqual(rgba.palette, None) - + def test_trns_l(self): im = hopper('L') diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 79122f6c11e..ee20014e107 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -15,8 +15,8 @@ def test_english(self): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - - + + def test_complex_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) @@ -102,7 +102,7 @@ def test_ligature_features(self): liga_size = ttf.getsize('fi', features=['-liga']) self.assertEqual(liga_size,(13,19)) - + def test_kerning_features(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) From dd524e57e679e8a0dc5cfdc15b597e1739a7e964 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 Jan 2018 19:45:33 +1100 Subject: [PATCH 0073/1393] Updated codecov filename --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 865e51697db..3085439f5a6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -19,7 +19,7 @@ prune docs/_static # build/src control detritus exclude .coveragerc -exclude codecov.yml +exclude .codecov.yml exclude .editorconfig exclude .landscape.yaml exclude .travis From 9d6f5f44a951e45b05e8d2f3564c762fae6cfc40 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 Jan 2018 19:53:26 +1100 Subject: [PATCH 0074/1393] Removed Tk directory --- MANIFEST.in | 1 - 1 file changed, 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 3085439f5a6..7006e5be29f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -11,7 +11,6 @@ include LICENSE include Makefile graft Tests graft src -graft Tk graft depends graft winbuild graft docs From 8674f719072eddfd14fb1cffff59bc56193472f2 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 29 Jan 2018 15:33:26 +0200 Subject: [PATCH 0075/1393] File exported from hopper.png using Wally --- Tests/images/hopper.wal | Bin 0 -> 21860 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper.wal diff --git a/Tests/images/hopper.wal b/Tests/images/hopper.wal new file mode 100644 index 0000000000000000000000000000000000000000..f6260c6b33b5f5dfd735caa80eb97905663b1de2 GIT binary patch literal 21860 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 literal 0 HcmV?d00001 From a852c6186f887f97849ff29fd1ebc8b7d953d090 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 29 Jan 2018 17:18:06 +0200 Subject: [PATCH 0076/1393] Basic WAL test --- Tests/test_file_wal.py | 23 +++++++++++++++++++++++ src/PIL/WalImageFile.py | 1 + 2 files changed, 24 insertions(+) create mode 100644 Tests/test_file_wal.py diff --git a/Tests/test_file_wal.py b/Tests/test_file_wal.py new file mode 100644 index 00000000000..13b1e3a2fa5 --- /dev/null +++ b/Tests/test_file_wal.py @@ -0,0 +1,23 @@ +from helper import unittest, PillowTestCase + +from PIL import WalImageFile + + +class TestFileWal(PillowTestCase): + + def test_open(self): + # Arrange + TEST_FILE = "Tests/images/hopper.wal" + + # Act + im = WalImageFile.open(TEST_FILE) + + # Assert + self.assertEqual(im.format, "WAL") + self.assertEqual(im.format_description, "Quake2 Texture") + self.assertEqual(im.mode, "P") + self.assertEqual(im.size, (128, 128)) + + +if __name__ == '__main__': + unittest.main() diff --git a/src/PIL/WalImageFile.py b/src/PIL/WalImageFile.py index 69964f7be3a..6602cc86bbb 100644 --- a/src/PIL/WalImageFile.py +++ b/src/PIL/WalImageFile.py @@ -74,6 +74,7 @@ def imopen(fp): with builtins.open(filename, "rb") as fp: return imopen(fp) + quake2palette = ( # default palette taken from piffo 0.93 by Hans Häggström b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" From aa0ee9feaba1e4e6aa21b4f481a6c19105fe9fb1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 30 Jan 2018 20:13:51 +1100 Subject: [PATCH 0077/1393] Rearranged classes into alphabetical order --- docs/reference/ImageFilter.rst | 2 +- src/PIL/ImageFilter.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/reference/ImageFilter.rst b/docs/reference/ImageFilter.rst index bc1868667f1..5275329ab51 100644 --- a/docs/reference/ImageFilter.rst +++ b/docs/reference/ImageFilter.rst @@ -33,9 +33,9 @@ image enhancement filters: * **EDGE_ENHANCE_MORE** * **EMBOSS** * **FIND_EDGES** +* **SHARPEN** * **SMOOTH** * **SMOOTH_MORE** -* **SHARPEN** .. autoclass:: PIL.ImageFilter.GaussianBlur .. autoclass:: PIL.ImageFilter.BoxBlur diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 100fea8bd28..735a00831da 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -270,6 +270,15 @@ class FIND_EDGES(BuiltinFilter): ) +class SHARPEN(BuiltinFilter): + name = "Sharpen" + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2 + ) + + class SMOOTH(BuiltinFilter): name = "Smooth" filterargs = (3, 3), 13, 0, ( @@ -288,12 +297,3 @@ class SMOOTH_MORE(BuiltinFilter): 1, 5, 5, 5, 1, 1, 1, 1, 1, 1 ) - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2 - ) From 9be8d669f912f143dcaebe0aeed592fb6617ced3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 31 Jan 2018 00:25:04 +0100 Subject: [PATCH 0078/1393] issue #2959: changes based on @hugovk's review --- Tests/test_file_pdf.py | 15 ++++++-- Tests/test_image_access.py | 2 +- Tests/test_pdfparser.py | 34 +++++++++--------- docs/handbook/image-file-formats.rst | 4 +-- src/PIL/PdfImagePlugin.py | 1 - src/PIL/pdfParser.py | 54 +++++++++++----------------- 6 files changed, 54 insertions(+), 56 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 824f6149aa6..173e4d5c7a1 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -107,19 +107,23 @@ def imGenerator(ims): def test_pdf_open(self): # fail on a buffer full of null bytes self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray(65536)) + # make an empty PDF object with pdfParser.PdfParser() as empty_pdf: self.assertEqual(len(empty_pdf.pages), 0) self.assertEqual(len(empty_pdf.info), 0) self.assertFalse(empty_pdf.should_close_buf) self.assertFalse(empty_pdf.should_close_file) + # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB") + # open the PDF file with pdfParser.PdfParser(filename=pdf_filename) as hopper_pdf: self.assertEqual(len(hopper_pdf.pages), 1) self.assertTrue(hopper_pdf.should_close_buf) self.assertTrue(hopper_pdf.should_close_file) + # read a PDF file from a buffer with a non-zero offset with open(pdf_filename, "rb") as f: content = b"xyzzy" + f.read() @@ -127,6 +131,7 @@ def test_pdf_open(self): self.assertEqual(len(hopper_pdf.pages), 1) self.assertFalse(hopper_pdf.should_close_buf) self.assertFalse(hopper_pdf.should_close_file) + # read a PDF file from an already open file with open(pdf_filename, "rb") as f: with pdfParser.PdfParser(f=f) as hopper_pdf: @@ -145,11 +150,13 @@ def test_pdf_append_fails_on_nonexistent_file(self): def test_pdf_append(self): # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB", producer="pdfParser") + # open it, check pages and info with pdfParser.PdfParser(pdf_filename, mode="r+b") as pdf: self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 1) self.assertEqual(pdf.info.Producer, "pdfParser") + # append some info pdf.info.Title = "abc" pdf.info.Author = "def" @@ -157,16 +164,19 @@ def test_pdf_append(self): pdf.info.Keywords = "qw)e\\r(ty" pdf.info.Creator = "hopper()" pdf.start_writing() - pdf.write_xref_and_trailer(f) + pdf.write_xref_and_trailer() + # open it again, check pages and info again with pdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) self.assertEqual(pdf.info.Title, "abc") + # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P]) + # open the PDF again, check pages and info again with pdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 3) @@ -177,9 +187,10 @@ def test_pdf_append(self): self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") self.assertEqual(pdf.info.Subject, u"ghi\uABCD") - def test_pdf_append(self): + def test_pdf_info(self): # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB", title="title", author="author", subject="subject", keywords="keywords", creator="creator", producer="producer") + # open it, check pages and info with pdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.info), 6) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 464e0a20866..0fcc5a689c2 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -250,7 +250,7 @@ def test_reference_counting(self): class TestEmbeddable(unittest.TestCase): - @unittest.skipIf(not sys.platform.startswith('win32') or + @unittest.skipIf(sys.platform.startswith('win32') or sys.version_info[:2] == (3, 4) or on_appveyor(), # failing on appveyor when run from # subprocess, not from shell diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index bf1066ff198..af617000844 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase -from PIL.pdfParser import * +from PIL.pdfParser import IndirectObjectDef, IndirectReference, PdfBinary, PdfDict, PdfFormatError, PdfName, PdfParser, PdfStream, decode_text, encode_text, pdf_repr class TestPdfParser(PillowTestCase): @@ -12,14 +12,14 @@ def test_text_encode_decode(self): self.assertEqual(decode_text(b"\x1B a \x1C"), u"\u02D9 a \u02DD") def test_indirect_refs(self): - self.assertEqual(IndirectReference(1,2), IndirectReference(1,2)) - self.assertNotEqual(IndirectReference(1,2), IndirectReference(1,3)) - self.assertNotEqual(IndirectReference(1,2), IndirectObjectDef(1,2)) - self.assertNotEqual(IndirectReference(1,2), (1,2)) - self.assertEqual(IndirectObjectDef(1,2), IndirectObjectDef(1,2)) - self.assertNotEqual(IndirectObjectDef(1,2), IndirectObjectDef(1,3)) - self.assertNotEqual(IndirectObjectDef(1,2), IndirectReference(1,2)) - self.assertNotEqual(IndirectObjectDef(1,2), (1,2)) + self.assertEqual(IndirectReference(1, 2), IndirectReference(1, 2)) + self.assertNotEqual(IndirectReference(1, 2), IndirectReference(1, 3)) + self.assertNotEqual(IndirectReference(1, 2), IndirectObjectDef(1, 2)) + self.assertNotEqual(IndirectReference(1, 2), (1, 2)) + self.assertEqual(IndirectObjectDef(1, 2), IndirectObjectDef(1, 2)) + self.assertNotEqual(IndirectObjectDef(1, 2), IndirectObjectDef(1, 3)) + self.assertNotEqual(IndirectObjectDef(1, 2), IndirectReference(1, 2)) + self.assertNotEqual(IndirectObjectDef(1, 2), (1, 2)) def test_parsing(self): self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"), b"Name#Hash") @@ -64,18 +64,18 @@ def test_parsing(self): self.assertEqual(s.decode(), b"abcde") def test_pdf_repr(self): - self.assertEqual(bytes(IndirectReference(1,2)), b"1 2 R") - self.assertEqual(bytes(IndirectObjectDef(*IndirectReference(1,2))), b"1 2 obj") + self.assertEqual(bytes(IndirectReference(1, 2)), b"1 2 R") + self.assertEqual(bytes(IndirectObjectDef(*IndirectReference(1, 2))), b"1 2 obj") self.assertEqual(bytes(PdfName(b"Name#Hash")), b"/Name#23Hash") self.assertEqual(bytes(PdfName("Name#Hash")), b"/Name#23Hash") - self.assertEqual(bytes(PdfDict({b"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") - self.assertEqual(bytes(PdfDict({"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") - self.assertEqual(pdf_repr(IndirectReference(1,2)), b"1 2 R") - self.assertEqual(pdf_repr(IndirectObjectDef(*IndirectReference(1,2))), b"1 2 obj") + self.assertEqual(bytes(PdfDict({b"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(bytes(PdfDict({"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(IndirectReference(1, 2)), b"1 2 R") + self.assertEqual(pdf_repr(IndirectObjectDef(*IndirectReference(1, 2))), b"1 2 obj") self.assertEqual(pdf_repr(PdfName(b"Name#Hash")), b"/Name#23Hash") self.assertEqual(pdf_repr(PdfName("Name#Hash")), b"/Name#23Hash") - self.assertEqual(pdf_repr(PdfDict({b"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") - self.assertEqual(pdf_repr(PdfDict({"Name": IndirectReference(1,2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(PdfDict({b"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(PdfDict({"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") self.assertEqual(pdf_repr(123), b"123") self.assertEqual(pdf_repr(True), b"true") self.assertEqual(pdf_repr(False), b"false") diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index fb6b3f2a88d..d265561de73 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -616,7 +616,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum A list of images to append as additional frames. Each of the images in the list can be single or multiframe images. Note however, that for correct results, all the appended images should have the same - encoderinfo and encoderconfig properties. + ``encoderinfo`` and ``encoderconfig`` properties. .. versionadded:: 4.2.0 @@ -973,7 +973,7 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum **append** Set to True to append pages to an existing PDF file. If the file doesn't - exist, an IOError will be raised. + exist, an :py:exc:`IOError` will be raised. .. versionadded:: 5.1.0 diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 6b90db12eb5..33a22b9d00d 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -21,7 +21,6 @@ ## from . import Image, ImageFile, ImageSequence, pdfParser -from ._binary import i8 import io __version__ = "0.5" diff --git a/src/PIL/pdfParser.py b/src/PIL/pdfParser.py index be4f2ccf10f..6c494211256 100644 --- a/src/PIL/pdfParser.py +++ b/src/PIL/pdfParser.py @@ -1,20 +1,19 @@ import codecs import collections -import io import mmap import os import re -import sys import zlib try: - from UserDict import UserDict + from UserDict import UserDict # Python 2.x except ImportError: - UserDict = collections.UserDict + UserDict = collections.UserDict # Python 3.x if str == bytes: # Python 2.x - make_bytes = lambda s: s # pragma: no cover + def make_bytes(s): # pragma: no cover + return s # pragma: no cover else: # Python 3.x def make_bytes(s): return s.encode("us-ascii") @@ -68,6 +67,8 @@ def encode_text(s): 0x9E: u"\u017E", 0xA0: u"\u20AC", } + + def decode_text(b): if b[:len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: return b[len(codecs.BOM_UTF16_BE):].decode("utf_16_be") @@ -181,7 +182,7 @@ def write(self, f): return startxref -class PdfName(): +class PdfName: def __init__(self, name): if isinstance(name, PdfName): self.name = name.name @@ -203,7 +204,8 @@ def __repr__(self): def from_pdf_stream(klass, data): return klass(PdfParser.interpret_name(data)) - allowed_chars = set(range(33,127)) - set((ord(c) for c in "#%/()<>[]{}")) + allowed_chars = set(range(33,127)) - set(ord(c) for c in "#%/()<>[]{}") + def __bytes__(self): if str == bytes: # Python 2.x result = bytearray(b"/") @@ -495,16 +497,13 @@ def read_pdf_info(self): self.info = PdfDict() else: self.info = PdfDict(self.read_indirect(self.info_ref)) - #print(repr(self.root)) check_format_condition(b"Type" in self.root, "/Type missing in Root") check_format_condition(self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog") check_format_condition(b"Pages" in self.root, "/Pages missing in Root") check_format_condition(isinstance(self.root[b"Pages"], IndirectReference), "/Pages in Root is not an indirect reference") self.pages_ref = self.root[b"Pages"] self.page_tree_root = self.read_indirect(self.pages_ref) - #print("page_tree_root: " + str(self.page_tree_root)) self.pages = self.linearize_page_tree(self.page_tree_root) - #print("pages: " + str(self.pages)) def next_object_id(self, offset=None): try: @@ -524,16 +523,15 @@ def next_object_id(self, offset=None): whitespace_mandatory = whitespace + b"+" newline_only = br"[\r\n]+" newline = whitespace_optional + newline_only + whitespace_optional - re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_optional + br"\<\<(.*\>\>)" + newline \ + re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_optional + br"\<\<(.*\>\>)" + newline + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) - re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_optional + br"\<\<(.*?\>\>)" + newline \ + re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_optional + br"\<\<(.*?\>\>)" + newline + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) + def read_trailer(self): search_start_offset = len(self.buf) - 16384 if search_start_offset < self.start_offset: search_start_offset = self.start_offset - #data_at_end = self.buf[search_start_offset:] - #m = self.re_trailer_end.search(data_at_end) m = self.re_trailer_end.search(self.buf, search_start_offset) check_format_condition(m, "trailer end not found") # make sure we found the LAST trailer @@ -544,12 +542,10 @@ def read_trailer(self): if not m: m = last_match trailer_data = m.group(1) - #print(trailer_data) self.last_xref_section_offset = int(m.group(2)) self.trailer_dict = self.interpret_trailer(trailer_data) self.xref_table = XrefTable() self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - #print(self.xref_table) if b"Prev" in self.trailer_dict: self.read_prev_trailer(self.trailer_dict[b"Prev"]) @@ -558,7 +554,6 @@ def read_prev_trailer(self, xref_section_offset): m = self.re_trailer_prev.search(self.buf[trailer_offset:trailer_offset+16384]) check_format_condition(m, "previous trailer not found") trailer_data = m.group(1) - #print(trailer_data) check_format_condition(int(m.group(2)) == xref_section_offset, "xref section offset in previous trailer doesn't match what was expected") trailer_dict = self.interpret_trailer(trailer_data) if b"Prev" in trailer_dict: @@ -568,6 +563,7 @@ def read_prev_trailer(self, xref_section_offset): re_name = re.compile(whitespace_optional + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + delimiter_or_ws + br")") re_dict_start = re.compile(whitespace_optional + br"\<\<") re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) + @classmethod def interpret_trailer(klass, trailer_data): trailer = {} @@ -579,15 +575,14 @@ def interpret_trailer(klass, trailer_data): check_format_condition(m and m.end() == len(trailer_data), "name not found in trailer, remaining data: " + repr(trailer_data[offset:])) break key = klass.interpret_name(m.group(1)) - #print(key) value, offset = klass.get_value(trailer_data, m.end()) - #print(value) trailer[key] = value check_format_condition(b"Size" in trailer and isinstance(trailer[b"Size"], int), "/Size not in trailer or not an integer") check_format_condition(b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), "/Root not in trailer or not an indirect reference") return trailer re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") + @classmethod def interpret_name(klass, raw, as_text=False): name = b"" @@ -616,10 +611,11 @@ def interpret_name(klass, raw, as_text=False): re_comment = re.compile(br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") re_stream_start = re.compile(whitespace_optional + br"stream\r?\n") re_stream_end = re.compile(whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") + @classmethod def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): - #if max_nesting == 0: - # return None, None + if max_nesting == 0: + return None, None m = klass.re_comment.match(data, offset) if m: offset = m.end() @@ -645,26 +641,22 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): if m: offset = m.end() result = {} - #print("<<") m = klass.re_dict_end.match(data, offset) while not m: key, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) - #print ("key " + str(key)) if offset is None: return result, None value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) result[key] = value - #print ("value " + str(value)) if offset is None: return result, None m = klass.re_dict_end.match(data, offset) - #print(">>") offset = m.end() m = klass.re_stream_start.match(data, offset) if m: try: stream_len = int(result[b"Length"]) - except: + except (TypeError, KeyError, ValueError): raise PdfFormatError("bad or missing Length in stream dict (%r)" % result.get(b"Length", None)) stream_data = data[m.end():m.end() + stream_len] m = klass.re_stream_end.match(data, m.end() + stream_len) @@ -682,7 +674,6 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): while not m: value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) result.append(value) - #print ("item " + str(value)) if offset is None: return result, None m = klass.re_array_end.match(data, offset) @@ -717,7 +708,6 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): #return None, offset # fallback (only for debugging) raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) - re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") escaped_chars = { b"n": b"\n", @@ -737,6 +727,7 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): ord(b")"): b")", ord(b"\\"): b"\\", } + @classmethod def get_literal_string(klass, data, offset): nesting_depth = 0 @@ -746,7 +737,6 @@ def get_literal_string(klass, data, offset): if m.group(1): result.extend(klass.escaped_chars[m.group(1)[1]]) elif m.group(2): - #result.append(eval(m.group(1))) result.append(int(m.group(2)[1:], 8)) elif m.group(3): pass @@ -763,10 +753,10 @@ def get_literal_string(klass, data, offset): offset = m.end() raise PdfFormatError("unfinished literal string") - re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline) re_xref_subsection_start = re.compile(whitespace_optional + br"([0-9]+)" + whitespace_mandatory + br"([0-9]+)" + whitespace_optional + newline_only) re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + def read_xref_table(self, xref_section_offset): subsection_found = False m = self.re_xref_section_start.match(self.buf, xref_section_offset + self.start_offset) @@ -793,20 +783,18 @@ def read_xref_table(self, xref_section_offset): self.xref_table[i] = new_entry return offset - def read_indirect(self, ref, max_nesting=-1): offset, generation = self.xref_table[ref[0]] assert generation == ref[1] return self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] - def linearize_page_tree(self, node=None): if node is None: node = self.page_tree_root check_format_condition(node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages") pages = [] for kid in node[b"Kids"]: - kid_object = self.read_indirect(kid, max_nesting=3) + kid_object = self.read_indirect(kid) if kid_object[b"Type"] == b"Page": pages.append(kid) else: From c15a0b2fce770e306aad9bafd09fed1528d62288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 31 Jan 2018 00:35:55 +0100 Subject: [PATCH 0079/1393] issue #2959: rename pdfParser.py to PdfParser.py --- Tests/test_file_pdf.py | 30 +++++++++++++------------- Tests/test_pdfparser.py | 2 +- src/PIL/PdfImagePlugin.py | 30 +++++++++++++------------- src/PIL/{pdfParser.py => PdfParser.py} | 0 4 files changed, 31 insertions(+), 31 deletions(-) rename src/PIL/{pdfParser.py => PdfParser.py} (100%) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 173e4d5c7a1..9bfacc24761 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -1,5 +1,5 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image, pdfParser +from PIL import Image, PdfParser import io import os import os.path @@ -19,7 +19,7 @@ def helper_save_as_pdf(self, mode, **kwargs): # Assert self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) - with pdfParser.PdfParser(outfile) as pdf: + with PdfParser.PdfParser(outfile) as pdf: if kwargs.get("append_images", False) or kwargs.get("append", False): self.assertGreater(len(pdf.pages), 1) else: @@ -106,10 +106,10 @@ def imGenerator(ims): def test_pdf_open(self): # fail on a buffer full of null bytes - self.assertRaises(pdfParser.PdfFormatError, pdfParser.PdfParser, buf=bytearray(65536)) + self.assertRaises(PdfParser.PdfFormatError, PdfParser.PdfParser, buf=bytearray(65536)) # make an empty PDF object - with pdfParser.PdfParser() as empty_pdf: + with PdfParser.PdfParser() as empty_pdf: self.assertEqual(len(empty_pdf.pages), 0) self.assertEqual(len(empty_pdf.info), 0) self.assertFalse(empty_pdf.should_close_buf) @@ -119,7 +119,7 @@ def test_pdf_open(self): pdf_filename = self.helper_save_as_pdf("RGB") # open the PDF file - with pdfParser.PdfParser(filename=pdf_filename) as hopper_pdf: + with PdfParser.PdfParser(filename=pdf_filename) as hopper_pdf: self.assertEqual(len(hopper_pdf.pages), 1) self.assertTrue(hopper_pdf.should_close_buf) self.assertTrue(hopper_pdf.should_close_file) @@ -127,14 +127,14 @@ def test_pdf_open(self): # read a PDF file from a buffer with a non-zero offset with open(pdf_filename, "rb") as f: content = b"xyzzy" + f.read() - with pdfParser.PdfParser(buf=content, start_offset=5) as hopper_pdf: + with PdfParser.PdfParser(buf=content, start_offset=5) as hopper_pdf: self.assertEqual(len(hopper_pdf.pages), 1) self.assertFalse(hopper_pdf.should_close_buf) self.assertFalse(hopper_pdf.should_close_file) # read a PDF file from an already open file with open(pdf_filename, "rb") as f: - with pdfParser.PdfParser(f=f) as hopper_pdf: + with PdfParser.PdfParser(f=f) as hopper_pdf: self.assertEqual(len(hopper_pdf.pages), 1) self.assertTrue(hopper_pdf.should_close_buf) self.assertFalse(hopper_pdf.should_close_file) @@ -149,13 +149,13 @@ def test_pdf_append_fails_on_nonexistent_file(self): def test_pdf_append(self): # make a PDF file - pdf_filename = self.helper_save_as_pdf("RGB", producer="pdfParser") + pdf_filename = self.helper_save_as_pdf("RGB", producer="PdfParser") # open it, check pages and info - with pdfParser.PdfParser(pdf_filename, mode="r+b") as pdf: + with PdfParser.PdfParser(pdf_filename, mode="r+b") as pdf: self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 1) - self.assertEqual(pdf.info.Producer, "pdfParser") + self.assertEqual(pdf.info.Producer, "PdfParser") # append some info pdf.info.Title = "abc" @@ -167,7 +167,7 @@ def test_pdf_append(self): pdf.write_xref_and_trailer() # open it again, check pages and info again - with pdfParser.PdfParser(pdf_filename) as pdf: + with PdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) self.assertEqual(pdf.info.Title, "abc") @@ -178,12 +178,12 @@ def test_pdf_append(self): mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P]) # open the PDF again, check pages and info again - with pdfParser.PdfParser(pdf_filename) as pdf: + with PdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 3) self.assertEqual(len(pdf.info), 6) - self.assertEqual(pdfParser.decode_text(pdf.info[b"Title"]), "abc") + self.assertEqual(PdfParser.decode_text(pdf.info[b"Title"]), "abc") self.assertEqual(pdf.info.Title, "abc") - self.assertEqual(pdf.info.Producer, "pdfParser") + self.assertEqual(pdf.info.Producer, "PdfParser") self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") self.assertEqual(pdf.info.Subject, u"ghi\uABCD") @@ -192,7 +192,7 @@ def test_pdf_info(self): pdf_filename = self.helper_save_as_pdf("RGB", title="title", author="author", subject="subject", keywords="keywords", creator="creator", producer="producer") # open it, check pages and info - with pdfParser.PdfParser(pdf_filename) as pdf: + with PdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.info), 6) self.assertEqual(pdf.info.Title, "title") self.assertEqual(pdf.info.Author, "author") diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index af617000844..db97c97dda4 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase -from PIL.pdfParser import IndirectObjectDef, IndirectReference, PdfBinary, PdfDict, PdfFormatError, PdfName, PdfParser, PdfStream, decode_text, encode_text, pdf_repr +from PIL.PdfParser import IndirectObjectDef, IndirectReference, PdfBinary, PdfDict, PdfFormatError, PdfName, PdfParser, PdfStream, decode_text, encode_text, pdf_repr class TestPdfParser(PillowTestCase): diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 33a22b9d00d..fa2388a749e 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -20,7 +20,7 @@ # Image plugin for PDF images (output only). ## -from . import Image, ImageFile, ImageSequence, pdfParser +from . import Image, ImageFile, ImageSequence, PdfParser import io __version__ = "0.5" @@ -55,9 +55,9 @@ def _save(im, fp, filename, save_all=False): producer = im.encoderinfo.get("producer", None) if is_appending: - existing_pdf = pdfParser.PdfParser(f=fp, filename=filename, mode="r+b") + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") else: - existing_pdf = pdfParser.PdfParser(f=fp, filename=filename, mode="w+b") + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") if title: existing_pdf.info.Title = title @@ -123,26 +123,26 @@ def _save(im, fp, filename, save_all=False): if im.mode == "1": filter = "ASCIIHexDecode" - colorspace = pdfParser.PdfName("DeviceGray") + colorspace = PdfParser.PdfName("DeviceGray") procset = "ImageB" # grayscale bits = 1 elif im.mode == "L": filter = "DCTDecode" # params = "<< /Predictor 15 /Columns %d >>" % (width-2) - colorspace = pdfParser.PdfName("DeviceGray") + colorspace = PdfParser.PdfName("DeviceGray") procset = "ImageB" # grayscale elif im.mode == "P": filter = "ASCIIHexDecode" palette = im.im.getpalette("RGB") - colorspace = [pdfParser.PdfName("Indexed"), pdfParser.PdfName("DeviceRGB"), 255, pdfParser.PdfBinary(palette)] + colorspace = [PdfParser.PdfName("Indexed"), PdfParser.PdfName("DeviceRGB"), 255, PdfParser.PdfBinary(palette)] procset = "ImageI" # indexed color elif im.mode == "RGB": filter = "DCTDecode" - colorspace = pdfParser.PdfName("DeviceRGB") + colorspace = PdfParser.PdfName("DeviceRGB") procset = "ImageC" # color images elif im.mode == "CMYK": filter = "DCTDecode" - colorspace = pdfParser.PdfName("DeviceCMYK") + colorspace = PdfParser.PdfName("DeviceCMYK") procset = "ImageC" # color images else: raise ValueError("cannot save mode %s" % im.mode) @@ -175,11 +175,11 @@ def _save(im, fp, filename, save_all=False): width, height = im.size existing_pdf.write_obj(image_refs[pageNumber], stream=op.getvalue(), - Type=pdfParser.PdfName("XObject"), - Subtype=pdfParser.PdfName("Image"), + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), Width=width, # * 72.0 / resolution, Height=height, # * 72.0 / resolution, - Filter=pdfParser.PdfName(filter), + Filter=PdfParser.PdfName(filter), BitsPerComponent=bits, DecodeParams=params, ColorSpace=colorspace) @@ -188,9 +188,9 @@ def _save(im, fp, filename, save_all=False): # page existing_pdf.write_page(page_refs[pageNumber], - Resources=pdfParser.PdfDict( - ProcSet=[pdfParser.PdfName("PDF"), pdfParser.PdfName(procset)], - XObject=pdfParser.PdfDict(image=image_refs[pageNumber])), + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_refs[pageNumber])), MediaBox=[0, 0, int(width * 72.0 / resolution), int(height * 72.0 / resolution)], Contents=contents_refs[pageNumber] ) @@ -198,7 +198,7 @@ def _save(im, fp, filename, save_all=False): # # page contents - page_contents = pdfParser.make_bytes( + page_contents = PdfParser.make_bytes( "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( int(width * 72.0 / resolution), int(height * 72.0 / resolution))) diff --git a/src/PIL/pdfParser.py b/src/PIL/PdfParser.py similarity index 100% rename from src/PIL/pdfParser.py rename to src/PIL/PdfParser.py From 4cea610f16519c57b972e61b642936fd062f8105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Wed, 31 Jan 2018 23:08:49 +0100 Subject: [PATCH 0080/1393] issue #2959: oops. sorry. reverting accidental change that broke builds --- Tests/test_image_access.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 0fcc5a689c2..464e0a20866 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -250,7 +250,7 @@ def test_reference_counting(self): class TestEmbeddable(unittest.TestCase): - @unittest.skipIf(sys.platform.startswith('win32') or + @unittest.skipIf(not sys.platform.startswith('win32') or sys.version_info[:2] == (3, 4) or on_appveyor(), # failing on appveyor when run from # subprocess, not from shell From eb5c52cb17ed5f81c254359b80650ccffaa786bb Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Mon, 5 Feb 2018 13:53:45 -0500 Subject: [PATCH 0081/1393] Fix "invalid escape sequence" warning on Python 3.6+ --- src/PIL/GifImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 71d8ce59a5d..c7f3281bb31 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -777,7 +777,7 @@ def getdata(im, offset=(0, 0), **params): :param im: Image object :param offset: Tuple of (x, y) pixels. Defaults to (0,0) - :param \**params: E.g. duration or other encoder info parameters + :param \\**params: E.g. duration or other encoder info parameters :returns: List of Bytes containing gif encoded frame data """ From 60002b4a903ecb68b7ce309f21b8e8c1a4e65820 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Feb 2018 20:16:21 +1100 Subject: [PATCH 0082/1393] Changed path to build instructions [ci skip] --- winbuild/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/README.md b/winbuild/README.md index 5ecbf18c6d1..144d0557733 100644 --- a/winbuild/README.md +++ b/winbuild/README.md @@ -1,7 +1,7 @@ Quick README ------------ -For more extensive info, see the Windows build instructions `docs/build.rst`. +For more extensive info, see the Windows build instructions `winbuild/build.rst`. * See https://github.com/python-pillow/Pillow/issues/553#issuecomment-37877416 and https://github.com/matplotlib/matplotlib/issues/1717#issuecomment-13343859 From cbb0c8fc534d004142c66b5ebda56ba38fdcecb8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Feb 2018 20:55:24 +1100 Subject: [PATCH 0083/1393] Changed build instructions path to link [ci skip] --- winbuild/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/README.md b/winbuild/README.md index 144d0557733..471b61a574f 100644 --- a/winbuild/README.md +++ b/winbuild/README.md @@ -1,7 +1,7 @@ Quick README ------------ -For more extensive info, see the Windows build instructions `winbuild/build.rst`. +For more extensive info, see the [Windows build instructions](build.rst). * See https://github.com/python-pillow/Pillow/issues/553#issuecomment-37877416 and https://github.com/matplotlib/matplotlib/issues/1717#issuecomment-13343859 From 19590874a84beef8d0ee9c2067e914197b05257d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Feb 2018 20:56:10 +1100 Subject: [PATCH 0084/1393] Fixed link [ci skip] --- winbuild/build.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/winbuild/build.rst b/winbuild/build.rst index 86c4cf4c736..847a6e1d270 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -1,8 +1,9 @@ Building Pillow on Windows ========================== -.. note:: For most people, the :doc:`installation instructions - ` should be sufficient +.. note:: For most people, the `installation instructions + <../docs/installation.rst#windows-installation>`_ should + be sufficient. This page will describe a build setup to build Pillow against the supported Python versions in 32 and 64-bit modes, using freely From 74ed05be1014affeb44771765ce5f54e538cbf0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 6 Feb 2018 06:09:40 +1100 Subject: [PATCH 0085/1393] Updated libimagequant to 2.11.9 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index c0a76f89191..d327d0dba8f 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.11.7 +archive=libimagequant-2.11.9 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From fc3c4c011942ded46947bebd7dedb89317f45788 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 14 Feb 2018 20:09:00 +1100 Subject: [PATCH 0086/1393] Corrected reference to method --- docs/reference/ImageColor.rst | 2 +- docs/reference/ImageDraw.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index f4bd9bd0ebc..f3e6a6f902b 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -6,7 +6,7 @@ The :py:mod:`ImageColor` module contains color tables and converters from CSS3-style color specifiers to RGB tuples. This module is used by -:py:meth:`PIL.Image.Image.new` and the :py:mod:`~PIL.ImageDraw` module, among +:py:meth:`PIL.Image.new` and the :py:mod:`~PIL.ImageDraw` module, among others. .. _color-names: diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 7e498797156..de26a4d854d 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -44,7 +44,7 @@ Colors ^^^^^^ To specify colors, you can use numbers or tuples just as you would use with -:py:meth:`PIL.Image.Image.new` or :py:meth:`PIL.Image.Image.putpixel`. For “1”, +:py:meth:`PIL.Image.new` or :py:meth:`PIL.Image.Image.putpixel`. For “1”, “L”, and “I” images, use integers. For “RGB” images, use a 3-tuple containing integer values. For “F” images, use integer or floating point values. From fc7fdced7429111aa0b3dd561848e2d1f521083e Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Tue, 20 Feb 2018 04:13:29 +0100 Subject: [PATCH 0087/1393] enable pip cache in appveyor build --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index fe128f4a4d1..bca451dc5b2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -82,6 +82,9 @@ after_test: matrix: fast_finish: true +cache: +- '%LOCALAPPDATA%\pip\Cache' + artifacts: - path: pillow\dist\*.egg name: egg From bc916e5e5358a2fe878a737c14153b335056f9e6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 26 Feb 2018 19:58:30 +1100 Subject: [PATCH 0088/1393] Fixed typos [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ca20888863d..e89941e1954 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -621,7 +621,7 @@ Changelog (Pillow) - Doc: Reordered operating systems in Compatibility Matrix #2436 [radarhere] -- Test: Additional tests for BurfStub, Eps, Container, GribStub, IPTC, Wmf, XVThumb, ImageDraw, ImageMorph ImageShow #2425 +- Test: Additional tests for BufrStub, Eps, Container, GribStub, IPTC, Wmf, XVThumb, ImageDraw, ImageMorph, ImageShow #2425 [radarhere] - Health fixes #2437 From 46906524565b3049eb40b4e49f480e55681caaf2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 14 Feb 2018 20:03:53 +1100 Subject: [PATCH 0089/1393] Updated pypy version --- winbuild/appveyor_install_pypy.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winbuild/appveyor_install_pypy.cmd b/winbuild/appveyor_install_pypy.cmd index 39bf6678275..1fe39f1a195 100644 --- a/winbuild/appveyor_install_pypy.cmd +++ b/winbuild/appveyor_install_pypy.cmd @@ -1,3 +1,3 @@ -curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-win32.zip +curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.10.0-win32.zip 7z x pypy2.zip -oc:\ -c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v5.8.0-win32\pypy.exe c:\vp\pypy2 \ No newline at end of file +c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v5.10.0-win32\pypy.exe c:\vp\pypy2 From 2ffb41f8a2ad763e170b6ad829a934b048004048 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 Feb 2018 11:35:54 +1100 Subject: [PATCH 0090/1393] Updated raqm to 0.5.0 --- 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 22d70d68c1b..655e841d986 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -2,7 +2,7 @@ # install raqm -archive=raqm-0.4.0 +archive=raqm-0.5.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From 3e49f27865b8ecbef95a3435e89cf9bca2073f40 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 27 Feb 2018 11:56:34 +0200 Subject: [PATCH 0091/1393] Update CHANGES.rst --- CHANGES.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index e89941e1954..435f882681a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,18 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Correct reference to Image.new method #3000 + [radarhere] + +- Rearrange ImageFilter classes into alphabetical order #2990 + [radarhere] + +- Test: Remove duplicate line #2983 + [radarhere] + +- Build: Update AppVeyor PyPy version #3003 + [radarhere] + - Tiff: Open 8 bit Tiffs with 5 or 6 channels, discarding extra channels #2938 [homm] @@ -17,7 +29,7 @@ Changelog (Pillow) - Test: Changed assert statements to unittest calls #2961 [radarhere] -- Depends: Updated libimagequant to 2.11.7, raqm to 0.4.0, freetype to 2.9 #2967, #2969, #2957 +- Depends: Updated libimagequant to 2.11.9, raqm to 0.5.0, freetype to 2.9 #2997, #3017, #2957 [radarhere] - Remove _imaging.crc32 in favor of builtin Python crc32 implementation #2935 From 1591c530bd96f5a65c32e544eb6a4a5f142dac30 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 27 Feb 2018 12:25:19 +0200 Subject: [PATCH 0092/1393] Update CHANGES.rst --- CHANGES.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 435f882681a..5d2f4e7a64a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,13 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ -- Correct reference to Image.new method #3000 +- Build: Enable pip cache in AppVeyor build #3009 + [thijstriemstra] + +- Trim trailing whitespace #2985 + [Metallicow] + +- Docs: Correct reference to Image.new method #3000 [radarhere] - Rearrange ImageFilter classes into alphabetical order #2990 From 4125947d09e2cfebca71715752e0696f705b305e Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 27 Feb 2018 13:26:32 +0200 Subject: [PATCH 0093/1393] No changes, except save with LF instead of CRLF --- appveyor.yml | 240 +++++++++++++++++++++++++-------------------------- 1 file changed, 120 insertions(+), 120 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index bca451dc5b2..a1d8d103c3e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,120 +1,120 @@ -version: '{build}' -clone_folder: c:\pillow -init: -- ECHO %PYTHON% -#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) -# Uncomment previous line to get RDP access during the build. - -environment: - X64_EXT: -x64 - EXECUTABLE: python.exe - PIP_DIR: Scripts - VENV: NO - TEST_OPTIONS: - DEPLOY: YES - matrix: - - PYTHON: C:/vp/pypy2 - EXECUTABLE: bin/pypy.exe - PIP_DIR: bin - VENV: YES - - PYTHON: C:/Python27-x64 - - PYTHON: C:/Python34 - - PYTHON: C:/Python27 - - PYTHON: C:/Python34-x64 - - PYTHON: C:/msys64/mingw32 - EXECUTABLE: bin/python3 - PIP_DIR: bin - TEST_OPTIONS: --processes=0 - DEPLOY: NO - - -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 c:\pillow-depends\*.zip c:\pillow\winbuild\ -- xcopy c:\pillow-depends\*.tar.gz c:\pillow\winbuild\ -- xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images -- cd c:\pillow\winbuild\ -- ps: | - if ($env:PYTHON -eq "c:/vp/pypy2") - { - c:\pillow\winbuild\appveyor_install_pypy.cmd - } -- ps: | - if ($env:PYTHON -eq "c:/msys64/mingw32") - { - c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_install_msys2_deps.sh - } - else - { - c:\python34\python.exe c:\pillow\winbuild\build_dep.py - c:\pillow\winbuild\build_deps.cmd - $host.SetShouldExit(0) - } - -build_script: -- ps: | - if ($env:PYTHON -eq "c:/msys64/mingw32") - { - c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_build_msys2.sh - Write-Host "through install" - $host.SetShouldExit(0) - } - else - { - & $env:PYTHON/$env:EXECUTABLE c:\pillow\winbuild\build.py - $host.SetShouldExit(0) - } -- cd c:\pillow -- '%PYTHON%\%EXECUTABLE% selftest.py --installed' - -test_script: -- cd c:\pillow -- '%PYTHON%\%PIP_DIR%\pip.exe install pytest pytest-cov' -- '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --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 -- codecov --file coverage.xml --name %PYTHON% - -matrix: - fast_finish: true - -cache: -- '%LOCALAPPDATA%\pip\Cache' - -artifacts: -- path: pillow\dist\*.egg - name: egg -- path: pillow\dist\*.wheel - name: wheel - -before_deploy: - - cd c:\pillow - - '%PYTHON%\%PIP_DIR%\pip.exe install wheel' - - cd c:\pillow\winbuild\ - - '%PYTHON%\%EXECUTABLE% c:\pillow\winbuild\build.py --wheel' - - cd c:\pillow - - ps: Get-ChildItem .\dist\*.* | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name } - -deploy: - provider: S3 - region: us-west-2 - access_key_id: AKIAIRAXC62ZNTVQJMOQ - secret_access_key: - secure: Hwb6klTqtBeMgxAjRoDltiiqpuH8xbwD4UooDzBSiCWXjuFj1lyl4kHgHwTCCGqi - bucket: pillow-nightly - folder: win/$(APPVEYOR_BUILD_NUMBER)/ - artifact: /.*egg|wheel/ - on: - branch: master - deploy: YES - - -# Uncomment the following lines to get RDP access after the build/test and block for -# up to the timeout limit (~1hr) -# -#on_finish: -#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +version: '{build}' +clone_folder: c:\pillow +init: +- ECHO %PYTHON% +#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +# Uncomment previous line to get RDP access during the build. + +environment: + X64_EXT: -x64 + EXECUTABLE: python.exe + PIP_DIR: Scripts + VENV: NO + TEST_OPTIONS: + DEPLOY: YES + matrix: + - PYTHON: C:/vp/pypy2 + EXECUTABLE: bin/pypy.exe + PIP_DIR: bin + VENV: YES + - PYTHON: C:/Python27-x64 + - PYTHON: C:/Python34 + - PYTHON: C:/Python27 + - PYTHON: C:/Python34-x64 + - PYTHON: C:/msys64/mingw32 + EXECUTABLE: bin/python3 + PIP_DIR: bin + TEST_OPTIONS: --processes=0 + DEPLOY: NO + + +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 c:\pillow-depends\*.zip c:\pillow\winbuild\ +- xcopy c:\pillow-depends\*.tar.gz c:\pillow\winbuild\ +- xcopy /s c:\pillow-depends\test_images\* c:\pillow\tests\images +- cd c:\pillow\winbuild\ +- ps: | + if ($env:PYTHON -eq "c:/vp/pypy2") + { + c:\pillow\winbuild\appveyor_install_pypy.cmd + } +- ps: | + if ($env:PYTHON -eq "c:/msys64/mingw32") + { + c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_install_msys2_deps.sh + } + else + { + c:\python34\python.exe c:\pillow\winbuild\build_dep.py + c:\pillow\winbuild\build_deps.cmd + $host.SetShouldExit(0) + } + +build_script: +- ps: | + if ($env:PYTHON -eq "c:/msys64/mingw32") + { + c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_build_msys2.sh + Write-Host "through install" + $host.SetShouldExit(0) + } + else + { + & $env:PYTHON/$env:EXECUTABLE c:\pillow\winbuild\build.py + $host.SetShouldExit(0) + } +- cd c:\pillow +- '%PYTHON%\%EXECUTABLE% selftest.py --installed' + +test_script: +- cd c:\pillow +- '%PYTHON%\%PIP_DIR%\pip.exe install pytest pytest-cov' +- '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --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 +- codecov --file coverage.xml --name %PYTHON% + +matrix: + fast_finish: true + +cache: +- '%LOCALAPPDATA%\pip\Cache' + +artifacts: +- path: pillow\dist\*.egg + name: egg +- path: pillow\dist\*.wheel + name: wheel + +before_deploy: + - cd c:\pillow + - '%PYTHON%\%PIP_DIR%\pip.exe install wheel' + - cd c:\pillow\winbuild\ + - '%PYTHON%\%EXECUTABLE% c:\pillow\winbuild\build.py --wheel' + - cd c:\pillow + - ps: Get-ChildItem .\dist\*.* | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name } + +deploy: + provider: S3 + region: us-west-2 + access_key_id: AKIAIRAXC62ZNTVQJMOQ + secret_access_key: + secure: Hwb6klTqtBeMgxAjRoDltiiqpuH8xbwD4UooDzBSiCWXjuFj1lyl4kHgHwTCCGqi + bucket: pillow-nightly + folder: win/$(APPVEYOR_BUILD_NUMBER)/ + artifact: /.*egg|wheel/ + on: + branch: master + deploy: YES + + +# Uncomment the following lines to get RDP access after the build/test and block for +# up to the timeout limit (~1hr) +# +#on_finish: +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 497b8fd0f77c666c96b6925f8eeddda9b3937efb Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 27 Feb 2018 13:27:26 +0200 Subject: [PATCH 0094/1393] Only attempt deploy for python-pillow/Pillow --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index a1d8d103c3e..95d816a9871 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -109,6 +109,7 @@ deploy: folder: win/$(APPVEYOR_BUILD_NUMBER)/ artifact: /.*egg|wheel/ on: + APPVEYOR_REPO_NAME: python-pillow/Pillow branch: master deploy: YES From 7f7d5aa183d2b687461966d307ece0b015049b43 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 28 Feb 2018 14:50:02 +0200 Subject: [PATCH 0095/1393] Move intro text below its header Allows hotlinking to include relevant intro: https://pillow.readthedocs.io/en/latest/reference/Image.html#create-thumbnails --- docs/reference/Image.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 216c71d620c..9a9bf57d74b 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -12,25 +12,25 @@ images. Examples -------- +Open, rotate, and display an image (using the default viewer) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + The following script loads an image, rotates it 45 degrees, and displays it using an external viewer (usually xv on Unix, and the paint program on Windows). -Open, rotate, and display an image (using the default viewer) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - .. code-block:: python from PIL import Image im = Image.open("bride.jpg") im.rotate(45).show() -The following script creates nice thumbnails of all JPEG images in the -current directory preserving aspect ratios with 128x128 max resolution. - Create thumbnails ^^^^^^^^^^^^^^^^^ +The following script creates nice thumbnails of all JPEG images in the +current directory preserving aspect ratios with 128x128 max resolution. + .. code-block:: python from PIL import Image From add2746ac61980421455dc722d0edede2478cbfa Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Wed, 28 Feb 2018 22:15:58 -0800 Subject: [PATCH 0096/1393] Certain corrupted jpegs can result in no data read On truncated jpeg, decoder can suspend waiting for additional bytes in buffer. For some input files, decoder suspends on jpeg_start_decompress stage. If at this point file reader reaches EOF, py code never gets back to jpeg decoder and we end up with no bytes to result image. This leaves us with some amount of potentially useful bytes undecoded and thrown away. Libjpeg docs suggest that in such situation, more appropriate would be to add EOI marker to the end of buffer, which will allows decoder to finish. https://github.com/libjpeg-turbo/libjpeg-turbo/blob/0dd9a2c1fd6c/libjpeg.txt#L1803-L1809 Docs also mention that adding EOI markers is what non-suspending code does anyway. --- src/PIL/ImageFile.py | 69 ++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 458857f41cd..7dbea67f376 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -202,44 +202,39 @@ def load(self): for decoder_name, extents, offset, args in self.tile: decoder = Image._getdecoder(self.mode, decoder_name, args, self.decoderconfig) - seek(offset) - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - status, err_code = decoder.decode(b"") - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error): # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - raise IOError("image file is truncated") - - if not s: # truncated jpeg - self.tile = [] - - # JpegDecode needs to clean things up here either way - # If we don't destroy the decompressor, - # we have a memory leak. - decoder.cleanup() - - if LOAD_TRUNCATED_IMAGES: + try: + seek(offset) + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + status, err_code = decoder.decode(b"") + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error): # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + raise IOError("image file is truncated") + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + s = b"\xFF\xD9" # Pretend file is finished adding EOI marker + else: + self.tile = [] + raise IOError("image file is truncated " + "(%d bytes not processed)" % len(b)) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: break - else: - raise IOError("image file is truncated " - "(%d bytes not processed)" % len(b)) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - - # Need to cleanup here to prevent leaks in PyPy - decoder.cleanup() + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() self.tile = [] self.readonly = readonly From a9dd5a9422156973b21aacafb1eb879e2320e7cd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Mar 2018 04:30:24 +1100 Subject: [PATCH 0097/1393] Improved readability of Other Platforms table [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index f1877f6dbb0..181ea856ebe 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -435,9 +435,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Ubuntu Linux 12.04 LTS | 2.6, 3.2, 3.3, 3.4, 3.5 | 3.4.1 |x86,x86-64 | | | PyPy5.3.1, PyPy3 v2.4.0 | | | -| | | | | +| +------------------------------+--------------------------------+-----------------------+ | | 2.7 | 4.3.0 |x86-64 | -| | | | | +| +------------------------------+--------------------------------+-----------------------+ | | 2.7, 3.2 | 3.4.1 |ppc | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Ubuntu Linux 10.04 LTS | 2.6 | 2.3.0 |x86,x86-64 | From d01a6c55aa284a0fd6471fc702ca2f9511952d99 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Mar 2018 05:21:54 +1100 Subject: [PATCH 0098/1393] Improved readability of Continuous Integration Targets table [ci skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 181ea856ebe..0371e517b26 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -394,11 +394,11 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, |x86-64 | | | pypy, pypy3 | | -| | | | +| +-------------------------------+-----------------------+ | | 2.7 |x86 | +----------------------------------+-------------------------------+-----------------------+ | Windows Server 2012 R2 | 2.7, 3.4 |x86, x86-64 | -| | | | +| +-------------------------------+-----------------------+ | | pypy, 3.5/mingw |x86 | +----------------------------------+-------------------------------+-----------------------+ From 113d67214ca4214503c46297a352ceef62c657e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Sat, 3 Mar 2018 21:08:20 +0100 Subject: [PATCH 0099/1393] issue #2959: change asserts into raises --- src/PIL/PdfParser.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 6c494211256..a5fb18a1a1b 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -79,6 +79,7 @@ def decode_text(b): class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the PDF file structure""" pass @@ -173,7 +174,7 @@ def write(self, f): f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id])) else: this_deleted_object_id = deleted_keys.pop(0) - assert object_id == this_deleted_object_id + check_format_condition(object_id == this_deleted_object_id, "expected the next deleted object ID to be %s, instead found %s" % (object_id, this_deleted_object_id)) try: next_in_linked_list = deleted_keys[0] except IndexError: @@ -341,7 +342,8 @@ class PdfParser: def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): # type: (PdfParser, str, file, Union[bytes, bytearray], int, str) -> None - assert not (buf and f) + if buf and f: + raise RuntimeError("specify buf or f or filename, but not both buf and f") self.filename = filename self.buf = buf self.f = f @@ -621,8 +623,8 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): offset = m.end() m = klass.re_indirect_def_start.match(data, offset) if m: - assert int(m.group(1)) > 0 - assert int(m.group(2)) >= 0 + check_format_condition(int(m.group(1)) > 0, "indirect object definition: object ID must be greater than 0") + check_format_condition(int(m.group(2)) >= 0, "indirect object definition: generation must be non-negative") check_format_condition(expect_indirect is None or expect_indirect == IndirectReference(int(m.group(1)), int(m.group(2))), "indirect object definition different than expected") object, offset = klass.get_value(data, m.end(), max_nesting=max_nesting-1) @@ -634,8 +636,8 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): check_format_condition(not expect_indirect, "indirect object definition not found") m = klass.re_indirect_reference.match(data, offset) if m: - assert int(m.group(1)) > 0 - assert int(m.group(2)) >= 0 + check_format_condition(int(m.group(1)) > 0, "indirect object reference: object ID must be greater than 0") + check_format_condition(int(m.group(2)) >= 0, "indirect object reference: generation must be non-negative") return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() m = klass.re_dict_start.match(data, offset) if m: @@ -785,7 +787,8 @@ def read_xref_table(self, xref_section_offset): def read_indirect(self, ref, max_nesting=-1): offset, generation = self.xref_table[ref[0]] - assert generation == ref[1] + check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" \ + % (ref[1], ref[0], generation, offset)) return self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] def linearize_page_tree(self, node=None): From 24ecfe315ab5dbeeb3c532eca0bdf57907ddd6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Sat, 3 Mar 2018 23:32:47 +0100 Subject: [PATCH 0100/1393] issue #2959: fix wrong Parent of pre-existing Page objects when appending --- Tests/test_file_pdf.py | 20 +++++++++++++++++ src/PIL/PdfParser.py | 49 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 9bfacc24761..8b22df325cc 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -147,6 +147,23 @@ def test_pdf_append_fails_on_nonexistent_file(self): finally: os.rmdir(temp_dir) + def check_pdf_pages_consistency(self, pdf): + pages_info = pdf.read_indirect(pdf.pages_ref) + self.assertNotIn(b"Parent", pages_info) + self.assertIn(b"Kids", pages_info) + kids_not_used = pages_info[b"Kids"] + for page_ref in pdf.pages: + while True: + if page_ref in kids_not_used: + kids_not_used.remove(page_ref) + page_info = pdf.read_indirect(page_ref) + self.assertIn(b"Parent", page_info) + page_ref = page_info[b"Parent"] + if page_ref == pdf.pages_ref: + break + self.assertEqual(pdf.pages_ref, page_info[b"Parent"]) + self.assertEqual(kids_not_used, []) + def test_pdf_append(self): # make a PDF file pdf_filename = self.helper_save_as_pdf("RGB", producer="PdfParser") @@ -156,6 +173,7 @@ def test_pdf_append(self): self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 1) self.assertEqual(pdf.info.Producer, "PdfParser") + self.check_pdf_pages_consistency(pdf) # append some info pdf.info.Title = "abc" @@ -171,6 +189,7 @@ def test_pdf_append(self): self.assertEqual(len(pdf.pages), 1) self.assertEqual(len(pdf.info), 6) self.assertEqual(pdf.info.Title, "abc") + self.check_pdf_pages_consistency(pdf) # append two images mode_CMYK = hopper("CMYK") @@ -186,6 +205,7 @@ def test_pdf_append(self): self.assertEqual(pdf.info.Producer, "PdfParser") self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") self.assertEqual(pdf.info.Subject, u"ghi\uABCD") + self.check_pdf_pages_consistency(pdf) def test_pdf_info(self): # make a PDF file diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index a5fb18a1a1b..b6938fdb786 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -101,6 +101,9 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) + def __hash__(self): + return hash((self.object_id, self.generation)) + class IndirectObjectDef(IndirectReference): def __str__(self): @@ -192,6 +195,9 @@ def __init__(self, name): else: self.name = name.encode("us-ascii") + def name_as_str(self): + return self.name.decode("us-ascii") + def __eq__(self, other): return (isinstance(other, PdfName) and other.name == self.name) or other == self.name @@ -358,6 +364,7 @@ def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): self.should_close_buf = True if not filename and hasattr(f, "name"): self.filename = f.name + self.cached_objects = {} if buf: self.read_pdf_info() else: @@ -368,6 +375,7 @@ def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): self.info_ref = None self.page_tree_root = {} self.pages = [] + self.orig_pages = [] self.pages_ref = None self.last_xref_section_offset = None self.trailer_dict = {} @@ -414,15 +422,45 @@ def write_catalog(self): self.del_root() self.root_ref = self.next_object_id(self.f.tell()) self.pages_ref = self.next_object_id(0) + self.rewrite_pages() self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) self.write_obj(self.pages_ref, - Type=PdfName("Pages"), + Type=PdfName(b"Pages"), Count=len(self.pages), Kids=self.pages) return self.root_ref + def rewrite_pages(self): + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + def write_xref_and_trailer(self, new_root_ref=None): if new_root_ref: self.del_root() @@ -443,7 +481,7 @@ def write_page(self, ref, *objs, **dict_obj): if isinstance(ref, int): ref = self.pages[ref] if "Type" not in dict_obj: - dict_obj["Type"] = PdfName("Page") + dict_obj["Type"] = PdfName(b"Page") if "Parent" not in dict_obj: dict_obj["Parent"] = self.pages_ref return self.write_obj(ref, *objs, **dict_obj) @@ -474,7 +512,6 @@ def del_root(self): return del self.xref_table[self.root_ref.object_id] del self.xref_table[self.root[b"Pages"].object_id] - # XXX TODO delete Pages tree recursively @staticmethod def get_buf_from_file(f): @@ -506,6 +543,8 @@ def read_pdf_info(self): self.pages_ref = self.root[b"Pages"] self.page_tree_root = self.read_indirect(self.pages_ref) self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references in case the user modifies, adds or deletes some pages and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] def next_object_id(self, offset=None): try: @@ -789,7 +828,9 @@ def read_indirect(self, ref, max_nesting=-1): offset, generation = self.xref_table[ref[0]] check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" \ % (ref[1], ref[0], generation, offset)) - return self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] + value = self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] + self.cached_objects[ref] = value + return value def linearize_page_tree(self, node=None): if node is None: From 928bea3002eda90e8060e3b0eb16df84263302b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dvo=C5=99=C3=A1k=20V=C3=A1clav?= Date: Sun, 4 Mar 2018 00:01:14 +0100 Subject: [PATCH 0101/1393] issue #2959: enhance test, mainly to trigger Appveyor re-build --- Tests/test_file_pdf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 8b22df325cc..f17da8d746a 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -220,6 +220,7 @@ def test_pdf_info(self): self.assertEqual(pdf.info.Keywords, "keywords") self.assertEqual(pdf.info.Creator, "creator") self.assertEqual(pdf.info.Producer, "producer") + self.check_pdf_pages_consistency(pdf) def test_pdf_append_to_bytesio(self): im = hopper("RGB") From eef06b21240d6f1f672ce999a110ae29fbb7bcb0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 4 Mar 2018 21:23:07 +1100 Subject: [PATCH 0102/1393] Fixed URL [ci skip] --- docs/example/DdsImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 29e13b9207a..077590f221a 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -3,7 +3,7 @@ Jerome Leclanche Documentation: - http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt The contents of this file are hereby released in the public domain (CC0) Full text of the CC0 license: From 6930d871eb60bff852943fd83fd78c012c9893ce Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Mar 2018 20:28:34 +1100 Subject: [PATCH 0103/1393] Removed unused import --- src/PIL/PpmImagePlugin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index be68d1b404f..7e6995b81b8 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -15,8 +15,6 @@ # -import string - from . import Image, ImageFile __version__ = "0.2" From 45352662bb5f50a3d3986e1295a3090c48094b8e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Mar 2018 20:28:58 +1100 Subject: [PATCH 0104/1393] Removed unused variable --- src/PIL/features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/features.py b/src/PIL/features.py index 9cbd523c90a..a234b80985e 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -15,7 +15,7 @@ def check_module(feature): module = modules[feature] try: - imported_module = __import__(module) + __import__(module) return True except ImportError: return False From 220219616201fb2c841755a6e81c96a0147822dd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Mar 2018 20:54:00 +1100 Subject: [PATCH 0105/1393] Flake8 blank line fixes --- Tests/bench_get.py | 1 + Tests/check_imaging_leaks.py | 1 + Tests/check_j2k_overflow.py | 1 + Tests/check_png_dos.py | 1 + Tests/helper.py | 2 +- Tests/make_hash.py | 1 + Tests/test_binary.py | 1 + Tests/test_decompression_bomb.py | 1 + Tests/test_file_dds.py | 1 + Tests/test_file_ftex.py | 1 + Tests/test_file_gbr.py | 1 + Tests/test_file_gif.py | 2 +- Tests/test_file_jpeg2k.py | 1 + Tests/test_file_png.py | 1 + Tests/test_file_sun.py | 1 + Tests/test_file_tiff.py | 3 +-- Tests/test_file_tiff_metadata.py | 1 - Tests/test_font_leaks.py | 2 ++ Tests/test_font_pcf.py | 1 - Tests/test_image_access.py | 2 ++ Tests/test_image_convert.py | 1 - Tests/test_image_draft.py | 1 + Tests/test_image_load.py | 1 + Tests/test_image_putdata.py | 1 + Tests/test_image_tobytes.py | 1 + Tests/test_image_transform.py | 1 + Tests/test_imagecms.py | 1 + Tests/test_imagefile.py | 2 ++ Tests/test_imagefont.py | 1 - Tests/test_imagefont_bitmap.py | 1 + Tests/test_imagefontctl.py | 3 ++- Tests/test_imagemath.py | 1 + Tests/test_imageops_usm.py | 1 + Tests/test_imagesequence.py | 1 + Tests/test_lib_pack.py | 1 - Tests/test_pickle.py | 1 + Tests/test_tiff_ifdrational.py | 1 + Tests/test_uploader.py | 1 + Tests/test_util.py | 1 + Tests/test_webp_leaks.py | 1 + Tests/threaded_save.py | 1 + Tests/versions.py | 1 + docs/example/DdsImagePlugin.py | 1 + src/PIL/BmpImagePlugin.py | 2 ++ src/PIL/EpsImagePlugin.py | 1 + src/PIL/FpxImagePlugin.py | 1 + src/PIL/GbrImagePlugin.py | 1 + src/PIL/GifImagePlugin.py | 1 + src/PIL/GimpGradientFile.py | 1 + src/PIL/IcnsImagePlugin.py | 1 + src/PIL/ImImagePlugin.py | 2 ++ src/PIL/Image.py | 5 +++++ src/PIL/ImageCms.py | 1 + src/PIL/ImageColor.py | 1 + src/PIL/ImageFont.py | 1 + src/PIL/ImageMath.py | 1 + src/PIL/ImageQt.py | 1 + src/PIL/ImageStat.py | 1 + src/PIL/Jpeg2KImagePlugin.py | 1 + src/PIL/PSDraw.py | 1 + src/PIL/PalmImagePlugin.py | 1 + src/PIL/PcxImagePlugin.py | 2 ++ src/PIL/PdfImagePlugin.py | 1 + src/PIL/PngImagePlugin.py | 1 + src/PIL/PpmImagePlugin.py | 1 + src/PIL/PsdImagePlugin.py | 1 + src/PIL/SgiImagePlugin.py | 1 + src/PIL/SpiderImagePlugin.py | 2 ++ src/PIL/SunImagePlugin.py | 1 + src/PIL/TgaImagePlugin.py | 2 ++ src/PIL/TiffImagePlugin.py | 1 - src/PIL/TiffTags.py | 1 + src/PIL/WalImageFile.py | 1 + src/PIL/WmfImagePlugin.py | 2 ++ src/PIL/XpmImagePlugin.py | 1 + src/PIL/features.py | 8 +++++++- winbuild/fetch.py | 1 + winbuild/untar.py | 1 + winbuild/unzip.py | 1 + 79 files changed, 93 insertions(+), 12 deletions(-) diff --git a/Tests/bench_get.py b/Tests/bench_get.py index 51f3a6aa228..e9afe1af525 100644 --- a/Tests/bench_get.py +++ b/Tests/bench_get.py @@ -14,6 +14,7 @@ def bench(mode): get(xy) print(mode, timeit.default_timer() - t0, "us") + bench("L") bench("I") bench("I;16") diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index a31cd2180a4..00a0245e4b0 100755 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -40,5 +40,6 @@ def test_leak_getlist(self): # Pass a new list at each iteration. lambda: im.point(range(256))) + if __name__ == '__main__': unittest.main() diff --git a/Tests/check_j2k_overflow.py b/Tests/check_j2k_overflow.py index bec4ea69486..1dd8db69f23 100644 --- a/Tests/check_j2k_overflow.py +++ b/Tests/check_j2k_overflow.py @@ -10,5 +10,6 @@ def test_j2k_overflow(self): with self.assertRaises(IOError): im.save(target) + if __name__ == '__main__': unittest.main() diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index 8998f8c0f0b..0bbaf6a4d3d 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -60,5 +60,6 @@ def test_dos_total_memory(self): self.assertLess(total_len, 64*1024*1024, "Total text chunks greater than 64M") + if __name__ == '__main__': unittest.main() diff --git a/Tests/helper.py b/Tests/helper.py index 607330122cb..aac5295dfc7 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -18,6 +18,7 @@ if os.environ.get('SHOW_ERRORS', None): # local img.show for errors. HAS_UPLOADER=True + class test_image_results: @classmethod def upload(self, a, b): @@ -31,7 +32,6 @@ def upload(self, a, b): pass - def convert_to_comparable(a, b): new_a, new_b = a, b if a.mode == 'P': diff --git a/Tests/make_hash.py b/Tests/make_hash.py index 4412f65be53..c5e32d6062e 100644 --- a/Tests/make_hash.py +++ b/Tests/make_hash.py @@ -32,6 +32,7 @@ def check(size, i0): h[i] = m return h + min_start = 0 # 1) find the smallest table size with no collisions diff --git a/Tests/test_binary.py b/Tests/test_binary.py index 2fac9b3d591..7e22e0f5926 100644 --- a/Tests/test_binary.py +++ b/Tests/test_binary.py @@ -23,5 +23,6 @@ def test_big_endian(self): self.assertEqual(_binary.o16be(65535), b'\xff\xff') self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 4da8760cdc1..ce27cea9685 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -44,6 +44,7 @@ def test_exception(self): self.assertRaises(Image.DecompressionBombError, lambda: Image.open(TEST_FILE)) + class TestDecompressionCrop(PillowTestCase): def setUp(self): diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 89d265ec27f..ec975f7ec9e 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -111,5 +111,6 @@ def short_file(): self.assertRaises(IOError, short_file) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_ftex.py b/Tests/test_file_ftex.py index ed1116ad591..6b43244c9e9 100644 --- a/Tests/test_file_ftex.py +++ b/Tests/test_file_ftex.py @@ -15,5 +15,6 @@ def test_load_dxt1(self): target = Image.open('Tests/images/ftex_dxt1.png') self.assert_image_similar(im, target.convert('RGBA'), 15) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gbr.py b/Tests/test_file_gbr.py index aacc193f46d..346605bd48e 100644 --- a/Tests/test_file_gbr.py +++ b/Tests/test_file_gbr.py @@ -18,5 +18,6 @@ def test_gbr_file(self): self.assert_image_equal(target, im) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 9d671561d56..f8e3918b471 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -278,7 +278,6 @@ def test_save_dispose(self): img.seek(img.tell() + 1) self.assertEqual(img.disposal_method, method) - # check per frame disposal im_list[0].save( out, @@ -586,5 +585,6 @@ def test_lzw_bits(self): # codec error prepatch im.load() + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 753b505987c..0766f5b07c9 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -176,5 +176,6 @@ def test_unbound_local(self): with self.assertRaises(IOError): Image.open('Tests/images/unbound_variable.jp2') + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index ce2b3e60872..d64f9b7d949 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -22,6 +22,7 @@ def chunk(cid, *data): PngImagePlugin.putchunk(*(test_file, cid) + data) return test_file.getvalue() + o32 = PngImagePlugin.o32 IHDR = chunk(b"IHDR", o32(1), o32(1), b'\x08\x02', b'\0\0\0') diff --git a/Tests/test_file_sun.py b/Tests/test_file_sun.py index 6bb6b98d47e..61cfdf36755 100644 --- a/Tests/test_file_sun.py +++ b/Tests/test_file_sun.py @@ -46,5 +46,6 @@ def test_others(self): with Image.open(target_path) as target: self.assert_image_equal(im, target) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 393f4a7a46a..62c1c339242 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -398,7 +398,6 @@ def test_with_underscores(self): self.assertEqual(im.tag_v2[X_RESOLUTION], 72) self.assertEqual(im.tag_v2[Y_RESOLUTION], 36) - def test_roundtrip_tiff_uint16(self): # Test an image of all '0' values pixel_value = 0x1234 @@ -447,7 +446,6 @@ def imGenerator(ims): reread = Image.open(mp) self.assertEqual(reread.n_frames, 3) - def test_saving_icc_profile(self): # Tests saving TIFF with icc_profile set. # At the time of writing this will only work for non-compressed tiffs @@ -489,6 +487,7 @@ def test_close_on_load_nonexclusive(self): im.load() self.assertFalse(fp.closed) + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): def test_fd_leak(self): diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 0f0031f7dde..8cc5a7882ef 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -78,7 +78,6 @@ def test_rt_metadata(self): self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) - def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index 009211aece8..d3261a9e2a9 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -3,6 +3,7 @@ import sys from PIL import Image, features, ImageDraw, ImageFont + @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") class TestTTypeFontLeak(PillowLeakTestCase): # fails at iteration 3 in master @@ -20,6 +21,7 @@ def test_leak(self): ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20) self._test_font(ttype) + class TestDefaultFontLeak(TestTTypeFontLeak): # fails at iteration 37 in master iterations = 100 diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 75ff364f983..875a20b2056 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -72,7 +72,6 @@ def _test_high_characters(self, message): with Image.open('Tests/images/high_ascii_chars.png') as target: self.assert_image_similar(im, target, 0) - def test_high_characters(self): message = "".join(chr(i+1) for i in range(140, 232)) self._test_high_characters(message) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 464e0a20866..155fa5c2ea8 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -10,6 +10,7 @@ import sys import os + class AccessTest(PillowTestCase): # initial value _init_cffi_access = Image.USE_CFFI_ACCESS @@ -309,5 +310,6 @@ def test_embeddable(self): process.communicate() self.assertEqual(process.returncode, 0) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index de88ff51911..c7c38138212 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -90,7 +90,6 @@ def test_trns_p_rgba(self): # https://github.com/python-pillow/Pillow/issues/2702 self.assertEqual(rgba.palette, None) - def test_trns_l(self): im = hopper('L') im.info['transparency'] = 128 diff --git a/Tests/test_image_draft.py b/Tests/test_image_draft.py index 12f5e0e9f38..18982fc9968 100644 --- a/Tests/test_image_draft.py +++ b/Tests/test_image_draft.py @@ -70,5 +70,6 @@ def test_several_drafts(self): im.draft(None, (64, 64)) im.load() + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_load.py b/Tests/test_image_load.py index 15a92e339d5..88b6e9b5c34 100644 --- a/Tests/test_image_load.py +++ b/Tests/test_image_load.py @@ -29,5 +29,6 @@ def test_contextmanager(self): self.assertRaises(OSError, os.fstat, fn) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 1a7a6e7c78f..2008c13074a 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -84,5 +84,6 @@ def test_array_F(self): self.assertEqual(len(im.getdata()), len(arr)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_tobytes.py b/Tests/test_image_tobytes.py index 2cae05e6667..f5a73869598 100644 --- a/Tests/test_image_tobytes.py +++ b/Tests/test_image_tobytes.py @@ -7,5 +7,6 @@ def test_sanity(self): data = hopper().tobytes() self.assertIsInstance(data, bytes) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index df8fc83e84a..5369ed1982a 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -267,5 +267,6 @@ class TestImageTransformPerspective(TestImageTransformAffine): # Repeat all tests for AFFINE transformations with PERSPECTIVE transform = Image.PERSPECTIVE + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 9e304ae01ef..31417564ff6 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -437,5 +437,6 @@ def test_auxiliary_channels_isolated(self): self.assert_image_equal(test_image.convert(dst_format[2]), reference_image) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index b50dcc94384..32e44a0e1e8 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -146,6 +146,7 @@ def decode(self, buffer): # eof return (-1, 0) + xoff, yoff, xsize, ysize = 10, 20, 100, 100 @@ -222,5 +223,6 @@ def test_oversize(self): im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] self.assertRaises(ValueError, im.load) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index fb79872757b..e120f8482b3 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -420,7 +420,6 @@ def test_unicode_pilfont(self): with self.assertRaises(UnicodeEncodeError): font.getsize(u"’") - def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index 7ee5f8a2b5e..bee415fd7e9 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -34,5 +34,6 @@ def test_similar(self): text, fill=(0, 0, 0), font=font_outline) self.assert_image_similar(im_bitmap, im_outline, 20) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index ee20014e107..ac5f9c225a6 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -6,6 +6,7 @@ FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans.ttf" + @unittest.skipUnless(features.check('raqm'), "Raqm Library is not installed.") class TestImagecomplextext(PillowTestCase): @@ -16,7 +17,6 @@ def test_english(self): draw = ImageDraw.Draw(im) draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - def test_complex_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) @@ -127,6 +127,7 @@ def test_arabictext_features(self): self.assert_image_similar(im, target_img, .5) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagemath.py b/Tests/test_imagemath.py index 4f99eda9337..2329b747e9a 100644 --- a/Tests/test_imagemath.py +++ b/Tests/test_imagemath.py @@ -13,6 +13,7 @@ def pixel(im): return int(im) # hack to deal with booleans print(im) + A = Image.new("L", (1, 1), 1) B = Image.new("L", (1, 1), 2) Z = Image.new("L", (1, 1), 0) # Z for zero diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index cd7dcae5f00..3fb021fe7b5 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -97,5 +97,6 @@ def gp(x, y): self.assertTrue(236 <= gp(8, 6)[2] <= 239) self.assertTrue(236 <= gp(8, 7)[1] <= 239) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 2a4a358ba8f..500a2e60a3f 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -70,5 +70,6 @@ def test_palette_mmap(self): color2 = im.getpalette()[0:3] self.assertEqual(color1, color2) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 0155c4bb48a..a065784604d 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -226,7 +226,6 @@ def test_L(self): self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) - def test_LA(self): self.assert_unpack("LA", "LA", 2, (1, 2), (3, 4), (5, 6)) self.assert_unpack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6)) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 69eb60949dd..bdfd3582dda 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -92,5 +92,6 @@ def test_cpickle_l_mode(self): self.helper_pickle_string(cPickle, protocol, mode="L") self.helper_pickle_file(cPickle, protocol, mode="L") + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 0bf4503c44f..bd767b931c2 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -59,5 +59,6 @@ def test_ifd_rational_save(self): self.assertEqual(float(IFDRational(301, 1)), float(reloaded.tag_v2[282])) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_uploader.py b/Tests/test_uploader.py index 9d1f164c2ab..e157867cb72 100644 --- a/Tests/test_uploader.py +++ b/Tests/test_uploader.py @@ -12,5 +12,6 @@ def check_upload_similar(self): target = hopper('RGB') self.assert_image_similar(result, target, 0) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_util.py b/Tests/test_util.py index 9901de3571d..2316d3d6543 100644 --- a/Tests/test_util.py +++ b/Tests/test_util.py @@ -75,5 +75,6 @@ def test_deferred_error(self): # Assert self.assertRaises(ValueError, lambda: thing.some_attr) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_webp_leaks.py b/Tests/test_webp_leaks.py index 82599bbbbde..6feee0be6c3 100644 --- a/Tests/test_webp_leaks.py +++ b/Tests/test_webp_leaks.py @@ -4,6 +4,7 @@ test_file = "Tests/images/hopper.webp" + @unittest.skipUnless(features.check('webp'), "WebP is not installed") class TestWebPLeaks(PillowLeakTestCase): diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py index ba8b17dbc47..d8faffa0c02 100644 --- a/Tests/threaded_save.py +++ b/Tests/threaded_save.py @@ -34,6 +34,7 @@ def run(self): sys.stdout.write(".") queue.task_done() + t0 = time.time() threads = 20 diff --git a/Tests/versions.py b/Tests/versions.py index 89be1d7c82a..abc1a3be95d 100644 --- a/Tests/versions.py +++ b/Tests/versions.py @@ -7,6 +7,7 @@ def version(module, version): if v: print(version, v) + version(Image, "jpeglib") version(Image, "zlib") diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 077590f221a..71a5b50eac6 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -271,6 +271,7 @@ def decode(self, buffer): raise IOError("Truncated DDS file") return 0, 0 + Image.register_decoder('DXT1', DXT1Decoder) Image.register_decoder('DXT5', DXT5Decoder) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 04c76cea5f0..f9e5ee5c84a 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -216,6 +216,7 @@ def _open(self): # -------------------------------------------------------------------- # Write BMP file + SAVE = { "1": ("1", 1, 2), "L": ("L", 8, 256), @@ -279,6 +280,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(BmpImageFile.format, BmpImageFile, _accept) Image.register_save(BmpImageFile.format, _save) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 044d089bf71..6013e2722bd 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -418,6 +418,7 @@ def close(self): # # -------------------------------------------------------------------- + Image.register_open(EpsImageFile.format, EpsImageFile, _accept) Image.register_save(EpsImageFile.format, _save) diff --git a/src/PIL/FpxImagePlugin.py b/src/PIL/FpxImagePlugin.py index 23f15f45936..d7bba42eb52 100644 --- a/src/PIL/FpxImagePlugin.py +++ b/src/PIL/FpxImagePlugin.py @@ -223,6 +223,7 @@ def load(self): # # -------------------------------------------------------------------- + Image.register_open(FpxImageFile.format, FpxImageFile, _accept) Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/src/PIL/GbrImagePlugin.py b/src/PIL/GbrImagePlugin.py index b8b9f1a3cf9..bd4c12f211e 100644 --- a/src/PIL/GbrImagePlugin.py +++ b/src/PIL/GbrImagePlugin.py @@ -89,5 +89,6 @@ def load(self): # # registry + Image.register_open(GbrImageFile.format, GbrImageFile, _accept) Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 71d8ce59a5d..a425e8b6231 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -292,6 +292,7 @@ def load_end(self): # -------------------------------------------------------------------- # Write GIF files + RAWMODE = { "1": "L", "L": "L", diff --git a/src/PIL/GimpGradientFile.py b/src/PIL/GimpGradientFile.py index 43cd7264933..10593da24f3 100644 --- a/src/PIL/GimpGradientFile.py +++ b/src/PIL/GimpGradientFile.py @@ -55,6 +55,7 @@ def sphere_increasing(middle, pos): def sphere_decreasing(middle, pos): return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 7c1bd5882c8..6f9686aa513 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -342,6 +342,7 @@ def _save(im, fp, filename): if retcode: raise CalledProcessError(retcode, convert_cmd) + Image.register_open(IcnsImageFile.format, IcnsImageFile, lambda x: x[:4] == b'icns') Image.register_extension(IcnsImageFile.format, '.icns') diff --git a/src/PIL/ImImagePlugin.py b/src/PIL/ImImagePlugin.py index 81b1d7b6c9c..b87fa908392 100644 --- a/src/PIL/ImImagePlugin.py +++ b/src/PIL/ImImagePlugin.py @@ -294,6 +294,7 @@ def tell(self): # -------------------------------------------------------------------- # Save IM files + SAVE = { # mode: (im type, raw mode) "1": ("0 1", "1"), @@ -339,6 +340,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(ImImageFile.format, ImImageFile) Image.register_save(ImImageFile.format, _save) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1a763b65380..fd47a0c1cd3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -36,9 +36,11 @@ class DecompressionBombWarning(RuntimeWarning): pass + class DecompressionBombError(Exception): pass + class _imaging_not_installed(object): # module placeholder def __getattr__(self, id): @@ -2745,6 +2747,7 @@ def register_extension(id, extension): """ EXTENSION[extension.lower()] = id.upper() + def register_extensions(id, extensions): """ Registers image extensions. This function should not be @@ -2756,6 +2759,7 @@ def register_extensions(id, extensions): for extension in extensions: register_extension(id, extension) + def registered_extensions(): """ Returns a dictionary containing all file extensions belonging @@ -2886,5 +2890,6 @@ def _apply_env_variables(env=None): except ValueError as e: warnings.warn("{0}: {1}".format(var_name, e)) + _apply_env_variables() atexit.register(core.clear_cache) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 85cdf6daafe..d82e30efc46 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -554,6 +554,7 @@ def buildProofTransform( except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) + buildTransformFromOpenProfiles = buildTransform buildProofTransformFromOpenProfiles = buildProofTransform diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 1c7bc31d59d..4a1c90b27c3 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -139,6 +139,7 @@ def getcolor(color, mode): return color + (alpha,) return color + colormap = { # X11 colour table from https://drafts.csswg.org/css-color-4/, with # gray/grey spelling issues fixed. This is a superset of HTML 4.0 diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index a162b8ba650..f3b55e0c4d0 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -33,6 +33,7 @@ LAYOUT_BASIC = 0 LAYOUT_RAQM = 1 + class _imagingft_not_installed(object): # module placeholder def __getattr__(self, id): diff --git a/src/PIL/ImageMath.py b/src/PIL/ImageMath.py index 2ccd1891bb2..c5bea708ace 100644 --- a/src/PIL/ImageMath.py +++ b/src/PIL/ImageMath.py @@ -235,6 +235,7 @@ def imagemath_max(self, other): def imagemath_convert(self, mode): return _Operand(self.im.convert(mode)) + ops = {} for k, v in list(globals().items()): if k[:10] == "imagemath_": diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 36b4e1ebc5c..280cbc6fcca 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -162,6 +162,7 @@ def _toqclass_helper(im): 'data': __data, 'im': im, 'format': format, 'colortable': colortable } + if qt_is_installed: class ImageQt(QImage): diff --git a/src/PIL/ImageStat.py b/src/PIL/ImageStat.py index f3c138b3aa8..cd58fc8ff4b 100644 --- a/src/PIL/ImageStat.py +++ b/src/PIL/ImageStat.py @@ -144,4 +144,5 @@ def _getstddev(self): v.append(math.sqrt(self.var[i])) return v + Global = Stat # compatibility diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index c67cc14bfdc..4619cc5231c 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -266,6 +266,7 @@ def _save(im, fp, filename): # ------------------------------------------------------------ # Registry stuff + Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) Image.register_save(Jpeg2KImageFile.format, _save) diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index fe0823860d7..de34713ea86 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -153,6 +153,7 @@ def image(self, box, im, dpi=None): # Copyright (c) Fredrik Lundh 1994. # + EDROFF_PS = """\ /S { show } bind def /P { moveto show } bind def diff --git a/src/PIL/PalmImagePlugin.py b/src/PIL/PalmImagePlugin.py index e2b9d15ec4f..7d7b16579c5 100644 --- a/src/PIL/PalmImagePlugin.py +++ b/src/PIL/PalmImagePlugin.py @@ -90,6 +90,7 @@ def build_prototype_image(): image.putpalette(palettedata) return image + Palm8BitColormapImage = build_prototype_image() # OK, we now have in Palm8BitColormapImage, diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index b847c9e7c37..564713a981f 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -110,6 +110,7 @@ def _open(self): # -------------------------------------------------------------------- # save PCX files + SAVE = { # mode: (version, bits, planes, raw mode) "1": (2, 1, 1, "1"), @@ -171,6 +172,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # registry + Image.register_open(PcxImageFile.format, PcxImageFile, _accept) Image.register_save(PcxImageFile.format, _save) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 86bc9c8e93a..fd48c729768 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -263,6 +263,7 @@ def write(self, value): # # -------------------------------------------------------------------- + Image.register_save("PDF", _save) Image.register_save_all("PDF", _save_all) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 4b9f5da5e16..621e19b9a30 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -85,6 +85,7 @@ def _safe_zlib_decompress(s): raise ValueError("Decompressed Data Too Large") return plaintext + def _crc32(data, seed=0): return zlib.crc32(data, seed) & 0xffffffff diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index 7e6995b81b8..c599ba8d53e 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -150,6 +150,7 @@ def _save(im, fp, filename): # # -------------------------------------------------------------------- + Image.register_open(PpmImageFile.format, PpmImageFile, _accept) Image.register_save(PpmImageFile.format, _save) diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index ee803271743..f6e04f78b34 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -301,6 +301,7 @@ def _maketile(file, mode, bbox, channels): # -------------------------------------------------------------------- # registry + Image.register_open(PsdImageFile.format, PsdImageFile, _accept) Image.register_extension(PsdImageFile.format, ".psd") diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 7966491d2c3..8b34561e539 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -193,6 +193,7 @@ def _save(im, fp, filename): fp.close() + class SGI16Decoder(ImageFile.PyDecoder): _pulls_fd = True diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index b65f181d80b..d89a3e1b326 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -51,6 +51,7 @@ def isInt(f): except (ValueError, OverflowError): return 0 + iforms = [1, 3, -11, -12, -21, -22] @@ -279,6 +280,7 @@ def _save_spider(im, fp, filename): # -------------------------------------------------------------------- + Image.register_open(SpiderImageFile.format, SpiderImageFile) Image.register_save(SpiderImageFile.format, _save_spider) diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index afee7d1a7d3..fd5e82724df 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -130,6 +130,7 @@ def _open(self): # # registry + Image.register_open(SunImageFile.format, SunImageFile, _accept) Image.register_extension(SunImageFile.format, ".ras") diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index a9596bd5f24..76d9ba8de71 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -130,6 +130,7 @@ def _open(self): # -------------------------------------------------------------------- # Write TGA file + SAVE = { "1": ("1", 1, 0, 3), "L": ("L", 8, 0, 3), @@ -186,6 +187,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(TgaImageFile.format, TgaImageFile) Image.register_save(TgaImageFile.format, _save) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 17f45693044..8387cac1494 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1286,7 +1286,6 @@ def _setup(self): if ';16L' in rawmode: rawmode = rawmode.replace(';16L', ';16N') - # 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) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index d3150775c8c..8700b62bfd2 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -355,6 +355,7 @@ def _populate(): TAGS_V2[k] = TagInfo(k, *v) + _populate() ## # Map type numbers to type names -- defined in ImageFileDirectory. diff --git a/src/PIL/WalImageFile.py b/src/PIL/WalImageFile.py index 69964f7be3a..6602cc86bbb 100644 --- a/src/PIL/WalImageFile.py +++ b/src/PIL/WalImageFile.py @@ -74,6 +74,7 @@ def imopen(fp): with builtins.open(filename, "rb") as fp: return imopen(fp) + quake2palette = ( # default palette taken from piffo 0.93 by Hans Häggström b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index fea436b3a63..173ddb25b7c 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -42,6 +42,7 @@ def register_handler(handler): global _handler _handler = handler + if hasattr(Image.core, "drawwmf"): # install default handler (windows only) @@ -161,6 +162,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry stuff + Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) Image.register_save(WmfStubImageFile.format, _save) diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index b6e69802d11..a5cca0e2793 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -121,6 +121,7 @@ def load_read(self, bytes): # # Registry + Image.register_open(XpmImageFile.format, XpmImageFile, _accept) Image.register_extension(XpmImageFile.format, ".xpm") diff --git a/src/PIL/features.py b/src/PIL/features.py index a234b80985e..d96bf385fdd 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -8,6 +8,7 @@ "webp": "PIL._webp", } + def check_module(feature): if not (feature in modules): raise ValueError("Unknown module %s" % feature) @@ -20,9 +21,11 @@ def check_module(feature): except ImportError: return False + def get_supported_modules(): return [f for f in modules if check_module(f)] + codecs = { "jpg": "jpeg", "jpg_2000": "jpeg2k", @@ -30,6 +33,7 @@ def get_supported_modules(): "libtiff": "libtiff" } + def check_codec(feature): if feature not in codecs: raise ValueError("Unknown codec %s" % feature) @@ -42,6 +46,7 @@ def check_codec(feature): def get_supported_codecs(): return [f for f in codecs if check_codec(f)] + features = { "webp_anim": ("PIL._webp", 'HAVE_WEBPANIM'), "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), @@ -49,6 +54,7 @@ def get_supported_codecs(): "raqm": ("PIL._imagingft", "HAVE_RAQM") } + def check_feature(feature): if feature not in features: raise ValueError("Unknown feature %s" % feature) @@ -71,9 +77,9 @@ def check(feature): feature in codecs and check_codec(feature) or \ feature in features and check_feature(feature)) + def get_supported(): ret = get_supported_modules() ret.extend(get_supported_features()) ret.extend(get_supported_codecs()) return ret - diff --git a/winbuild/fetch.py b/winbuild/fetch.py index 7d140fd358d..b7acb63ac55 100644 --- a/winbuild/fetch.py +++ b/winbuild/fetch.py @@ -14,5 +14,6 @@ def fetch(url): fd.write(content) return name + if __name__ == '__main__': fetch(sys.argv[1]) diff --git a/winbuild/untar.py b/winbuild/untar.py index 95b1c22549e..d85be384c86 100644 --- a/winbuild/untar.py +++ b/winbuild/untar.py @@ -6,5 +6,6 @@ def untar(src, dest): with tarfile.open(src, 'r:gz') as tgz: tgz.extractall(dest) + if __name__ == '__main__': untar(sys.argv[1], sys.argv[2]) diff --git a/winbuild/unzip.py b/winbuild/unzip.py index 92d385fa657..5a464757c2b 100644 --- a/winbuild/unzip.py +++ b/winbuild/unzip.py @@ -6,5 +6,6 @@ def unzip(src, dest): with zipfile.ZipFile(src) as zf: zf.extractall(dest) + if __name__ == '__main__': unzip(sys.argv[1], sys.argv[2]) From f22f1628ebe04b8b310f79b2329de5f2ee2466c6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 4 Mar 2018 14:24:36 +1100 Subject: [PATCH 0106/1393] At least two spaces before inline comment --- Tests/helper.py | 2 +- Tests/test_file_gif.py | 2 +- Tests/test_file_png.py | 2 +- Tests/test_font_leaks.py | 6 +++--- Tests/test_webp_leaks.py | 2 +- src/PIL/ImageFile.py | 2 +- src/PIL/TiffImagePlugin.py | 2 +- src/PIL/TiffTags.py | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index aac5295dfc7..ab2add282a7 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -246,7 +246,7 @@ def _get_mem_usage(self): if sys.platform == 'darwin': # man 2 getrusage: # ru_maxrss the maximum resident set size utilized (in bytes). - return mem / 1024 # Kb + return mem / 1024 # Kb else: # linux # man 2 getrusage diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index f8e3918b471..5dccde3aefc 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -581,7 +581,7 @@ def test_lzw_bits(self): # see https://github.com/python-pillow/Pillow/issues/2811 im = Image.open('Tests/images/issue_2811.gif') - self.assertEqual(im.tile[0][3][0], 11) # LZW bits + self.assertEqual(im.tile[0][3][0], 11) # LZW bits # codec error prepatch im.load() diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index d64f9b7d949..8541c5f2474 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -543,7 +543,7 @@ def test_getchunks(self): @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") class TestTruncatedPngPLeaks(PillowLeakTestCase): mem_limit = 2*1024 # max increase in K - iterations = 100 # Leak is 56k/iteration, this will leak 5.6megs + iterations = 100 # Leak is 56k/iteration, this will leak 5.6megs def setUp(self): if "zip_encoder" not in codecs or "zip_decoder" not in codecs: diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index d3261a9e2a9..c44fa0ed297 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -8,12 +8,12 @@ class TestTTypeFontLeak(PillowLeakTestCase): # fails at iteration 3 in master iterations = 10 - mem_limit = 4096 #k + mem_limit = 4096 #k def _test_font(self, font): im = Image.new('RGB', (255,255), 'white') draw = ImageDraw.ImageDraw(im) - self._test_leak(lambda: draw.text((0, 0), "some text "*1024, #~10k + self._test_leak(lambda: draw.text((0, 0), "some text "*1024, #~10k font=font, fill="black")) @unittest.skipIf(not features.check('freetype2'), "Test requires freetype2") @@ -25,7 +25,7 @@ def test_leak(self): class TestDefaultFontLeak(TestTTypeFontLeak): # fails at iteration 37 in master iterations = 100 - mem_limit = 1024 #k + mem_limit = 1024 #k def test_leak(self): default_font = ImageFont.load_default() diff --git a/Tests/test_webp_leaks.py b/Tests/test_webp_leaks.py index 6feee0be6c3..c542ed8111a 100644 --- a/Tests/test_webp_leaks.py +++ b/Tests/test_webp_leaks.py @@ -8,7 +8,7 @@ @unittest.skipUnless(features.check('webp'), "WebP is not installed") class TestWebPLeaks(PillowLeakTestCase): - mem_limit = 3 * 1024 # kb + mem_limit = 3 * 1024 # kb iterations = 100 def test_leak_load(self): diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 458857f41cd..f8dedaf936b 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -188,7 +188,7 @@ def load(self): self.map = None self.load_prepare() - err_code = -3 # initialize to unknown error + err_code = -3 # initialize to unknown error if not self.map: # sort tiles in file order self.tile.sort(key=_tilesort) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 8387cac1494..ce6173453b0 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -572,7 +572,7 @@ def _setitem(self, tag, value, legacy_api): if ((info.length == 1) or (info.length is None and len(values) == 1 and not legacy_api)): # Don't mess with the legacy api, since it's frozen. - if legacy_api and self.tagtype[tag] in [5, 10]: # rationals + if legacy_api and self.tagtype[tag] in [5, 10]: # rationals values = values, try: dest[tag], = values diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 8700b62bfd2..427f3a48940 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -193,8 +193,8 @@ def lookup(tag): 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), 50780: ("BestQualityScale", RATIONAL, 1), - 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one - 50839: ("ImageJMetaData", UNDEFINED, 1) # see Issue #2006 + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1) # see Issue #2006 } # Legacy Tags structure From 8116ee3738fa776b91557dabbc70bff3a995453d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 4 Mar 2018 15:33:44 +1100 Subject: [PATCH 0107/1393] Inline comment should start with '# ' --- Tests/test_font_leaks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index c44fa0ed297..ab02307a2ca 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -8,12 +8,12 @@ class TestTTypeFontLeak(PillowLeakTestCase): # fails at iteration 3 in master iterations = 10 - mem_limit = 4096 #k + mem_limit = 4096 # k def _test_font(self, font): im = Image.new('RGB', (255,255), 'white') draw = ImageDraw.ImageDraw(im) - self._test_leak(lambda: draw.text((0, 0), "some text "*1024, #~10k + self._test_leak(lambda: draw.text((0, 0), "some text "*1024, # ~10k font=font, fill="black")) @unittest.skipIf(not features.check('freetype2'), "Test requires freetype2") @@ -25,7 +25,7 @@ def test_leak(self): class TestDefaultFontLeak(TestTTypeFontLeak): # fails at iteration 37 in master iterations = 100 - mem_limit = 1024 #k + mem_limit = 1024 # k def test_leak(self): default_font = ImageFont.load_default() From c13ccf13a18e932d14d72d704cc2d37923c56949 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 6 Mar 2018 19:53:07 +1100 Subject: [PATCH 0108/1393] Added missing whitespace --- Tests/helper.py | 2 +- Tests/test_decompression_bomb.py | 4 +- Tests/test_file_gif.py | 2 +- Tests/test_file_jpeg.py | 2 +- Tests/test_file_tiff.py | 4 +- Tests/test_file_tiff_metadata.py | 2 +- Tests/test_font_leaks.py | 2 +- Tests/test_font_pcf.py | 10 +- Tests/test_image_transform.py | 2 +- Tests/test_imagefontctl.py | 4 +- Tests/test_lib_pack.py | 330 +++++++++++++++---------------- Tests/test_numpy.py | 2 +- setup.py | 2 +- src/PIL/Image.py | 8 +- 14 files changed, 188 insertions(+), 188 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index ab2add282a7..8556ed76a42 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -17,7 +17,7 @@ if os.environ.get('SHOW_ERRORS', None): # local img.show for errors. - HAS_UPLOADER=True + HAS_UPLOADER = True class test_image_results: @classmethod diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index ce27cea9685..4e3c2637752 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -30,7 +30,7 @@ def test_no_warning_no_limit(self): def test_warning(self): # Set limit to trigger warning on the test file - Image.MAX_IMAGE_PIXELS = 128 * 128 -1 + Image.MAX_IMAGE_PIXELS = 128 * 128 - 1 self.assertEqual(Image.MAX_IMAGE_PIXELS, 128 * 128 - 1) self.assert_warning(Image.DecompressionBombWarning, @@ -38,7 +38,7 @@ def test_warning(self): def test_exception(self): # Set limit to trigger exception on the test file - Image.MAX_IMAGE_PIXELS = 64 * 128 -1 + Image.MAX_IMAGE_PIXELS = 64 * 128 - 1 self.assertEqual(Image.MAX_IMAGE_PIXELS, 64 * 128 - 1) self.assertRaises(Image.DecompressionBombError, diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 5dccde3aefc..c8f3836fc5f 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -266,7 +266,7 @@ def test_save_dispose(self): Image.new('L', (100, 100), '#111'), Image.new('L', (100, 100), '#222'), ] - for method in range(0,4): + for method in range(0, 4): im_list[0].save( out, save_all=True, diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index f4641437091..d0b204c9e45 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -141,7 +141,7 @@ def test_large_icc_meta(self): f = self.tempfile("temp.jpg") icc_profile = im.info["icc_profile"] try: - im.save(f, format='JPEG', progressive=True,quality=95, + im.save(f, format='JPEG', progressive=True, quality=95, icc_profile=icc_profile, optimize=True) except IOError: self.fail("Failed saving image with icc larger than image size") diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 62c1c339242..334f5c96b66 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -178,8 +178,8 @@ def test_16bit_s(self): im = Image.open('Tests/images/16bit.s.tif') im.load() self.assertEqual(im.mode, 'I') - self.assertEqual(im.getpixel((0,0)),32767) - self.assertEqual(im.getpixel((0,1)),0) + self.assertEqual(im.getpixel((0, 0)), 32767) + self.assertEqual(im.getpixel((0, 1)), 0) def test_12bit_rawmode(self): """ Are we generating the same interpretation diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 8cc5a7882ef..aabedd6c8e7 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -242,7 +242,7 @@ def test_too_many_entries(self): ifd = TiffImagePlugin.ImageFileDirectory_v2() # 277: ("SamplesPerPixel", SHORT, 1), - ifd._tagdata[277] = struct.pack('hh', 4,4) + ifd._tagdata[277] = struct.pack('hh', 4, 4) ifd.tagtype[277] = TiffTags.SHORT try: diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index ab02307a2ca..a1c40e6a903 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -11,7 +11,7 @@ class TestTTypeFontLeak(PillowLeakTestCase): mem_limit = 4096 # k def _test_font(self, font): - im = Image.new('RGB', (255,255), 'white') + im = Image.new('RGB', (255, 255), 'white') draw = ImageDraw.ImageDraw(im) self._test_leak(lambda: draw.text((0, 0), "some text "*1024, # ~10k font=font, fill="black")) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 875a20b2056..2b344c6c28c 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -46,7 +46,7 @@ def test_invalid_file(self): def test_draw(self): tempname = self.save_font() font = ImageFont.load(tempname) - im = Image.new("L", (130,30), "white") + 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: @@ -56,17 +56,17 @@ def test_textsize(self): tempname = self.save_font() font = ImageFont.load(tempname) for i in range(255): - (dx,dy) = font.getsize(chr(i)) + (dx, dy) = font.getsize(chr(i)) self.assertEqual(dy, 20) - self.assertIn(dx, (0,10)) + self.assertIn(dx, (0, 10)) for l in range(len(message)): msg = message[:l+1] - self.assertEqual(font.getsize(msg), (len(msg)*10,20)) + self.assertEqual(font.getsize(msg), (len(msg)*10, 20)) def _test_high_characters(self, message): tempname = self.save_font() font = ImageFont.load(tempname) - im = Image.new("L", (750,30) , "white") + 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: diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 5369ed1982a..a3ab7805f71 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -61,7 +61,7 @@ def test_fill(self): Image.BILINEAR, fillcolor = 'red') - self.assertEqual(transformed.getpixel((w-1,h-1)), (255,0,0)) + self.assertEqual(transformed.getpixel((w-1, h-1)), (255, 0, 0)) def test_mesh(self): # this should be a checkerboard of halfsized hoppers in ul, lr diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index ac5f9c225a6..89f9563f314 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -101,7 +101,7 @@ def test_ligature_features(self): self.assert_image_similar(im, target_img, .5) liga_size = ttf.getsize('fi', features=['-liga']) - self.assertEqual(liga_size,(13,19)) + self.assertEqual(liga_size, (13, 19)) def test_kerning_features(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) @@ -120,7 +120,7 @@ def test_arabictext_features(self): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina','-init','-medi']) + draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina', '-init', '-medi']) target = 'Tests/images/test_arabictext_features.png' target_img = Image.open(target) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index a065784604d..002db2e19ba 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -24,26 +24,26 @@ def assert_pack(self, mode, rawmode, data, *pixels): self.assertEqual(data, im.tobytes("raw", rawmode)) def test_1(self): - self.assert_pack("1", "1", b'\x01', 0,0,0,0,0,0,0,X) - self.assert_pack("1", "1;I", b'\x01', X,X,X,X,X,X,X,0) - self.assert_pack("1", "1;R", b'\x01', X,0,0,0,0,0,0,0) - self.assert_pack("1", "1;IR", b'\x01', 0,X,X,X,X,X,X,X) + self.assert_pack("1", "1", b'\x01', 0, 0, 0, 0, 0, 0, 0, X) + self.assert_pack("1", "1;I", b'\x01', X, X, X, X, X, X, X, 0) + self.assert_pack("1", "1;R", b'\x01', X, 0, 0, 0, 0, 0, 0, 0) + self.assert_pack("1", "1;IR", b'\x01', 0, X, X, X, X, X, X, X) - self.assert_pack("1", "1", b'\xaa', X,0,X,0,X,0,X,0) - self.assert_pack("1", "1;I", b'\xaa', 0,X,0,X,0,X,0,X) - self.assert_pack("1", "1;R", b'\xaa', 0,X,0,X,0,X,0,X) - self.assert_pack("1", "1;IR", b'\xaa', X,0,X,0,X,0,X,0) + self.assert_pack("1", "1", b'\xaa', X, 0, X, 0, X, 0, X, 0) + self.assert_pack("1", "1;I", b'\xaa', 0, X, 0, X, 0, X, 0, X) + self.assert_pack("1", "1;R", b'\xaa', 0, X, 0, X, 0, X, 0, X) + self.assert_pack("1", "1;IR", b'\xaa', X, 0, X, 0, X, 0, X, 0) - self.assert_pack("1", "L", b'\xff\x00\x00\xff\x00\x00', X,0,0,X,0,0) + self.assert_pack("1", "L", b'\xff\x00\x00\xff\x00\x00', X, 0, 0, X, 0, 0) def test_L(self): - self.assert_pack("L", "L", 1, 1,2,3,4) + self.assert_pack("L", "L", 1, 1, 2, 3, 4) self.assert_pack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_pack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) def test_LA(self): - self.assert_pack("LA", "LA", 2, (1,2), (3,4), (5,6)) - self.assert_pack("LA", "LA;L", 2, (1,4), (2,5), (3,6)) + self.assert_pack("LA", "LA", 2, (1, 2), (3, 4), (5, 6)) + self.assert_pack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6)) def test_P(self): self.assert_pack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 255, 0, 0) @@ -52,100 +52,100 @@ def test_P(self): self.assert_pack("P", "P", 1, 1, 2, 3, 4) def test_PA(self): - self.assert_pack("PA", "PA", 2, (1,2), (3,4), (5,6)) - self.assert_pack("PA", "PA;L", 2, (1,4), (2,5), (3,6)) + self.assert_pack("PA", "PA", 2, (1, 2), (3, 4), (5, 6)) + self.assert_pack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6)) def test_RGB(self): - self.assert_pack("RGB", "RGB", 3, (1,2,3), (4,5,6), (7,8,9)) + self.assert_pack("RGB", "RGB", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) self.assert_pack("RGB", "RGBX", - b'\x01\x02\x03\xff\x05\x06\x07\xff', (1,2,3), (5,6,7)) + b'\x01\x02\x03\xff\x05\x06\x07\xff', (1, 2, 3), (5, 6, 7)) self.assert_pack("RGB", "XRGB", - b'\x00\x02\x03\x04\x00\x06\x07\x08', (2,3,4), (6,7,8)) - self.assert_pack("RGB", "BGR", 3, (3,2,1), (6,5,4), (9,8,7)) + b'\x00\x02\x03\x04\x00\x06\x07\x08', (2, 3, 4), (6, 7, 8)) + self.assert_pack("RGB", "BGR", 3, (3, 2, 1), (6, 5, 4), (9, 8, 7)) self.assert_pack("RGB", "BGRX", - b'\x01\x02\x03\x00\x05\x06\x07\x00', (3,2,1), (7,6,5)) + b'\x01\x02\x03\x00\x05\x06\x07\x00', (3, 2, 1), (7, 6, 5)) self.assert_pack("RGB", "XBGR", - b'\x00\x02\x03\x04\x00\x06\x07\x08', (4,3,2), (8,7,6)) - self.assert_pack("RGB", "RGB;L", 3, (1,4,7), (2,5,8), (3,6,9)) - self.assert_pack("RGB", "R", 1, (1,9,9), (2,9,9), (3,9,9)) - self.assert_pack("RGB", "G", 1, (9,1,9), (9,2,9), (9,3,9)) - self.assert_pack("RGB", "B", 1, (9,9,1), (9,9,2), (9,9,3)) + b'\x00\x02\x03\x04\x00\x06\x07\x08', (4, 3, 2), (8, 7, 6)) + self.assert_pack("RGB", "RGB;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_pack("RGB", "R", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9)) + self.assert_pack("RGB", "G", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9)) + self.assert_pack("RGB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3)) def test_RGBA(self): self.assert_pack("RGBA", "RGBA", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack("RGBA", "RGBA;L", 4, - (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_pack("RGBA", "RGB", 3, (1,2,3,14), (4,5,6,15), (7,8,9,16)) - self.assert_pack("RGBA", "BGR", 3, (3,2,1,14), (6,5,4,15), (9,8,7,16)) + (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack("RGBA", "RGB", 3, (1, 2, 3, 14), (4, 5, 6, 15), (7, 8, 9, 16)) + self.assert_pack("RGBA", "BGR", 3, (3, 2, 1, 14), (6, 5, 4, 15), (9, 8, 7, 16)) self.assert_pack("RGBA", "BGRA", 4, - (3,2,1,4), (7,6,5,8), (11,10,9,12)) + (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) self.assert_pack("RGBA", "ABGR", 4, - (4,3,2,1), (8,7,6,5), (12,11,10,9)) + (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) self.assert_pack("RGBA", "BGRa", 4, - (191,127,63,4), (223,191,159,8), (233,212,191,12)) - self.assert_pack("RGBA", "R", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) - self.assert_pack("RGBA", "G", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) - self.assert_pack("RGBA", "B", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) - self.assert_pack("RGBA", "A", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) + (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12)) + self.assert_pack("RGBA", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack("RGBA", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack("RGBA", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) + self.assert_pack("RGBA", "A", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_RGBa(self): self.assert_pack("RGBa", "RGBa", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack("RGBa", "BGRa", 4, - (3,2,1,4), (7,6,5,8), (11,10,9,12)) + (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) self.assert_pack("RGBa", "aBGR", 4, - (4,3,2,1), (8,7,6,5), (12,11,10,9)) + (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): - self.assert_pack("RGBX", "RGBX", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) - self.assert_pack("RGBX", "RGBX;L", 4, (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_pack("RGBX", "RGB", 3, (1,2,3,X), (4,5,6,X), (7,8,9,X)) - self.assert_pack("RGBX", "BGR", 3, (3,2,1,X), (6,5,4,X), (9,8,7,X)) + self.assert_pack("RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_pack("RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) + self.assert_pack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) self.assert_pack("RGBX", "BGRX", b'\x01\x02\x03\x00\x05\x06\x07\x00\t\n\x0b\x00', - (3,2,1,X), (7,6,5,X), (11,10,9,X)) + (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) self.assert_pack("RGBX", "XBGR", b'\x00\x02\x03\x04\x00\x06\x07\x08\x00\n\x0b\x0c', - (4,3,2,X), (8,7,6,X), (12,11,10,X)) - self.assert_pack("RGBX", "R", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) - self.assert_pack("RGBX", "G", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) - self.assert_pack("RGBX", "B", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) - self.assert_pack("RGBX", "X", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) + (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) + self.assert_pack("RGBX", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack("RGBX", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack("RGBX", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) + self.assert_pack("RGBX", "X", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_CMYK(self): - self.assert_pack("CMYK", "CMYK", 4, (1,2,3,4), (5,6,7,8), (9,10,11,12)) + self.assert_pack("CMYK", "CMYK", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack("CMYK", "CMYK;I", 4, - (254,253,252,251), (250,249,248,247), (246,245,244,243)) + (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) self.assert_pack("CMYK", "CMYK;L", 4, - (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_pack("CMYK", "K", 1, (6,7,0,1), (6,7,0,2), (0,7,0,3)) + (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack("CMYK", "K", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_YCbCr(self): - self.assert_pack("YCbCr", "YCbCr", 3, (1,2,3), (4,5,6), (7,8,9)) - self.assert_pack("YCbCr", "YCbCr;L", 3, (1,4,7), (2,5,8), (3,6,9)) + self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_pack("YCbCr", "YCbCrX", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', - (1,2,3), (5,6,7), (9,10,11)) + (1, 2, 3), (5, 6, 7), (9, 10, 11)) self.assert_pack("YCbCr", "YCbCrK", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', - (1,2,3), (5,6,7), (9,10,11)) - self.assert_pack("YCbCr", "Y", 1, (1,0,8,9), (2,0,8,9), (3,0,8,0)) - self.assert_pack("YCbCr", "Cb", 1, (6,1,8,9), (6,2,8,9), (6,3,8,9)) - self.assert_pack("YCbCr", "Cr", 1, (6,7,1,9), (6,7,2,0), (6,7,3,9)) + (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_pack("YCbCr", "Y", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack("YCbCr", "Cb", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack("YCbCr", "Cr", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) def test_LAB(self): self.assert_pack("LAB", "LAB", 3, - (1,130,131), (4,133,134), (7,136,137)) - self.assert_pack("LAB", "L", 1, (1,9,9), (2,9,9), (3,9,9)) - self.assert_pack("LAB", "A", 1, (9,1,9), (9,2,9), (9,3,9)) - self.assert_pack("LAB", "B", 1, (9,9,1), (9,9,2), (9,9,3)) + (1, 130, 131), (4, 133, 134), (7, 136, 137)) + self.assert_pack("LAB", "L", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9)) + self.assert_pack("LAB", "A", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9)) + self.assert_pack("LAB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3)) def test_HSV(self): - self.assert_pack("HSV", "HSV", 3, (1,2,3), (4,5,6), (7,8,9)) - self.assert_pack("HSV", "H", 1, (1,9,9), (2,9,9), (3,9,9)) - self.assert_pack("HSV", "S", 1, (9,1,9), (9,2,9), (9,3,9)) - self.assert_pack("HSV", "V", 1, (9,9,1), (9,9,2), (9,9,3)) + self.assert_pack("HSV", "HSV", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_pack("HSV", "H", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9)) + self.assert_pack("HSV", "S", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9)) + self.assert_pack("HSV", "V", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3)) def test_I(self): self.assert_pack("I", "I;16B", 2, 0x0102, 0x0304) @@ -244,163 +244,163 @@ def test_PA(self): self.assert_unpack("PA", "PA;L", 2, (1, 4), (2, 5), (3, 6)) def test_RGB(self): - self.assert_unpack("RGB", "RGB", 3, (1,2,3), (4,5,6), (7,8,9)) - self.assert_unpack("RGB", "RGB;L", 3, (1,4,7), (2,5,8), (3,6,9)) - self.assert_unpack("RGB", "RGB;R", 3, (128,64,192), (32,160,96)) - self.assert_unpack("RGB", "RGB;16L", 6, (2,4,6), (8,10,12)) - self.assert_unpack("RGB", "RGB;16B", 6, (1,3,5), (7,9,11)) - self.assert_unpack("RGB", "BGR", 3, (3,2,1), (6,5,4), (9,8,7)) - self.assert_unpack("RGB", "RGB;15", 2, (8,131,0), (24,0,8)) - self.assert_unpack("RGB", "BGR;15", 2, (0,131,8), (8,0,24)) - self.assert_unpack("RGB", "RGB;16", 2, (8,64,0), (24,129,0)) - self.assert_unpack("RGB", "BGR;16", 2, (0,64,8), (0,129,24)) - self.assert_unpack("RGB", "RGB;4B", 2, (17,0,34), (51,0,68)) - self.assert_unpack("RGB", "RGBX", 4, (1,2,3), (5,6,7), (9,10,11)) - self.assert_unpack("RGB", "RGBX;L", 4, (1,4,7), (2,5,8), (3,6,9)) - self.assert_unpack("RGB", "BGRX", 4, (3,2,1), (7,6,5), (11,10,9)) - self.assert_unpack("RGB", "XRGB", 4, (2,3,4), (6,7,8), (10,11,12)) - self.assert_unpack("RGB", "XBGR", 4, (4,3,2), (8,7,6), (12,11,10)) + self.assert_unpack("RGB", "RGB", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_unpack("RGB", "RGB;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_unpack("RGB", "RGB;R", 3, (128, 64, 192), (32, 160, 96)) + self.assert_unpack("RGB", "RGB;16L", 6, (2, 4, 6), (8, 10, 12)) + self.assert_unpack("RGB", "RGB;16B", 6, (1, 3, 5), (7, 9, 11)) + self.assert_unpack("RGB", "BGR", 3, (3, 2, 1), (6, 5, 4), (9, 8, 7)) + self.assert_unpack("RGB", "RGB;15", 2, (8, 131, 0), (24, 0, 8)) + self.assert_unpack("RGB", "BGR;15", 2, (0, 131, 8), (8, 0, 24)) + self.assert_unpack("RGB", "RGB;16", 2, (8, 64, 0), (24, 129, 0)) + self.assert_unpack("RGB", "BGR;16", 2, (0, 64, 8), (0, 129, 24)) + self.assert_unpack("RGB", "RGB;4B", 2, (17, 0, 34), (51, 0, 68)) + self.assert_unpack("RGB", "RGBX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack("RGB", "RGBX;L", 4, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_unpack("RGB", "BGRX", 4, (3, 2, 1), (7, 6, 5), (11, 10, 9)) + self.assert_unpack("RGB", "XRGB", 4, (2, 3, 4), (6, 7, 8), (10, 11, 12)) + self.assert_unpack("RGB", "XBGR", 4, (4, 3, 2), (8, 7, 6), (12, 11, 10)) self.assert_unpack("RGB", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data - (127,102,0), (192,227,0), (213,255,170), (98,255,133)) - self.assert_unpack("RGB", "R", 1, (1,0,0), (2,0,0), (3,0,0)) - 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)) + (127, 102, 0), (192, 227, 0), (213, 255, 170), (98, 255, 133)) + self.assert_unpack("RGB", "R", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0)) + 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)) 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("RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6)) self.assert_unpack("RGBA", "LA;16B", 4, - (1,1,1,3), (5,5,5,7), (9,9,9,11)) + (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) self.assert_unpack("RGBA", "RGBA", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_unpack("RGBA", "RGBa", 4, - (63,127,191,4), (159,191,223,8), (191,212,233,12)) + (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12)) self.assert_unpack("RGBA", "RGBa", b'\x01\x02\x03\x00\x10\x20\x30\xff', - (0,0,0,0), (16,32,48,255)) + (0, 0, 0, 0), (16, 32, 48, 255)) self.assert_unpack("RGBA", "RGBa;16L", 8, - (63,127,191,8), (159,191,223,16), (191,212,233,24)) + (63, 127, 191, 8), (159, 191, 223, 16), (191, 212, 233, 24)) self.assert_unpack("RGBA", "RGBa;16L", b'\x88\x01\x88\x02\x88\x03\x88\x00' b'\x88\x10\x88\x20\x88\x30\x88\xff', - (0,0,0,0), (16,32,48,255)) + (0, 0, 0, 0), (16, 32, 48, 255)) self.assert_unpack("RGBA", "RGBa;16B", 8, - (36,109,182,7), (153,187,221,15), (188,210,232,23)) + (36, 109, 182, 7), (153, 187, 221, 15), (188, 210, 232, 23)) self.assert_unpack("RGBA", "RGBa;16B", b'\x01\x88\x02\x88\x03\x88\x00\x88' b'\x10\x88\x20\x88\x30\x88\xff\x88', - (0,0,0,0), (16,32,48,255)) + (0, 0, 0, 0), (16, 32, 48, 255)) self.assert_unpack("RGBA", "BGRa", 4, - (191,127,63,4), (223,191,159,8), (233,212,191,12)) + (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12)) self.assert_unpack("RGBA", "BGRa", b'\x01\x02\x03\x00\x10\x20\x30\xff', - (0,0,0,0), (48,32,16,255)) + (0, 0, 0, 0), (48, 32, 16, 255)) self.assert_unpack("RGBA", "RGBA;I", 4, - (254,253,252,4), (250,249,248,8), (246,245,244,12)) + (254, 253, 252, 4), (250, 249, 248, 8), (246, 245, 244, 12)) self.assert_unpack("RGBA", "RGBA;L", 4, - (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_unpack("RGBA", "RGBA;15", 2, (8,131,0,0), (24,0,8,0)) - self.assert_unpack("RGBA", "BGRA;15", 2, (0,131,8,0), (8,0,24,0)) - self.assert_unpack("RGBA", "RGBA;4B", 2, (17,0,34,0), (51,0,68,0)) - self.assert_unpack("RGBA", "RGBA;16L", 8, (2,4,6,8), (10,12,14,16)) - self.assert_unpack("RGBA", "RGBA;16B", 8, (1,3,5,7), (9,11,13,15)) + (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack("RGBA", "RGBA;15", 2, (8, 131, 0, 0), (24, 0, 8, 0)) + self.assert_unpack("RGBA", "BGRA;15", 2, (0, 131, 8, 0), (8, 0, 24, 0)) + self.assert_unpack("RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0)) + self.assert_unpack("RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) + self.assert_unpack("RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) self.assert_unpack("RGBA", "BGRA", 4, - (3,2,1,4), (7,6,5,8), (11,10,9,12)) + (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) self.assert_unpack("RGBA", "ARGB", 4, - (2,3,4,1), (6,7,8,5), (10,11,12,9)) + (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) self.assert_unpack("RGBA", "ABGR", 4, - (4,3,2,1), (8,7,6,5), (12,11,10,9)) + (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) self.assert_unpack("RGBA", "YCCA;P", b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data - (0,161,0,4), (255,255,255,237), (27,158,0,206), (0,118,0,17)) - self.assert_unpack("RGBA", "R", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) - self.assert_unpack("RGBA", "G", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) - 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)) + (0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17)) + self.assert_unpack("RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack("RGBA", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + 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)) def test_RGBa(self): self.assert_unpack("RGBa", "RGBa", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_unpack("RGBa", "BGRa", 4, - (3,2,1,4), (7,6,5,8), (11,10,9,12)) + (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) self.assert_unpack("RGBa", "aRGB", 4, - (2,3,4,1), (6,7,8,5), (10,11,12,9)) + (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) self.assert_unpack("RGBa", "aBGR", 4, - (4,3,2,1), (8,7,6,5), (12,11,10,9)) + (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): - self.assert_unpack("RGBX", "RGB", 3, (1,2,3,X), (4,5,6,X), (7,8,9,X)) - self.assert_unpack("RGBX", "RGB;L", 3, (1,4,7,X), (2,5,8,X), (3,6,9,X)) - self.assert_unpack("RGBX", "RGB;16B", 6, (1,3,5,X), (7,9,11,X)) - self.assert_unpack("RGBX", "BGR", 3, (3,2,1,X), (6,5,4,X), (9,8,7,X)) - self.assert_unpack("RGBX", "RGB;15", 2, (8,131,0,X), (24,0,8,X)) - self.assert_unpack("RGBX", "BGR;15", 2, (0,131,8,X), (8,0,24,X)) - self.assert_unpack("RGBX", "RGB;4B", 2, (17,0,34,X), (51,0,68,X)) + self.assert_unpack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) + self.assert_unpack("RGBX", "RGB;L", 3, (1, 4, 7, X), (2, 5, 8, X), (3, 6, 9, X)) + self.assert_unpack("RGBX", "RGB;16B", 6, (1, 3, 5, X), (7, 9, 11, X)) + self.assert_unpack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) + self.assert_unpack("RGBX", "RGB;15", 2, (8, 131, 0, X), (24, 0, 8, X)) + self.assert_unpack("RGBX", "BGR;15", 2, (0, 131, 8, X), (8, 0, 24, X)) + self.assert_unpack("RGBX", "RGB;4B", 2, (17, 0, 34, X), (51, 0, 68, X)) self.assert_unpack("RGBX", "RGBX", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_unpack("RGBX", "RGBXX", 5, - (1,2,3,4), (6,7,8,9), (11,12,13,14)) + (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) self.assert_unpack("RGBX", "RGBXXX", 6, - (1,2,3,4), (7,8,9,10), (13,14,15,16)) + (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) self.assert_unpack("RGBX", "RGBX;L", 4, - (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_unpack("RGBX", "RGBX;16L", 8, (2,4,6,8), (10,12,14,16)) - self.assert_unpack("RGBX", "RGBX;16B", 8, (1,3,5,7), (9,11,13,15)) - self.assert_unpack("RGBX", "BGRX", 4, (3,2,1,X), (7,6,5,X), (11,10,9,X)) - self.assert_unpack("RGBX", "XRGB", 4, (2,3,4,X), (6,7,8,X), (10,11,12,X)) - self.assert_unpack("RGBX", "XBGR", 4, (4,3,2,X), (8,7,6,X), (12,11,10,X)) + (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack("RGBX", "RGBX;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) + self.assert_unpack("RGBX", "RGBX;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) + self.assert_unpack("RGBX", "BGRX", 4, (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) + self.assert_unpack("RGBX", "XRGB", 4, (2, 3, 4, X), (6, 7, 8, X), (10, 11, 12, X)) + self.assert_unpack("RGBX", "XBGR", 4, (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) self.assert_unpack("RGBX", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data - (127,102,0,X), (192,227,0,X), (213,255,170,X), (98,255,133,X)) - self.assert_unpack("RGBX", "R", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) - self.assert_unpack("RGBX", "G", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) - self.assert_unpack("RGBX", "B", 1, (0,0,1,0), (0,0,2,0), (0,0,3,0)) - self.assert_unpack("RGBX", "X", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) + (127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X)) + self.assert_unpack("RGBX", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack("RGBX", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + self.assert_unpack("RGBX", "B", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) + self.assert_unpack("RGBX", "X", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) def test_CMYK(self): self.assert_unpack("CMYK", "CMYK", 4, - (1,2,3,4), (5,6,7,8), (9,10,11,12)) + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_unpack("CMYK", "CMYKX", 5, - (1,2,3,4), (6,7,8,9), (11,12,13,14)) + (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) self.assert_unpack("CMYK", "CMYKXX", 6, - (1,2,3,4), (7,8,9,10), (13,14,15,16)) + (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) self.assert_unpack("CMYK", "CMYK;I", 4, - (254,253,252,251), (250,249,248,247), (246,245,244,243)) + (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) self.assert_unpack("CMYK", "CMYK;L", 4, - (1,4,7,10), (2,5,8,11), (3,6,9,12)) - self.assert_unpack("CMYK", "C", 1, (1,0,0,0), (2,0,0,0), (3,0,0,0)) - self.assert_unpack("CMYK", "M", 1, (0,1,0,0), (0,2,0,0), (0,3,0,0)) - self.assert_unpack("CMYK", "Y", 1, (0,0,1,0), (0,0,2,0), (0,0,3,0)) - self.assert_unpack("CMYK", "K", 1, (0,0,0,1), (0,0,0,2), (0,0,0,3)) + (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack("CMYK", "C", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack("CMYK", "M", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + self.assert_unpack("CMYK", "Y", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) + self.assert_unpack("CMYK", "K", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) self.assert_unpack("CMYK", "C;I", 1, - (254,0,0,0), (253,0,0,0), (252,0,0,0)) + (254, 0, 0, 0), (253, 0, 0, 0), (252, 0, 0, 0)) self.assert_unpack("CMYK", "M;I", 1, - (0,254,0,0), (0,253,0,0), (0,252,0,0)) + (0, 254, 0, 0), (0, 253, 0, 0), (0, 252, 0, 0)) self.assert_unpack("CMYK", "Y;I", 1, - (0,0,254,0), (0,0,253,0), (0,0,252,0)) + (0, 0, 254, 0), (0, 0, 253, 0), (0, 0, 252, 0)) self.assert_unpack("CMYK", "K;I", 1, - (0,0,0,254), (0,0,0,253), (0,0,0,252)) + (0, 0, 0, 254), (0, 0, 0, 253), (0, 0, 0, 252)) def test_YCbCr(self): - self.assert_unpack("YCbCr", "YCbCr", 3, (1,2,3), (4,5,6), (7,8,9)) - self.assert_unpack("YCbCr", "YCbCr;L", 3, (1,4,7), (2,5,8), (3,6,9)) - self.assert_unpack("YCbCr", "YCbCrK", 4, (1,2,3), (5,6,7), (9,10,11)) - self.assert_unpack("YCbCr", "YCbCrX", 4, (1,2,3), (5,6,7), (9,10,11)) - self.assert_unpack("YCbCr", "YCbCrXX", 5, (1,2,3), (6,7,8), (11,12,13)) - self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1,2,3), (7,8,9), (13,14,15)) + self.assert_unpack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_unpack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_unpack("YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack("YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack("YCbCr", "YCbCrXX", 5, (1, 2, 3), (6, 7, 8), (11, 12, 13)) + self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1, 2, 3), (7, 8, 9), (13, 14, 15)) def test_LAB(self): self.assert_unpack("LAB", "LAB", 3, - (1,130,131), (4,133,134), (7,136,137)) - self.assert_unpack("LAB", "L", 1, (1,0,0), (2,0,0), (3,0,0)) - self.assert_unpack("LAB", "A", 1, (0,1,0), (0,2,0), (0,3,0)) - self.assert_unpack("LAB", "B", 1, (0,0,1), (0,0,2), (0,0,3)) + (1, 130, 131), (4, 133, 134), (7, 136, 137)) + self.assert_unpack("LAB", "L", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0)) + self.assert_unpack("LAB", "A", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0)) + self.assert_unpack("LAB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) def test_HSV(self): - self.assert_unpack("HSV", "HSV", 3, (1,2,3), (4,5,6), (7,8,9)) - self.assert_unpack("HSV", "H", 1, (1,0,0), (2,0,0), (3,0,0)) - self.assert_unpack("HSV", "S", 1, (0,1,0), (0,2,0), (0,3,0)) - self.assert_unpack("HSV", "V", 1, (0,0,1), (0,0,2), (0,0,3)) + self.assert_unpack("HSV", "HSV", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_unpack("HSV", "H", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0)) + self.assert_unpack("HSV", "S", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0)) + self.assert_unpack("HSV", "V", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) def test_I(self): self.assert_unpack("I", "I;8", 1, 0x01, 0x02, 0x03, 0x04) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 7eeee3a83f0..3f95865135b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -214,7 +214,7 @@ def test_zero_size(self): def test_bool(self): # https://github.com/python-pillow/Pillow/issues/2044 - a = numpy.zeros((10,2), dtype=numpy.bool) + a = numpy.zeros((10, 2), dtype=numpy.bool) a[0][0] = True im2 = Image.fromarray(a) diff --git a/setup.py b/setup.py index e75105d82d2..4a0ad86c529 100755 --- a/setup.py +++ b/setup.py @@ -788,7 +788,7 @@ def debug_build(): setup_requires=pytest_runner, tests_require=['pytest'], packages=["PIL"], - package_dir={'':'src'}, + package_dir={'': 'src'}, keywords=["Imaging", ], license='Standard PIL License', zip_safe=not (debug_build() or PLATFORM_MINGW), ) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index fd47a0c1cd3..0fc0b5e8741 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1407,7 +1407,7 @@ def paste(self, im, box=None, mask=None): else: self.im.paste(im, box) - def alpha_composite(self, im, dest=(0,0), source=(0,0)): + def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): """ 'In-place' analog of Image.alpha_composite. Composites an image onto this image. @@ -1438,7 +1438,7 @@ def alpha_composite(self, im, dest=(0,0), source=(0,0)): source = source + im.size # over image, crop if it's not the whole thing. - if source == (0,0) + im.size: + if source == (0, 0) + im.size: overlay = im else: overlay = im.crop(source) @@ -1447,7 +1447,7 @@ def alpha_composite(self, im, dest=(0,0), source=(0,0)): box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) # destination image. don't copy if we're using the whole image. - if box == (0,0) + self.size: + if box == (0, 0) + self.size: background = self else: background = self.crop(box) @@ -2501,7 +2501,7 @@ def _decompression_bomb_check(size): raise DecompressionBombError( "Image size (%d pixels) exceeds limit of %d pixels, " "could be decompression bomb DOS attack." % - (pixels, 2* MAX_IMAGE_PIXELS)) + (pixels, 2 * MAX_IMAGE_PIXELS)) if pixels > MAX_IMAGE_PIXELS: warnings.warn( From adaa70357662a11cd4b7c0beddaad4e92164c5d9 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Sat, 17 Feb 2018 02:46:29 +0200 Subject: [PATCH 0109/1393] Add support for BLP file format --- CHANGES.rst | 2 +- Tests/images/blp2_dxt1.blp | Bin 0 -> 33940 bytes Tests/images/blp2_dxt1.png | Bin 0 -> 761 bytes Tests/test_file_blp.py | 14 ++ src/PIL/BlpImagePlugin.py | 432 +++++++++++++++++++++++++++++++++++++ src/PIL/__init__.py | 5 +- 6 files changed, 450 insertions(+), 3 deletions(-) create mode 100644 Tests/images/blp2_dxt1.blp create mode 100644 Tests/images/blp2_dxt1.png create mode 100644 Tests/test_file_blp.py create mode 100644 src/PIL/BlpImagePlugin.py diff --git a/CHANGES.rst b/CHANGES.rst index 5d2f4e7a64a..e9d53d563a1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1189,7 +1189,7 @@ Changelog (Pillow) - Change function declaration to match Tcl_CmdProc type #1966 [homm] -- Integer overflow checks on all calls to *alloc #1781 +- Integer overflow checks on all calls to \*alloc #1781 [wiredfool] - Change equals method on Image so it short circuits #1967 diff --git a/Tests/images/blp2_dxt1.blp b/Tests/images/blp2_dxt1.blp new file mode 100644 index 0000000000000000000000000000000000000000..73c0c91b51ad578c142ae9da8db4df31ad48f7d2 GIT binary patch literal 33940 zcmeIy!3}^Q3uamjv<@tCMK zF>6!;5?DHcUi$fEIptsv`~wbffCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h k00%h00S<70103K02ROh14sd`29N+*4IKTl8aA0Kzekgc{&Hw-a literal 0 HcmV?d00001 diff --git a/Tests/images/blp2_dxt1.png b/Tests/images/blp2_dxt1.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a24618a9acde300dc2cc345cc1c0a8bca92cdb GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0$>1D-C9Ar*7pURGpeP+&M< zpdgev;fuc`&ynpc=JS8wVGMm;&hRIN;S!I-EJhDwhDT!W2FQRX a23z}VrdL&`^38xrn!(f6&t;ucLK6U{y4X$t literal 0 HcmV?d00001 diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py new file mode 100644 index 00000000000..febba73c2a0 --- /dev/null +++ b/Tests/test_file_blp.py @@ -0,0 +1,14 @@ +from PIL import Image + +from helper import PillowTestCase, unittest + + +class TestFileBlp(PillowTestCase): + def test_load_blp2_dxt1(self): + im = Image.open("Tests/images/blp2_dxt1.blp") + target = Image.open("Tests/images/blp2_dxt1.png") + self.assert_image_similar(im, target.convert("RGBA"), 15) + + +if __name__ == "__main__": + unittest.main() diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py new file mode 100644 index 00000000000..72bf7048265 --- /dev/null +++ b/src/PIL/BlpImagePlugin.py @@ -0,0 +1,432 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile + + +BLP_FORMAT_JPEG = 0 + +BLP_ENCODING_UNCOMPRESSED = 1 +BLP_ENCODING_DXT = 2 +BLP_ENCODING_UNCOMPRESSED_RAW_BGRA = 3 + +BLP_ALPHA_ENCODING_DXT1 = 0 +BLP_ALPHA_ENCODING_DXT3 = 1 +BLP_ALPHA_ENCODING_DXT5 = 7 + + +def decode_dxt1(data, alpha=False): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + final = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + # Decode next 8-byte block. + idx = block * 8 + color0, color1, bits = struct.unpack("> 11) & 0x1f) << 3 + g0 = ((color0 >> 5) & 0x3f) << 2 + b0 = (color0 & 0x1f) << 3 + + # color 1, packed 5-6-5 + r1 = ((color1 >> 11) & 0x1f) << 3 + g1 = ((color1 >> 5) & 0x3f) << 2 + b1 = (color1 & 0x1f) << 3 + + # Decode this block into 4x4 pixels + # Accumulate the results onto our 4 row accumulators + for j in range(4): + for i in range(4): + # get next control op and generate a pixel + + control = bits & 3 + bits = bits >> 2 + if control == 0: + final[j].append(r0) + final[j].append(g0) + final[j].append(b0) + elif control == 1: + final[j].append(r1) + final[j].append(g1) + final[j].append(b1) + elif control == 2: + if color0 > color1: + final[j].append((2 * r0 + r1) // 3) + final[j].append((2 * g0 + g1) // 3) + final[j].append((2 * b0 + b1) // 3) + else: + final[j].append((r0 + r1) // 2) + final[j].append((g0 + g1) // 2) + final[j].append((b0 + b1) // 2) + elif control == 3: + if color0 > color1: + final[j].append((2 * r1 + r0) // 3) + final[j].append((2 * g1 + g0) // 3) + final[j].append((2 * b1 + b0) // 3) + else: + final[j].append(0) + final[j].append(0) + final[j].append(0) + if alpha: + final[j].append(0) + + if alpha: + final[j].append(0xFF) + + return final + + +def decode_dxt3(data): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + final = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx:idx + 16] + # Decode next 16-byte block. + bits = struct.unpack("<8B", block[:8]) + color0, color1 = struct.unpack("> 11) & 0x1f) << 3 + g0 = ((color0 >> 5) & 0x3f) << 2 + b0 = (color0 & 0x1f) << 3 + + # color 1, packed 5-6-5 + r1 = ((color1 >> 11) & 0x1f) << 3 + g1 = ((color1 >> 5) & 0x3f) << 2 + b1 = (color1 & 0x1f) << 3 + + for j in range(4): + high = False # Do we want the higher bits? + for i in range(4): + alphacode_index = (4 * j + i) // 2 + a = bits[alphacode_index] + if high: + high = False + a >>= 4 + else: + high = True + a &= 0xf + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + final[j].append(r0) + final[j].append(g0) + final[j].append(b0) + final[j].append(a) + elif color_code == 1: + final[j].append(r1) + final[j].append(g1) + final[j].append(b1) + final[j].append(a) + elif color_code == 2: + final[j].append((2 * r0 + r1) // 3) + final[j].append((2 * g0 + g1) // 3) + final[j].append((2 * b0 + b1) // 3) + final[j].append(a) + elif color_code == 3: + final[j].append((2 * r1 + r0) // 3) + final[j].append((2 * g1 + g0) // 3) + final[j].append((2 * b1 + b0) // 3) + final[j].append(a) + + return final + + +def decode_dxt5(data): + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + final = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx:idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack("> 11) & 0x1f) << 3 + g0 = ((color0 >> 5) & 0x3f) << 2 + b0 = (color0 & 0x1f) << 3 + + # color 1, packed 5-6-5 + r1 = ((color1 >> 11) & 0x1f) << 3 + g1 = ((color1 >> 5) & 0x3f) << 2 + b1 = (color1 & 0x1f) << 3 + + for j in range(4): + for i in range(4): + # get next control op and generate a pixel + alphacode_index = 3 * (4 * j + i) + + if alphacode_index <= 12: + alphacode = (alphacode2 >> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + else: + if alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + final[j].append(r0) + final[j].append(g0) + final[j].append(b0) + final[j].append(a) + elif color_code == 1: + final[j].append(r1) + final[j].append(g1) + final[j].append(b1) + final[j].append(a) + elif color_code == 2: + final[j].append((2 * r0 + r1) // 3) + final[j].append((2 * g0 + g1) // 3) + final[j].append((2 * b0 + b1) // 3) + final[j].append(a) + elif color_code == 3: + final[j].append((2 * r1 + r0) // 3) + final[j].append((2 * g1 + g0) // 3) + final[j].append((2 * b1 + b0) // 3) + final[j].append(a) + + return tuple(final) + + +def getpalette(data): + """ + Helper to transform a BytesIO object into a palette + """ + palette = [] + string = BytesIO(data) + while True: + try: + palette.append(struct.unpack("<4B", string.read(4))) + except struct.error: + break + return palette + + +class BLPFormatError(NotImplementedError): + pass + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _decode_blp1(self): + header = BytesIO(self.fp.read(28 + 16 * 4 + 16 * 4)) + + magic, compression = struct.unpack("<4si", header.read(8)) + encoding, alpha_depth, alpha_encoding, has_mips = struct.unpack( + "<4b", header.read(4) + ) + self.size = struct.unpack(" Date: Sun, 18 Feb 2018 04:55:55 +0200 Subject: [PATCH 0110/1393] blp: Simplify dxt1/dxt3/dxt5 decoding --- src/PIL/BlpImagePlugin.py | 154 +++++++++++++++----------------------- 1 file changed, 62 insertions(+), 92 deletions(-) diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index 72bf7048265..fbddb6cdcb6 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -46,28 +46,29 @@ BLP_ALPHA_ENCODING_DXT5 = 7 +def unpack_565(i): + return ( + ((i >> 11) & 0x1f) << 3, + ((i >> 5) & 0x3f) << 2, + (i & 0x1f) << 3 + ) + + def decode_dxt1(data, alpha=False): """ input: one "row" of data (i.e. will produce 4*width pixels) """ blocks = len(data) // 8 # number of blocks in row - final = (bytearray(), bytearray(), bytearray(), bytearray()) + ret = (bytearray(), bytearray(), bytearray(), bytearray()) for block in range(blocks): # Decode next 8-byte block. idx = block * 8 color0, color1, bits = struct.unpack("> 11) & 0x1f) << 3 - g0 = ((color0 >> 5) & 0x3f) << 2 - b0 = (color0 & 0x1f) << 3 - - # color 1, packed 5-6-5 - r1 = ((color1 >> 11) & 0x1f) << 3 - g1 = ((color1 >> 5) & 0x3f) << 2 - b1 = (color1 & 0x1f) << 3 + r0, g0, b0 = unpack_565(color0) + r1, g1, b1 = unpack_565(color1) # Decode this block into 4x4 pixels # Accumulate the results onto our 4 row accumulators @@ -77,39 +78,35 @@ def decode_dxt1(data, alpha=False): control = bits & 3 bits = bits >> 2 + + a = 0xFF if control == 0: - final[j].append(r0) - final[j].append(g0) - final[j].append(b0) + r, g, b = r0, g0, b0 elif control == 1: - final[j].append(r1) - final[j].append(g1) - final[j].append(b1) + r, g, b = r1, g1, b1 elif control == 2: if color0 > color1: - final[j].append((2 * r0 + r1) // 3) - final[j].append((2 * g0 + g1) // 3) - final[j].append((2 * b0 + b1) // 3) + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 else: - final[j].append((r0 + r1) // 2) - final[j].append((g0 + g1) // 2) - final[j].append((b0 + b1) // 2) + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 elif control == 3: if color0 > color1: - final[j].append((2 * r1 + r0) // 3) - final[j].append((2 * g1 + g0) // 3) - final[j].append((2 * b1 + b0) // 3) + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 else: - final[j].append(0) - final[j].append(0) - final[j].append(0) - if alpha: - final[j].append(0) + r, g, b, a = 0, 0, 0, 0 if alpha: - final[j].append(0xFF) + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) - return final + return ret def decode_dxt3(data): @@ -118,7 +115,7 @@ def decode_dxt3(data): """ blocks = len(data) // 16 # number of blocks in row - final = (bytearray(), bytearray(), bytearray(), bytearray()) + ret = (bytearray(), bytearray(), bytearray(), bytearray()) for block in range(blocks): idx = block * 16 @@ -129,15 +126,8 @@ def decode_dxt3(data): code, = struct.unpack("> 11) & 0x1f) << 3 - g0 = ((color0 >> 5) & 0x3f) << 2 - b0 = (color0 & 0x1f) << 3 - - # color 1, packed 5-6-5 - r1 = ((color1 >> 11) & 0x1f) << 3 - g1 = ((color1 >> 5) & 0x3f) << 2 - b1 = (color1 & 0x1f) << 3 + r0, g0, b0 = unpack_565(color0) + r1, g1, b1 = unpack_565(color1) for j in range(4): high = False # Do we want the higher bits? @@ -155,27 +145,21 @@ def decode_dxt3(data): color_code = (code >> 2 * (4 * j + i)) & 0x03 if color_code == 0: - final[j].append(r0) - final[j].append(g0) - final[j].append(b0) - final[j].append(a) + r, g, b = r0, g0, b0 elif color_code == 1: - final[j].append(r1) - final[j].append(g1) - final[j].append(b1) - final[j].append(a) + r, g, b = r1, g1, b1 elif color_code == 2: - final[j].append((2 * r0 + r1) // 3) - final[j].append((2 * g0 + g1) // 3) - final[j].append((2 * b0 + b1) // 3) - final[j].append(a) + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 elif color_code == 3: - final[j].append((2 * r1 + r0) // 3) - final[j].append((2 * g1 + g0) // 3) - final[j].append((2 * b1 + b0) // 3) - final[j].append(a) + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) - return final + return ret def decode_dxt5(data): @@ -184,7 +168,7 @@ def decode_dxt5(data): """ blocks = len(data) // 16 # number of blocks in row - final = (bytearray(), bytearray(), bytearray(), bytearray()) + ret = (bytearray(), bytearray(), bytearray(), bytearray()) for block in range(blocks): idx = block * 16 @@ -202,15 +186,8 @@ def decode_dxt5(data): code, = struct.unpack("> 11) & 0x1f) << 3 - g0 = ((color0 >> 5) & 0x3f) << 2 - b0 = (color0 & 0x1f) << 3 - - # color 1, packed 5-6-5 - r1 = ((color1 >> 11) & 0x1f) << 3 - g1 = ((color1 >> 5) & 0x3f) << 2 - b1 = (color1 & 0x1f) << 3 + r0, g0, b0 = unpack_565(color0) + r1, g1, b1 = unpack_565(color1) for j in range(4): for i in range(4): @@ -230,38 +207,31 @@ def decode_dxt5(data): a = a1 elif a0 > a1: a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 else: - if alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 color_code = (code >> 2 * (4 * j + i)) & 0x03 if color_code == 0: - final[j].append(r0) - final[j].append(g0) - final[j].append(b0) - final[j].append(a) + r, g, b = r0, g0, b0 elif color_code == 1: - final[j].append(r1) - final[j].append(g1) - final[j].append(b1) - final[j].append(a) + r, g, b = r1, g1, b1 elif color_code == 2: - final[j].append((2 * r0 + r1) // 3) - final[j].append((2 * g0 + g1) // 3) - final[j].append((2 * b0 + b1) // 3) - final[j].append(a) + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 elif color_code == 3: - final[j].append((2 * r1 + r0) // 3) - final[j].append((2 * g1 + g0) // 3) - final[j].append((2 * b1 + b0) // 3) - final[j].append(a) + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) - return tuple(final) + return ret def getpalette(data): From 73d7fff16e06efe7d0cb235ac7283f165361e4b5 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Sun, 18 Feb 2018 04:56:13 +0200 Subject: [PATCH 0111/1393] blp: Separate BLP1 and BLP2 decoding more cleanly --- Tests/images/{ => blp}/blp2_dxt1.blp | Bin Tests/images/{ => blp}/blp2_dxt1.png | Bin src/PIL/BlpImagePlugin.py | 227 +++++++++++++-------------- 3 files changed, 110 insertions(+), 117 deletions(-) rename Tests/images/{ => blp}/blp2_dxt1.blp (100%) rename Tests/images/{ => blp}/blp2_dxt1.png (100%) diff --git a/Tests/images/blp2_dxt1.blp b/Tests/images/blp/blp2_dxt1.blp similarity index 100% rename from Tests/images/blp2_dxt1.blp rename to Tests/images/blp/blp2_dxt1.blp diff --git a/Tests/images/blp2_dxt1.png b/Tests/images/blp/blp2_dxt1.png similarity index 100% rename from Tests/images/blp2_dxt1.png rename to Tests/images/blp/blp2_dxt1.png diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index fbddb6cdcb6..d3675a67568 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -234,20 +234,6 @@ def decode_dxt5(data): return ret -def getpalette(data): - """ - Helper to transform a BytesIO object into a palette - """ - palette = [] - string = BytesIO(data) - while True: - try: - palette.append(struct.unpack("<4B", string.read(4))) - except struct.error: - break - return palette - - class BLPFormatError(NotImplementedError): pass @@ -259,144 +245,151 @@ class BlpImageFile(ImageFile.ImageFile): format = "BLP" format_description = "Blizzard Mipmap Format" - def _decode_blp1(self): - header = BytesIO(self.fp.read(28 + 16 * 4 + 16 * 4)) + def _open(self): + self.tile = [] + self.magic = self.fp.read(4) + self._read_blp_header() + + if self.magic == b"BLP1": + self._open_blp1() + elif self.magic == b"BLP2": + self._open_blp2() + else: + raise BLPFormatError("Bad BLP magic %r" % (self.magic)) - magic, compression = struct.unpack("<4si", header.read(8)) - encoding, alpha_depth, alpha_encoding, has_mips = struct.unpack( - "<4b", header.read(4) - ) - self.size = struct.unpack(" Date: Sun, 18 Feb 2018 06:24:39 +0200 Subject: [PATCH 0112/1393] blp: Add more test images --- Tests/images/blp/blp1_alpha4.blp | Bin 0 -> 12102 bytes Tests/images/blp/blp1_alpha4.png | Bin 0 -> 2902 bytes Tests/images/blp/blp1_alpha5.blp | Bin 0 -> 175942 bytes Tests/images/blp/blp1_alpha5.png | Bin 0 -> 36686 bytes Tests/images/blp/blp1_jpeg.blp | Bin 0 -> 9499 bytes Tests/images/blp/blp2_dxt1a.blp | Bin 0 -> 1356 bytes Tests/images/blp/blp2_dxt1a.png | Bin 0 -> 275 bytes Tests/images/blp/blp2_dxt3.blp | Bin 0 -> 88580 bytes Tests/images/blp/blp2_dxt3.png | Bin 0 -> 37282 bytes Tests/images/blp/blp2_dxt5.blp | Bin 0 -> 350724 bytes Tests/images/blp/blp2_dxt5.png | Bin 0 -> 302340 bytes Tests/images/blp/blp2_raw.blp | Bin 0 -> 88555 bytes Tests/images/blp/blp2_raw.png | Bin 0 -> 18056 bytes Tests/test_file_blp.py | 36 ++++++++++++++++++++++++++++--- 14 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 Tests/images/blp/blp1_alpha4.blp create mode 100644 Tests/images/blp/blp1_alpha4.png create mode 100644 Tests/images/blp/blp1_alpha5.blp create mode 100644 Tests/images/blp/blp1_alpha5.png create mode 100644 Tests/images/blp/blp1_jpeg.blp create mode 100644 Tests/images/blp/blp2_dxt1a.blp create mode 100644 Tests/images/blp/blp2_dxt1a.png create mode 100644 Tests/images/blp/blp2_dxt3.blp create mode 100644 Tests/images/blp/blp2_dxt3.png create mode 100644 Tests/images/blp/blp2_dxt5.blp create mode 100644 Tests/images/blp/blp2_dxt5.png create mode 100644 Tests/images/blp/blp2_raw.blp create mode 100644 Tests/images/blp/blp2_raw.png diff --git a/Tests/images/blp/blp1_alpha4.blp b/Tests/images/blp/blp1_alpha4.blp new file mode 100644 index 0000000000000000000000000000000000000000..b63663a5da516a98eb7126554f08fbe2ac39e45f GIT binary patch literal 12102 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 literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp1_alpha4.png b/Tests/images/blp/blp1_alpha4.png new file mode 100644 index 0000000000000000000000000000000000000000..489f1616b4ca9ac7add8de885505e15e3d0abe6d GIT binary patch literal 2902 zcmV-c3#s&pP)000XeNklIs`(WW9p;(s4I1&-n zjdsclsNh1^cE%e3Hh3yzWUaT>(eR2Gue5|j5`SHeB3Z=6-tKg|yGtVuKyWIRvV-&1 zY29-|YzT|x8lde!Xs?Ad&IUaj<1Z%xyDqX4lGlyjxj!NK1C-T{qx|e3kao#PNV%3I zBqCDQdn!~K(banW_~@iF^>rDp2f!82csASL+nr5JutVQIhYbe(N_Z%<`Rk{EkeTSZB=UNujS9xv+Z4FaTTdU)&h&bTzb z_kCDb)uMiGj0X^ul?me`lBE#RMFo?RLvV)+RD}oL)wY5 zx1ufnhrB@U&G0XSg(eE#_H7u%b3jW|$_%DhM{Jbz^surdbbUWx z9?#Sv2`PZx$>icAC)5mewd}O!gxcU)Vr4>PKI93_Qj+9+ zdYesejmG2b-fS{0i^F2)!OrwnS;lgF^wgDwJuG$-$!1eE%574(p0vj&UwJb`E)ei? zQgFq$G;G@$V3g!(Zs8%(*7Lryf)fBF9snw0pTs08z*C;&(ZOtdHR@$v#5~GKUQUHb zN1ux3^2=jKY+0&lRRHL$v$o50IBU(Os`8y(z)rLAW%S%)D|fUl043b_UVs?%tD0zS zUz|E6mkA-<%QQ|(Q;Z^&k9Nl5@XmBn=1DTjcz)Hxoyj@M&!_SI=}+pgWT4zE!*|o&~@4mFFZ7}aE<|x2?4-q5K)Me zUc`#0FZ%R`0pK(qahB$ZAhf!O7-UzOr$=)D5m7v)EJcu-U9!-2?zV=&Ei2OeSKK(+C-WOi{u^AeHWQTR8*0rD5A{;>g;L)RYS5HpZJ^ zJP|bL&?htkV!?tiu6yx+(>POw#iF8abTvR}kz(C>-M;XQ^}5%_EB0T*94Vl42)(6k zvkopev+WYv7C_R7P_DJ63PR8(cn&b>BEgk}*On;3${yg2b=+;($^&pA)d@Wi&UyjJ z&8F?N2f(-mP}RP!d}AE|N5JYR8pwc<<$1s8|8IM)4X_#POpPRy1Y~f35MqWJfd&r? z5Z6GCU>m*Ac*HgjxVFZqyJUiafux&Rn^H=VYlEBhrBr|4%M^DV)hRz4C^_n0k z3|bCEan04Hh^t(#2-oYDw4JLrLuXtZ5dhPjOzUQKN>&THF=)E5KEqh-5=NMkjyW5) zorY~^pfjd7tJ!!0XeyJs75&C>61g712GhAX4UG;dA+A9;3YdEUgY#8y?$0m-mh)A& zay`OW(Vg3QW*0A0cKu34SnbCA%N%Sr_blBi@Cmh7P9VeTojbkq{y3YGvD$UbX@=dpFR7O zayHrBQE`0u*6k!81Mt1|y?0gU&d^p?H`X^9ALF)m^iKR$VKEt9TyGk0+^|Dyc-dw=@9xvVzp#kU{afAWM} zoIf|3*a1Kwk}LRz69mgFu{IFZRjWacDreiq_jh;q06hNU>G9L$$!BfUmHU%B`8bw5 z-J9(F{MSD}Jw1Pe002Ju{Ii3D;{Er&d*lp&Z@v9qrqt2X(|%!yjE2aEE8kk^G1MBH zqYc}P*M1_NtFr{xZ?l#4?p_$gZCaj`ef5KoQg150LGe&)iHo(;{XuaBuN1v&ktskokS*FiS>H5 zH@kJ~aR2=5*}wkV2Os?6-(UKY{Z;b=Km7Y2{>7jFneOdku^7DG)Ve6fgVzyNS5E+6 z7XTRD-n)OFP$q@^- zci0)dUe1eh3ZPoAyRO^Y-|sv9=;7~v`QeAZ_{~QzcO(5j_1cnraUv$=?C<{iZ@%-# ze{xkbF2(>lqx(*;)~j}->uUAz(eHls@S}F6UpgW1zx4XElnIZEJWIwSNkuWv21YJU z&Q|pbz^2o0C|7x-8{OzeH@eY{Zgis?{eS2`0Y&x)Ig}{1(EtDd07*qoM6N<$f*L5a AZ2$lO literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp1_alpha5.blp b/Tests/images/blp/blp1_alpha5.blp new file mode 100644 index 0000000000000000000000000000000000000000..3bf3002bbe35944e829087418450d65f5a4f2061 GIT binary patch literal 175942 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%0AL02E%s)Ok z%=}{*`I!G;{Du8kb#na0QXTEz#={?&f3dVV|5Em|DzHN4+J8#(uVKWq{Y9IwnZf4I z$Li1lUFp!pHpKQt)>r zle-w+`KNidn;u%NyC@;=pmt)%Td2l)&+Y=xX zNpj>7kGCQfz8jCz#*u=64~J94@vqJIaoQCQoX5FD_`@aWU3~3aI~?4E^Tq9iF_}2zn*TI#|3naOaLmK=?g2dyy=QggJ!81XL2?)g*W;m+~0sP6KRS4kR zDx9_M#C1IA>Y)#gbYHZ%Y{}yCJ1Q2#l`ksADb`CCl`L9ZvA7%&Wy_{jEL&2sY}vHN zrR8@ZW=X}8C5!G@TCupI{0@YdR^W^Q9xA~q4B{x&SA=%IE6ISEV9^+)P}EV^CEhQmXTq zEXRA`m*>9n%v*ijEt8n2esP#Dj6rClSXVs>I^f?T^82v>$7Y zZ;d_nSp2caS|58XhD!wKZ$)4u!rLEfO>DR0Dm7sz9&1Jn;uC1?=se==NzneI=u6Pk zAdC(rZnxMt77zUqx+iuGh(uO&5DA=hgaA62wl;jMpZ%BQO}OZ%NFPH06zFo$e|Zps zOLSNWpqm3d&dfsqLG+n87?6Es03W?4I>=n-`EBSyJw!@84+PATu&WJt`W<>*>7?PK zmu0t0rZ_GQ1Z_As4&5w8;DETGEg7_-3uY4fd3NXc<~p4mDW=0bwz4#_`g|M2<`9NFE`u^UHh9F3vr2C1Dm+0h36%+F4J zF#quQ4IJYkDX2h4?F6PW$RA*i0sUEi$e-2!&E@wD%P;GWVxr(VC_l_{fIqri=C8`) zH+=ocW{3W$pE#H#6<{tR`VTGt;p=Zsew@k1`jf;lt+7^!RrN1xf7p2NJGA`_vM?co zfI+|@U=a8(h`^t7@4?762p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLEuk=0Cvv#CvGRU z>BZsZ4S(UK+q^d3GVhoA*BG=LC3nOGTEJ7UQ;CadENyB3Qbp zoW625m0}~DPHsD^VD>8SFA$W&(<>`+W4D&)r}HTFs>-T)^XJd4%Ks2{)3KM1{qWia zxNFPXvg&^A{DrqIoG(|n?a5o8)wr!ZS3#x1`+JA`q z^}v7>PJDUSGhhG2fv%Uj4m|I8sldTTK5ruZ$H0KPTR7^z-oEetroF%YH_zK%+P4SO z<^D?MymKFT;hBNX{?38tZ9g42TO*OGIh7~n$32$=1J651m;5SS%U=)qvitRX!VA+y zevbZ<{`#v24<5w5gkS#ZSHJuv^f&IUMc_}<%NQvJ0fWGQMFj8^hd4eyLf6>XxNI4` z(DAV%47K{F2*XBo?H6k0c_jSsIjTrOp&BGHf)+*aSe!UM6^B13=l-w+fB3^6e*b&_ z_R>o~eg64>{qc`~HGoG$KJmg!`w#td(pyql_2U6dGVXifl_S5A>*^m5U@ZI3gBSiT84AO6!%e)7}*`zmH50|O`X`{w`p^-;$C@`C>d9#7q` literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp1_alpha5.png b/Tests/images/blp/blp1_alpha5.png new file mode 100644 index 0000000000000000000000000000000000000000..1a39e42fa39579409288a9a828291fc6292f1d38 GIT binary patch literal 36686 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 J@l}V2zX7@66CMBn literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp1_jpeg.blp b/Tests/images/blp/blp1_jpeg.blp new file mode 100644 index 0000000000000000000000000000000000000000..bdf7146ed41a3481dea3a8d78973c1cdeb449bd2 GIT binary patch literal 9499 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 literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp2_dxt1a.blp b/Tests/images/blp/blp2_dxt1a.blp new file mode 100644 index 0000000000000000000000000000000000000000..5bedc27d65650459d63e07fb50fc688bf3e836c8 GIT binary patch literal 1356 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 literal 0 HcmV?d00001 diff --git a/Tests/images/blp/blp2_dxt5.blp b/Tests/images/blp/blp2_dxt5.blp new file mode 100644 index 0000000000000000000000000000000000000000..241d311f036532601daa1e90f281f47c3788117d GIT binary patch literal 350724 zcmeFak6Y8{xj!Dmg-apDCBd$C(r$4 z=eoZC!SNc`_S*gYe(vY~_1y0#`CGRAU{`1>D_{lD11|NZyBEAYQ7@V_hYKUd(t z?_|9iyZ>J?SN|`pQ%BPHvAH5vGI72bF6#IB#XN#V?_L__hwp|7e)`=nhSvtdi}9GV zc&&wE#$}7OAf9*q!m6KTDhWNScaw%=i&hal+moo`%$7+APClHhvPmR}$2Fk_4nRV8 zY9<;uG076amIw3%f?X_Lln4m^LVr+MR(_5lIIWGZ6o>ckCb*&RF(qS2$szd8n+q0~ z$G@K7N3Yy@Gbfw7is1EE-tq-+`EmSrM>~v7A;v-I9}V%`erV{Z;f^irCU5W-$$=J?%O%Z=Meg%S6=X?G7elX7FSOQ zT!emg)NQG3YKjoNt#6BNZ9q~+@X4XajDoZGkUt*wru8w4VKJe<JErGHiFBq1bnRwgX1s1QtBRw+{W<*e3x}i4b|18{O@%o zO3stjNZ;C_RB}CTobO-yws!Cq7QLkWo4z-?#BTR>f&;!ExS7}>@>BU0wO1k$jRO7WIV85h&Y9a9S6fFW(~0 zuXEsvCEew868aCl;y#|sh5WJ4cXEKa=g0NB>gyc1CK*J2WU*ww0r5ve^}1-~u3e

HKLz9G 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

+iw=*zaGYP`1I>vRiBMg=b9fo0ewr#UBl#I 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%0D>b^r&(5jl`q-UyO}C3Ngadd>ezXSY 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 s!K>s(~aY*O_01}GQV!~=3*_U0XnH!w*?6|;U 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index febba73c2a0..f8528427e16 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -4,10 +4,40 @@ class TestFileBlp(PillowTestCase): + def test_load_blp1_alpha4(self): + im = Image.open("Tests/images/blp/blp1_alpha4.blp") + target = Image.open("Tests/images/blp/blp1_alpha4.png") + self.assert_image_equal(im, target) + + def test_load_blp1_alpha5(self): + im = Image.open("Tests/images/blp/blp1_alpha5.blp") + target = Image.open("Tests/images/blp/blp1_alpha5.png") + self.assert_image_equal(im, target) + + def test_load_blp2_raw(self): + im = Image.open("Tests/images/blp/blp2_raw.blp") + target = Image.open("Tests/images/blp/blp2_raw.png") + self.assert_image_equal(im, target) + def test_load_blp2_dxt1(self): - im = Image.open("Tests/images/blp2_dxt1.blp") - target = Image.open("Tests/images/blp2_dxt1.png") - self.assert_image_similar(im, target.convert("RGBA"), 15) + im = Image.open("Tests/images/blp/blp2_dxt1.blp") + target = Image.open("Tests/images/blp/blp2_dxt1.png") + self.assert_image_equal(im, target) + + def test_load_blp2_dxt1a(self): + im = Image.open("Tests/images/blp/blp2_dxt1a.blp") + target = Image.open("Tests/images/blp/blp2_dxt1a.png") + self.assert_image_equal(im, target) + + def test_load_blp2_dxt3(self): + im = Image.open("Tests/images/blp/blp2_dxt3.blp") + target = Image.open("Tests/images/blp/blp2_dxt3.png") + self.assert_image_equal(im, target) + + def test_load_blp2_dxt5(self): + im = Image.open("Tests/images/blp/blp2_dxt5.blp") + target = Image.open("Tests/images/blp/blp2_dxt5.png") + self.assert_image_equal(im, target) if __name__ == "__main__": From d2c73c4882d22c122617f1c7cea6381888dcb1a3 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Sun, 4 Mar 2018 10:02:54 +0200 Subject: [PATCH 0113/1393] tox: Add pytest to test deps --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 67ce46bff6e..e6a439112a7 100644 --- a/tox.ini +++ b/tox.ini @@ -12,3 +12,4 @@ commands = {envpython} setup.py build_ext --inplace {envpython} selftest.py {envpython} -m pytest -qq +deps = pytest From 31409bc83db3a68693dd43b0599b3781c06cc817 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Sun, 4 Mar 2018 10:03:57 +0200 Subject: [PATCH 0114/1393] tox: Allow passing arguments from tox to pytest --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index e6a439112a7..fdfc5ea5620 100644 --- a/tox.ini +++ b/tox.ini @@ -11,5 +11,5 @@ commands = {envpython} setup.py clean {envpython} setup.py build_ext --inplace {envpython} selftest.py - {envpython} -m pytest -qq + {envpython} -m pytest -qq {posargs} deps = pytest From 3a77758d9addcaec5111cf6a2d8b614ffb89f81f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sun, 4 Mar 2018 20:23:13 +0000 Subject: [PATCH 0115/1393] Convert BlpImagePlugin to use Pydecoder framework --- src/PIL/BlpImagePlugin.py | 104 ++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 32 deletions(-) diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index d3675a67568..ec358db3bc7 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -246,26 +246,21 @@ class BlpImageFile(ImageFile.ImageFile): format_description = "Blizzard Mipmap Format" def _open(self): - self.tile = [] self.magic = self.fp.read(4) self._read_blp_header() if self.magic == b"BLP1": - self._open_blp1() + decoder = "BLP1" + self.mode = "RGB" elif self.magic == b"BLP2": - self._open_blp2() + decoder = "BLP2" + self.mode = "RGBA" if self._blp_alpha_depth else "RGB" else: raise BLPFormatError("Bad BLP magic %r" % (self.magic)) - def _read_palette(self): - ret = [] - for i in range(256): - try: - b, g, r, a = struct.unpack("<4B", self.fp.read(4)) - except struct.error: - break - ret.append((b, g, r, a)) - return ret + self.tile = [ + (decoder, (0, 0) + self.size, 0, (self.mode, 0, 1)) + ] def _read_blp_header(self): self._blp_compression, = struct.unpack(" Date: Mon, 5 Mar 2018 21:05:56 -0800 Subject: [PATCH 0116/1393] Move jpeg-specific eof-processing to jpeg plugin --- src/PIL/ImageFile.py | 2 +- src/PIL/JpegImagePlugin.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 7dbea67f376..39ad1f09319 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -221,7 +221,7 @@ def load(self): if not s: # truncated jpeg if LOAD_TRUNCATED_IMAGES: - s = b"\xFF\xD9" # Pretend file is finished adding EOI marker + break else: self.tile = [] raise IOError("image file is truncated " diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 9a190fb4ab4..6a18fff1914 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -353,6 +353,21 @@ def _open(self): else: raise SyntaxError("no marker found") + def load_read(self, read_bytes): + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES: + # Premature EOF. + # Pretend file is finished adding EOI marker + return b"\xFF\xD9" + + return s + def draft(self, mode, size): if len(self.tile) != 1: From 5269bbc268da758998acb7ba8604ca02eef2b7a0 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Wed, 7 Mar 2018 21:31:51 -0800 Subject: [PATCH 0117/1393] Add truncated jpeg tests --- Tests/images/truncated_jpeg.jpg | Bin 0 -> 6698 bytes Tests/test_file_jpeg.py | 16 ++++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 Tests/images/truncated_jpeg.jpg diff --git a/Tests/images/truncated_jpeg.jpg b/Tests/images/truncated_jpeg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4fec450df95ab99ae051c23d0fc51362c7cef17 GIT binary patch literal 6698 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 Date: Sat, 10 Mar 2018 14:48:01 +1100 Subject: [PATCH 0118/1393] Fixed typos [ci skip] --- src/_imagingmorph.c | 2 +- src/_webp.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index 2b5e7bc5d4d..73979f63587 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -126,7 +126,7 @@ apply(PyObject *self, PyObject* args) } /* Match a morphologic LUT to a binary image and return a list - of the coordinates of all all matching pixels. + of the coordinates of all matching pixels. Expected parameters: diff --git a/src/_webp.c b/src/_webp.c index f82feb46a4a..f23d950f771 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -13,8 +13,8 @@ /* * Check the versions from mux.h and demux.h, to ensure the WebPAnimEncoder and * WebPAnimDecoder APIs are present (initial support was added in 0.5.0). The - * very early versions added had some significant differences, so we require - * later versions, before enabling animation support. + * very early versions had some significant differences, so we require later + * versions, before enabling animation support. */ #if WEBP_MUX_ABI_VERSION >= 0x0104 && WEBP_DEMUX_ABI_VERSION >= 0x0105 #define HAVE_WEBPANIM From 968a6a7ac0f4d1c71e0c0def826c1185ff7f0073 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Mar 2018 00:05:46 +1100 Subject: [PATCH 0119/1393] Updated libimagequant to 2.11.10 --- depends/install_imagequant.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_imagequant.sh b/depends/install_imagequant.sh index d327d0dba8f..ce5f66d8df4 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.11.9 +archive=libimagequant-2.11.10 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz From aef98ef1022e45ce47e5e9cbc73e649b762f6809 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 10 Mar 2018 19:22:29 +0200 Subject: [PATCH 0120/1393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5d2f4e7a64a..0dbdffd8e82 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -35,7 +35,7 @@ Changelog (Pillow) - Test: Changed assert statements to unittest calls #2961 [radarhere] -- Depends: Updated libimagequant to 2.11.9, raqm to 0.5.0, freetype to 2.9 #2997, #3017, #2957 +- Depends: Update libimagequant to 2.11.10, raqm to 0.5.0, freetype to 2.9 #3036, #3017, #2957 [radarhere] - Remove _imaging.crc32 in favor of builtin Python crc32 implementation #2935 From de80b8f36bb5d05609153bbfb62cfd0da151c6ec Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 Feb 2018 05:53:31 +1100 Subject: [PATCH 0121/1393] Fixed efficient saving --- src/PIL/IcnsImagePlugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 6f9686aa513..651582e8128 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -323,6 +323,7 @@ def _save(im, fp, filename): im_scaled = im.resize((w*2, w*2), Image.LANCZOS) im_scaled.save(os.path.join(iconset, prefix+'@2x.png')) + last_w = w*2 last_im = im_scaled # iconutil -c icns -o {} {} From 6af53a73039202721237f8ef5c77135827b65c57 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Mar 2018 22:14:49 +1100 Subject: [PATCH 0122/1393] Improved efficient saving by copying the saved image, instead of saving the same image twice --- src/PIL/IcnsImagePlugin.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 651582e8128..1dce3fe4bf2 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -311,20 +311,18 @@ def _save(im, fp, filename): # create the temporary set of pngs iconset = tempfile.mkdtemp('.iconset') last_w = None - last_im = None for w in [16, 32, 128, 256, 512]: prefix = 'icon_{}x{}'.format(w, w) + first_path = os.path.join(iconset, prefix+'.png') if last_w == w: - im_scaled = last_im + shutil.copyfile(second_path, first_path) else: - im_scaled = im.resize((w, w), Image.LANCZOS) - im_scaled.save(os.path.join(iconset, prefix+'.png')) + im.resize((w, w), Image.LANCZOS).save(first_path) - im_scaled = im.resize((w*2, w*2), Image.LANCZOS) - im_scaled.save(os.path.join(iconset, prefix+'@2x.png')) + second_path = os.path.join(iconset, prefix+'@2x.png') + im.resize((w*2, w*2), Image.LANCZOS).save(second_path) last_w = w*2 - last_im = im_scaled # iconutil -c icns -o {} {} from subprocess import Popen, PIPE, CalledProcessError From ef546cd303285cb96313f13d1ae2da7c3e42eefd Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Mon, 12 Mar 2018 09:48:13 +0200 Subject: [PATCH 0123/1393] blp: Remove images with unclear licenses --- Tests/images/blp/blp1_alpha4.blp | Bin 12102 -> 0 bytes Tests/images/blp/blp1_alpha4.png | Bin 2902 -> 0 bytes Tests/images/blp/blp1_alpha5.blp | Bin 175942 -> 0 bytes Tests/images/blp/blp1_alpha5.png | Bin 36686 -> 0 bytes Tests/images/blp/blp2_dxt3.blp | Bin 88580 -> 0 bytes Tests/images/blp/blp2_dxt3.png | Bin 37282 -> 0 bytes Tests/images/blp/blp2_dxt5.blp | Bin 350724 -> 0 bytes Tests/images/blp/blp2_dxt5.png | Bin 302340 -> 0 bytes Tests/test_file_blp.py | 20 -------------------- 9 files changed, 20 deletions(-) delete mode 100644 Tests/images/blp/blp1_alpha4.blp delete mode 100644 Tests/images/blp/blp1_alpha4.png delete mode 100644 Tests/images/blp/blp1_alpha5.blp delete mode 100644 Tests/images/blp/blp1_alpha5.png delete mode 100644 Tests/images/blp/blp2_dxt3.blp delete mode 100644 Tests/images/blp/blp2_dxt3.png delete mode 100644 Tests/images/blp/blp2_dxt5.blp delete mode 100644 Tests/images/blp/blp2_dxt5.png diff --git a/Tests/images/blp/blp1_alpha4.blp b/Tests/images/blp/blp1_alpha4.blp deleted file mode 100644 index b63663a5da516a98eb7126554f08fbe2ac39e45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12102 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 diff --git a/Tests/images/blp/blp1_alpha4.png b/Tests/images/blp/blp1_alpha4.png deleted file mode 100644 index 489f1616b4ca9ac7add8de885505e15e3d0abe6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2902 zcmV-c3#s&pP)000XeNklIs`(WW9p;(s4I1&-n zjdsclsNh1^cE%e3Hh3yzWUaT>(eR2Gue5|j5`SHeB3Z=6-tKg|yGtVuKyWIRvV-&1 zY29-|YzT|x8lde!Xs?Ad&IUaj<1Z%xyDqX4lGlyjxj!NK1C-T{qx|e3kao#PNV%3I zBqCDQdn!~K(banW_~@iF^>rDp2f!82csASL+nr5JutVQIhYbe(N_Z%<`Rk{EkeTSZB=UNujS9xv+Z4FaTTdU)&h&bTzb z_kCDb)uMiGj0X^ul?me`lBE#RMFo?RLvV)+RD}oL)wY5 zx1ufnhrB@U&G0XSg(eE#_H7u%b3jW|$_%DhM{Jbz^surdbbUWx z9?#Sv2`PZx$>icAC)5mewd}O!gxcU)Vr4>PKI93_Qj+9+ zdYesejmG2b-fS{0i^F2)!OrwnS;lgF^wgDwJuG$-$!1eE%574(p0vj&UwJb`E)ei? zQgFq$G;G@$V3g!(Zs8%(*7Lryf)fBF9snw0pTs08z*C;&(ZOtdHR@$v#5~GKUQUHb zN1ux3^2=jKY+0&lRRHL$v$o50IBU(Os`8y(z)rLAW%S%)D|fUl043b_UVs?%tD0zS zUz|E6mkA-<%QQ|(Q;Z^&k9Nl5@XmBn=1DTjcz)Hxoyj@M&!_SI=}+pgWT4zE!*|o&~@4mFFZ7}aE<|x2?4-q5K)Me zUc`#0FZ%R`0pK(qahB$ZAhf!O7-UzOr$=)D5m7v)EJcu-U9!-2?zV=&Ei2OeSKK(+C-WOi{u^AeHWQTR8*0rD5A{;>g;L)RYS5HpZJ^ zJP|bL&?htkV!?tiu6yx+(>POw#iF8abTvR}kz(C>-M;XQ^}5%_EB0T*94Vl42)(6k zvkopev+WYv7C_R7P_DJ63PR8(cn&b>BEgk}*On;3${yg2b=+;($^&pA)d@Wi&UyjJ z&8F?N2f(-mP}RP!d}AE|N5JYR8pwc<<$1s8|8IM)4X_#POpPRy1Y~f35MqWJfd&r? z5Z6GCU>m*Ac*HgjxVFZqyJUiafux&Rn^H=VYlEBhrBr|4%M^DV)hRz4C^_n0k z3|bCEan04Hh^t(#2-oYDw4JLrLuXtZ5dhPjOzUQKN>&THF=)E5KEqh-5=NMkjyW5) zorY~^pfjd7tJ!!0XeyJs75&C>61g712GhAX4UG;dA+A9;3YdEUgY#8y?$0m-mh)A& zay`OW(Vg3QW*0A0cKu34SnbCA%N%Sr_blBi@Cmh7P9VeTojbkq{y3YGvD$UbX@=dpFR7O zayHrBQE`0u*6k!81Mt1|y?0gU&d^p?H`X^9ALF)m^iKR$VKEt9TyGk0+^|Dyc-dw=@9xvVzp#kU{afAWM} zoIf|3*a1Kwk}LRz69mgFu{IFZRjWacDreiq_jh;q06hNU>G9L$$!BfUmHU%B`8bw5 z-J9(F{MSD}Jw1Pe002Ju{Ii3D;{Er&d*lp&Z@v9qrqt2X(|%!yjE2aEE8kk^G1MBH zqYc}P*M1_NtFr{xZ?l#4?p_$gZCaj`ef5KoQg150LGe&)iHo(;{XuaBuN1v&ktskokS*FiS>H5 zH@kJ~aR2=5*}wkV2Os?6-(UKY{Z;b=Km7Y2{>7jFneOdku^7DG)Ve6fgVzyNS5E+6 z7XTRD-n)OFP$q@^- zci0)dUe1eh3ZPoAyRO^Y-|sv9=;7~v`QeAZ_{~QzcO(5j_1cnraUv$=?C<{iZ@%-# ze{xkbF2(>lqx(*;)~j}->uUAz(eHls@S}F6UpgW1zx4XElnIZEJWIwSNkuWv21YJU z&Q|pbz^2o0C|7x-8{OzeH@eY{Zgis?{eS2`0Y&x)Ig}{1(EtDd07*qoM6N<$f*L5a AZ2$lO diff --git a/Tests/images/blp/blp1_alpha5.blp b/Tests/images/blp/blp1_alpha5.blp deleted file mode 100644 index 3bf3002bbe35944e829087418450d65f5a4f2061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175942 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%0AL02E%s)Ok z%=}{*`I!G;{Du8kb#na0QXTEz#={?&f3dVV|5Em|DzHN4+J8#(uVKWq{Y9IwnZf4I z$Li1lUFp!pHpKQt)>r zle-w+`KNidn;u%NyC@;=pmt)%Td2l)&+Y=xX zNpj>7kGCQfz8jCz#*u=64~J94@vqJIaoQCQoX5FD_`@aWU3~3aI~?4E^Tq9iF_}2zn*TI#|3naOaLmK=?g2dyy=QggJ!81XL2?)g*W;m+~0sP6KRS4kR zDx9_M#C1IA>Y)#gbYHZ%Y{}yCJ1Q2#l`ksADb`CCl`L9ZvA7%&Wy_{jEL&2sY}vHN zrR8@ZW=X}8C5!G@TCupI{0@YdR^W^Q9xA~q4B{x&SA=%IE6ISEV9^+)P}EV^CEhQmXTq zEXRA`m*>9n%v*ijEt8n2esP#Dj6rClSXVs>I^f?T^82v>$7Y zZ;d_nSp2caS|58XhD!wKZ$)4u!rLEfO>DR0Dm7sz9&1Jn;uC1?=se==NzneI=u6Pk zAdC(rZnxMt77zUqx+iuGh(uO&5DA=hgaA62wl;jMpZ%BQO}OZ%NFPH06zFo$e|Zps zOLSNWpqm3d&dfsqLG+n87?6Es03W?4I>=n-`EBSyJw!@84+PATu&WJt`W<>*>7?PK zmu0t0rZ_GQ1Z_As4&5w8;DETGEg7_-3uY4fd3NXc<~p4mDW=0bwz4#_`g|M2<`9NFE`u^UHh9F3vr2C1Dm+0h36%+F4J zF#quQ4IJYkDX2h4?F6PW$RA*i0sUEi$e-2!&E@wD%P;GWVxr(VC_l_{fIqri=C8`) zH+=ocW{3W$pE#H#6<{tR`VTGt;p=Zsew@k1`jf;lt+7^!RrN1xf7p2NJGA`_vM?co zfI+|@U=a8(h`^t7@4?762p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLEuk=0Cvv#CvGRU z>BZsZ4S(UK+q^d3GVhoA*BG=LC3nOGTEJ7UQ;CadENyB3Qbp zoW625m0}~DPHsD^VD>8SFA$W&(<>`+W4D&)r}HTFs>-T)^XJd4%Ks2{)3KM1{qWia zxNFPXvg&^A{DrqIoG(|n?a5o8)wr!ZS3#x1`+JA`q z^}v7>PJDUSGhhG2fv%Uj4m|I8sldTTK5ruZ$H0KPTR7^z-oEetroF%YH_zK%+P4SO z<^D?MymKFT;hBNX{?38tZ9g42TO*OGIh7~n$32$=1J651m;5SS%U=)qvitRX!VA+y zevbZ<{`#v24<5w5gkS#ZSHJuv^f&IUMc_}<%NQvJ0fWGQMFj8^hd4eyLf6>XxNI4` z(DAV%47K{F2*XBo?H6k0c_jSsIjTrOp&BGHf)+*aSe!UM6^B13=l-w+fB3^6e*b&_ z_R>o~eg64>{qc`~HGoG$KJmg!`w#td(pyql_2U6dGVXifl_S5A>*^m5U@ZI3gBSiT84AO6!%e)7}*`zmH50|O`X`{w`p^-;$C@`C>d9#7q` diff --git a/Tests/images/blp/blp1_alpha5.png b/Tests/images/blp/blp1_alpha5.png deleted file mode 100644 index 1a39e42fa39579409288a9a828291fc6292f1d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36686 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 J@l}V2zX7@66CMBn diff --git a/Tests/images/blp/blp2_dxt3.blp b/Tests/images/blp/blp2_dxt3.blp deleted file mode 100644 index 807073cf0756a43768b9810b2e8b87ea2c3d3335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88580 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 diff --git a/Tests/images/blp/blp2_dxt5.blp b/Tests/images/blp/blp2_dxt5.blp deleted file mode 100644 index 241d311f036532601daa1e90f281f47c3788117d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350724 zcmeFak6Y8{xj!Dmg-apDCBd$C(r$4 z=eoZC!SNc`_S*gYe(vY~_1y0#`CGRAU{`1>D_{lD11|NZyBEAYQ7@V_hYKUd(t z?_|9iyZ>J?SN|`pQ%BPHvAH5vGI72bF6#IB#XN#V?_L__hwp|7e)`=nhSvtdi}9GV zc&&wE#$}7OAf9*q!m6KTDhWNScaw%=i&hal+moo`%$7+APClHhvPmR}$2Fk_4nRV8 zY9<;uG076amIw3%f?X_Lln4m^LVr+MR(_5lIIWGZ6o>ckCb*&RF(qS2$szd8n+q0~ z$G@K7N3Yy@Gbfw7is1EE-tq-+`EmSrM>~v7A;v-I9}V%`erV{Z;f^irCU5W-$$=J?%O%Z=Meg%S6=X?G7elX7FSOQ zT!emg)NQG3YKjoNt#6BNZ9q~+@X4XajDoZGkUt*wru8w4VKJe<JErGHiFBq1bnRwgX1s1QtBRw+{W<*e3x}i4b|18{O@%o zO3stjNZ;C_RB}CTobO-yws!Cq7QLkWo4z-?#BTR>f&;!ExS7}>@>BU0wO1k$jRO7WIV85h&Y9a9S6fFW(~0 zuXEsvCEew868aCl;y#|sh5WJ4cXEKa=g0NB>gyc1CK*J2WU*ww0r5ve^}1-~u3e

HKLz9G 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

+iw=*zaGYP`1I>vRiBMg=b9fo0ewr#UBl#I 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%0D>b^r&(5jl`q-UyO}C3Ngadd>ezXSY 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 Date: Tue, 6 Feb 2018 18:39:28 +0200 Subject: [PATCH 0124/1393] Use named version attributes and simplify version checks --- src/PIL/EpsImagePlugin.py | 2 +- src/PIL/Image.py | 2 +- src/PIL/ImageShow.py | 2 +- src/PIL/ImageTk.py | 2 +- src/PIL/TiffImagePlugin.py | 2 +- src/PIL/_tkinter_finder.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 6013e2722bd..b5034877140 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -379,7 +379,7 @@ def close(self): base_fp = fp if fp != sys.stdout: fp = NoCloseStream(fp) - if sys.version_info[0] > 2: + if sys.version_info.major > 2: fp = io.TextIOWrapper(fp, encoding='latin-1') if eps: diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 0fc0b5e8741..e88356b3d45 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -584,7 +584,7 @@ def close(self): # object is gone. self.im = deferred_error(ValueError("Operation on closed image")) - if sys.version_info >= (3, 4, 0): + if sys.version_info.major >= 3: def __del__(self): if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') and self.fp and self._exclusive_fp): diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index fdd739920de..b50d6135884 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -18,7 +18,7 @@ import os import sys -if sys.version_info >= (3, 3): +if sys.version_info.major >= 3: from shlex import quote else: from pipes import quote diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index 78ba6d1cbfd..faf52d2b9c1 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -27,7 +27,7 @@ import sys -if sys.version_info[0] > 2: +if sys.version_info.major > 2: import tkinter else: import Tkinter as tkinter diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index ce6173453b0..f9039183e46 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -653,7 +653,7 @@ def load_string(self, data, legacy_api=True): @_register_writer(2) def write_string(self, value): # remerge of https://github.com/python-pillow/Pillow/pull/1416 - if sys.version_info[0] == 2: + if sys.version_info.major == 2: value = value.decode('ascii', 'replace') return b"" + value.encode('ascii', 'replace') + b"\0" diff --git a/src/PIL/_tkinter_finder.py b/src/PIL/_tkinter_finder.py index 21f0caa2fa3..987d9621182 100644 --- a/src/PIL/_tkinter_finder.py +++ b/src/PIL/_tkinter_finder.py @@ -2,7 +2,7 @@ """ import sys -if sys.version_info[0] > 2: +if sys.version_info.major > 2: from tkinter import _tkinter as tk else: from Tkinter import tkinter as tk From 0b2a77e8e4016249105733a7c3bf782b0ebadb4d Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 6 Feb 2018 22:03:50 +0200 Subject: [PATCH 0125/1393] Use named version attribute --- Tests/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index 8556ed76a42..92e059cae97 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -265,7 +265,7 @@ def _test_leak(self, core): # helpers -py3 = (sys.version_info >= (3, 0)) +py3 = sys.version_info.major >= 3 def fromstring(data): From 265a8b7d3e5ddca27eeee8cadb4e0359f3dc230e Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 12 Mar 2018 22:10:29 +0200 Subject: [PATCH 0126/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0dbdffd8e82..b313f7ea22f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Fix and improve efficient saving of ICNS on macOS #3004 + [radarhere] + - Build: Enable pip cache in AppVeyor build #3009 [thijstriemstra] From e901a5a3e1d15841424fc734ab5fd3dfbdcbf13d Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 13 Mar 2018 11:31:20 +0200 Subject: [PATCH 0127/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b313f7ea22f..a05cb583964 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Support appending to existing PDFs #2965 + [vashek] + - Fix and improve efficient saving of ICNS on macOS #3004 [radarhere] From c192c47b02c690eab1501c09347dc45a77915aae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Mar 2018 19:04:14 +1100 Subject: [PATCH 0128/1393] Fixed msys64 build --- winbuild/appveyor_install_msys2_deps.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/winbuild/appveyor_install_msys2_deps.sh b/winbuild/appveyor_install_msys2_deps.sh index b13dc9e98b0..fbab280b3c2 100644 --- a/winbuild/appveyor_install_msys2_deps.sh +++ b/winbuild/appveyor_install_msys2_deps.sh @@ -1,11 +1,12 @@ #!/bin/sh -pacman -S --noconfirm mingw32/mingw-w64-i686-python3 \ - mingw32/mingw-w64-i686-python3-pip \ +pacman -S --noconfirm mingw32/mingw-w64-i686-python3-pip \ mingw32/mingw-w64-i686-python3-setuptools \ mingw32/mingw-w64-i686-python2-pip \ mingw32/mingw-w64-i686-python2-setuptools \ mingw-w64-i686-libjpeg-turbo +C:/msys64/mingw32/bin/python3 -m pip install --upgrade pip + /mingw32/bin/pip install pytest pytest-cov olefile /mingw32/bin/pip3 install pytest pytest-cov olefile From 3e6db78f75cf9000c3728616464a95799900c55c Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 15 Mar 2018 15:25:51 +0200 Subject: [PATCH 0129/1393] Failing test for JPEG2000 parser feed --- Tests/test_file_jpeg2k.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 0766f5b07c9..810e21a9d74 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -176,6 +176,19 @@ def test_unbound_local(self): with self.assertRaises(IOError): Image.open('Tests/images/unbound_variable.jp2') + def test_parser_feed(self): + # Arrange + from PIL import ImageFile + with open('Tests/images/test-card-lossless.jp2', 'rb') as f: + data = f.read() + + # Act + p = ImageFile.Parser() + p.feed(data) + + # Assert + self.assertEqual(p.image.size, (640, 480)) + if __name__ == '__main__': unittest.main() From d61921455e7e9d384dd93a783b459146c6a76d61 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 15 Mar 2018 15:27:10 +0200 Subject: [PATCH 0130/1393] Prevent TypeError for JPEG2000 parser feed --- src/PIL/Jpeg2KImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 4619cc5231c..7ab183a4b3a 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -192,7 +192,7 @@ def _open(self): length = -1 self.tile = [('jpeg2k', (0, 0) + self.size, 0, - (self.codec, self.reduce, self.layers, fd, length, self.fp))] + (self.codec, self.reduce, self.layers, fd, length))] def load(self): if self.reduce: From aa05409016d75e40f8e4dc17f8567727fcba86ef Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 27 Feb 2018 12:30:25 +0200 Subject: [PATCH 0131/1393] Either appveyor.yml or .appveyor.yml is allowed, let's hide with other dotfiles --- appveyor.yml => .appveyor.yml | 0 MANIFEST.in | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename appveyor.yml => .appveyor.yml (100%) diff --git a/appveyor.yml b/.appveyor.yml similarity index 100% rename from appveyor.yml rename to .appveyor.yml diff --git a/MANIFEST.in b/MANIFEST.in index 7006e5be29f..cd65f46fcb2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -17,13 +17,13 @@ graft docs prune docs/_static # build/src control detritus +exclude .appveyor.yml exclude .coveragerc exclude .codecov.yml exclude .editorconfig exclude .landscape.yaml exclude .travis exclude .travis/* -exclude appveyor.yml exclude build_children.sh exclude tox.ini global-exclude .git* From 2123dd70fbf88c6cd9db9d24ccff57f313e75c14 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Mar 2018 19:38:07 +1100 Subject: [PATCH 0132/1393] Allow append_images to set .icns scaled images --- Tests/test_file_icns.py | 19 +++++++++++++++++-- src/PIL/IcnsImagePlugin.py | 8 ++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index d8508e57917..a347be41af0 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -22,8 +22,7 @@ def test_sanity(self): self.assertEqual(im.size, (1024, 1024)) self.assertEqual(im.format, "ICNS") - @unittest.skipIf(sys.platform != 'darwin', - "requires MacOS") + @unittest.skipIf(sys.platform != 'darwin', "requires MacOS") def test_save(self): im = Image.open(TEST_FILE) @@ -36,6 +35,22 @@ def test_save(self): self.assertEqual(reread.size, (1024, 1024)) self.assertEqual(reread.format, "ICNS") + @unittest.skipIf(sys.platform != 'darwin', "requires MacOS") + def test_save_append_images(self): + im = Image.open(TEST_FILE) + + temp_file = self.tempfile("temp.icns") + provided_im = Image.new('RGBA', (32, 32), (255, 0, 0, 0)) + im.save(temp_file, append_images=[provided_im]) + + reread = Image.open(temp_file) + self.assert_image_equal(reread, im) + + reread = Image.open(temp_file) + reread.size = (16, 16, 2) + reread.load() + self.assert_image_equal(reread, provided_im) + def test_sizes(self): # Check that we can load all of the sizes, and that the final pixel # dimensions are as expected diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 1dce3fe4bf2..b382a73e124 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -310,6 +310,8 @@ def _save(im, fp, filename): # create the temporary set of pngs iconset = tempfile.mkdtemp('.iconset') + provided_images = {im.width:im for im in + im.encoderinfo.get("append_images", [])} last_w = None for w in [16, 32, 128, 256, 512]: prefix = 'icon_{}x{}'.format(w, w) @@ -318,10 +320,12 @@ def _save(im, fp, filename): if last_w == w: shutil.copyfile(second_path, first_path) else: - im.resize((w, w), Image.LANCZOS).save(first_path) + im_w = provided_images.get(w, im.resize((w, w), Image.LANCZOS)) + im_w.save(first_path) second_path = os.path.join(iconset, prefix+'@2x.png') - im.resize((w*2, w*2), Image.LANCZOS).save(second_path) + im_w2 = provided_images.get(w*2, im.resize((w*2, w*2), Image.LANCZOS)) + im_w2.save(second_path) last_w = w*2 # iconutil -c icns -o {} {} From 4a781d0013c0c32042dcb3afba70c385b17473c8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Mar 2018 19:36:07 +1100 Subject: [PATCH 0133/1393] Replaced MacOS with macOS --- Tests/check_imaging_leaks.py | 2 +- Tests/check_j2k_leaks.py | 2 +- Tests/check_jpeg_leaks.py | 2 +- Tests/helper.py | 2 +- Tests/test_file_icns.py | 4 ++-- Tests/test_file_png.py | 2 +- Tests/test_font_leaks.py | 2 +- Tests/test_imagefont.py | 4 ++-- Tests/test_shell_injection.py | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index 00a0245e4b0..eb9426eee97 100755 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -9,7 +9,7 @@ max_iterations = 10000 -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestImagingLeaks(PillowTestCase): def _get_mem_usage(self): diff --git a/Tests/check_j2k_leaks.py b/Tests/check_j2k_leaks.py index 8e9c4ca20ef..5fafccbc042 100755 --- a/Tests/check_j2k_leaks.py +++ b/Tests/check_j2k_leaks.py @@ -11,7 +11,7 @@ test_file = "Tests/images/rgb_trns_ycbc.jp2" -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestJpegLeaks(PillowTestCase): def setUp(self): if "jpeg2k_encoder" not in codecs or "jpeg2k_decoder" not in codecs: diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index 7df2dfcc46d..065e9d81796 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -15,7 +15,7 @@ """ -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestJpegLeaks(PillowTestCase): """ diff --git a/Tests/helper.py b/Tests/helper.py index 8556ed76a42..7036ff898a8 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -227,7 +227,7 @@ def open_withImagemagick(self, f): raise IOError() -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class PillowLeakTestCase(PillowTestCase): # requires unix/osx iterations = 100 # count diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index a347be41af0..d8d6a128e75 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -22,7 +22,7 @@ def test_sanity(self): self.assertEqual(im.size, (1024, 1024)) self.assertEqual(im.format, "ICNS") - @unittest.skipIf(sys.platform != 'darwin', "requires MacOS") + @unittest.skipIf(sys.platform != 'darwin', "requires macOS") def test_save(self): im = Image.open(TEST_FILE) @@ -35,7 +35,7 @@ def test_save(self): self.assertEqual(reread.size, (1024, 1024)) self.assertEqual(reread.format, "ICNS") - @unittest.skipIf(sys.platform != 'darwin', "requires MacOS") + @unittest.skipIf(sys.platform != 'darwin', "requires macOS") def test_save_append_images(self): im = Image.open(TEST_FILE) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 8541c5f2474..8cf109e70ea 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -540,7 +540,7 @@ def test_getchunks(self): self.assertEqual(len(chunks), 3) -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestTruncatedPngPLeaks(PillowLeakTestCase): mem_limit = 2*1024 # max increase in K iterations = 100 # Leak is 56k/iteration, this will leak 5.6megs diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index a1c40e6a903..4de28a95a25 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -4,7 +4,7 @@ from PIL import Image, features, ImageDraw, ImageFont -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestTTypeFontLeak(PillowLeakTestCase): # fails at iteration 3 in master iterations = 10 diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index e120f8482b3..0ec49384e29 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -437,7 +437,7 @@ def loadable_font(filepath, size, index, encoding, *args, **kwargs): self.assertEqual(('FreeMono', 'Regular'), name) @unittest.skipIf(sys.platform.startswith('win32'), - "requires Unix or MacOS") + "requires Unix or macOS") def test_find_linux_font(self): # A lot of mocking here - this is more for hitting code and # catching syntax like errors @@ -471,7 +471,7 @@ def fake_walker(path): font_directory+'/Duplicate.ttf', 'Duplicate') @unittest.skipIf(sys.platform.startswith('win32'), - "requires Unix or MacOS") + "requires Unix or macOS") def test_find_macos_font(self): # Like the linux test, more cover hitting code rather than testing # correctness. diff --git a/Tests/test_shell_injection.py b/Tests/test_shell_injection.py index acfea3baecd..9e489f77cc5 100644 --- a/Tests/test_shell_injection.py +++ b/Tests/test_shell_injection.py @@ -18,7 +18,7 @@ ) -@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") +@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class TestShellInjection(PillowTestCase): def assert_save_filename_check(self, src_img, save_func): From 1328c537ad9246b294c8f0f57a247f1b3a363763 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 19 Mar 2018 11:28:32 +0200 Subject: [PATCH 0134/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a05cb583964..96a7870ae5b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Allow append_images to set .icns scaled images #3005 + [radarhere] + - Support appending to existing PDFs #2965 [vashek] From 18f21e8209b6f8ca1bdc07096a4773576a077fb8 Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 25 Jan 2018 22:54:54 +0200 Subject: [PATCH 0135/1393] Remove redundant travis_after_all stuff --- .travis.yml | 26 -------------------------- .travis/after_success.sh | 17 ----------------- MANIFEST.in | 1 - build_children.sh | 7 ------- 4 files changed, 51 deletions(-) delete mode 100755 build_children.sh diff --git a/.travis.yml b/.travis.yml index cc06084a50c..d3982651a62 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,29 +61,3 @@ script: after_success: - .travis/after_success.sh - -after_failure: - - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - python travis_after_all.py - export $(cat .to_export_back) - if [ "$BUILD_LEADER" = "YES" ]; then - if [ "$BUILD_AGGREGATE_STATUS" = "others_failed" ]; then - echo "All jobs failed" - else - echo "Some jobs failed" - fi - fi - fi - -after_script: - - | - if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS - fi - -env: - global: - # travis encrypt AUTH_TOKEN= - secure: "Vzm7aG1Qv0SDQcqiPzZMedNLn5ZmpL7IzF0DYnqcD+/l+zmKU22SnJBcX0uVXumo+r7eZfpsShpqfcdsZvMlvmQnwz+Y6AGKQru9tCKZbTMnuRjWKKXekC+tr8Xt9CKvRVtte5PyXW31paxUI3/e+fQGBwoFjEEC+6EpEOjeRfE=" diff --git a/.travis/after_success.sh b/.travis/after_success.sh index a18c095c959..c215f421997 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -30,20 +30,3 @@ if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then depends/diffcover-install.sh depends/diffcover-run.sh fi - -# after_all - -if [ "$TRAVIS_REPO_SLUG" = "python-pillow/Pillow" ] && [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - curl -Lo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py - python travis_after_all.py - export $(cat .to_export_back) - if [ "$BUILD_LEADER" = "YES" ]; then - if [ "$BUILD_AGGREGATE_STATUS" = "others_succeeded" ]; then - echo "All jobs succeeded! Triggering macOS build..." - # Trigger a macOS build at the pillow-wheels repo - ./build_children.sh - else - echo "Some jobs failed" - fi - fi -fi diff --git a/MANIFEST.in b/MANIFEST.in index cd65f46fcb2..40b2ef5d706 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -24,7 +24,6 @@ exclude .editorconfig exclude .landscape.yaml exclude .travis exclude .travis/* -exclude build_children.sh exclude tox.ini global-exclude .git* global-exclude *.pyc diff --git a/build_children.sh b/build_children.sh deleted file mode 100755 index c4ed4ebfa8e..00000000000 --- a/build_children.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Get last child project build number from branch named "latest" -BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/python-pillow/pillow-wheels/branches/latest' | grep -o '^{"branch":{"id":[0-9]*,' | grep -o '[0-9]' | tr -d '\n') - -# Restart last child project build -curl -X POST https://api.travis-ci.org/builds/$BUILD_NUM/restart --header "Authorization: token "$AUTH_TOKEN From 9386a414fcb9b53e2dedd23aa31b077a75dd7c9e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 21 Mar 2018 08:03:35 +0000 Subject: [PATCH 0136/1393] Update CHANGES.rst [ci-skip] --- CHANGES.rst | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index bb5965e5f30..b7d5486b331 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,27 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Docs: Move intro text below its header #3021 + [hugovk] + +- CI: Rename appveyor.yml as .appveyor.yml #2978 + [hugovk] + +- Fix TypeError for JPEG2000 parser feed #3042 + [hugovk] + +- Certain corrupted jpegs can result in no data read #3023 + [kkopachev] + +- Add support for BLP file format #3007 + [jleclanche] + +- Simplify version checks #2998 + [hugovk] + +- Fix "invalid escape sequence" warning on Python 3.6+ #2996 + [timgraham] + - Allow append_images to set .icns scaled images #3005 [radarhere] @@ -1198,7 +1219,7 @@ Changelog (Pillow) - Change function declaration to match Tcl_CmdProc type #1966 [homm] -- Integer overflow checks on all calls to \*alloc #1781 +- Integer overflow checks on all calls to *alloc #1781 [wiredfool] - Change equals method on Image so it short circuits #1967 From 08a8a25290d8ebed269cf047535fd45f491c4795 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 21 Mar 2018 21:11:39 +1100 Subject: [PATCH 0137/1393] Added documentation for ICNS append_images [ci skip] --- docs/handbook/image-file-formats.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index d265561de73..0815048ba29 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -110,7 +110,10 @@ 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 only supported for GIF, PDF, TIFF, and WebP. + 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. **duration** The display duration of each frame of the multiframe gif, in @@ -179,6 +182,15 @@ sets the following :py:attr:`~PIL.Image.Image.info` property: ask for ``(512, 512, 2)``, the final value of :py:attr:`~PIL.Image.Image.size` will be ``(1024, 1024)``). +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:: 5.1.0 + ICO ^^^ From 15f6bdf56a61972b31bba9dcdc1582ebc77c500f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 Mar 2018 08:46:06 +1100 Subject: [PATCH 0138/1393] Added Gitter references [ci skip] --- .github/CONTRIBUTING.md | 2 +- docs/_templates/sidebarhelp.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6c6e9b61222..8d0d7ff453e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -4,7 +4,7 @@ Bug fixes, feature additions, tests, documentation and more can be contributed v ## Bug fixes, feature additions, etc. -Please send a pull request to the master branch. Please include [documentation](https://pillow.readthedocs.io) and [tests](../Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are welcome too. Feel free to ask questions [via issues](https://github.com/python-pillow/Pillow/issues/new) or irc://irc.freenode.net#pil +Please send a pull request to the master branch. Please include [documentation](https://pillow.readthedocs.io) and [tests](../Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are welcome too. Feel free to ask questions [via issues](https://github.com/python-pillow/Pillow/issues/new), [Gitter](https://gitter.im/python-pillow/Pillow) or irc://irc.freenode.net#pil - Fork the Pillow repository. - Create a branch from master. diff --git a/docs/_templates/sidebarhelp.html b/docs/_templates/sidebarhelp.html index da3882e8d09..36b7c5e9599 100644 --- a/docs/_templates/sidebarhelp.html +++ b/docs/_templates/sidebarhelp.html @@ -1,4 +1,4 @@

Need help?

- You can get help via IRC at irc://irc.freenode.net#pil or Stack Overflow here and here. Please report issues on GitHub. + You can get help via IRC at irc://irc.freenode.net#pil, Gitter or Stack Overflow here and here. Please report issues on GitHub.

From f826dc37d1565a71b5ee916474afa4822457a968 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 25 Mar 2018 12:54:13 +0300 Subject: [PATCH 0139/1393] Fix incorrect image type checking in _imagingmorph module --- src/_imagingmorph.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index 73979f63587..b700f8482aa 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -64,12 +64,12 @@ apply(PyObject *self, PyObject* args) width = imgin->xsize; height = imgin->ysize; - if (imgin->type != IMAGING_TYPE_UINT8 && + if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } - if (imgout->type != IMAGING_TYPE_UINT8 && + if (imgout->type != IMAGING_TYPE_UINT8 || imgout->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; @@ -167,7 +167,7 @@ match(PyObject *self, PyObject* args) lut = PyBytes_AsString(py_lut); imgin = (Imaging) i0; - if (imgin->type != IMAGING_TYPE_UINT8 && + if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; From 853208c65f98de9d20b9bdc3d910f3664af0278f Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 25 Mar 2018 15:49:42 +0300 Subject: [PATCH 0140/1393] color 3D LUT, just start --- setup.py | 2 +- src/libImaging/ColorLUT.c | 106 ++++++++++++++++++++++++++++++++++++++ src/libImaging/Imaging.h | 2 + 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/libImaging/ColorLUT.c diff --git a/setup.py b/setup.py index 4a0ad86c529..e75a19bdf19 100755 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ _LIB_IMAGING = ( "Access", "AlphaComposite", "Resample", "Bands", "BcnDecode", "BitDecode", - "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crop", + "Blend", "Chops", "ColorLUT", "Convert", "ConvertYCbCr", "Copy", "Crop", "Dib", "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", "Histo", "JpegDecode", "JpegEncode", "Matrix", "ModeFilter", diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c new file mode 100644 index 00000000000..d7aa56121cc --- /dev/null +++ b/src/libImaging/ColorLUT.c @@ -0,0 +1,106 @@ +#include "Imaging.h" +#include + + +#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) + + +/* 8 bits for result. Table can overflow [0, 1.0] range, + so we need extra bits for overflow and negative values. */ +#define PRECISION_BITS (16 - 8 - 2) + + +static inline void +interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) +{ + out[0] = a[0] * (1-shift) + b[0] * shift; + out[1] = a[1] * (1-shift) + b[1] * shift; + out[2] = a[2] * (1-shift) + b[2] * shift; +} + +static inline void +interpolate4(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) +{ + out[0] = a[0] * (1-shift) + b[0] * shift; + out[1] = a[1] * (1-shift) + b[1] * shift; + out[2] = a[2] * (1-shift) + b[2] * shift; + out[3] = a[3] * (1-shift) + b[3] * shift; +} + +static inline int +table3D_index3(int index1D, int index2D, int index3D, + int size1D, int size1D_2D) +{ + return (index1D + index2D * size1D + index3D * size1D_2D) * 3; +} + +static inline int +table3D_index4(int index1D, int index2D, int index3D, + int size1D, int size1D_2D) +{ + return (index1D + index2D * size1D + index3D * size1D_2D) * 4; +} + +/* + Transforms colors of imIn using provided 3D look-up table + and puts the result in imOut. Returns imOut on sucess or 0 on error. + + imOut, imIn — images, should be the same size and may be the same image. + Should have 3 or 4 channels. + table_channels — number of channels in the look-up table, 3 or 4. + Should be less or equal than number of channels in imOut image; + size1D, size_2D and size3D — dimensions of provided table; + table — flatten table, + array with table_channels × size1D × size2D × size3D elements, + where channels are changed first, then 1D, then​ 2D, then 3D. + Each element is signed 16-bit int where 0 is lowest output value + 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) +{ + int size1D_2D = size1D * size2D; + float scale1D = (size1D - 1) / 255.0; + float scale2D = (size2D - 1) / 255.0; + float scale3D = (size3D - 1) / 255.0; + int x, y; + + if (table_channels < 3 || table_channels > 4) { + PyErr_SetString(PyExc_ValueError, "table_channels could be 3 or 4"); + return NULL; + } + + 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(); + } + + for (y = 0; y < imOut->ysize; y++) { + UINT8 *rowIn = (UINT8 *)imIn->image[y]; + UINT8 *rowOut = (UINT8 *)imIn->image[y]; + for (x = 0; x < imOut->xsize; x++) { + float scaled1D = rowIn[x*4 + 0] * scale1D; + float scaled2D = rowIn[x*4 + 1] * scale2D; + float scaled3D = rowIn[x*4 + 2] * scale3D; + int index1D = (int) scaled1D; + int index2D = (int) scaled2D; + int index3D = (int) scaled3D; + float shift1D = scaled1D - index1D; + float shift2D = scaled2D - index2D; + float shift3D = scaled3D - index3D; + + } + } + + return imOut; +} diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index aa59fe18c39..ece082a18ea 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -319,6 +319,8 @@ extern Imaging ImagingTransform( 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); From d2d546d4ae4d700b3ccf9a247d4adf2c9678b60a Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 11:26:51 +0300 Subject: [PATCH 0141/1393] Python to C bridge --- src/_imaging.c | 122 +++++++++++++++++++++++++++++++++++++- src/libImaging/ColorLUT.c | 30 ++++++---- 2 files changed, 139 insertions(+), 13 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 11f5f6ea487..d1262f5b8d2 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -696,9 +696,123 @@ _blend(ImagingObject* self, PyObject* args) } /* -------------------------------------------------------------------- */ -/* METHODS */ +/* METHODS */ /* -------------------------------------------------------------------- */ + +static INT16* +_prepare_lut_table(PyObject* table, Py_ssize_t table_size) +{ + int i; + FLOAT32* table_data; + INT16* prepared; + + /* NOTE: This value should be the same as in ColorLUT.c */ + #define PRECISION_BITS (16 - 8 - 2) + + table_data = (FLOAT32*) getlist(table, &table_size, + "The table should have table_channels * " + "size1D * size2D * size3D float items.", TYPE_FLOAT32); + if ( ! table_data) { + return NULL; + } + + /* malloc check ok, max is 2 * 4 * 65**3 = 2197000 */ + prepared = (INT16*) malloc(sizeof(INT16) * table_size); + if ( ! prepared) { + free(table_data); + return (INT16*) PyErr_NoMemory(); + } + + for (i = 0; i < table_size; i++) { + /* Max value for INT16 */ + if (table_data[i] >= (0x7fff - 0.5) / (255 << PRECISION_BITS)) { + prepared[i] = 0x7fff; + continue; + } + /* Min value for INT16 */ + if (table_data[i] <= (-0x8000 + 0.5) / (255 << PRECISION_BITS)) { + prepared[i] = -0x8000; + continue; + } + if (table_data[i] < 0) { + prepared[i] = table_data[i] * (255 << PRECISION_BITS) - 0.5; + } else { + prepared[i] = table_data[i] * (255 << PRECISION_BITS) + 0.5; + } + } + + #undef PRECISION_BITS + free(table_data); + return prepared; +} + + +static PyObject* +_color_lut_3d(ImagingObject* self, PyObject* args) +{ + char* mode; + int filter; + int table_channels; + int size1D, size2D, size3D; + PyObject* table; + + INT16* prepared_table; + Imaging imOut; + + 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."); + return NULL; + } + + if (1 > table_channels || table_channels > 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"); + return NULL; + } + + 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) { + free(prepared_table); + return NULL; + } + + if ( ! ImagingColorLUT3D_linear(imOut, self->image, + table_channels, size1D, size2D, size3D, + prepared_table)) { + free(prepared_table); + ImagingDelete(imOut); + return NULL; + } + + free(prepared_table); + + return PyImagingNew(imOut); +} + static PyObject* _convert(ImagingObject* self, PyObject* args) { @@ -720,7 +834,10 @@ _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* @@ -2982,6 +3099,7 @@ static struct PyMethodDef methods[] = { {"pixel_access", (PyCFunction)pixel_access_new, 1}, /* 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}, diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index d7aa56121cc..6288625a1a5 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -6,25 +6,26 @@ /* 8 bits for result. Table can overflow [0, 1.0] range, - so we need extra bits for overflow and negative values. */ + 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) static inline void interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) { - out[0] = a[0] * (1-shift) + b[0] * shift; - out[1] = a[1] * (1-shift) + b[1] * shift; - out[2] = a[2] * (1-shift) + b[2] * shift; + out[0] = a[0] * (1-shift) + b[0] * shift + 0.5; + out[1] = a[1] * (1-shift) + b[1] * shift + 0.5; + out[2] = a[2] * (1-shift) + b[2] * shift + 0.5; } static inline void interpolate4(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) { - out[0] = a[0] * (1-shift) + b[0] * shift; - out[1] = a[1] * (1-shift) + b[1] * shift; - out[2] = a[2] * (1-shift) + b[2] * shift; - out[3] = a[3] * (1-shift) + b[3] * shift; + out[0] = a[0] * (1-shift) + b[0] * shift + 0.5; + out[1] = a[1] * (1-shift) + b[1] * shift + 0.5; + out[2] = a[2] * (1-shift) + b[2] * shift + 0.5; + out[3] = a[3] * (1-shift) + b[3] * shift + 0.5; } static inline int @@ -61,10 +62,17 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, int size1D, int size2D, int size3D, INT16* table) { + /* The fractions are a way to avoid overflow. + For every pixel, we interpolate 8 elements from the table: + current and +1 for every dimension and they combinations. + If we hit the upper cells from the table, + +1 cells will be outside of the table. + With this compensation we never hit the upper cells + but this also doesn't introduce any noticable difference. */ + float scale1D = (size1D - 1) / (255.0002); + float scale2D = (size2D - 1) / (255.0002); + float scale3D = (size3D - 1) / (255.0002); int size1D_2D = size1D * size2D; - float scale1D = (size1D - 1) / 255.0; - float scale2D = (size2D - 1) / 255.0; - float scale3D = (size3D - 1) / 255.0; int x, y; if (table_channels < 3 || table_channels > 4) { From 696ae12b3776dde4b272800b999fca4f7ff77ee5 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 14:14:52 +0300 Subject: [PATCH 0142/1393] 3D to 3D implementation --- src/_imaging.c | 1 + src/libImaging/ColorLUT.c | 150 +++++++++++++++++++++++++++++++------- 2 files changed, 126 insertions(+), 25 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index d1262f5b8d2..f023a6328db 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -740,6 +740,7 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } else { prepared[i] = table_data[i] * (255 << PRECISION_BITS) + 0.5; } + // printf("%f, %d ", table_data[i], prepared[i]); } #undef PRECISION_BITS diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 6288625a1a5..dab9eb62732 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -2,30 +2,104 @@ #include -#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) - - /* 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)) + + +UINT8 _lookups2[1024] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, +}; + +UINT8 *lookups2 = &_lookups2[512]; + + +static inline UINT8 clip8(int in) +{ + return lookups2[(in + PRECISION_ROUNDING) >> PRECISION_BITS]; +} static inline void -interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) +interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) { - out[0] = a[0] * (1-shift) + b[0] * shift + 0.5; - out[1] = a[1] * (1-shift) + b[1] * shift + 0.5; - out[2] = a[2] * (1-shift) + b[2] * shift + 0.5; + out[0] = (a[0] * (0x1000-shift) + b[0] * shift + (1<<11)) >> 12; + out[1] = (a[1] * (0x1000-shift) + b[1] * shift + (1<<11)) >> 12; + out[2] = (a[2] * (0x1000-shift) + b[2] * shift + (1<<11)) >> 12; } static inline void -interpolate4(INT16 out[3], const INT16 a[3], const INT16 b[3], float shift) +interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) { - out[0] = a[0] * (1-shift) + b[0] * shift + 0.5; - out[1] = a[1] * (1-shift) + b[1] * shift + 0.5; - out[2] = a[2] * (1-shift) + b[2] * shift + 0.5; - out[3] = a[3] * (1-shift) + b[3] * shift + 0.5; + out[0] = (a[0] * (0x1000-shift) + b[0] * shift + (1<<11)) >> 12; + out[1] = (a[1] * (0x1000-shift) + b[1] * shift + (1<<11)) >> 12; + out[2] = (a[2] * (0x1000-shift) + b[2] * shift + (1<<11)) >> 12; + out[3] = (a[3] * (0x1000-shift) + b[3] * shift + (1<<11)) >> 12; } static inline int @@ -94,19 +168,45 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, } for (y = 0; y < imOut->ysize; y++) { - UINT8 *rowIn = (UINT8 *)imIn->image[y]; - UINT8 *rowOut = (UINT8 *)imIn->image[y]; - for (x = 0; x < imOut->xsize; x++) { - float scaled1D = rowIn[x*4 + 0] * scale1D; - float scaled2D = rowIn[x*4 + 1] * scale2D; - float scaled3D = rowIn[x*4 + 2] * scale3D; - int index1D = (int) scaled1D; - int index2D = (int) scaled2D; - int index3D = (int) scaled3D; - float shift1D = scaled1D - index1D; - float shift2D = scaled2D - index2D; - float shift3D = scaled3D - index3D; - + UINT8* rowIn = (UINT8 *)imIn->image[y]; + UINT8* rowOut = (UINT8 *)imOut->image[y]; + if (table_channels == 3) { + for (x = 0; x < imOut->xsize; x++) { + float scaled1D = rowIn[x*4 + 0] * scale1D; + float scaled2D = rowIn[x*4 + 1] * scale2D; + float scaled3D = rowIn[x*4 + 2] * scale3D; + int index1D = (int) scaled1D; + int index2D = (int) scaled2D; + int index3D = (int) scaled3D; + INT16 shift1D = (scaled1D - index1D) * 0x1000 + 0.5; + INT16 shift2D = (scaled2D - index2D) * 0x1000 + 0.5; + INT16 shift3D = (scaled3D - index3D) * 0x1000 + 0.5; + int idx = table3D_index3(index1D, index2D, index3D, size1D, size1D_2D); + INT16 result[3], left[3], right[3]; + INT16 leftleft[3], leftright[3], rightleft[3], rightright[3]; + + interpolate3(leftleft, &table[idx + 0], &table[idx + 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(right, rightleft, rightright, shift2D); + + interpolate3(result, left, right, shift3D); + + rowOut[x*4 + 0] = clip8(result[0]); + rowOut[x*4 + 1] = clip8(result[1]); + rowOut[x*4 + 2] = clip8(result[2]); + rowOut[x*4 + 3] = rowIn[x*4 + 3]; + + // printf("%d: %f -> %d, %f; idx: %d; (%d, %d, %d)\n", + // rowIn[x*4 + 0], scaled1D, index1D, shift1D, + // idx, nearest[0], nearest[1], nearest[2]); + } } } From 23827d52506a6e1c0e898a53d1c6018e241e0e99 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 14:18:17 +0300 Subject: [PATCH 0143/1393] 3D to 4D implementation --- src/libImaging/ColorLUT.c | 52 +++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index dab9eb62732..a1f562d9073 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -170,21 +170,21 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, for (y = 0; y < imOut->ysize; y++) { UINT8* rowIn = (UINT8 *)imIn->image[y]; UINT8* rowOut = (UINT8 *)imOut->image[y]; - if (table_channels == 3) { - for (x = 0; x < imOut->xsize; x++) { - float scaled1D = rowIn[x*4 + 0] * scale1D; - float scaled2D = rowIn[x*4 + 1] * scale2D; - float scaled3D = rowIn[x*4 + 2] * scale3D; - int index1D = (int) scaled1D; - int index2D = (int) scaled2D; - int index3D = (int) scaled3D; - INT16 shift1D = (scaled1D - index1D) * 0x1000 + 0.5; - INT16 shift2D = (scaled2D - index2D) * 0x1000 + 0.5; - INT16 shift3D = (scaled3D - index3D) * 0x1000 + 0.5; - int idx = table3D_index3(index1D, index2D, index3D, size1D, size1D_2D); - INT16 result[3], left[3], right[3]; - INT16 leftleft[3], leftright[3], rightleft[3], rightright[3]; - + for (x = 0; x < imOut->xsize; x++) { + float scaled1D = rowIn[x*4 + 0] * scale1D; + float scaled2D = rowIn[x*4 + 1] * scale2D; + float scaled3D = rowIn[x*4 + 2] * scale3D; + int index1D = (int) scaled1D; + int index2D = (int) scaled2D; + int index3D = (int) scaled3D; + INT16 shift1D = (scaled1D - index1D) * 0x1000 + 0.5; + INT16 shift2D = (scaled2D - index2D) * 0x1000 + 0.5; + INT16 shift3D = (scaled3D - index3D) * 0x1000 + 0.5; + int idx = table3D_index3(index1D, index2D, index3D, size1D, size1D_2D); + INT16 result[4], left[4], right[4]; + INT16 leftleft[4], leftright[4], rightleft[4], rightright[4]; + + if (table_channels == 3) { interpolate3(leftleft, &table[idx + 0], &table[idx + 3], shift1D); interpolate3(leftright, &table[idx + size1D*3], &table[idx + size1D*3 + 3], shift1D); @@ -202,10 +202,26 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, rowOut[x*4 + 1] = clip8(result[1]); rowOut[x*4 + 2] = clip8(result[2]); rowOut[x*4 + 3] = rowIn[x*4 + 3]; + } + + if (table_channels == 4) { + interpolate4(leftleft, &table[idx + 0], &table[idx + 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(right, rightleft, rightright, shift2D); - // printf("%d: %f -> %d, %f; idx: %d; (%d, %d, %d)\n", - // rowIn[x*4 + 0], scaled1D, index1D, shift1D, - // idx, nearest[0], nearest[1], nearest[2]); + interpolate4(result, left, right, shift3D); + + rowOut[x*4 + 0] = clip8(result[0]); + rowOut[x*4 + 1] = clip8(result[1]); + rowOut[x*4 + 2] = clip8(result[2]); + rowOut[x*4 + 3] = clip8(result[3]); } } } From a42beccee7f2c10277c28a6f6ef24fc8d9047d62 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Mon, 26 Mar 2018 19:29:44 +0530 Subject: [PATCH 0144/1393] Enabling background colour parameter on rotate Enabling the user to choose the background colour of the final rotated image rather than just black. parameter added: backgroundcolor --- src/PIL/Image.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 379a1d8a6bf..657141ba2a8 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1749,7 +1749,7 @@ def resize(self, size, resample=NEAREST, box=None): return self._new(self.im.resize(size, resample, box)) def rotate(self, angle, resample=NEAREST, expand=0, center=None, - translate=None): + translate=None, backgroundcolor=None): """ Returns a rotated copy of this image. This method returns a copy of this image, rotated the given number of degrees counter @@ -1771,6 +1771,7 @@ def rotate(self, angle, resample=NEAREST, expand=0, center=None, :param center: Optional center of rotation (a 2-tuple). Origin is the upper left corner. Default is the center of the image. :param translate: An optional post-rotate translation (a 2-tuple). + :param backgroundcolor: An optional color for the color outside the transformed image :returns: An :py:class:`~PIL.Image.Image` object. """ @@ -1851,7 +1852,7 @@ def transform(x, y, matrix): matrix) w, h = nw, nh - return self.transform((w, h), AFFINE, matrix, resample) + return self.transform((w, h), AFFINE, matrix, resample, fillcolor=backgroundcolor) def save(self, fp, format=None, **params): """ From 3a5f0201f53df27bce53793268ff1fc5d8a7cce8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 17:23:14 +0300 Subject: [PATCH 0145/1393] pure FPI implementation --- src/libImaging/ColorLUT.c | 65 ++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index a1f562d9073..4a5c6bced0c 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -8,6 +8,14 @@ #define PRECISION_BITS (16 - 8 - 2) #define PRECISION_ROUNDING (1<<(PRECISION_BITS-1)) +/* 8 — scales are multiplyed on byte. + 6 — max index in the table (size is 65, but index 64 is not reachable) */ +#define SCALE_BITS (32 - 8 - 6) +#define SCALE_MASK ((1 << SCALE_BITS) - 1) + +#define SHIFT_BITS (16 - 1) +#define SHIFT_ROUNDING (1<<(SHIFT_BITS-1)) + UINT8 _lookups2[1024] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -88,18 +96,18 @@ static inline UINT8 clip8(int in) static inline void interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) { - out[0] = (a[0] * (0x1000-shift) + b[0] * shift + (1<<11)) >> 12; - out[1] = (a[1] * (0x1000-shift) + b[1] * shift + (1<<11)) >> 12; - out[2] = (a[2] * (0x1000-shift) + b[2] * shift + (1<<11)) >> 12; + out[0] = (a[0] * ((1<> SHIFT_BITS; + out[1] = (a[1] * ((1<> SHIFT_BITS; + out[2] = (a[2] * ((1<> SHIFT_BITS; } static inline void interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) { - out[0] = (a[0] * (0x1000-shift) + b[0] * shift + (1<<11)) >> 12; - out[1] = (a[1] * (0x1000-shift) + b[1] * shift + (1<<11)) >> 12; - out[2] = (a[2] * (0x1000-shift) + b[2] * shift + (1<<11)) >> 12; - out[3] = (a[3] * (0x1000-shift) + b[3] * shift + (1<<11)) >> 12; + 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; } static inline int @@ -143,9 +151,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 noticable difference. */ - float scale1D = (size1D - 1) / (255.0002); - float scale2D = (size2D - 1) / (255.0002); - float scale3D = (size3D - 1) / (255.0002); + UINT32 scale1D = (size1D - 1) / 255.0 * (1<ysize; y++) { UINT8* rowIn = (UINT8 *)imIn->image[y]; - UINT8* rowOut = (UINT8 *)imOut->image[y]; + UINT32* rowOut = (UINT32 *)imOut->image[y]; for (x = 0; x < imOut->xsize; x++) { - float scaled1D = rowIn[x*4 + 0] * scale1D; - float scaled2D = rowIn[x*4 + 1] * scale2D; - float scaled3D = rowIn[x*4 + 2] * scale3D; - int index1D = (int) scaled1D; - int index2D = (int) scaled2D; - int index3D = (int) scaled3D; - INT16 shift1D = (scaled1D - index1D) * 0x1000 + 0.5; - INT16 shift2D = (scaled2D - index2D) * 0x1000 + 0.5; - INT16 shift3D = (scaled3D - index3D) * 0x1000 + 0.5; - int idx = table3D_index3(index1D, index2D, index3D, size1D, size1D_2D); + 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 = table3D_index3( + 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]; @@ -198,10 +207,9 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, interpolate3(result, left, right, shift3D); - rowOut[x*4 + 0] = clip8(result[0]); - rowOut[x*4 + 1] = clip8(result[1]); - rowOut[x*4 + 2] = clip8(result[2]); - rowOut[x*4 + 3] = rowIn[x*4 + 3]; + rowOut[x] = MAKE_UINT32( + clip8(result[0]), clip8(result[1]), + clip8(result[2]), rowIn[x*4 + 3]); } if (table_channels == 4) { @@ -218,10 +226,9 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, interpolate4(result, left, right, shift3D); - rowOut[x*4 + 0] = clip8(result[0]); - rowOut[x*4 + 1] = clip8(result[1]); - rowOut[x*4 + 2] = clip8(result[2]); - rowOut[x*4 + 3] = clip8(result[3]); + rowOut[x] = MAKE_UINT32( + clip8(result[0]), clip8(result[1]), + clip8(result[2]), clip8(result[3])); } } } From 845f4dbfe152a53f9562bc912869a1b892f95cfb Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 17:34:56 +0300 Subject: [PATCH 0146/1393] update comment --- src/libImaging/ColorLUT.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 4a5c6bced0c..2af348586c0 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -144,13 +144,16 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, int size1D, int size2D, int size3D, INT16* table) { - /* The fractions are a way to avoid overflow. - For every pixel, we interpolate 8 elements from the table: - current and +1 for every dimension and they combinations. - If we hit the upper cells from the table, - +1 cells will be outside of the table. - With this compensation we never hit the upper cells - but this also doesn't introduce any noticable difference. */ + /* 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, + we can use one extra bit for precision. + 2. For every pixel, we interpolate 8 elements from the table: + current and +1 for every dimension and they combinations. + If we hit the upper cells from the table, + +1 cells will be outside of the table. + With this compensation we never hit the upper cells + but this also doesn't introduce any noticable difference. */ UINT32 scale1D = (size1D - 1) / 255.0 * (1< Date: Mon, 26 Mar 2018 17:41:25 +0300 Subject: [PATCH 0147/1393] one function table_index3D --- src/libImaging/ColorLUT.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 2af348586c0..65fcd9d7c76 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -111,18 +111,12 @@ interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) } static inline int -table3D_index3(int index1D, int index2D, int index3D, +table_index3D(int index1D, int index2D, int index3D, int size1D, int size1D_2D) { - return (index1D + index2D * size1D + index3D * size1D_2D) * 3; + return index1D + index2D * size1D + index3D * size1D_2D; } -static inline int -table3D_index4(int index1D, int index2D, int index3D, - int size1D, int size1D_2D) -{ - return (index1D + index2D * size1D + index3D * size1D_2D) * 4; -} /* Transforms colors of imIn using provided 3D look-up table @@ -145,7 +139,7 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, INT16* table) { /* This float to int conversion doesn't have rounding - error compensation (+ 0.5) for two reasons: + error compensation (+0.5) for two reasons: 1. As we don't hit the highest value, we can use one extra bit for precision. 2. For every pixel, we interpolate 8 elements from the table: @@ -188,11 +182,9 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, 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 = table3D_index3( - index1D >> SCALE_BITS, - index2D >> SCALE_BITS, - index3D >> SCALE_BITS, - size1D, size1D_2D); + int idx = 3 * table_index3D( + 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]; From 78d16d30c4ec1b929d63de40990e4720430f1713 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 18:02:08 +0300 Subject: [PATCH 0148/1393] share clip8_lookups table between Resample and ColorLUT --- src/libImaging/ColorLUT.c | 73 +-------------------------------------- src/libImaging/Imaging.h | 2 ++ src/libImaging/Resample.c | 39 ++++++++++++++++++--- 3 files changed, 38 insertions(+), 76 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 65fcd9d7c76..38371dbf2ba 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -17,82 +17,11 @@ #define SHIFT_ROUNDING (1<<(SHIFT_BITS-1)) -UINT8 _lookups2[1024] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -}; - -UINT8 *lookups2 = &_lookups2[512]; - - static inline UINT8 clip8(int in) { - return lookups2[(in + PRECISION_ROUNDING) >> PRECISION_BITS]; + return clip8_lookups[(in + PRECISION_ROUNDING) >> PRECISION_BITS]; } - static inline void interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) { diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index ece082a18ea..8c3ad65c3bb 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -536,6 +536,8 @@ extern Py_ssize_t _imaging_tell_pyFd(PyObject *fd); #include "ImagingUtils.h" +extern UINT8 *clip8_lookups; + #if defined(__cplusplus) } diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index 7cefdb2afb5..29a6cce1d1a 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -83,7 +83,31 @@ static struct filter LANCZOS = { lanczos_filter, 3.0 }; #define PRECISION_BITS (32 - 8 - 2) -UINT8 _lookups[512] = { +UINT8 _clip8_lookups[1024] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -115,15 +139,22 @@ UINT8 _lookups[512] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 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 *lookups = &_lookups[128]; - +UINT8 *clip8_lookups = &_clip8_lookups[512]; static inline UINT8 clip8(int in) { - return lookups[in >> PRECISION_BITS]; + return clip8_lookups[in >> PRECISION_BITS]; } From b30b2a280fc8d09f43b8e773ac81c9204e5cf3bb Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 19:30:00 +0300 Subject: [PATCH 0149/1393] Tests. First part --- Tests/test_color_lut.py | 129 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 Tests/test_color_lut.py diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py new file mode 100644 index 00000000000..18b3f630fe2 --- /dev/null +++ b/Tests/test_color_lut.py @@ -0,0 +1,129 @@ +from __future__ import division +from helper import unittest, PillowTestCase + +import time +from PIL import Image + + +class TestColorLut3DCoreAPI(PillowTestCase): + def generate_unit_table(self, channels, size): + if isinstance(size, tuple): + size1D, size2D, size3D = size + else: + size1D, size2D, size3D = (size, size, size) + + table = [ + [ + r / float(size1D-1) if size1D != 1 else 0, + g / float(size2D-1) if size2D != 1 else 0, + b / float(size3D-1) if size3D != 1 else 0, + r / float(size1D-1) if size1D != 1 else 0, + g / float(size2D-1) if size2D != 1 else 0, + b / float(size3D-1) if size3D != 1 else 0, + ][:channels] + for b in range(size3D) + for g in range(size2D) + for r in range(size1D) + ] + return ( + channels, size1D, size2D, size3D, + [item for sublist in table for item in sublist]) + + def test_wrong_arguments(self): + im = Image.new('RGB', (10, 10), 0) + + with self.assertRaisesRegexp(ValueError, "filter"): + im.im.color_lut_3d('RGB', Image.CUBIC, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "image mode"): + im.im.color_lut_3d('wrong', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "table_channels"): + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(6, 3)) + + with self.assertRaisesRegexp(ValueError, "table_channels"): + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(1, 3)) + + with self.assertRaisesRegexp(ValueError, "table_channels"): + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(2, 3)) + + with self.assertRaisesRegexp(ValueError, "Table size"): + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (1, 3, 3))) + + with self.assertRaisesRegexp(ValueError, "Table size"): + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (66, 3, 3))) + + def test_correct_arguments(self): + im = Image.new('RGB', (10, 10), 0) + + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + im.im.color_lut_3d('CMYK', Image.LINEAR, + *self.generate_unit_table(4, 3)) + + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (2, 3, 3))) + + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (65, 3, 3))) + + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (3, 65, 3))) + + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (3, 3, 65))) + + def test_wrong_mode(self): + with self.assertRaisesRegexp(ValueError, "wrong mode"): + im = Image.new('L', (10, 10), 0) + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "wrong mode"): + im = Image.new('RGB', (10, 10), 0) + im.im.color_lut_3d('L', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "wrong mode"): + im = Image.new('L', (10, 10), 0) + im.im.color_lut_3d('L', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "wrong mode"): + im = Image.new('RGB', (10, 10), 0) + im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + with self.assertRaisesRegexp(ValueError, "wrong mode"): + im = Image.new('RGB', (10, 10), 0) + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(4, 3)) + + def test_correct_mode(self): + im = Image.new('RGBA', (10, 10), 0) + im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + im = Image.new('RGBA', (10, 10), 0) + im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(4, 3)) + + im = Image.new('RGB', (10, 10), 0) + im.im.color_lut_3d('HSV', Image.LINEAR, + *self.generate_unit_table(3, 3)) + + im = Image.new('RGB', (10, 10), 0) + im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(4, 3)) + + +if __name__ == '__main__': + unittest.main() From 5f0b7ee73e17c8866a29cfb804cd1cc6f4853b0c Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 22:29:50 +0300 Subject: [PATCH 0150/1393] More tests --- Tests/test_color_lut.py | 68 +++++++++++++++++++++++++++++++++++++++-- src/_imaging.c | 1 - 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 18b3f630fe2..3eb2bdcef45 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -19,7 +19,6 @@ def generate_unit_table(self, channels, size): b / float(size3D-1) if size3D != 1 else 0, r / float(size1D-1) if size1D != 1 else 0, g / float(size2D-1) if size2D != 1 else 0, - b / float(size3D-1) if size3D != 1 else 0, ][:channels] for b in range(size3D) for g in range(size2D) @@ -42,7 +41,7 @@ def test_wrong_arguments(self): with self.assertRaisesRegexp(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(6, 3)) + *self.generate_unit_table(5, 3)) with self.assertRaisesRegexp(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, @@ -60,6 +59,14 @@ def test_wrong_arguments(self): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_unit_table(3, (66, 3, 3))) + with self.assertRaisesRegexp(ValueError, r"size1D \* size2D \* size3D"): + im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, [0, 0, 0] * 7) + + with self.assertRaisesRegexp(ValueError, r"size1D \* size2D \* size3D"): + im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, [0, 0, 0] * 9) + def test_correct_arguments(self): im = Image.new('RGB', (10, 10), 0) @@ -124,6 +131,63 @@ def test_correct_mode(self): im.im.color_lut_3d('RGBA', Image.LINEAR, *self.generate_unit_table(4, 3)) + def test_units(self): + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + + # Fast test with small cubes + for size in [2, 3, 5, 7, 11, 16, 17]: + self.assert_image_equal(im, im._new( + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, size)))) + + # Not so fast + self.assert_image_equal(im, im._new( + im.im.color_lut_3d('RGB', Image.LINEAR, + *self.generate_unit_table(3, (2, 2, 65))))) + + def test_channels_order(self): + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + + # Reverse channels by splitting and using table + self.assert_image_equal( + Image.merge('RGB', im.split()[::-1]), + im._new(im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, [ + 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 1, + + 1, 0, 0, 1, 0, 1, + 1, 1, 0, 1, 1, 1, + ]))) + + def test_overflow(self): + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + + transformed = im._new(im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, + [ + -1, -1, -1, 2, -1, -1, + -1, 2, -1, 2, 2, -1, + + -1, -1, 2, 2, -1, 2, + -1, 2, 2, 2, 2, 2, + ])).load() + + self.assertEqual(transformed[0, 0], (0, 0, 255)) + self.assertEqual(transformed[50, 50], (0, 0, 255)) + self.assertEqual(transformed[255, 0], (0, 255, 255)) + self.assertEqual(transformed[205, 50], (0, 255, 255)) + self.assertEqual(transformed[0, 255], (255, 0, 0)) + self.assertEqual(transformed[50, 205], (255, 0, 0)) + self.assertEqual(transformed[255, 255], (255, 255, 0)) + self.assertEqual(transformed[205, 205], (255, 255, 0)) + if __name__ == '__main__': unittest.main() diff --git a/src/_imaging.c b/src/_imaging.c index f023a6328db..d1262f5b8d2 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -740,7 +740,6 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } else { prepared[i] = table_data[i] * (255 << PRECISION_BITS) + 0.5; } - // printf("%f, %d ", table_data[i], prepared[i]); } #undef PRECISION_BITS From 5227c30561174c727458d6ca8bf6a26c3eb2e9da Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 26 Mar 2018 22:33:22 +0300 Subject: [PATCH 0151/1393] typos --- Tests/test_color_lut.py | 1 - src/libImaging/ColorLUT.c | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 3eb2bdcef45..2da59b11595 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,7 +1,6 @@ from __future__ import division from helper import unittest, PillowTestCase -import time from PIL import Image diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 38371dbf2ba..f9dd91cb808 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -8,7 +8,7 @@ #define PRECISION_BITS (16 - 8 - 2) #define PRECISION_ROUNDING (1<<(PRECISION_BITS-1)) -/* 8 — scales are multiplyed on byte. +/* 8 — scales are multiplied on byte. 6 — max index in the table (size is 65, but index 64 is not reachable) */ #define SCALE_BITS (32 - 8 - 6) #define SCALE_MASK ((1 << SCALE_BITS) - 1) @@ -72,11 +72,11 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, 1. As we don't hit the highest value, we can use one extra bit for precision. 2. For every pixel, we interpolate 8 elements from the table: - current and +1 for every dimension and they combinations. + current and +1 for every dimension and their combinations. If we hit the upper cells from the table, +1 cells will be outside of the table. With this compensation we never hit the upper cells - but this also doesn't introduce any noticable difference. */ + but this also doesn't introduce any noticeable difference. */ UINT32 scale1D = (size1D - 1) / 255.0 * (1< Date: Mon, 26 Mar 2018 23:17:17 +0300 Subject: [PATCH 0152/1393] more tests and fixed bug for interpolate4 --- Tests/test_color_lut.py | 21 +++++++++++++++++++++ src/libImaging/ColorLUT.c | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 2da59b11595..65b5c512722 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -146,6 +146,27 @@ def test_units(self): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_unit_table(3, (2, 2, 65))))) + def test_units_4channels(self): + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + + # Red channel copied to alpha + self.assert_image_equal( + Image.merge('RGBA', (im.split()*2)[:4]), + im._new(im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(4, 17)))) + + def test_copy_alpha_channel(self): + g = Image.linear_gradient('L') + im = Image.merge('RGBA', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180), + g.transpose(Image.ROTATE_270)]) + + self.assert_image_equal(im, im._new( + im.im.color_lut_3d('RGBA', Image.LINEAR, + *self.generate_unit_table(3, 17)))) + def test_channels_order(self): g = Image.linear_gradient('L') im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index f9dd91cb808..3f930c3ee48 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -111,7 +111,7 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, 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 = 3 * table_index3D( + int idx = table_channels * table_index3D( index1D >> SCALE_BITS, index2D >> SCALE_BITS, index3D >> SCALE_BITS, size1D, size1D_2D); INT16 result[4], left[4], right[4]; From bea25dba300386786c1bbc942e2c83a1ac3ce1f7 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 18:41:49 +0530 Subject: [PATCH 0153/1393] Rotate with fill color unit test check if hopper image equals hopper45withfill after rotate --- Tests/test_image_rotate.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index fbcf9008d83..1da0a70b7de 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -96,6 +96,11 @@ def test_center(self): self.rotate(im, im.mode, 45, center=(0, 0)) self.rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) self.rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) + + def test_rotate_with_fill(self): + im = hopper() + target = Image.open('Tests/images/hopper45withfill.png') + self.assert_image_equal(im.rotate(45, fillcolor='white'), target) if __name__ == '__main__': From 65c78266adb5648974f181d6c37803401b547197 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 18:55:34 +0530 Subject: [PATCH 0154/1393] RotateImage with fill: Added file for assertion Fail First: add image for assertion --- Tests/images/hopper45withfill.png | Bin 0 -> 27574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/hopper45withfill.png diff --git a/Tests/images/hopper45withfill.png b/Tests/images/hopper45withfill.png new file mode 100644 index 0000000000000000000000000000000000000000..913d85970eeacd3905a4da1720e74f418e6561dd GIT binary patch literal 27574 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 Date: Tue, 27 Mar 2018 19:01:33 +0530 Subject: [PATCH 0155/1393] Added review Changes Changed parameter name to fillcolor Added full stop on param description --- 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 657141ba2a8..aacb814c0bf 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1749,7 +1749,7 @@ def resize(self, size, resample=NEAREST, box=None): return self._new(self.im.resize(size, resample, box)) def rotate(self, angle, resample=NEAREST, expand=0, center=None, - translate=None, backgroundcolor=None): + translate=None, fillcolor=None): """ Returns a rotated copy of this image. This method returns a copy of this image, rotated the given number of degrees counter @@ -1771,7 +1771,7 @@ def rotate(self, angle, resample=NEAREST, expand=0, center=None, :param center: Optional center of rotation (a 2-tuple). Origin is the upper left corner. Default is the center of the image. :param translate: An optional post-rotate translation (a 2-tuple). - :param backgroundcolor: An optional color for the color outside the transformed image + :param fillcolor: An optional color for the color outside the rotated image. :returns: An :py:class:`~PIL.Image.Image` object. """ @@ -1852,7 +1852,7 @@ def transform(x, y, matrix): matrix) w, h = nw, nh - return self.transform((w, h), AFFINE, matrix, resample, fillcolor=backgroundcolor) + return self.transform((w, h), AFFINE, matrix, resample, fillcolor=fillcolor) def save(self, fp, format=None, **params): """ From f35803896861d6eed446be56f1524eec48d5e12c Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 19:03:35 +0530 Subject: [PATCH 0156/1393] modify comment --- 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 aacb814c0bf..22ee46bfc82 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1771,7 +1771,7 @@ def rotate(self, angle, resample=NEAREST, expand=0, center=None, :param center: Optional center of rotation (a 2-tuple). Origin is the upper left corner. Default is the center of the image. :param translate: An optional post-rotate translation (a 2-tuple). - :param fillcolor: An optional color for the color outside the rotated image. + :param fillcolor: An optional color for area outside the rotated image. :returns: An :py:class:`~PIL.Image.Image` object. """ From fa85f112cdaf2c971e66aa6c17de843e0bf67ab9 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 19:31:58 +0530 Subject: [PATCH 0157/1393] Updating Test changing from equal to similar --- Tests/test_image_rotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 1da0a70b7de..edf8c516cd9 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -100,7 +100,7 @@ def test_center(self): def test_rotate_with_fill(self): im = hopper() target = Image.open('Tests/images/hopper45withfill.png') - self.assert_image_equal(im.rotate(45, fillcolor='white'), target) + self.assert_image_similar(im.rotate(45, fillcolor='white'), target, 1) if __name__ == '__main__': From 8af7c679ab96bee0d1a6a3b4b979af3bf1330af4 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 19:43:04 +0530 Subject: [PATCH 0158/1393] Added basic green file for rotate Making changes according to review --- Tests/images/rotate_45_with_fill.png | Bin 0 -> 625 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/rotate_45_with_fill.png diff --git a/Tests/images/rotate_45_with_fill.png b/Tests/images/rotate_45_with_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..05b2d34d54cdddbdda419fb622fa4914a5081cf6 GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^DImPRx97qyrvlfoE)7WfSiUB8X+X|j@ij-6 zUeG=y>m8Kt-!)<1o(l5`0=pMnn5t?MAGFC z*5TcM-lwJCmQ?I4op4>uv10%Es5{!*>b@*1iCll=(Mszdta~qMr`x^Lc{(-L?ElRI z!S$0&yX`!7f7goH@a4+Ejp0ADjtKU8>t|`cvpGFed^cb1kLSl$Crz9+Ify;3R69gY z+y8B-ZOvcFKTG0tlg({6%s98Y@WHj^*20xr`?Ef1 Date: Tue, 27 Mar 2018 19:48:35 +0530 Subject: [PATCH 0159/1393] Split test for fill and no fill Added a simpler image to compare --- Tests/test_image_rotate.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index edf8c516cd9..61ce78a7183 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -97,10 +97,17 @@ def test_center(self): self.rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) self.rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) + def test_rotate_no_fill(self): + im = Image.new('RGB', (100, 100), 'green') + target = Image.open('Tests/images/rotate_45_no_fill.png') + im = im.rotate(45) + self.assert_image_equal(im, target) + def test_rotate_with_fill(self): - im = hopper() - target = Image.open('Tests/images/hopper45withfill.png') - self.assert_image_similar(im.rotate(45, fillcolor='white'), target, 1) + im = Image.new('RGB', (100, 100), 'green') + target = Image.open('Tests/images/rotate_45_with_fill.png') + im = im.rotate(45, fillcolor='white') + self.assert_image_equal(im, target) if __name__ == '__main__': From eb3efb25872603e2fbdca4fa391f4bf08d99332b Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 19:52:24 +0530 Subject: [PATCH 0160/1393] Added Files for Rotate Fill tests --- Tests/images/rotate_45_with_no_fill.png | Bin 0 -> 639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/rotate_45_with_no_fill.png diff --git a/Tests/images/rotate_45_with_no_fill.png b/Tests/images/rotate_45_with_no_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9d03e6ca94bcde5f6013ace9b24e4d419dc12e GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^DIm?<;X=dCve=M>s!y*ZTIL&Zrm@Q3sGT|K)RZfSVA? zXEv*K<|N7$wEav;^fqeNJ*mR&e@5rS5sQ?>6EpbQdJ-f1+AD;6*m_P%<^9i-SS2^X z^x6-D7y56fnqK%+@nX&ENmp;bak&t@9ro zh;{KliBAh%ra7c=(wNY(OuWctx%)E5(kCGi!guV7?-lUBi!Yv3DlAv`w5LRN9(&QR zeN5WPJFh45UTZH-KEWN5UL<~2Imh?ew8ixsjOYK}{4b&2GcQehsYHHS@FP9WwcN$C zmuv{DnZMK}o?*+=U#IOi9;|d+_o6Cz)pkqSFCt&}g}uuv6ML~nx`O@w?N13W^kr{v zkjSXv;R)q`|E_0iy><_q#kNCj@{eQ_P8htEe$+XWb)Lk1HSKLG#y2LdvA$$+*yaIG zasK_}bJ9%3_gem2J?MYKSpQ^>eVc*m*AMJJSflS-yVvZWat4^N7(8A5T-G@yGywo( CryY?1 literal 0 HcmV?d00001 From e1229db8107ceed938b46d06d9d944c242913b80 Mon Sep 17 00:00:00 2001 From: storesource <36395224+storesource@users.noreply.github.com> Date: Tue, 27 Mar 2018 20:07:06 +0530 Subject: [PATCH 0161/1393] Rename File --- Tests/images/rotate_45_no_fill.png | Bin 0 -> 639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/images/rotate_45_no_fill.png diff --git a/Tests/images/rotate_45_no_fill.png b/Tests/images/rotate_45_no_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9d03e6ca94bcde5f6013ace9b24e4d419dc12e GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^DIm?<;X=dCve=M>s!y*ZTIL&Zrm@Q3sGT|K)RZfSVA? zXEv*K<|N7$wEav;^fqeNJ*mR&e@5rS5sQ?>6EpbQdJ-f1+AD;6*m_P%<^9i-SS2^X z^x6-D7y56fnqK%+@nX&ENmp;bak&t@9ro zh;{KliBAh%ra7c=(wNY(OuWctx%)E5(kCGi!guV7?-lUBi!Yv3DlAv`w5LRN9(&QR zeN5WPJFh45UTZH-KEWN5UL<~2Imh?ew8ixsjOYK}{4b&2GcQehsYHHS@FP9WwcN$C zmuv{DnZMK}o?*+=U#IOi9;|d+_o6Cz)pkqSFCt&}g}uuv6ML~nx`O@w?N13W^kr{v zkjSXv;R)q`|E_0iy><_q#kNCj@{eQ_P8htEe$+XWb)Lk1HSKLG#y2LdvA$$+*yaIG zasK_}bJ9%3_gem2J?MYKSpQ^>eVc*m*AMJJSflS-yVvZWat4^N7(8A5T-G@yGywo( CryY?1 literal 0 HcmV?d00001 From 79689977cfc3cbfd8bbb3ab55b93632815b754cc Mon Sep 17 00:00:00 2001 From: storesource Date: Tue, 27 Mar 2018 21:05:19 +0530 Subject: [PATCH 0162/1393] Remove unnecessary files --- Tests/images/hopper45withfill.png | Bin 27574 -> 0 bytes Tests/images/rotate_45_with_no_fill.png | Bin 639 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Tests/images/hopper45withfill.png delete mode 100644 Tests/images/rotate_45_with_no_fill.png diff --git a/Tests/images/hopper45withfill.png b/Tests/images/hopper45withfill.png deleted file mode 100644 index 913d85970eeacd3905a4da1720e74f418e6561dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27574 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 CryY?1 From 71f643e1ead202596c186ea46e2925a1f8f1615c Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 27 Mar 2018 03:45:00 +0300 Subject: [PATCH 0163/1393] doesn't affect accuracy, but a bit faster --- src/_imaging.c | 5 +---- src/libImaging/ColorLUT.c | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index d1262f5b8d2..544e54d8735 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -834,10 +834,7 @@ _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* diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 3f930c3ee48..efcc49ca66c 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -9,12 +9,12 @@ #define PRECISION_ROUNDING (1<<(PRECISION_BITS-1)) /* 8 — scales are multiplied on byte. - 6 — max index in the table (size is 65, but index 64 is not reachable) */ + 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 << SCALE_BITS) - 1) +#define SCALE_MASK ((1<> SHIFT_BITS; - out[1] = (a[1] * ((1<> SHIFT_BITS; - out[2] = (a[2] * ((1<> SHIFT_BITS; + out[0] = (a[0] * ((1<> SHIFT_BITS; + out[1] = (a[1] * ((1<> SHIFT_BITS; + out[2] = (a[2] * ((1<> 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; + 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; } static inline int From 461a0904058c49c45f820b9c6a1f92bdea147f47 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 14:39:28 +0300 Subject: [PATCH 0164/1393] Python interface --- src/PIL/ImageFilter.py | 59 ++++++++++++++++++++++++++++++++++++++- src/libImaging/ColorLUT.c | 6 ++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 735a00831da..eba5453d456 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -130,7 +130,6 @@ def __init__(self, size=3): class ModeFilter(Filter): """ - Create a mode filter. Picks the most frequent pixel value in a box with the given size. Pixel values that occur only once or twice are ignored; if no pixel value occurs more than twice, the original pixel value is preserved. @@ -297,3 +296,61 @@ class SMOOTH_MORE(BuiltinFilter): 1, 5, 5, 5, 1, 1, 1, 1, 1, 1 ) + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + def __init__(self, size, table, channels=3, target_mode=None): + try: + _, _, _ = size + except ValueError: + raise ValueError("Size should be an integer either " + "tuple of three integers.") + except TypeError: + size = (size, size, size) + self.size = size + self.channels = channels + self.mode = target_mode + + table = list(table) + # Convert to a flat list + if isinstance(table[0], (list, tuple)): + table = [ + pixel + for pixel in table + if len(pixel) == channels + for color in pixel + ] + + if len(table) != channels * size[0] * size[1] * size[2]: + raise ValueError( + "The table should have channels * size**3 float items " + "either size**3 items of channels-sized tuples with floats.") + self.table = table + + def filter(self, image): + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, Image.LINEAR, self.channels, + self.size[0], self.size[1], self.size[2], self.table) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index efcc49ca66c..36b87f10845 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -48,15 +48,15 @@ table_index3D(int index1D, int index2D, int index3D, /* - Transforms colors of imIn using provided 3D look-up table + Transforms colors of imIn using provided 3D lookup table and puts the result in imOut. Returns imOut on sucess or 0 on error. imOut, imIn — images, should be the same size and may be the same image. Should have 3 or 4 channels. - table_channels — number of channels in the look-up table, 3 or 4. + table_channels — number of channels in the lookup table, 3 or 4. Should be less or equal than number of channels in imOut image; size1D, size_2D and size3D — dimensions of provided table; - table — flatten table, + table — flat table, array with table_channels × size1D × size2D × size3D elements, where channels are changed first, then 1D, then​ 2D, then 3D. Each element is signed 16-bit int where 0 is lowest output value From 506995d8161b7efc0aac02c09bc313869b6d5371 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 16:37:35 +0300 Subject: [PATCH 0165/1393] Tests for python API --- Tests/test_color_lut.py | 47 ++++++++++++++++++++++++++++++++++++++--- src/PIL/ImageFilter.py | 26 ++++++++++++++++------- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 65b5c512722..5d15c4cb2ac 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,7 +1,7 @@ from __future__ import division from helper import unittest, PillowTestCase -from PIL import Image +from PIL import Image, ImageFilter class TestColorLut3DCoreAPI(PillowTestCase): @@ -27,7 +27,7 @@ def generate_unit_table(self, channels, size): channels, size1D, size2D, size3D, [item for sublist in table for item in sublist]) - def test_wrong_arguments(self): + def test_wrong_args(self): im = Image.new('RGB', (10, 10), 0) with self.assertRaisesRegexp(ValueError, "filter"): @@ -66,7 +66,7 @@ def test_wrong_arguments(self): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 9) - def test_correct_arguments(self): + def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, @@ -209,5 +209,46 @@ def test_overflow(self): self.assertEqual(transformed[205, 205], (255, 255, 0)) +class TestColorLut3DFilter(PillowTestCase): + def test_wrong_args(self): + with self.assertRaisesRegexp(ValueError, "should be an integer"): + ImageFilter.Color3DLUT("small", [1]) + + with self.assertRaisesRegexp(ValueError, "should be an integer"): + ImageFilter.Color3DLUT((11, 11), [1]) + + with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + ImageFilter.Color3DLUT((11, 11, 1), [1]) + + with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + ImageFilter.Color3DLUT((11, 11, 66), [1]) + + with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + ImageFilter.Color3DLUT((3, 3, 3), [1, 1, 1]) + + with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 2) + + with self.assertRaisesRegexp(ValueError, "should have a length of 4"): + ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 27, channels=4) + + with self.assertRaisesRegexp(ValueError, "should have a length of 3"): + ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8) + + def test_convert_table(self): + flt = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) + self.assertEqual(tuple(flt.size), (2, 2, 2)) + self.assertEqual(flt.name, "Color 3D LUT") + + flt = ImageFilter.Color3DLUT((2, 2, 2), [ + (0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), + (12, 13, 14), (15, 16, 17), (18, 19, 20), (21, 22, 23)]) + self.assertEqual(tuple(flt.size), (2, 2, 2)) + self.assertEqual(flt.table, list(range(24))) + + flt = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, + channels=4) + + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index eba5453d456..1c95615764f 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -43,6 +43,7 @@ class Kernel(MultibandFilter): :param offset: Offset. If given, this value is added to the result, after it has been divided by the scale factor. """ + name = "Kernel" def __init__(self, size, kernel, scale=None, offset=0): if scale is None: @@ -320,6 +321,8 @@ class Color3DLUT(MultibandFilter): than ``channels`` channels. Default is ``None``, which means that mode wouldn't be changed. """ + name = "Color 3D LUT" + def __init__(self, size, table, channels=3, target_mode=None): try: _, _, _ = size @@ -328,24 +331,31 @@ def __init__(self, size, table, channels=3, target_mode=None): "tuple of three integers.") except TypeError: size = (size, size, size) + size = map(int, size) + for size1D in size: + if not 2 <= size1D <= 65: + raise ValueError("Size should be in [2, 65] range.") + self.size = size self.channels = channels self.mode = target_mode table = list(table) # Convert to a flat list - if isinstance(table[0], (list, tuple)): - table = [ - pixel - for pixel in table - if len(pixel) == channels - for color in pixel - ] + if table and isinstance(table[0], (list, tuple)): + table, raw_table = [], table + for pixel in raw_table: + if len(pixel) != channels: + raise ValueError("The elements of the table should have " + "a length of {}.".format(channels)) + for color in pixel: + table.append(color) if len(table) != channels * size[0] * size[1] * size[2]: raise ValueError( "The table should have channels * size**3 float items " - "either size**3 items of channels-sized tuples with floats.") + "either size**3 items of channels-sized tuples with floats. " + "Table length: {}".format(len(table))) self.table = table def filter(self, image): From 622749530bfbd3ffb081fbe75965d74a7c87ffa1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 17:26:21 +0300 Subject: [PATCH 0166/1393] Color3DLUT.generate --- Tests/test_color_lut.py | 23 ++++++++++++++++++ src/PIL/ImageFilter.py | 53 +++++++++++++++++++++++++++++++---------- 2 files changed, 63 insertions(+), 13 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 5d15c4cb2ac..30b8de279c9 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -249,6 +249,29 @@ def test_convert_table(self): flt = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, channels=4) + def test_generate(self): + flt = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) + self.assertEqual(tuple(flt.size), (5, 5, 5)) + self.assertEqual(flt.name, "Color 3D LUT") + self.assertEqual(flt.table[:24], [ + 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.5, 0.0, 0.0, 0.75, 0.0, 0.0, + 1.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0]) + + flt = ImageFilter.Color3DLUT.generate(5, channels=4, + callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) + self.assertEqual(tuple(flt.size), (5, 5, 5)) + self.assertEqual(flt.name, "Color 3D LUT") + self.assertEqual(flt.table[:24], [ + 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.125, 0.0, 0.5, 0.0, 0.25, + 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125]) + + with self.assertRaisesRegexp(ValueError, "should have a length of 3"): + ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) + + with self.assertRaisesRegexp(ValueError, "should have a length of 4"): + ImageFilter.Color3DLUT.generate(5, channels=4, + callback=lambda r, g, b: (r, g, b)) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 1c95615764f..e616b4641e6 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -324,19 +324,7 @@ class Color3DLUT(MultibandFilter): name = "Color 3D LUT" def __init__(self, size, table, channels=3, target_mode=None): - try: - _, _, _ = size - except ValueError: - raise ValueError("Size should be an integer either " - "tuple of three integers.") - except TypeError: - size = (size, size, size) - size = map(int, size) - for size1D in size: - if not 2 <= size1D <= 65: - raise ValueError("Size should be in [2, 65] range.") - - self.size = size + self.size = size = self._check_size(size) self.channels = channels self.mode = target_mode @@ -358,6 +346,45 @@ def __init__(self, size, table, channels=3, target_mode=None): "Table length: {}".format(len(table))) self.table = table + @staticmethod + def _check_size(size): + try: + _, _, _ = size + except ValueError: + raise ValueError("Size should be an integer either " + "tuple of three integers.") + except TypeError: + size = (size, size, size) + size = map(int, size) + for size1D in size: + if not 2 <= size1D <= 65: + raise ValueError("Size should be in [2, 65] range.") + return size + + @classmethod + def generate(cls, size, callback, channels=3, target_mode=None): + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: Passed to the constructor. + :param target_mode: Passed to the constructor. + """ + size1D, size2D, size3D = cls._check_size(size) + table = [] + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + table.append(callback( + r / float(size1D-1), + g / float(size2D-1), + b / float(size3D-1))) + + return cls((size1D, size2D, size3D), table, channels, target_mode) + def filter(self, image): from . import Image From 7f0bbf52e3d506d823739c1b16c5a6bfc4c30255 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 17:37:00 +0300 Subject: [PATCH 0167/1393] Python3 fix --- src/PIL/ImageFilter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index e616b4641e6..e16b47bdde1 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -355,7 +355,7 @@ def _check_size(size): "tuple of three integers.") except TypeError: size = (size, size, size) - size = map(int, size) + size = [int(x) for x in size] for size1D in size: if not 2 <= size1D <= 65: raise ValueError("Size should be in [2, 65] range.") From d2a5d1e44de391365046ca99b0331bc92e4de25d Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 23:56:51 +0300 Subject: [PATCH 0168/1393] Add tests for some cases and fix bugs --- Tests/test_color_lut.py | 22 ++++++++++++++++++++++ src/libImaging/Resample.c | 23 ++++++++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 30b8de279c9..3bfb05f02a6 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -198,7 +198,24 @@ def test_overflow(self): -1, -1, 2, 2, -1, 2, -1, 2, 2, 2, 2, 2, ])).load() + self.assertEqual(transformed[0, 0], (0, 0, 255)) + self.assertEqual(transformed[50, 50], (0, 0, 255)) + self.assertEqual(transformed[255, 0], (0, 255, 255)) + self.assertEqual(transformed[205, 50], (0, 255, 255)) + self.assertEqual(transformed[0, 255], (255, 0, 0)) + self.assertEqual(transformed[50, 205], (255, 0, 0)) + self.assertEqual(transformed[255, 255], (255, 255, 0)) + self.assertEqual(transformed[205, 205], (255, 255, 0)) + transformed = im._new(im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, + [ + -3, -3, -3, 5, -3, -3, + -3, 5, -3, 5, 5, -3, + + -3, -3, 5, 5, -3, 5, + -3, 5, 5, 5, 5, 5, + ])).load() self.assertEqual(transformed[0, 0], (0, 0, 255)) self.assertEqual(transformed[50, 50], (0, 0, 255)) self.assertEqual(transformed[255, 0], (0, 255, 255)) @@ -257,6 +274,11 @@ def test_generate(self): 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.5, 0.0, 0.0, 0.75, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0]) + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + self.assertEqual(im, im.filter(flt)) + flt = ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) self.assertEqual(tuple(flt.size), (5, 5, 5)) diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index 29a6cce1d1a..6fae2081d2a 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -83,7 +83,16 @@ static struct filter LANCZOS = { lanczos_filter, 3.0 }; #define PRECISION_BITS (32 - 8 - 2) -UINT8 _clip8_lookups[1024] = { +/* 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, @@ -147,10 +156,18 @@ UINT8 _clip8_lookups[1024] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 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[512]; +UINT8 *clip8_lookups = &_clip8_lookups[640]; static inline UINT8 clip8(int in) { From aa929dda98cb0243face04049aa75000efc291d3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 30 Mar 2018 02:02:37 +0300 Subject: [PATCH 0169/1393] from_cube_file + test --- Tests/test_color_lut.py | 73 ++++++++++++++++++++++++++++++++--------- src/PIL/ImageFilter.py | 57 +++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 17 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 3bfb05f02a6..6d1cb23731c 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -253,37 +253,37 @@ def test_wrong_args(self): ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8) def test_convert_table(self): - flt = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) - self.assertEqual(tuple(flt.size), (2, 2, 2)) - self.assertEqual(flt.name, "Color 3D LUT") + lut = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) + self.assertEqual(tuple(lut.size), (2, 2, 2)) + self.assertEqual(lut.name, "Color 3D LUT") - flt = ImageFilter.Color3DLUT((2, 2, 2), [ + lut = ImageFilter.Color3DLUT((2, 2, 2), [ (0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14), (15, 16, 17), (18, 19, 20), (21, 22, 23)]) - self.assertEqual(tuple(flt.size), (2, 2, 2)) - self.assertEqual(flt.table, list(range(24))) + self.assertEqual(tuple(lut.size), (2, 2, 2)) + self.assertEqual(lut.table, list(range(24))) - flt = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, + lut = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, channels=4) def test_generate(self): - flt = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) - self.assertEqual(tuple(flt.size), (5, 5, 5)) - self.assertEqual(flt.name, "Color 3D LUT") - self.assertEqual(flt.table[:24], [ + lut = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) + self.assertEqual(tuple(lut.size), (5, 5, 5)) + self.assertEqual(lut.name, "Color 3D LUT") + self.assertEqual(lut.table[:24], [ 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.5, 0.0, 0.0, 0.75, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0]) g = Image.linear_gradient('L') im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), g.transpose(Image.ROTATE_180)]) - self.assertEqual(im, im.filter(flt)) + self.assertEqual(im, im.filter(lut)) - flt = ImageFilter.Color3DLUT.generate(5, channels=4, + lut = ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) - self.assertEqual(tuple(flt.size), (5, 5, 5)) - self.assertEqual(flt.name, "Color 3D LUT") - self.assertEqual(flt.table[:24], [ + self.assertEqual(tuple(lut.size), (5, 5, 5)) + self.assertEqual(lut.name, "Color 3D LUT") + self.assertEqual(lut.table[:24], [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.125, 0.0, 0.5, 0.0, 0.25, 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125]) @@ -294,6 +294,47 @@ def test_generate(self): ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (r, g, b)) + def test_from_cube_file_minimal(self): + lut = ImageFilter.Color3DLUT.from_cube_file([ + "LUT_3D_SIZE 2", + "", + "0 0 0.031", + "0.96 0 0.031", + "0 1 0.031", + "0.96 1 0.031", + "0 0 0.931", + "0.96 0 0.931", + "0 1 0.931", + "0.96 1 0.931", + ]) + self.assertEqual(tuple(lut.size), (2, 2, 2)) + self.assertEqual(lut.name, "Color 3D LUT") + self.assertEqual(lut.table[:12], [ + 0, 0, 0.031, 0.96, 0, 0.031, 0, 1, 0.031, 0.96, 1, 0.031]) + + def test_from_cube_file_parser(self): + lut = ImageFilter.Color3DLUT.from_cube_file([ + " # Comment", + 'TITLE "LUT name from file"', + "LUT_3D_SIZE 2 3 4", + " # Comment", + "CHANNELS 4", + "", + ] + [ + " # Comment", + "0 0 0.031 1", + "0.96 0 0.031 1", + "", + "0 1 0.031 1", + "0.96 1 0.031 1", + ] * 6, target_mode='HSV') + self.assertEqual(tuple(lut.size), (2, 3, 4)) + self.assertEqual(lut.channels, 4) + self.assertEqual(lut.name, "LUT name from file") + self.assertEqual(lut.mode, 'HSV') + self.assertEqual(lut.table[:12], [ + 0, 0, 0.031, 1, 0.96, 0, 0.031, 1, 0, 1, 0.031, 1]) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index e16b47bdde1..916c24cae7c 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -17,6 +17,8 @@ import functools +from ._util import isPath + class Filter(object): pass @@ -343,7 +345,8 @@ def __init__(self, size, table, channels=3, target_mode=None): raise ValueError( "The table should have channels * size**3 float items " "either size**3 items of channels-sized tuples with floats. " - "Table length: {}".format(len(table))) + "Table size: {}x{}x{}. Table length: {}".format( + size[0], size[1], size[2], len(table))) self.table = table @staticmethod @@ -385,6 +388,58 @@ def generate(cls, size, callback, channels=3, target_mode=None): return cls((size1D, size2D, size3D), table, channels, target_mode) + @classmethod + def from_cube_file(cls, lines, target_mode=None): + name, size = None, None + channels = 3 + file = None + + if isPath(lines): + file = lines = open(lines, 'rt') + + try: + iterator = iter(lines) + + for i, line in enumerate(iterator, 1): + line = line.strip() + if not line: + break + if line.startswith('TITLE "'): + name = line.split('"')[1] + continue + if line.startswith('LUT_3D_SIZE '): + size = [int(x) for x in line.split()[1:]] + if len(size) == 1: + size = size[0] + continue + if line.startswith('CHANNELS '): + channels = int(line.split()[1]) + + if size is None: + raise ValueError('No size found in the file') + + table = [] + for i, line in enumerate(iterator, i + 1): + line = line.strip() + if not line or line.startswith('#'): + continue + try: + pixel = [float(x) for x in line.split()] + except ValueError: + raise ValueError("Not a number on line {}".format(i)) + if len(pixel) != channels: + raise ValueError( + "Wrong number of colors on line {}".format(i)) + table.append(tuple(pixel)) + finally: + if file is not None: + file.close() + + instance = cls(size, table, channels, target_mode) + if name is not None: + instance.name = name + return instance + def filter(self, image): from . import Image From e304a0d501315b95c71ea16c532216f391db240f Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 30 Mar 2018 09:57:54 +0300 Subject: [PATCH 0170/1393] add tests, fix error messages --- Tests/test_color_lut.py | 57 ++++++++++++++++++++++++++++++++++++++--- src/PIL/ImageFilter.py | 8 +++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 6d1cb23731c..96050c6fb3c 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,4 +1,5 @@ from __future__ import division +from tempfile import NamedTemporaryFile from helper import unittest, PillowTestCase from PIL import Image, ImageFilter @@ -228,10 +229,10 @@ def test_overflow(self): class TestColorLut3DFilter(PillowTestCase): def test_wrong_args(self): - with self.assertRaisesRegexp(ValueError, "should be an integer"): + with self.assertRaisesRegexp(ValueError, "should be either an integer"): ImageFilter.Color3DLUT("small", [1]) - with self.assertRaisesRegexp(ValueError, "should be an integer"): + with self.assertRaisesRegexp(ValueError, "should be either an integer"): ImageFilter.Color3DLUT((11, 11), [1]) with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): @@ -316,7 +317,8 @@ def test_from_cube_file_parser(self): lut = ImageFilter.Color3DLUT.from_cube_file([ " # Comment", 'TITLE "LUT name from file"', - "LUT_3D_SIZE 2 3 4", + " LUT_3D_SIZE 2 3 4", + " SKIP THIS", " # Comment", "CHANNELS 4", "", @@ -335,6 +337,55 @@ def test_from_cube_file_parser(self): self.assertEqual(lut.table[:12], [ 0, 0, 0.031, 1, 0.96, 0, 0.031, 1, 0, 1, 0.031, 1]) + def test_from_cube_file_errors(self): + with self.assertRaisesRegexp(ValueError, "No size found"): + lut = ImageFilter.Color3DLUT.from_cube_file([ + 'TITLE "LUT name from file"', + "", + ] + [ + "0 0 0.031", + "0.96 0 0.031", + ] * 3) + + with self.assertRaisesRegexp(ValueError, "number of colors on line 4"): + lut = ImageFilter.Color3DLUT.from_cube_file([ + 'LUT_3D_SIZE 2', + "", + ] + [ + "0 0 0.031", + "0.96 0 0.031 1", + ] * 3) + + with self.assertRaisesRegexp(ValueError, "Not a number on line 3"): + lut = ImageFilter.Color3DLUT.from_cube_file([ + 'LUT_3D_SIZE 2', + "", + ] + [ + "0 green 0.031", + "0.96 0 0.031", + ] * 3) + + def test_from_cube_file_filename(self): + with NamedTemporaryFile() as f: + f.write( + "LUT_3D_SIZE 2\n" + "\n" + "0 0 0.031\n" + "0.96 0 0.031\n" + "0 1 0.031\n" + "0.96 1 0.031\n" + "0 0 0.931\n" + "0.96 0 0.931\n" + "0 1 0.931\n" + "0.96 1 0.931\n" + ) + f.flush() + lut = ImageFilter.Color3DLUT.from_cube_file(f.name) + self.assertEqual(tuple(lut.size), (2, 2, 2)) + self.assertEqual(lut.name, "Color 3D LUT") + self.assertEqual(lut.table[:12], [ + 0, 0, 0.031, 0.96, 0, 0.031, 0, 1, 0.031, 0.96, 1, 0.031]) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 916c24cae7c..4fb3db38183 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -343,8 +343,8 @@ def __init__(self, size, table, channels=3, target_mode=None): if len(table) != channels * size[0] * size[1] * size[2]: raise ValueError( - "The table should have channels * size**3 float items " - "either size**3 items of channels-sized tuples with floats. " + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " "Table size: {}x{}x{}. Table length: {}".format( size[0], size[1], size[2], len(table))) self.table = table @@ -354,8 +354,8 @@ def _check_size(size): try: _, _, _ = size except ValueError: - raise ValueError("Size should be an integer either " - "tuple of three integers.") + raise ValueError("Size should be either an integer or " + "a tuple of three integers.") except TypeError: size = (size, size, size) size = [int(x) for x in size] From 83a5f6e5b530da16d6d7bd4cb2692ec5cefbd91c Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 30 Mar 2018 10:09:22 +0300 Subject: [PATCH 0171/1393] change file mode --- Tests/test_color_lut.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 96050c6fb3c..7b9faaa75d8 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -366,7 +366,7 @@ def test_from_cube_file_errors(self): ] * 3) def test_from_cube_file_filename(self): - with NamedTemporaryFile() as f: + with NamedTemporaryFile('w+t') as f: f.write( "LUT_3D_SIZE 2\n" "\n" From c1b956e3c84d5b8378f7529e5004a3a8517f9228 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 30 Mar 2018 10:21:01 +0300 Subject: [PATCH 0172/1393] More tests fixes for windows --- Tests/test_color_lut.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 7b9faaa75d8..fffd3341b2f 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,8 +1,10 @@ from __future__ import division + +import os from tempfile import NamedTemporaryFile -from helper import unittest, PillowTestCase from PIL import Image, ImageFilter +from helper import unittest, PillowTestCase class TestColorLut3DCoreAPI(PillowTestCase): @@ -366,7 +368,7 @@ def test_from_cube_file_errors(self): ] * 3) def test_from_cube_file_filename(self): - with NamedTemporaryFile('w+t') as f: + with NamedTemporaryFile('w+t', delete=False) as f: f.write( "LUT_3D_SIZE 2\n" "\n" @@ -379,12 +381,15 @@ def test_from_cube_file_filename(self): "0 1 0.931\n" "0.96 1 0.931\n" ) - f.flush() + + try: lut = ImageFilter.Color3DLUT.from_cube_file(f.name) self.assertEqual(tuple(lut.size), (2, 2, 2)) self.assertEqual(lut.name, "Color 3D LUT") self.assertEqual(lut.table[:12], [ 0, 0, 0.031, 0.96, 0, 0.031, 0, 1, 0.031, 0.96, 1, 0.031]) + finally: + os.unlink(f.name) if __name__ == '__main__': From 805dc447076dc580816d730d360de08917d86a9e Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 30 Mar 2018 11:29:59 +0300 Subject: [PATCH 0173/1393] improve color cube parser --- Tests/test_color_lut.py | 18 +++++++++++------- src/PIL/ImageFilter.py | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index fffd3341b2f..4aedd5b432e 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -300,7 +300,6 @@ def test_generate(self): def test_from_cube_file_minimal(self): lut = ImageFilter.Color3DLUT.from_cube_file([ "LUT_3D_SIZE 2", - "", "0 0 0.031", "0.96 0 0.031", "0 1 0.031", @@ -321,6 +320,7 @@ def test_from_cube_file_parser(self): 'TITLE "LUT name from file"', " LUT_3D_SIZE 2 3 4", " SKIP THIS", + "", " # Comment", "CHANNELS 4", "", @@ -343,25 +343,30 @@ def test_from_cube_file_errors(self): with self.assertRaisesRegexp(ValueError, "No size found"): lut = ImageFilter.Color3DLUT.from_cube_file([ 'TITLE "LUT name from file"', - "", ] + [ "0 0 0.031", "0.96 0 0.031", ] * 3) - with self.assertRaisesRegexp(ValueError, "number of colors on line 4"): + with self.assertRaisesRegexp(ValueError, "number of colors on line 3"): lut = ImageFilter.Color3DLUT.from_cube_file([ 'LUT_3D_SIZE 2', - "", ] + [ "0 0 0.031", "0.96 0 0.031 1", ] * 3) - with self.assertRaisesRegexp(ValueError, "Not a number on line 3"): + with self.assertRaisesRegexp(ValueError, "1D LUT cube files"): + lut = ImageFilter.Color3DLUT.from_cube_file([ + 'LUT_1D_SIZE 2', + ] + [ + "0 0 0.031", + "0.96 0 0.031 1", + ]) + + with self.assertRaisesRegexp(ValueError, "Not a number on line 2"): lut = ImageFilter.Color3DLUT.from_cube_file([ 'LUT_3D_SIZE 2', - "", ] + [ "0 green 0.031", "0.96 0 0.031", @@ -371,7 +376,6 @@ def test_from_cube_file_filename(self): with NamedTemporaryFile('w+t', delete=False) as f: f.write( "LUT_3D_SIZE 2\n" - "\n" "0 0 0.031\n" "0.96 0 0.031\n" "0 1 0.031\n" diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 4fb3db38183..8e193798d29 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -16,6 +16,7 @@ # import functools +from itertools import chain from ._util import isPath @@ -402,8 +403,6 @@ def from_cube_file(cls, lines, target_mode=None): for i, line in enumerate(iterator, 1): line = line.strip() - if not line: - break if line.startswith('TITLE "'): name = line.split('"')[1] continue @@ -414,12 +413,22 @@ def from_cube_file(cls, lines, target_mode=None): continue if line.startswith('CHANNELS '): channels = int(line.split()[1]) + if line.startswith('LUT_1D_SIZE '): + raise ValueError("1D LUT cube files aren't supported.") + + try: + float(line.partition(' ')[0]) + except ValueError: + pass + else: + # Data starts + break if size is None: raise ValueError('No size found in the file') table = [] - for i, line in enumerate(iterator, i + 1): + for i, line in enumerate(chain([line], iterator), i): line = line.strip() if not line or line.startswith('#'): continue From 147f835146331e249bb330a6dd57681fe7eb5f2a Mon Sep 17 00:00:00 2001 From: Kathryn Davies <19580275+kathryndavies@users.noreply.github.com> Date: Fri, 30 Mar 2018 15:42:56 -0700 Subject: [PATCH 0174/1393] Fix a resource leak: close fp before return (found by cppcheck) --- src/libImaging/File.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libImaging/File.c b/src/libImaging/File.c index d67bcabde94..d75f19d5d63 100644 --- a/src/libImaging/File.c +++ b/src/libImaging/File.c @@ -71,6 +71,7 @@ ImagingSavePPM(Imaging im, const char* outfile) fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize); } else { (void) ImagingError_ModeError(); + fclose(fp); return 0; } From 76d467245d0c66376543b5f130eab09b37c5aea4 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 31 Mar 2018 09:52:05 +0300 Subject: [PATCH 0175/1393] Release GIL --- src/libImaging/ColorLUT.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 36b87f10845..9988ad1b161 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -82,6 +82,7 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, UINT32 scale3D = (size3D - 1) / 255.0 * (1< 4) { PyErr_SetString(PyExc_ValueError, "table_channels could be 3 or 4"); @@ -101,6 +102,7 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, return (Imaging) ImagingError_ModeError(); } + ImagingSectionEnter(&cookie); for (y = 0; y < imOut->ysize; y++) { UINT8* rowIn = (UINT8 *)imIn->image[y]; UINT32* rowOut = (UINT32 *)imOut->image[y]; @@ -156,6 +158,7 @@ ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, } } } + ImagingSectionLeave(&cookie); return imOut; } From 912980c52f35e1ab4453aa29b83a4ec1c3e3d861 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 31 Mar 2018 19:55:43 +0300 Subject: [PATCH 0176/1393] =?UTF-8?q?Remove=20Color3DLUT.from=5Fcube=5Ffil?= =?UTF-8?q?e=20from=20=D1=81ore=20library?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tests/test_color_lut.py | 98 ----------------------------------------- src/PIL/ImageFilter.py | 60 ------------------------- 2 files changed, 158 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 4aedd5b432e..b6d6e441fe6 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -297,104 +297,6 @@ def test_generate(self): ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (r, g, b)) - def test_from_cube_file_minimal(self): - lut = ImageFilter.Color3DLUT.from_cube_file([ - "LUT_3D_SIZE 2", - "0 0 0.031", - "0.96 0 0.031", - "0 1 0.031", - "0.96 1 0.031", - "0 0 0.931", - "0.96 0 0.931", - "0 1 0.931", - "0.96 1 0.931", - ]) - self.assertEqual(tuple(lut.size), (2, 2, 2)) - self.assertEqual(lut.name, "Color 3D LUT") - self.assertEqual(lut.table[:12], [ - 0, 0, 0.031, 0.96, 0, 0.031, 0, 1, 0.031, 0.96, 1, 0.031]) - - def test_from_cube_file_parser(self): - lut = ImageFilter.Color3DLUT.from_cube_file([ - " # Comment", - 'TITLE "LUT name from file"', - " LUT_3D_SIZE 2 3 4", - " SKIP THIS", - "", - " # Comment", - "CHANNELS 4", - "", - ] + [ - " # Comment", - "0 0 0.031 1", - "0.96 0 0.031 1", - "", - "0 1 0.031 1", - "0.96 1 0.031 1", - ] * 6, target_mode='HSV') - self.assertEqual(tuple(lut.size), (2, 3, 4)) - self.assertEqual(lut.channels, 4) - self.assertEqual(lut.name, "LUT name from file") - self.assertEqual(lut.mode, 'HSV') - self.assertEqual(lut.table[:12], [ - 0, 0, 0.031, 1, 0.96, 0, 0.031, 1, 0, 1, 0.031, 1]) - - def test_from_cube_file_errors(self): - with self.assertRaisesRegexp(ValueError, "No size found"): - lut = ImageFilter.Color3DLUT.from_cube_file([ - 'TITLE "LUT name from file"', - ] + [ - "0 0 0.031", - "0.96 0 0.031", - ] * 3) - - with self.assertRaisesRegexp(ValueError, "number of colors on line 3"): - lut = ImageFilter.Color3DLUT.from_cube_file([ - 'LUT_3D_SIZE 2', - ] + [ - "0 0 0.031", - "0.96 0 0.031 1", - ] * 3) - - with self.assertRaisesRegexp(ValueError, "1D LUT cube files"): - lut = ImageFilter.Color3DLUT.from_cube_file([ - 'LUT_1D_SIZE 2', - ] + [ - "0 0 0.031", - "0.96 0 0.031 1", - ]) - - with self.assertRaisesRegexp(ValueError, "Not a number on line 2"): - lut = ImageFilter.Color3DLUT.from_cube_file([ - 'LUT_3D_SIZE 2', - ] + [ - "0 green 0.031", - "0.96 0 0.031", - ] * 3) - - def test_from_cube_file_filename(self): - with NamedTemporaryFile('w+t', delete=False) as f: - f.write( - "LUT_3D_SIZE 2\n" - "0 0 0.031\n" - "0.96 0 0.031\n" - "0 1 0.031\n" - "0.96 1 0.031\n" - "0 0 0.931\n" - "0.96 0 0.931\n" - "0 1 0.931\n" - "0.96 1 0.931\n" - ) - - try: - lut = ImageFilter.Color3DLUT.from_cube_file(f.name) - self.assertEqual(tuple(lut.size), (2, 2, 2)) - self.assertEqual(lut.name, "Color 3D LUT") - self.assertEqual(lut.table[:12], [ - 0, 0, 0.031, 0.96, 0, 0.031, 0, 1, 0.031, 0.96, 1, 0.031]) - finally: - os.unlink(f.name) - if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 8e193798d29..63e0d46e8d8 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -389,66 +389,6 @@ def generate(cls, size, callback, channels=3, target_mode=None): return cls((size1D, size2D, size3D), table, channels, target_mode) - @classmethod - def from_cube_file(cls, lines, target_mode=None): - name, size = None, None - channels = 3 - file = None - - if isPath(lines): - file = lines = open(lines, 'rt') - - try: - iterator = iter(lines) - - for i, line in enumerate(iterator, 1): - line = line.strip() - if line.startswith('TITLE "'): - name = line.split('"')[1] - continue - if line.startswith('LUT_3D_SIZE '): - size = [int(x) for x in line.split()[1:]] - if len(size) == 1: - size = size[0] - continue - if line.startswith('CHANNELS '): - channels = int(line.split()[1]) - if line.startswith('LUT_1D_SIZE '): - raise ValueError("1D LUT cube files aren't supported.") - - try: - float(line.partition(' ')[0]) - except ValueError: - pass - else: - # Data starts - break - - if size is None: - raise ValueError('No size found in the file') - - table = [] - for i, line in enumerate(chain([line], iterator), i): - line = line.strip() - if not line or line.startswith('#'): - continue - try: - pixel = [float(x) for x in line.split()] - except ValueError: - raise ValueError("Not a number on line {}".format(i)) - if len(pixel) != channels: - raise ValueError( - "Wrong number of colors on line {}".format(i)) - table.append(tuple(pixel)) - finally: - if file is not None: - file.close() - - instance = cls(size, table, channels, target_mode) - if name is not None: - instance.name = name - return instance - def filter(self, image): from . import Image From 8f6be2ee7d3772e705f32beafd07eef1bf5b909d Mon Sep 17 00:00:00 2001 From: Kathryn Davies <19580275+kathryndavies@users.noreply.github.com> Date: Sat, 31 Mar 2018 21:28:37 -0700 Subject: [PATCH 0177/1393] Move location of fclose and add dump test. --- Tests/test_image.py | 12 +++++++++--- src/libImaging/File.c | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 6f6d1983e39..f64ea241b8d 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -112,7 +112,6 @@ def test_unknown_extension(self): self.assertRaises(ValueError, im.save, temp_file) def test_internals(self): - im = Image.new("L", (100, 100)) im.readonly = 1 im._copy() @@ -122,8 +121,15 @@ def test_internals(self): im.paste(0, (0, 0, 100, 100)) self.assertFalse(im.readonly) - test_file = self.tempfile("temp.ppm") - im._dump(test_file) + def test_dump(self): + im = Image.new("L", (10, 10)) + im._dump(self.tempfile("temp_L.ppm")) + + im = Image.new("RGB", (10, 10)) + im._dump(self.tempfile("temp_RGB.ppm")) + + im = Image.new("HSV", (10, 10)) + self.assertRaises(ValueError, im._dump, self.tempfile("temp_HSV.ppm")) def test_comparison_with_other_type(self): # Arrange diff --git a/src/libImaging/File.c b/src/libImaging/File.c index d75f19d5d63..6f014c1f822 100644 --- a/src/libImaging/File.c +++ b/src/libImaging/File.c @@ -70,8 +70,8 @@ ImagingSavePPM(Imaging im, const char* outfile) /* Write "PPM" */ fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize); } else { - (void) ImagingError_ModeError(); fclose(fp); + (void) ImagingError_ModeError(); return 0; } From 42310381325e1cbcaa1920f32a8534a31bebc818 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 1 Apr 2018 19:52:39 +0300 Subject: [PATCH 0178/1393] Remove unused imports --- Tests/test_color_lut.py | 3 --- src/PIL/ImageFilter.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index b6d6e441fe6..f9d35c83c9b 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,8 +1,5 @@ from __future__ import division -import os -from tempfile import NamedTemporaryFile - from PIL import Image, ImageFilter from helper import unittest, PillowTestCase diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 63e0d46e8d8..93cd7ad47d9 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -16,9 +16,6 @@ # import functools -from itertools import chain - -from ._util import isPath class Filter(object): From db7d4835315fc28afa8eef7e182089de34b8c44c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Apr 2018 13:04:33 +1000 Subject: [PATCH 0179/1393] Removed winbuild gitignore --- winbuild/.gitignore | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 winbuild/.gitignore diff --git a/winbuild/.gitignore b/winbuild/.gitignore deleted file mode 100644 index adc679fa889..00000000000 --- a/winbuild/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*.zip -*.tar.gz -*.msi -*.asc -__pycache__ -depends/ \ No newline at end of file From 5a7ed2273b86738276987106941aeb65a7fc1b30 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 2 Apr 2018 10:56:39 +0100 Subject: [PATCH 0180/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b7d5486b331..1bda25ae097 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.1.0 (unreleased) ------------------ +- Close fp before return in ImagingSavePPM #3061 + [kathryndavies] + +- Added documentation for ICNS append_images #3051 + [radarhere] + - Docs: Move intro text below its header #3021 [hugovk] From 6bae24034ecf153fcddbe7776fe2a52031f462f3 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 2 Apr 2018 09:59:13 +0000 Subject: [PATCH 0181/1393] Release notes for 5.1.0 --- docs/handbook/image-file-formats.rst | 7 ++++++ docs/releasenotes/5.1.0.rst | 36 ++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 3 files changed, 44 insertions(+) create mode 100644 docs/releasenotes/5.1.0.rst diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index d265561de73..af2c7171daf 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -767,6 +767,13 @@ PIL reads and writes X bitmap files (mode ``1``). Read-only formats ----------------- +BLP +^^^ + +BLP is the Blizzard Mipmap Format is a texture format used in World of +Warcraft. Pillow supports reading ``JPEG`` Compressed or raw ``BLP1`` +images, and all types of ``BLP2`` images. + CUR ^^^ diff --git a/docs/releasenotes/5.1.0.rst b/docs/releasenotes/5.1.0.rst new file mode 100644 index 00000000000..e87bba3cb43 --- /dev/null +++ b/docs/releasenotes/5.1.0.rst @@ -0,0 +1,36 @@ +5.1.0 +----- + +New File Format +================ + +BLP File Format +^^^^^^^^^^^^^^^ + +Pillow now supports reading the BLP "Blizzard Mipmap" file format used +for tiles in Blizzard's engine. + +API Changes +=========== + +Optional channels for TIFF files +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pillow can now open TIFF files with base modes of ``RGB``, ``YCbCr``, +and ``CMYK`` with up to 6 8-bit channels, discarding any extra +channels if the content is tagged as UNSPECIFIED. Pillow still does +not store more than 4 8-bit channels of image data. + +Append to PDF Files +^^^^^^^^^^^^^^^^^^^ + +Images can now be appended to PDF files in place by passing in +``append=True`` when saving the image. + +Other Changes +============= + +WebP memory leak +^^^^^^^^^^^^^^^^ + +A memory leak when opening ``WebP`` files has been fixed. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 0ee853fca9d..ab7b097856d 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 5.1.0 5.0.0 4.3.0 4.2.1 From d74e71537e9c3ef7cfef9452d38c24632009c6cd Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 2 Apr 2018 10:21:02 +0000 Subject: [PATCH 0182/1393] typo --- docs/handbook/image-file-formats.rst | 2 +- docs/releasenotes/5.1.0.rst | 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 af2c7171daf..8ad7898abfc 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -770,7 +770,7 @@ Read-only formats BLP ^^^ -BLP is the Blizzard Mipmap Format is a texture format used in World of +BLP is the Blizzard Mipmap Format, a texture format used in World of Warcraft. Pillow supports reading ``JPEG`` Compressed or raw ``BLP1`` images, and all types of ``BLP2`` images. diff --git a/docs/releasenotes/5.1.0.rst b/docs/releasenotes/5.1.0.rst index e87bba3cb43..2a4c64ac52e 100644 --- a/docs/releasenotes/5.1.0.rst +++ b/docs/releasenotes/5.1.0.rst @@ -2,7 +2,7 @@ ----- New File Format -================ +=============== BLP File Format ^^^^^^^^^^^^^^^ From 0b578f25d54a86884c87b5e1cb0d3a14d3dfc747 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Mon, 2 Apr 2018 10:23:36 +0000 Subject: [PATCH 0183/1393] 5.1.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 1bda25ae097..88b843dee3b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,7 +2,7 @@ Changelog (Pillow) ================== -5.1.0 (unreleased) +5.1.0 (2018-04-02) ------------------ - Close fp before return in ImagingSavePPM #3061 diff --git a/src/PIL/version.py b/src/PIL/version.py index fbf87ab58dc..4f3f7030970 100644 --- a/src/PIL/version.py +++ b/src/PIL/version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.1.0.dev0' +__version__ = '5.1.0' From 8076e07acc67defdcb284ad65283f251f0934206 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Apr 2018 21:17:02 +1000 Subject: [PATCH 0184/1393] Removed 5.0.1 reference from CHANGES [ci skip] --- CHANGES.rst | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 88b843dee3b..c9986b8a54e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,7 @@ Changelog (Pillow) - Close fp before return in ImagingSavePPM #3061 [kathryndavies] - + - Added documentation for ICNS append_images #3051 [radarhere] @@ -19,12 +19,12 @@ Changelog (Pillow) - Fix TypeError for JPEG2000 parser feed #3042 [hugovk] - + - Certain corrupted jpegs can result in no data read #3023 [kkopachev] - + - Add support for BLP file format #3007 - [jleclanche] + [jleclanche] - Simplify version checks #2998 [hugovk] @@ -89,10 +89,6 @@ Changelog (Pillow) - Docs: Changed documentation references to 2.x to 2.7 #2921 [radarhere] - -5.0.1 (unreleased) ------------------- - - Fix memory leak when opening webp files #2974 [wiredfool] From 79ed02b8f4702f12f81154e9b0f6674331729bbf Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 2 Apr 2018 17:10:51 +0300 Subject: [PATCH 0185/1393] Fix _i2f compilation on some GCC versions --- src/libImaging/ImagingUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/ImagingUtils.h b/src/libImaging/ImagingUtils.h index b040fc303f4..a2f2aa8e2ec 100644 --- a/src/libImaging/ImagingUtils.h +++ b/src/libImaging/ImagingUtils.h @@ -37,7 +37,7 @@ ! 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 From e705cd1476f04a918aae34f638b502116cb12eba Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 3 Apr 2018 20:36:09 -0700 Subject: [PATCH 0186/1393] Fix dereferencing type-punned pointer will break strict-aliasing Compiler warning appeared as: src/path.c:574:22: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] Py_TYPE(&item)->tp_name); ^~~~~~~ As item is already of type PyObject*, and the Py_TYPE macro is equivalent to (((PyObject*)(o))->ob_type), no need for the dereference. https://docs.python.org/3/c-api/structures.html#c.Py_TYPE --- Tests/test_imagepath.py | 5 +++++ src/path.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py index 14cc4d14b3f..98a6d3416cf 100644 --- a/Tests/test_imagepath.py +++ b/Tests/test_imagepath.py @@ -17,6 +17,11 @@ def test_path(self): self.assertEqual(p[0], (0.0, 1.0)) self.assertEqual(p[-1], (8.0, 9.0)) self.assertEqual(list(p[:1]), [(0.0, 1.0)]) + with self.assertRaises(TypeError) as cm: + p['foo'] + self.assertEqual( + str(cm.exception), + "Path indices must be integers, not str") self.assertEqual( list(p), [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)]) diff --git a/src/path.c b/src/path.c index b56ea838e79..d1c18c8ed79 100644 --- a/src/path.c +++ b/src/path.c @@ -571,7 +571,7 @@ path_subscript(PyPathObject* self, PyObject* item) { else { PyErr_Format(PyExc_TypeError, "Path indices must be integers, not %.200s", - Py_TYPE(&item)->tp_name); + Py_TYPE(item)->tp_name); return NULL; } } From 85ff61f4dc9a77f8ad678eb992c4381644020e46 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 3 Apr 2018 20:54:41 -0700 Subject: [PATCH 0187/1393] Remove unused Python class, Path The class is always overridden by the C implementation. The Python implementation is unused. --- src/PIL/ImagePath.py | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/src/PIL/ImagePath.py b/src/PIL/ImagePath.py index 1543508e4a1..8cbfec0d306 100644 --- a/src/PIL/ImagePath.py +++ b/src/PIL/ImagePath.py @@ -17,44 +17,4 @@ from . import Image -# the Python class below is overridden by the C implementation. - - -class Path(object): - - def __init__(self, xy): - pass - - def compact(self, distance=2): - """ - Compacts the path, by removing points that are close to each other. - This method modifies the path in place. - """ - pass - - def getbbox(self): - """Gets the bounding box.""" - pass - - def map(self, function): - """Maps the path through a function.""" - pass - - def tolist(self, flat=0): - """ - Converts the path to Python list. - # - @param flat By default, this function returns a list of 2-tuples - [(x, y), ...]. If this argument is true, it returns a flat list - [x, y, ...] instead. - @return A list of coordinates. - """ - pass - - def transform(self, matrix): - """Transforms the path.""" - pass - - -# override with C implementation Path = Image.core.path From 86f3971252d7ee1019758809de7034f386d78fca Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Wed, 4 Apr 2018 04:41:51 -0700 Subject: [PATCH 0188/1393] Add new Pytest cache directory to gitignore Starting with Pytest 3.4.0 (2018-01-30), Pytest's cache directory was renamed to .pytest_cache. https://docs.pytest.org/en/latest/changelog.html#pytest-3-4-0-2018-01-30 > The default cache directory has been renamed from .cache to > .pytest_cache after community feedback that the name .cache did not > make it clear that it was used by pytest. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 242f50845a2..57494ded8db 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ htmlcov/ .tox/ .coverage .cache +.pytest_cache nosetests.xml coverage.xml From b56fe11086bd0b126ea52e259f1cedd162aa9011 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Wed, 4 Apr 2018 05:25:59 -0700 Subject: [PATCH 0189/1393] Remove unnecessary `#if 1` directive The preprocessor directive `#if 1` always evaluates as true, so the enclosed code is always compiled. The directive has existed since the original fork from PIL, 9a640e3157150e35f17354517e8c6304fc428060. --- src/libImaging/Draw.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 3fae3d931e5..69cd884447a 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -872,8 +872,6 @@ ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, semantics are ok, except that "curve" flattens the bezier curves by itself */ -#if 1 /* ARROW_GRAPHICS */ - struct ImagingOutlineInstance { float x0, y0; @@ -1102,5 +1100,3 @@ ImagingDrawOutline(Imaging im, ImagingOutline outline, const void* ink_, return 0; } - -#endif From 7a4bfdc9554e3e1a449ad6e265ad1eb99220d20d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 5 Apr 2018 06:29:14 +1000 Subject: [PATCH 0190/1393] Updated URL --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4a0ad86c529..b51de41d02a 100755 --- a/setup.py +++ b/setup.py @@ -763,7 +763,7 @@ def debug_build(): long_description=_read('README.rst').decode('utf-8'), author='Alex Clark (Fork Author)', author_email='aclark@aclark.net', - url='https://python-pillow.org', + url='http://python-pillow.org', classifiers=[ "Development Status :: 6 - Mature", "Topic :: Multimedia :: Graphics", From b33f1a44771e09ca1623955f2d91a5381e88d98d Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Apr 2018 11:46:44 +0300 Subject: [PATCH 0191/1393] Update CHANGES.rst --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index c9986b8a54e..75addae7e28 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,21 @@ Changelog (Pillow) ================== +5.2.0 (unreleased) +------------------ + +- Enabling background colour parameter on rotate #3057 + [storesource] + +- Remove unnecessary `#if 1` directive #3072 + [jdufresne] + +- Remove unused Python class, Path #3070 + [jdufresne] + +- Fix dereferencing type-punned pointer will break strict-aliasing #3069 + [jdufresne] + 5.1.0 (2018-04-02) ------------------ From e25df9d65fa0ef5e9f21124a6b756f8ebc92550f Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Apr 2018 12:02:19 +0300 Subject: [PATCH 0192/1393] Tabs to spaces, no other changes --- src/Tk/tkImaging.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Tk/tkImaging.c b/src/Tk/tkImaging.c index f448be16637..02cf5e1587b 100644 --- a/src/Tk/tkImaging.c +++ b/src/Tk/tkImaging.c @@ -16,7 +16,7 @@ * following lines to your Tcl_AppInit function (in tkappinit.c) * instead. Put them after the calls to Tcl_Init and Tk_Init: * - * { + * { * extern void TkImaging_Init(Tcl_Interp* interp); * TkImaging_Init(interp); * } @@ -69,7 +69,7 @@ ImagingFind(const char* name) id = atol(name); #endif if (!id) - return NULL; + return NULL; return (Imaging) id; } @@ -112,32 +112,32 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, /* Active region */ #if 0 if (src_xoffset + xsize > im->xsize) - xsize = im->xsize - src_xoffset; + xsize = im->xsize - src_xoffset; if (src_yoffset + ysize > im->ysize) - ysize = im->ysize - src_yoffset; + ysize = im->ysize - src_yoffset; if (xsize < 0 || ysize < 0 - || src_xoffset >= im->xsize - || src_yoffset >= im->ysize) - return TCL_OK; + || src_xoffset >= im->xsize + || src_yoffset >= im->ysize) + return TCL_OK; #endif /* Mode */ if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { - block.pixelSize = 1; - block.offset[0] = block.offset[1] = block.offset[2] = 0; + block.pixelSize = 1; + block.offset[0] = block.offset[1] = block.offset[2] = 0; } else if (strncmp(im->mode, "RGB", 3) == 0) { - block.pixelSize = 4; - block.offset[0] = 0; - block.offset[1] = 1; - block.offset[2] = 2; + block.pixelSize = 4; + block.offset[0] = 0; + block.offset[1] = 1; + block.offset[2] = 2; if (strcmp(im->mode, "RGBA") == 0) block.offset[3] = 3; /* alpha (or reserved, under 8.2) */ else block.offset[3] = 0; /* no alpha */ } else { TCL_APPEND_RESULT(interp, "Bad mode", (char*) NULL); - return TCL_ERROR; + return TCL_ERROR; } block.width = im->xsize; @@ -146,8 +146,8 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, block.pixelPtr = (unsigned char*) im->block; #if 0 block.pixelPtr = (unsigned char*) im->block + - src_yoffset * im->linesize + - src_xoffset * im->pixelsize; + src_yoffset * im->linesize + + src_xoffset * im->pixelsize; #endif if (TK_LT_85) { /* Tk 8.4 */ From 429c4bf30a36f806005e7960adffd0f64fd690e7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Apr 2018 12:20:21 +0300 Subject: [PATCH 0193/1393] Remove unnecessary '#if 0' code --- src/Tk/tkImaging.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/Tk/tkImaging.c b/src/Tk/tkImaging.c index 02cf5e1587b..66e093faecc 100644 --- a/src/Tk/tkImaging.c +++ b/src/Tk/tkImaging.c @@ -109,18 +109,6 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, return TCL_ERROR; } - /* Active region */ -#if 0 - if (src_xoffset + xsize > im->xsize) - xsize = im->xsize - src_xoffset; - if (src_yoffset + ysize > im->ysize) - ysize = im->ysize - src_yoffset; - if (xsize < 0 || ysize < 0 - || src_xoffset >= im->xsize - || src_yoffset >= im->ysize) - return TCL_OK; -#endif - /* Mode */ if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { @@ -144,11 +132,6 @@ PyImagingPhotoPut(ClientData clientdata, Tcl_Interp* interp, block.height = im->ysize; block.pitch = im->linesize; block.pixelPtr = (unsigned char*) im->block; -#if 0 - block.pixelPtr = (unsigned char*) im->block + - src_yoffset * im->linesize + - src_xoffset * im->pixelsize; -#endif if (TK_LT_85) { /* Tk 8.4 */ TK_PHOTO_PUT_BLOCK_84(photo, &block, 0, 0, block.width, block.height, From fe0b78b98d3bb744077421edc6aa335f8352601a Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Apr 2018 13:52:48 +0300 Subject: [PATCH 0194/1393] Support Python 3.7 --- .travis.yml | 4 ++-- docs/installation.rst | 6 ++++-- setup.py | 3 ++- tox.ini | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index cc06084a50c..9e306d6a6a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,12 +13,12 @@ matrix: include: - python: "pypy" - python: "pypy3" - - python: '3.6' + - python: '3.7-dev' - python: '2.7' - python: "2.7_with_system_site_packages" # For PyQt4 + - python: '3.6' - python: '3.5' - python: '3.4' - - python: '3.7-dev' - env: DOCKER="alpine" DOCKER_TAG="pytest" - env: DOCKER="arch" DOCKER_TAG="pytest" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" DOCKER_TAG="pytest" diff --git a/docs/installation.rst b/docs/installation.rst index 0371e517b26..86be0218c1c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -19,7 +19,9 @@ Notes .. note:: Pillow >= 4.0.0 < 5.0.0 supports Python versions 2.7, 3.3, 3.4, 3.5, 3.6 -.. note:: Pillow >= 5.0.0 supports Python versions 2.7, 3.4, 3.5, 3.6 +.. note:: Pillow >= 5.0.0 < 5.2.0 supports Python versions 2.7, 3.4, 3.5, 3.6 + +.. note:: Pillow >= 5.2.0 supports Python versions 2.7, 3.4, 3.5, 3.6, 3.7 Basic Installation ------------------ @@ -392,7 +394,7 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 16.04 LTS | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ -| Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, |x86-64 | +| Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, 3.7, |x86-64 | | | pypy, pypy3 | | | +-------------------------------+-----------------------+ | | 2.7 |x86 | diff --git a/setup.py b/setup.py index b51de41d02a..4d88237f011 100755 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ import mp_compile -if sys.platform == "win32" and sys.version_info >= (3, 7): +if sys.platform == "win32" and sys.version_info >= (3, 8): warnings.warn( "Pillow does not yet support Python {}.{} and does not yet provide " "prebuilt Windows binaries. We do not recommend building from " @@ -778,6 +778,7 @@ def debug_build(): "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ], diff --git a/tox.ini b/tox.ini index fdfc5ea5620..1226619db11 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py27, py34, py35, py36 +envlist = py27, py34, py35, py36, py37 [testenv] commands = From c88659245a18c520a3ca2268ea9060d306803257 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Apr 2018 13:52:58 +0300 Subject: [PATCH 0195/1393] Add release notes --- docs/releasenotes/5.2.0.rst | 21 +++++++++++++++++++++ docs/releasenotes/index.rst | 1 + 2 files changed, 22 insertions(+) create mode 100644 docs/releasenotes/5.2.0.rst diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst new file mode 100644 index 00000000000..bf917ad46ba --- /dev/null +++ b/docs/releasenotes/5.2.0.rst @@ -0,0 +1,21 @@ +5.0.0 +----- + +API Additions +============= + +Image.rotate +^^^^^^^^^^^^ + +A new named parameter, ``fillcolor``, has been added to ``Image.rotate``. This +color specifies the background color to use in the area outside the rotated +image. This parameter takes the same color specifications as used in +``Image.new``. + +Other Changes +============= + +Support added for Python 3.7 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pillow 5.2 supports Python 3.7. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index ab7b097856d..16e5c1d85c9 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 5.2.0 5.1.0 5.0.0 4.3.0 From 8753c10b7a8d2461224b33e336b4df9dc222b689 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 6 Apr 2018 23:57:25 +0300 Subject: [PATCH 0196/1393] Update version --- docs/releasenotes/5.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index bf917ad46ba..073daaf03de 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -1,4 +1,4 @@ -5.0.0 +5.2.0 ----- API Additions From 6958ce1700a751581e2b749dceec843101de3c1d Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 9 Apr 2018 16:09:36 +0300 Subject: [PATCH 0197/1393] Rename PIL.version to PIL._version and remove it from module --- RELEASING.md | 4 ++-- setup.py | 2 +- src/PIL/__init__.py | 6 +++--- src/PIL/{version.py => _version.py} | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename src/PIL/{version.py => _version.py} (50%) diff --git a/RELEASING.md b/RELEASING.md index d72401bd58c..fe9f7d0b17c 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,7 +8,7 @@ Released quarterly on the first day of January, April, July, October. * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](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 TravisCI. -* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in `PIL/version.py` +* [ ] In compliance with 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. * [ ] Create branch and tag for release e.g.: @@ -38,7 +38,7 @@ Released as needed for security, installation or critical bug fixes. ``` git checkout -t remotes/origin/2.9.x ``` -* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in `PIL/version.py` +* [ ] In compliance with 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/setup.py b/setup.py index f4dbbb62da5..a36619d01a6 100755 --- a/setup.py +++ b/setup.py @@ -122,7 +122,7 @@ def _read(file): def get_version(): - version_file = 'src/PIL/version.py' + version_file = 'src/PIL/_version.py' with open(version_file, 'r') as f: exec(compile(f.read(), version_file, 'exec')) return locals()['__version__'] diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index 76188a0a39f..012586fa453 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -11,12 +11,12 @@ # ;-) -from . import version +from . import _version VERSION = '1.1.7' # PIL Version -PILLOW_VERSION = version.__version__ +PILLOW_VERSION = __version__ = _version.__version__ -__version__ = PILLOW_VERSION +del _version _plugins = ['BlpImagePlugin', 'BmpImagePlugin', diff --git a/src/PIL/version.py b/src/PIL/_version.py similarity index 50% rename from src/PIL/version.py rename to src/PIL/_version.py index 4f3f7030970..959ab028648 100644 --- a/src/PIL/version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.1.0' +__version__ = '5.2.0.dev0' From 05c78a13e73d98befcffdfb351ac4dbad5e60b2e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 11 Apr 2018 08:57:31 +1000 Subject: [PATCH 0198/1393] Changed encoderinfo to have priority over info when saving GIF images --- Tests/test_file_gif.py | 5 ++++- src/PIL/GifImagePlugin.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index c8f3836fc5f..b1006a63044 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -305,9 +305,12 @@ def test_duration(self): out = self.tempfile('temp.gif') im = Image.new('L', (100, 100), '#000') + + # Check that the argument has priority over the info settings + im.info['duration'] = 100 im.save(out, duration=duration) - reread = Image.open(out) + reread = Image.open(out) self.assertEqual(reread.info['duration'], duration) def test_multiple_duration(self): diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index c01adff88f0..1bfbb5ffdd5 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -457,7 +457,8 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): - im.encoderinfo.update(im.info) + for k, v in im.info.items(): + im.encoderinfo.setdefault(k, v) # header try: palette = im.encoderinfo["palette"] From 032027303fa9af94d6c7cbffabeaf97ae7d0949a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 11 Apr 2018 13:46:42 +1000 Subject: [PATCH 0199/1393] Fixed typo --- src/libImaging/ColorLUT.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libImaging/ColorLUT.c b/src/libImaging/ColorLUT.c index 9988ad1b161..46b00142b41 100644 --- a/src/libImaging/ColorLUT.c +++ b/src/libImaging/ColorLUT.c @@ -49,8 +49,8 @@ table_index3D(int index1D, int index2D, int index3D, /* Transforms colors of imIn using provided 3D lookup table - and puts the result in imOut. Returns imOut on sucess or 0 on error. - + and puts the result in imOut. Returns imOut on success or 0 on error. + imOut, imIn — images, should be the same size and may be the same image. Should have 3 or 4 channels. table_channels — number of channels in the lookup table, 3 or 4. @@ -61,7 +61,7 @@ table_index3D(int index1D, int index2D, int index3D, where channels are changed first, then 1D, then​ 2D, then 3D. Each element is signed 16-bit int where 0 is lowest output value and 255 << PRECISION_BITS (16320) is highest value. -*/ +*/ Imaging ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, int size1D, int size2D, int size3D, From 25a5f95d21eed555a30fc23b9221c687eda83ec6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 13:36:48 +0300 Subject: [PATCH 0200/1393] Add Color3DLUT to docs --- docs/reference/ImageFilter.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/reference/ImageFilter.rst b/docs/reference/ImageFilter.rst index 5275329ab51..099de0c31c7 100644 --- a/docs/reference/ImageFilter.rst +++ b/docs/reference/ImageFilter.rst @@ -37,12 +37,13 @@ image enhancement filters: * **SMOOTH** * **SMOOTH_MORE** -.. autoclass:: PIL.ImageFilter.GaussianBlur +.. autoclass:: PIL.ImageFilter.Color3DLUT .. autoclass:: PIL.ImageFilter.BoxBlur -.. autoclass:: PIL.ImageFilter.UnsharpMask +.. autoclass:: PIL.ImageFilter.GaussianBlur .. autoclass:: PIL.ImageFilter.Kernel -.. autoclass:: PIL.ImageFilter.RankFilter .. autoclass:: PIL.ImageFilter.MedianFilter .. autoclass:: PIL.ImageFilter.MinFilter .. autoclass:: PIL.ImageFilter.MaxFilter .. autoclass:: PIL.ImageFilter.ModeFilter +.. autoclass:: PIL.ImageFilter.RankFilter +.. autoclass:: PIL.ImageFilter.UnsharpMask From 162b21bb752ca1b34934151abb27d4c83609182b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 15:28:01 +0300 Subject: [PATCH 0201/1393] Update CHANGES.rst [CI skip] --- CHANGES.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 75addae7e28..18e7527b7b0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,13 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ -- Enabling background colour parameter on rotate #3057 +- Changed encoderinfo to have priority over info when saving GIF images #3086 + [radarhere] + +- Rename PIL.version to PIL._version and remove it from module #3083 + [homm] + +- Enable background colour parameter on rotate #3057 [storesource] - Remove unnecessary `#if 1` directive #3072 @@ -194,7 +200,7 @@ Changelog (Pillow) - Add eog support for Ubuntu Image Viewer #2864 [NafisFaysal] -- Test: Test on 3.7-dev on Travis.ci #2870 +- Test: Test on 3.7-dev on Travis CI #2870 [hugovk] - Dependencies: Update libtiff to 4.0.9 #2871 @@ -515,7 +521,7 @@ Changelog (Pillow) - Doc: Clarified Image.save:append_images documentation #2604 [radarhere] -- CI: Amazon Linux and Centos6 docker images added to TravisCI #2585 +- CI: Amazon Linux and Centos6 docker images added to Travis CI #2585 [wiredfool] - Image.alpha_composite added #2595 @@ -584,7 +590,7 @@ Changelog (Pillow) - Update Feature Detection #2520 [wiredfool] -- CI: Update pypy on TravisCI #2573 +- CI: Update pypy on Travis CI #2573 [hugovk] - ImageMorph: Fix wrong expected size of MRLs read from disk #2561 From dcb37dd1f15562190d06898b6ee64b1dc3e0282d Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 13:37:34 +0300 Subject: [PATCH 0202/1393] new method alter(); 3 times faster generate() --- src/PIL/ImageFilter.py | 51 +++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 93cd7ad47d9..d7801bedb7b 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -15,6 +15,8 @@ # See the README file for information on usage and redistribution. # +from __future__ import division + import functools @@ -323,12 +325,16 @@ class Color3DLUT(MultibandFilter): """ name = "Color 3D LUT" - def __init__(self, size, table, channels=3, target_mode=None): + def __init__(self, size, table, channels=3, target_mode=None, **kwargs): self.size = size = self._check_size(size) self.channels = channels self.mode = target_mode - table = list(table) + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + if kwargs.get('_copy_table', True): + table = list(table) + # Convert to a flat list if table and isinstance(table[0], (list, tuple)): table, raw_table = [], table @@ -371,20 +377,45 @@ def generate(cls, size, callback, channels=3, target_mode=None): three color channels. Will be called ``size**3`` times with values from 0.0 to 1.0 and should return a tuple with ``channels`` elements. - :param channels: Passed to the constructor. + :param channels: The number of channels which should return callback. :param target_mode: Passed to the constructor. """ size1D, size2D, size3D = cls._check_size(size) - table = [] + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + + table = [0] * (size1D * size2D * size3D * channels) + idx_out = 0 for b in range(size3D): for g in range(size2D): for r in range(size1D): - table.append(callback( - r / float(size1D-1), - g / float(size2D-1), - b / float(size3D-1))) - - return cls((size1D, size2D, size3D), table, channels, target_mode) + table[idx_out:idx_out + channels] = callback( + r / (size1D-1), g / (size2D-1), b / (size3D-1)) + idx_out += channels + + return cls((size1D, size2D, size3D), table, channels=channels, + target_mode=target_mode, _copy_table=False) + + def alter(self, callback, channels=None, target_mode=None): + if channels not in (None, 3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + ch_in = self.channels + ch_out = channels or ch_in + + table = [0] * (self.size[0] * self.size[1] * self.size[2] * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(self.size[2]): + for g in range(self.size[1]): + for r in range(self.size[0]): + values = callback(*self.table[idx_in:idx_in + ch_in]) + table[idx_out:idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)(self.size, table, channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False) def filter(self, image): from . import Image From 70c453b8571691eb69fe8a442b7c269f8508cf6d Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 16:17:10 +0300 Subject: [PATCH 0203/1393] rename alter() to transform() add with_normals argument docstring --- Tests/test_color_lut.py | 4 ++-- src/PIL/ImageFilter.py | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index f9d35c83c9b..575e32354b5 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -287,10 +287,10 @@ def test_generate(self): 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.125, 0.0, 0.5, 0.0, 0.25, 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125]) - with self.assertRaisesRegexp(ValueError, "should have a length of 3"): + with self.assertRaisesRegexp(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) - with self.assertRaisesRegexp(ValueError, "should have a length of 4"): + with self.assertRaisesRegexp(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (r, g, b)) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index d7801bedb7b..ec09552fa64 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -378,7 +378,8 @@ def generate(cls, size, callback, channels=3, target_mode=None): times with values from 0.0 to 1.0 and should return a tuple with ``channels`` elements. :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor. + :param target_mode: Passed to the constructor of the resulted + lookup table. """ size1D, size2D, size3D = cls._check_size(size) if channels not in (3, 4): @@ -396,19 +397,43 @@ def generate(cls, size, callback, channels=3, target_mode=None): return cls((size1D, size2D, size3D), table, channels=channels, target_mode=target_mode, _copy_table=False) - def alter(self, callback, channels=None, target_mode=None): + def transform(self, callback, with_normals=False, channels=None, + target_mode=None): + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new. The number of arguments which + function should take is ``self.channels`` or + ``3 + self.channels`` if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual values of colors. + :param channels: Number of colors in the resulted lookup table. + :param target_mode: Passed to the constructor of the resulted + lookup table. + """ if channels not in (None, 3, 4): raise ValueError("Only 3 or 4 output channels are supported") ch_in = self.channels ch_out = channels or ch_in + size1D, size2D, size3D = self.size - table = [0] * (self.size[0] * self.size[1] * self.size[2] * ch_out) + table = [0] * (size1D * size2D * size3D * ch_out) idx_in = 0 idx_out = 0 - for b in range(self.size[2]): - for g in range(self.size[1]): - for r in range(self.size[0]): - values = callback(*self.table[idx_in:idx_in + ch_in]) + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + values = self.table[idx_in:idx_in + ch_in] + if with_normals: + values = callback(r / (size1D-1), g / (size2D-1), + b / (size3D-1), *values) + else: + values = callback(*values) table[idx_out:idx_out + ch_out] = values idx_in += ch_in idx_out += ch_out From acfd4845c6b5debbe7a2a1f6c858cdb2ed8039b6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 17:05:48 +0300 Subject: [PATCH 0204/1393] tests --- Tests/test_color_lut.py | 180 +++++++++++++++++++++++++++++++--------- 1 file changed, 142 insertions(+), 38 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 575e32354b5..c9c71bc80fb 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -5,7 +5,7 @@ class TestColorLut3DCoreAPI(PillowTestCase): - def generate_unit_table(self, channels, size): + def generate_identity_table(self, channels, size): if isinstance(size, tuple): size1D, size2D, size3D = size else: @@ -32,31 +32,31 @@ def test_wrong_args(self): with self.assertRaisesRegexp(ValueError, "filter"): im.im.color_lut_3d('RGB', Image.CUBIC, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "image mode"): im.im.color_lut_3d('wrong', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(5, 3)) + *self.generate_identity_table(5, 3)) with self.assertRaisesRegexp(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(1, 3)) + *self.generate_identity_table(1, 3)) with self.assertRaisesRegexp(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(2, 3)) + *self.generate_identity_table(2, 3)) with self.assertRaisesRegexp(ValueError, "Table size"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (1, 3, 3))) + *self.generate_identity_table(3, (1, 3, 3))) with self.assertRaisesRegexp(ValueError, "Table size"): im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (66, 3, 3))) + *self.generate_identity_table(3, (66, 3, 3))) with self.assertRaisesRegexp(ValueError, r"size1D \* size2D \* size3D"): im.im.color_lut_3d('RGB', Image.LINEAR, @@ -70,67 +70,67 @@ def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) im.im.color_lut_3d('CMYK', Image.LINEAR, - *self.generate_unit_table(4, 3)) + *self.generate_identity_table(4, 3)) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (2, 3, 3))) + *self.generate_identity_table(3, (2, 3, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (65, 3, 3))) + *self.generate_identity_table(3, (65, 3, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (3, 65, 3))) + *self.generate_identity_table(3, (3, 65, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (3, 3, 65))) + *self.generate_identity_table(3, (3, 3, 65))) def test_wrong_mode(self): with self.assertRaisesRegexp(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegexp(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(4, 3)) + *self.generate_identity_table(4, 3)) def test_correct_mode(self): im = Image.new('RGBA', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) im = Image.new('RGBA', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(4, 3)) + *self.generate_identity_table(4, 3)) im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('HSV', Image.LINEAR, - *self.generate_unit_table(3, 3)) + *self.generate_identity_table(3, 3)) im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(4, 3)) + *self.generate_identity_table(4, 3)) - def test_units(self): + def test_identities(self): g = Image.linear_gradient('L') im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), g.transpose(Image.ROTATE_180)]) @@ -139,14 +139,14 @@ def test_units(self): for size in [2, 3, 5, 7, 11, 16, 17]: self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, size)))) + *self.generate_identity_table(3, size)))) # Not so fast self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_unit_table(3, (2, 2, 65))))) + *self.generate_identity_table(3, (2, 2, 65))))) - def test_units_4channels(self): + def test_identities_4_channels(self): g = Image.linear_gradient('L') im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), g.transpose(Image.ROTATE_180)]) @@ -155,7 +155,7 @@ def test_units_4channels(self): self.assert_image_equal( Image.merge('RGBA', (im.split()*2)[:4]), im._new(im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(4, 17)))) + *self.generate_identity_table(4, 17)))) def test_copy_alpha_channel(self): g = Image.linear_gradient('L') @@ -165,7 +165,7 @@ def test_copy_alpha_channel(self): self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_unit_table(3, 17)))) + *self.generate_identity_table(3, 17)))) def test_channels_order(self): g = Image.linear_gradient('L') @@ -266,7 +266,17 @@ def test_convert_table(self): lut = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, channels=4) - def test_generate(self): + +class TestGenerateColorLut3D(PillowTestCase): + def test_wrong_channels_count(self): + with self.assertRaisesRegexp(ValueError, "should have either channels"): + ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) + + with self.assertRaisesRegexp(ValueError, "should have either channels"): + ImageFilter.Color3DLUT.generate(5, channels=4, + callback=lambda r, g, b: (r, g, b)) + + def test_3_channels(self): lut = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) self.assertEqual(tuple(lut.size), (5, 5, 5)) self.assertEqual(lut.name, "Color 3D LUT") @@ -274,11 +284,7 @@ def test_generate(self): 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.5, 0.0, 0.0, 0.75, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0]) - g = Image.linear_gradient('L') - im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), - g.transpose(Image.ROTATE_180)]) - self.assertEqual(im, im.filter(lut)) - + def test_4_channels(self): lut = ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) self.assertEqual(tuple(lut.size), (5, 5, 5)) @@ -287,12 +293,110 @@ def test_generate(self): 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.125, 0.0, 0.5, 0.0, 0.25, 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125]) + def test_apply(self): + lut = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) + + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + self.assertEqual(im, im.filter(lut)) + + +class TestTransformColorLut3D(PillowTestCase): + def test_wrong_args(self): + source = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) + + with self.assertRaisesRegexp(ValueError, "Only 3 or 4 output"): + source.transform(lambda r, g, b: (r, g, b), channels=8) + with self.assertRaisesRegexp(ValueError, "should have either channels"): - ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) + source.transform(lambda r, g, b: (r, g, b), channels=4) with self.assertRaisesRegexp(ValueError, "should have either channels"): - ImageFilter.Color3DLUT.generate(5, channels=4, - callback=lambda r, g, b: (r, g, b)) + source.transform(lambda r, g, b: (r, g, b, 1)) + + with self.assertRaisesRegexp(TypeError, "takes exactly 4 arguments"): + source.transform(lambda r, g, b, a: (r, g, b)) + + def test_target_mode(self): + source = ImageFilter.Color3DLUT.generate( + 2, lambda r, g, b: (r, g, b), target_mode='HSV') + + lut = source.transform(lambda r, g, b: (r, g, b)) + self.assertEqual(lut.mode, 'HSV') + + lut = source.transform(lambda r, g, b: (r, g, b), target_mode='RGB') + self.assertEqual(lut.mode, 'RGB') + + def test_3_to_3_channels(self): + source = ImageFilter.Color3DLUT.generate( + (3, 4, 5), lambda r, g, b: (r, g, b)) + lut = source.transform(lambda r, g, b: (r*r, g*g, b*b)) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:10], [ + 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]) + + def test_3_to_4_channels(self): + source = ImageFilter.Color3DLUT.generate( + (6, 5, 4), lambda r, g, b: (r, g, b)) + lut = source.transform(lambda r, g, b: (r*r, g*g, b*b, 1), channels=4) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertNotEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:16], [ + 0.0, 0.0, 0.0, 1, 0.2**2, 0.0, 0.0, 1, + 0.4**2, 0.0, 0.0, 1, 0.6**2, 0.0, 0.0, 1]) + + def test_4_to_3_channels(self): + source = ImageFilter.Color3DLUT.generate( + (3, 6, 5), lambda r, g, b: (r, g, b, 1), channels=4) + lut = source.transform(lambda r, g, b, a: (a - r*r, a - g*g, a - b*b), + channels=3) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertNotEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:18], [ + 1.0, 1.0, 1.0, 0.75, 1.0, 1.0, 0.0, 1.0, 1.0, + 1.0, 0.96, 1.0, 0.75, 0.96, 1.0, 0.0, 0.96, 1.0]) + + def test_4_to_4_channels(self): + source = ImageFilter.Color3DLUT.generate( + (6, 5, 4), lambda r, g, b: (r, g, b, 1), channels=4) + lut = source.transform(lambda r, g, b, a: (r*r, g*g, b*b, a - 0.5)) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:16], [ + 0.0, 0.0, 0.0, 0.5, 0.2**2, 0.0, 0.0, 0.5, + 0.4**2, 0.0, 0.0, 0.5, 0.6**2, 0.0, 0.0, 0.5]) + + def test_with_normals_3_channels(self): + source = ImageFilter.Color3DLUT.generate( + (6, 5, 4), lambda r, g, b: (r*r, g*g, b*b)) + lut = source.transform( + lambda nr, ng, nb, r, g, b: (nr - r, ng - g, nb - b), + with_normals=True) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:18], [ + 0.0, 0.0, 0.0, 0.16, 0.0, 0.0, 0.24, 0.0, 0.0, + 0.24, 0.0, 0.0, 0.8 - (0.8**2), 0, 0, 0, 0, 0]) + + def test_with_normals_4_channels(self): + source = ImageFilter.Color3DLUT.generate( + (3, 6, 5), lambda r, g, b: (r*r, g*g, b*b, 1), channels=4) + lut = source.transform( + lambda nr, ng, nb, r, g, b, a: (nr - r, ng - g, nb - b, a-0.5), + with_normals=True) + self.assertEqual(tuple(lut.size), tuple(source.size)) + self.assertEqual(len(lut.table), len(source.table)) + self.assertNotEqual(lut.table, source.table) + self.assertEqual(lut.table[0:16], [ + 0.0, 0.0, 0.0, 0.5, 0.25, 0.0, 0.0, 0.5, + 0.0, 0.0, 0.0, 0.5, 0.0, 0.16, 0.0, 0.5]) if __name__ == '__main__': From ecd0e5e15e4428be2ebc0d9dc04bb1828188d3af Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 17:31:41 +0300 Subject: [PATCH 0205/1393] check exception type only --- Tests/test_color_lut.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index c9c71bc80fb..9de2cf245f2 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -315,7 +315,7 @@ def test_wrong_args(self): with self.assertRaisesRegexp(ValueError, "should have either channels"): source.transform(lambda r, g, b: (r, g, b, 1)) - with self.assertRaisesRegexp(TypeError, "takes exactly 4 arguments"): + with self.assertRaises(TypeError): source.transform(lambda r, g, b, a: (r, g, b)) def test_target_mode(self): From fb1d25417ec67e0850dd13b204b802d689604bbe Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 11 Apr 2018 20:55:35 +0300 Subject: [PATCH 0206/1393] test for wrong channels number in generate --- Tests/test_color_lut.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 9de2cf245f2..505f4229a1b 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -269,6 +269,10 @@ def test_convert_table(self): class TestGenerateColorLut3D(PillowTestCase): def test_wrong_channels_count(self): + with self.assertRaisesRegexp(ValueError, "3 or 4 output channels"): + ImageFilter.Color3DLUT.generate(5, channels=2, + callback=lambda r, g, b: (r, g, b)) + with self.assertRaisesRegexp(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) From 75c76d91e18e56c7cfccca7016d7508235c7046b Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 11:54:54 +0300 Subject: [PATCH 0207/1393] Add repr for Color3DLUT --- Tests/test_color_lut.py | 14 +++++++++++++- src/PIL/ImageFilter.py | 9 +++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 505f4229a1b..9477bea4faa 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,5 +1,7 @@ from __future__ import division +from array import array + from PIL import Image, ImageFilter from helper import unittest, PillowTestCase @@ -264,8 +266,18 @@ def test_convert_table(self): self.assertEqual(lut.table, list(range(24))) lut = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, - channels=4) + channels=4) + def test_repr(self): + lut = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) + self.assertEqual(repr(lut), + "") + + lut = ImageFilter.Color3DLUT( + (3, 4, 5), array('f', [0, 0, 0, 0] * (3 * 4 * 5)), + channels=4, target_mode='YCbCr', _copy_table=False) + self.assertEqual(repr(lut), + "") class TestGenerateColorLut3D(PillowTestCase): def test_wrong_channels_count(self): diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index ec09552fa64..8c2eb9a87e3 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -442,6 +442,15 @@ def transform(self, callback, with_normals=False, channels=None, target_mode=target_mode or self.mode, _copy_table=False) + def __repr__(self): + r = ["{0} from {1}".format(self.__class__.__name__, + self.table.__class__.__name__)] + r.append("size={0}x{1}x{2}".format(*self.size)) + r.append("channels={0}".format(self.channels)) + if self.mode: + r.append("target_mode={0}".format(self.mode)) + return "<{}>".format(" ".join(r)) + def filter(self, image): from . import Image From 1a371e572c9e5bf6a84bd5a078032e0f1d9fe5a1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 12:10:00 +0300 Subject: [PATCH 0208/1393] update repr method --- 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 8c2eb9a87e3..6ba0ff6e73d 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -443,12 +443,14 @@ def transform(self, callback, with_normals=False, channels=None, _copy_table=False) def __repr__(self): - r = ["{0} from {1}".format(self.__class__.__name__, - self.table.__class__.__name__)] - r.append("size={0}x{1}x{2}".format(*self.size)) - r.append("channels={0}".format(self.channels)) + r = [ + "{} from {}".format(self.__class__.__name__, + self.table.__class__.__name__), + "size={:d}x{:d}x{:d}".format(*self.size), + "channels={:d}".format(self.channels), + ] if self.mode: - r.append("target_mode={0}".format(self.mode)) + r.append("target_mode={}".format(self.mode)) return "<{}>".format(" ".join(r)) def filter(self, image): From bdd8dc40f67c4bf317efdf74dc5498c565257807 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 12:20:59 +0300 Subject: [PATCH 0209/1393] Return RankFilter and UnsharpMask order [ci skip] --- docs/reference/ImageFilter.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageFilter.rst b/docs/reference/ImageFilter.rst index 099de0c31c7..3368f799fb6 100644 --- a/docs/reference/ImageFilter.rst +++ b/docs/reference/ImageFilter.rst @@ -40,10 +40,10 @@ image enhancement filters: .. autoclass:: PIL.ImageFilter.Color3DLUT .. autoclass:: PIL.ImageFilter.BoxBlur .. autoclass:: PIL.ImageFilter.GaussianBlur +.. autoclass:: PIL.ImageFilter.UnsharpMask .. autoclass:: PIL.ImageFilter.Kernel +.. autoclass:: PIL.ImageFilter.RankFilter .. autoclass:: PIL.ImageFilter.MedianFilter .. autoclass:: PIL.ImageFilter.MinFilter .. autoclass:: PIL.ImageFilter.MaxFilter .. autoclass:: PIL.ImageFilter.ModeFilter -.. autoclass:: PIL.ImageFilter.RankFilter -.. autoclass:: PIL.ImageFilter.UnsharpMask From daa8e7dacdfc7cbad9ccb1ae8e31dfb84af123c0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 12:40:40 +0300 Subject: [PATCH 0210/1393] Add earlier catching of wrong channels count --- Tests/test_color_lut.py | 3 +++ src/PIL/ImageFilter.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 9477bea4faa..336fa6c6635 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -254,6 +254,9 @@ def test_wrong_args(self): with self.assertRaisesRegexp(ValueError, "should have a length of 3"): ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8) + with self.assertRaisesRegexp(ValueError, "Only 3 or 4 output"): + ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8, channels=2) + def test_convert_table(self): lut = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) self.assertEqual(tuple(lut.size), (2, 2, 2)) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 6ba0ff6e73d..6fcb3683f8e 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -326,6 +326,8 @@ class Color3DLUT(MultibandFilter): name = "Color 3D LUT" def __init__(self, size, table, channels=3, target_mode=None, **kwargs): + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") self.size = size = self._check_size(size) self.channels = channels self.mode = target_mode From 6ee33d81e48af57799f8d1f2b502a2da5ec12a00 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 12 Apr 2018 14:29:34 +0300 Subject: [PATCH 0211/1393] Update CHANGES.rst [CI skip] --- CHANGES.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 18e7527b7b0..1f9f2389a0a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Build macOS wheels with Xcode 6.4, supporting older macOS versions #3068 + [wiredfool] + +- Fix _i2f compilation on some GCC versions #3067 + [homm] + - Changed encoderinfo to have priority over info when saving GIF images #3086 [radarhere] @@ -22,7 +28,7 @@ Changelog (Pillow) - Fix dereferencing type-punned pointer will break strict-aliasing #3069 [jdufresne] - + 5.1.0 (2018-04-02) ------------------ From d9b8d970b2496cc525b618fa26f5e74edf2708eb Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 23:42:35 +0300 Subject: [PATCH 0212/1393] edit doctring [ci skip] --- src/PIL/ImageFilter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 6fcb3683f8e..3c168402097 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -413,8 +413,8 @@ def transform(self, callback, with_normals=False, channels=None, :param with_normals: If true, ``callback`` will be called with coordinates in the color cube as the first three arguments. Otherwise, ``callback`` - will be called only with actual values of colors. - :param channels: Number of colors in the resulted lookup table. + will be called only with actual color values. + :param channels: Number of channels in the resulted lookup table. :param target_mode: Passed to the constructor of the resulted lookup table. """ From 68af72bef49bd6a394165fe53f42b3659effabf6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 13 Apr 2018 10:07:51 +0300 Subject: [PATCH 0213/1393] edit doctring [ci skip] --- src/PIL/ImageFilter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 3c168402097..e074d9ee745 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -380,7 +380,7 @@ def generate(cls, size, callback, channels=3, target_mode=None): times with values from 0.0 to 1.0 and should return a tuple with ``channels`` elements. :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulted + :param target_mode: Passed to the constructor of the resulting lookup table. """ size1D, size2D, size3D = cls._check_size(size) @@ -414,8 +414,8 @@ def transform(self, callback, with_normals=False, channels=None, coordinates in the color cube as the first three arguments. Otherwise, ``callback`` will be called only with actual color values. - :param channels: Number of channels in the resulted lookup table. - :param target_mode: Passed to the constructor of the resulted + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting lookup table. """ if channels not in (None, 3, 4): From 854a0d6044f12fc80349b2455749bc5413231a6b Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 15:03:34 +0300 Subject: [PATCH 0214/1393] edit doctring [ci skip] --- src/PIL/ImageFilter.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index e074d9ee745..ff9348b212b 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -405,9 +405,10 @@ def transform(self, callback, with_normals=False, channels=None, a new LUT with altered values. :param callback: A function which takes old lookup table values - and returns a new. The number of arguments which - function should take is ``self.channels`` or - ``3 + self.channels`` if ``with_normals`` flag is set. + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. Should return a tuple of ``self.channels`` or ``channels`` elements if it is set. :param with_normals: If true, ``callback`` will be called with From b2c6231977b4de5b0026fbfa6be997df896a54de Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Apr 2018 22:16:46 +1000 Subject: [PATCH 0215/1393] Corrected installation doc syntax --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 0371e517b26..35b5edf1945 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -175,7 +175,7 @@ Many of Pillow's features require external libraries: * 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. + is available if all the libraries are installed. * Windows support: Raqm support is currently unsupported on Windows. Once you have installed the prerequisites, run:: From aba478abba768adf56c401a4edd644c45ddc5d4d Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 17:06:54 +0300 Subject: [PATCH 0216/1393] Raise error if it is occurred during conversion in getlist --- Tests/test_color_lut.py | 4 ++++ src/_imaging.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index f9d35c83c9b..52539fee0f1 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -66,6 +66,10 @@ def test_wrong_args(self): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 9) + with self.assertRaisesRegexp(TypeError, "a float is required"): + im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, [0, 0, "0"] * 8) + def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) diff --git a/src/_imaging.c b/src/_imaging.c index 544e54d8735..808917ad15a 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -379,12 +379,12 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) PyObject* seq; PyObject* op; - if (!PySequence_Check(arg)) { + if ( ! PySequence_Check(arg)) { PyErr_SetString(PyExc_TypeError, must_be_sequence); return NULL; } - n = PyObject_Length(arg); + n = PySequence_Size(arg); if (length && wrong_length && n != *length) { PyErr_SetString(PyExc_ValueError, wrong_length); return NULL; @@ -393,13 +393,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 PyErr_NoMemory(); seq = PySequence_Fast(arg, must_be_sequence); - if (!seq) { + if ( ! seq) { free(list); - PyErr_SetString(PyExc_TypeError, must_be_sequence); return NULL; } @@ -427,12 +426,16 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) } } + Py_DECREF(seq); + + if (PyErr_Occurred()) { + free(list); + return NULL; + } + if (length) *length = n; - PyErr_Clear(); - Py_DECREF(seq); - return list; } From eae14c56e18a400961b1196b400450c412e02028 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 17:22:21 +0300 Subject: [PATCH 0217/1393] Check exception type only, not string --- Tests/test_color_lut.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 52539fee0f1..7414d9476df 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -66,7 +66,7 @@ def test_wrong_args(self): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 9) - with self.assertRaisesRegexp(TypeError, "a float is required"): + with self.assertRaises(TypeError): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, "0"] * 8) From a325559f5822900dab4468b9c51ac798fd2eb4f3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 17:47:53 +0300 Subject: [PATCH 0218/1393] One more test for coverage --- Tests/test_color_lut.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 7414d9476df..733aba2a235 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -70,6 +70,10 @@ def test_wrong_args(self): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, "0"] * 8) + with self.assertRaises(TypeError): + im.im.color_lut_3d('RGB', Image.LINEAR, + 3, 2, 2, 2, 16) + def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) From c8405ef7069c1aa902615d79bb899443bede686b Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 12 Apr 2018 01:54:08 +0300 Subject: [PATCH 0219/1393] Transparently store numpy arrays in ColorLut --- src/PIL/ImageFilter.py | 52 +++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index ff9348b212b..c3c71b2528a 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -19,6 +19,11 @@ import functools +try: + import numpy +except ImportError: # pragma: no cover + numpy = None + class Filter(object): pass @@ -334,25 +339,40 @@ def __init__(self, size, table, channels=3, target_mode=None, **kwargs): # Hidden flag `_copy_table=False` could be used to avoid extra copying # of the table if the table is specially made for the constructor. - if kwargs.get('_copy_table', True): - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - table, raw_table = [], table - for pixel in raw_table: - if len(pixel) != channels: - raise ValueError("The elements of the table should have " - "a length of {}.".format(channels)) - for color in pixel: - table.append(color) - - if len(table) != channels * size[0] * size[1] * size[2]: + copy_table = kwargs.get('_copy_table', True) + items = size[0] * size[1] * size[2] + wrong_size = False + + if numpy and isinstance(table, numpy.ndarray): + if copy_table: + table = table.copy() + + if table.shape in [(items * channels,), (items, channels), + (size[2], size[1], size[0], channels)]: + table = table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + table, raw_table = [], table + for pixel in raw_table: + if len(pixel) != channels: + raise ValueError( + "The elements of the table should " + "have a length of {}.".format(channels)) + table.extend(pixel) + + if wrong_size or len(table) != items * channels: raise ValueError( "The table should have either channels * size**3 float items " "or size**3 items of channels-sized tuples with floats. " - "Table size: {}x{}x{}. Table length: {}".format( - size[0], size[1], size[2], len(table))) + "Table should be: {}x{}x{}x{}. Actual length: {}".format( + channels, size[0], size[1], size[2], len(table))) self.table = table @staticmethod From 5ec1b2e8ba15e43a5e7a9b98582a6922bcb88135 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 18:48:06 +0300 Subject: [PATCH 0220/1393] versionadded --- src/PIL/ImageFilter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index c3c71b2528a..e77349df08d 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -315,6 +315,8 @@ class Color3DLUT(MultibandFilter): This method allows you to apply almost any color transformation in constant time by using pre-calculated decimated tables. + .. versionadded:: 5.2.0 + :param size: Size of the table. One int or tuple of (int, int, int). Minimal size in any dimension is 2, maximum is 65. :param table: Flat lookup table. A list of ``channels * size**3`` From 76e57bbbe20d06d42fb125614b11a77dfcdeab4c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 18:59:57 +0300 Subject: [PATCH 0221/1393] Better numpy tests skipping --- Tests/test_numpy.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 3f95865135b..7f7083ce5fb 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -5,13 +5,10 @@ from PIL import Image try: - import site import numpy - assert site # silence warning - assert numpy # silence warning except ImportError: - # Skip via setUp() - pass + numpy = None + TEST_IMAGE_SIZE = (10, 10) @@ -23,17 +20,8 @@ sys.pypy_version_info <= (5, 3, 1, 'final', 0)) +@unittest.skipIf(numpy is None, "Numpy is not installed") class TestNumpy(PillowTestCase): - - def setUp(self): - try: - import site - import numpy - assert site # silence warning - assert numpy # silence warning - except ImportError: - self.skipTest("ImportError") - def test_numpy_to_image(self): def to_image(dtype, bands=1, boolean=0): From cbfc832ccd427f4440b96e501ccb49e48c63fe7b Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 14 Apr 2018 19:00:55 +0300 Subject: [PATCH 0222/1393] Remove 'del draw' from code example --- docs/reference/ImageDraw.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index de26a4d854d..6b686568d99 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -25,7 +25,6 @@ Example: Draw a gray cross over an image draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) - del draw # write to stdout im.save(sys.stdout, "PNG") From 63b243e1f6d2819e348f71c89f1efc4834bc4142 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 19:17:15 +0300 Subject: [PATCH 0223/1393] color lut numpy tests --- Tests/test_color_lut.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 8bf33be9270..4cd10b739b7 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -5,6 +5,11 @@ from PIL import Image, ImageFilter from helper import unittest, PillowTestCase +try: + import numpy +except ImportError: + numpy = None + class TestColorLut3DCoreAPI(PillowTestCase): def generate_identity_table(self, channels, size): @@ -279,6 +284,39 @@ def test_convert_table(self): lut = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, channels=4) + @unittest.skipIf(numpy is None, "Numpy is not installed") + def test_numpy_sources(self): + table = numpy.ones((5, 6, 7, 3), dtype=numpy.float16) + with self.assertRaisesRegexp(ValueError, "should have either channels"): + lut = ImageFilter.Color3DLUT((5, 6, 7), table) + + table = numpy.ones((7, 6, 5, 3), dtype=numpy.float16) + lut = ImageFilter.Color3DLUT((5, 6, 7), table) + self.assertIsInstance(lut.table, numpy.ndarray) + self.assertEqual(lut.table.dtype, table.dtype) + self.assertEqual(lut.table.shape, (table.size,)) + + table = numpy.ones((7 * 6 * 5, 3), dtype=numpy.float16) + lut = ImageFilter.Color3DLUT((5, 6, 7), table) + self.assertEqual(lut.table.shape, (table.size,)) + + table = numpy.ones((7 * 6 * 5 * 3), dtype=numpy.float16) + lut = ImageFilter.Color3DLUT((5, 6, 7), table) + self.assertEqual(lut.table.shape, (table.size,)) + + # Check application + Image.new('RGB', (10, 10), 0).filter(lut) + + # Check copy + table[0] = 33 + self.assertEqual(lut.table[0], 1) + + # Check not copy + table = numpy.ones((7 * 6 * 5 * 3), dtype=numpy.float16) + lut = ImageFilter.Color3DLUT((5, 6, 7), table, _copy_table=False) + table[0] = 33 + self.assertEqual(lut.table[0], 33) + def test_repr(self): lut = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) self.assertEqual(repr(lut), From ecc4c7fecc3068ea67e52412eabfa68aae24a956 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 10 Apr 2018 13:40:44 +0300 Subject: [PATCH 0224/1393] Remove unittest regex deprecation warnings --- Tests/helper.py | 5 +++ Tests/test_color_lut.py | 59 ++++++++++++++++++------------------ Tests/test_file_jpeg.py | 2 +- Tests/test_file_jpeg2k.py | 2 +- Tests/test_file_png.py | 3 +- Tests/test_image_resample.py | 20 ++++++------ Tests/test_imagecms.py | 2 +- Tests/test_imagefont.py | 3 +- 8 files changed, 50 insertions(+), 46 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index f04dffbc597..606dca006e8 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -267,6 +267,11 @@ def _test_leak(self, core): py3 = sys.version_info.major >= 3 +if not py3: + # Remove DeprecationWarning in Python 3 + PillowTestCase.assertRaisesRegex = PillowTestCase.assertRaisesRegexp + PillowTestCase.assertRegex = PillowTestCase.assertRegexpMatches + def fromstring(data): from io import BytesIO diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 8bf33be9270..2c6c83af15c 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -32,39 +32,39 @@ def generate_identity_table(self, channels, size): def test_wrong_args(self): im = Image.new('RGB', (10, 10), 0) - with self.assertRaisesRegexp(ValueError, "filter"): + with self.assertRaisesRegex(ValueError, "filter"): im.im.color_lut_3d('RGB', Image.CUBIC, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "image mode"): + with self.assertRaisesRegex(ValueError, "image mode"): im.im.color_lut_3d('wrong', Image.LINEAR, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "table_channels"): + with self.assertRaisesRegex(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(5, 3)) - with self.assertRaisesRegexp(ValueError, "table_channels"): + with self.assertRaisesRegex(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(1, 3)) - with self.assertRaisesRegexp(ValueError, "table_channels"): + with self.assertRaisesRegex(ValueError, "table_channels"): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(2, 3)) - with self.assertRaisesRegexp(ValueError, "Table size"): + with self.assertRaisesRegex(ValueError, "Table size"): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(3, (1, 3, 3))) - with self.assertRaisesRegexp(ValueError, "Table size"): + with self.assertRaisesRegex(ValueError, "Table size"): im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(3, (66, 3, 3))) - with self.assertRaisesRegexp(ValueError, r"size1D \* size2D \* size3D"): + with self.assertRaisesRegex(ValueError, r"size1D \* size2D \* size3D"): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 7) - with self.assertRaisesRegexp(ValueError, r"size1D \* size2D \* size3D"): + with self.assertRaisesRegex(ValueError, r"size1D \* size2D \* size3D"): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 9) @@ -98,27 +98,27 @@ def test_correct_args(self): *self.generate_identity_table(3, (3, 3, 65))) def test_wrong_mode(self): - with self.assertRaisesRegexp(ValueError, "wrong mode"): + with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "wrong mode"): + with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "wrong mode"): + with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "wrong mode"): + with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, *self.generate_identity_table(3, 3)) - with self.assertRaisesRegexp(ValueError, "wrong mode"): + with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, *self.generate_identity_table(4, 3)) @@ -238,31 +238,31 @@ def test_overflow(self): class TestColorLut3DFilter(PillowTestCase): def test_wrong_args(self): - with self.assertRaisesRegexp(ValueError, "should be either an integer"): + with self.assertRaisesRegex(ValueError, "should be either an integer"): ImageFilter.Color3DLUT("small", [1]) - with self.assertRaisesRegexp(ValueError, "should be either an integer"): + with self.assertRaisesRegex(ValueError, "should be either an integer"): ImageFilter.Color3DLUT((11, 11), [1]) - with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + with self.assertRaisesRegex(ValueError, r"in \[2, 65\] range"): ImageFilter.Color3DLUT((11, 11, 1), [1]) - with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + with self.assertRaisesRegex(ValueError, r"in \[2, 65\] range"): ImageFilter.Color3DLUT((11, 11, 66), [1]) - with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + with self.assertRaisesRegex(ValueError, "table should have .+ items"): ImageFilter.Color3DLUT((3, 3, 3), [1, 1, 1]) - with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + with self.assertRaisesRegex(ValueError, "table should have .+ items"): ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 2) - with self.assertRaisesRegexp(ValueError, "should have a length of 4"): + with self.assertRaisesRegex(ValueError, "should have a length of 4"): ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 27, channels=4) - with self.assertRaisesRegexp(ValueError, "should have a length of 3"): + with self.assertRaisesRegex(ValueError, "should have a length of 3"): ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8) - with self.assertRaisesRegexp(ValueError, "Only 3 or 4 output"): + with self.assertRaisesRegex(ValueError, "Only 3 or 4 output"): ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8, channels=2) def test_convert_table(self): @@ -290,16 +290,17 @@ def test_repr(self): self.assertEqual(repr(lut), "") + class TestGenerateColorLut3D(PillowTestCase): def test_wrong_channels_count(self): - with self.assertRaisesRegexp(ValueError, "3 or 4 output channels"): + with self.assertRaisesRegex(ValueError, "3 or 4 output channels"): ImageFilter.Color3DLUT.generate(5, channels=2, callback=lambda r, g, b: (r, g, b)) - with self.assertRaisesRegexp(ValueError, "should have either channels"): + with self.assertRaisesRegex(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) - with self.assertRaisesRegexp(ValueError, "should have either channels"): + with self.assertRaisesRegex(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, channels=4, callback=lambda r, g, b: (r, g, b)) @@ -333,13 +334,13 @@ class TestTransformColorLut3D(PillowTestCase): def test_wrong_args(self): source = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) - with self.assertRaisesRegexp(ValueError, "Only 3 or 4 output"): + with self.assertRaisesRegex(ValueError, "Only 3 or 4 output"): source.transform(lambda r, g, b: (r, g, b), channels=8) - with self.assertRaisesRegexp(ValueError, "should have either channels"): + with self.assertRaisesRegex(ValueError, "should have either channels"): source.transform(lambda r, g, b: (r, g, b), channels=4) - with self.assertRaisesRegexp(ValueError, "should have either channels"): + with self.assertRaisesRegex(ValueError, "should have either channels"): source.transform(lambda r, g, b: (r, g, b, 1)) with self.assertRaises(TypeError): diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 205a6ffdf6f..e7e639f0526 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -41,7 +41,7 @@ def gen_random_image(self, size, mode='RGB'): def test_sanity(self): # internal version number - self.assertRegexpMatches(Image.core.jpeglib_version, r"\d+\.\d+$") + self.assertRegex(Image.core.jpeglib_version, r"\d+\.\d+$") im = Image.open(TEST_FILE) im.load() diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 810e21a9d74..71f15f7b83a 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -31,7 +31,7 @@ def roundtrip(self, im, **options): def test_sanity(self): # Internal version number - self.assertRegexpMatches(Image.core.jp2klib_version, r'\d+\.\d+\.\d+$') + self.assertRegex(Image.core.jp2klib_version, r'\d+\.\d+\.\d+$') im = Image.open('Tests/images/test-card-lossless.jp2') px = im.load() diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 8cf109e70ea..abf3f295300 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -68,8 +68,7 @@ def get_chunks(self, filename): def test_sanity(self): # internal version number - self.assertRegexpMatches( - Image.core.zlib_version, r"\d+\.\d+\.\d+(\.\d+)?$") + self.assertRegex(Image.core.zlib_version, r"\d+\.\d+\.\d+(\.\d+)?$") test_file = self.tempfile("temp.png") diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 4223db53076..1ecb6cda60c 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -383,24 +383,24 @@ def test_wrong_arguments(self): im.resize((32, 32), resample, (20, 20, 20, 100)) im.resize((32, 32), resample, (20, 20, 100, 20)) - with self.assertRaisesRegexp(TypeError, "must be sequence of length 4"): + with self.assertRaisesRegex(TypeError, "must be sequence of length 4"): im.resize((32, 32), resample, (im.width, im.height)) - with self.assertRaisesRegexp(ValueError, "can't be negative"): + with self.assertRaisesRegex(ValueError, "can't be negative"): im.resize((32, 32), resample, (-20, 20, 100, 100)) - with self.assertRaisesRegexp(ValueError, "can't be negative"): + with self.assertRaisesRegex(ValueError, "can't be negative"): im.resize((32, 32), resample, (20, -20, 100, 100)) - with self.assertRaisesRegexp(ValueError, "can't be empty"): + with self.assertRaisesRegex(ValueError, "can't be empty"): im.resize((32, 32), resample, (20.1, 20, 20, 100)) - with self.assertRaisesRegexp(ValueError, "can't be empty"): + with self.assertRaisesRegex(ValueError, "can't be empty"): im.resize((32, 32), resample, (20, 20.1, 100, 20)) - with self.assertRaisesRegexp(ValueError, "can't be empty"): + with self.assertRaisesRegex(ValueError, "can't be empty"): im.resize((32, 32), resample, (20.1, 20.1, 20, 20)) - with self.assertRaisesRegexp(ValueError, "can't exceed"): + with self.assertRaisesRegex(ValueError, "can't exceed"): im.resize((32, 32), resample, (0, 0, im.width + 1, im.height)) - with self.assertRaisesRegexp(ValueError, "can't exceed"): + with self.assertRaisesRegex(ValueError, "can't exceed"): im.resize((32, 32), resample, (0, 0, im.width, im.height + 1)) def resize_tiled(self, im, dst_size, xtiles, ytiles): @@ -447,7 +447,7 @@ def test_subsample(self): # error with box should be much smaller than without self.assert_image_similar(reference, with_box, 6) - with self.assertRaisesRegexp(AssertionError, "difference 29\."): + with self.assertRaisesRegex(AssertionError, "difference 29\."): self.assert_image_similar(reference, without_box, 5) def test_formats(self): @@ -490,7 +490,7 @@ def test_no_passthrough(self): try: res = im.resize(size, Image.LANCZOS, box) self.assertEqual(res.size, size) - with self.assertRaisesRegexp(AssertionError, "difference \d"): + with self.assertRaisesRegex(AssertionError, "difference \d"): # check that the difference at least that much self.assert_image_similar(res, im.crop(box), 20) except AssertionError: diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 31417564ff6..4138f455f6e 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -43,7 +43,7 @@ def test_sanity(self): self.assertEqual(list(map(type, v)), [str, str, str, str]) # internal version number - self.assertRegexpMatches(ImageCms.core.littlecms_version, r"\d+\.\d+$") + self.assertRegex(ImageCms.core.littlecms_version, r"\d+\.\d+$") self.skip_missing() i = ImageCms.profileToProfile(hopper(), SRGB, SRGB) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0ec49384e29..986b0b5efe6 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -75,8 +75,7 @@ def get_font(self): layout_engine=self.LAYOUT_ENGINE) def test_sanity(self): - self.assertRegexpMatches( - ImageFont.core.freetype2_version, r"\d+\.\d+\.\d+$") + self.assertRegex(ImageFont.core.freetype2_version, r"\d+\.\d+\.\d+$") def test_font_properties(self): ttf = self.get_font() From f733482c0e22afd7a38afcfe4097c70b11c1909f Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 10 Apr 2018 15:24:58 +0300 Subject: [PATCH 0225/1393] Remove workaround for since-fixed scipy regression, to remove recent scipy DeprecationWarning --- Tests/test_scipy.py | 53 --------------------------------------------- src/PIL/Image.py | 2 -- 2 files changed, 55 deletions(-) delete mode 100644 Tests/test_scipy.py diff --git a/Tests/test_scipy.py b/Tests/test_scipy.py deleted file mode 100644 index 18c4403a080..00000000000 --- a/Tests/test_scipy.py +++ /dev/null @@ -1,53 +0,0 @@ -from helper import unittest, PillowTestCase -from distutils.version import LooseVersion -try: - import numpy as np - from numpy.testing import assert_equal - - from scipy import misc - import scipy - HAS_SCIPY = True -except ImportError: - HAS_SCIPY = False - - -class Test_scipy_resize(PillowTestCase): - """ Tests for scipy regression in Pillow 2.6.0 - - Tests from https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py - """ - - def setUp(self): - if not HAS_SCIPY: - self.skipTest("Scipy Required") - - def test_imresize(self): - im = np.random.random((10, 20)) - for T in np.sctypes['float'] + [float]: - # 1.1 rounds to below 1.1 for float16, 1.101 works - im1 = misc.imresize(im, T(1.101)) - self.assertEqual(im1.shape, (11, 22)) - - # this test fails prior to scipy 0.14.0b1 - # https://github.com/scipy/scipy/commit/855ff1fff805fb91840cf36b7082d18565fc8352 - @unittest.skipIf(HAS_SCIPY and - (LooseVersion(scipy.__version__) < LooseVersion('0.14.0')), - "Test fails on scipy < 0.14.0") - def test_imresize4(self): - im = np.array([[1, 2], - [3, 4]]) - res = np.array([[1., 1.25, 1.75, 2.], - [1.5, 1.75, 2.25, 2.5], - [2.5, 2.75, 3.25, 3.5], - [3., 3.25, 3.75, 4.]], dtype=np.float32) - # Check that resizing by target size, float and int are the same - im2 = misc.imresize(im, (4, 4), mode='F') # output size - im3 = misc.imresize(im, 2., mode='F') # fraction - im4 = misc.imresize(im, 200, mode='F') # percentage - assert_equal(im2, res) - assert_equal(im3, res) - assert_equal(im4, res) - - -if __name__ == '__main__': - unittest.main() diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 22ee46bfc82..c4ff94b6df1 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1725,8 +1725,6 @@ def resize(self, size, resample=NEAREST, box=None): ): raise ValueError("unknown resampling filter") - size = tuple(size) - if box is None: box = (0, 0) + self.size else: From 7e8998a4523a77f51f666524f5a1e9f40425bfc2 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 10 Apr 2018 17:08:32 +0300 Subject: [PATCH 0226/1393] ImageOps.box_blur is deprecated, use ImageFilter.BoxBlur instead --- Tests/test_box_blur.py | 4 ++-- Tests/test_imageops_usm.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Tests/test_box_blur.py b/Tests/test_box_blur.py index 622b842d004..2787dfc0db9 100644 --- a/Tests/test_box_blur.py +++ b/Tests/test_box_blur.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase -from PIL import Image, ImageOps +from PIL import Image, ImageFilter sample = Image.new("L", (7, 5)) @@ -16,7 +16,7 @@ class TestBoxBlurApi(PillowTestCase): def test_imageops_box_blur(self): - i = ImageOps.box_blur(sample, 1) + i = sample.filter(ImageFilter.BoxBlur(1)) self.assertEqual(i.mode, sample.mode) self.assertEqual(i.size, sample.size) self.assertIsInstance(i, Image.Image) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index 3fb021fe7b5..2666d348269 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -17,6 +17,11 @@ def test_ops_api(self): self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) + i = self.assert_warning(DeprecationWarning, + ImageOps.box_blur, im, 1) + self.assertEqual(i.mode, "RGB") + self.assertEqual(i.size, (128, 128)) + i = self.assert_warning(DeprecationWarning, ImageOps.gblur, im, 2.0) self.assertEqual(i.mode, "RGB") From 2c87242027d294c0894e746b6d4eb3570953945f Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 14 Apr 2018 23:12:28 +0300 Subject: [PATCH 0227/1393] Support for many many LUT source on C level --- src/_imaging.c | 51 +++++++++++++++++++++++++++++++------ src/libImaging/ImPlatform.h | 1 + 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 808917ad15a..2fcd1b2ee45 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -356,6 +356,7 @@ getbands(const char* mode) #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)) @@ -439,6 +440,28 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) return list; } +FLOAT32 +float16tofloat32(const FLOAT16 in) { + UINT32 t1; + UINT32 t2; + UINT32 t3; + + 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 += 0x38000000; // Adjust bias + + t1 = (t3 == 0 ? 0 : t1); // Denormals-as-zero + + t1 |= t2; // Re-insert sign bit + + return *(FLOAT32 *)&t1; +} + static inline PyObject* getpixel(Imaging im, ImagingAccess access, int x, int y) { @@ -702,18 +725,19 @@ _blend(ImagingObject* self, PyObject* args) /* METHODS */ /* -------------------------------------------------------------------- */ - static INT16* _prepare_lut_table(PyObject* table, Py_ssize_t table_size) { int i; - FLOAT32* table_data; + float item; + INT32 data_type = TYPE_FLOAT32; + void* table_data; INT16* prepared; /* NOTE: This value should be the same as in ColorLUT.c */ #define PRECISION_BITS (16 - 8 - 2) - table_data = (FLOAT32*) getlist(table, &table_size, + table_data = getlist(table, &table_size, "The table should have table_channels * " "size1D * size2D * size3D float items.", TYPE_FLOAT32); if ( ! table_data) { @@ -728,20 +752,31 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } for (i = 0; i < table_size; i++) { + switch (data_type) { + case TYPE_FLOAT16: + item = float16tofloat32(((FLOAT16*) table_data)[i]); + break; + case TYPE_FLOAT32: + item = ((FLOAT32*) table_data)[i]; + break; + case TYPE_DOUBLE: + item = ((double*) table_data)[i]; + break; + } /* Max value for INT16 */ - if (table_data[i] >= (0x7fff - 0.5) / (255 << PRECISION_BITS)) { + if (item >= (0x7fff - 0.5) / (255 << PRECISION_BITS)) { prepared[i] = 0x7fff; continue; } /* Min value for INT16 */ - if (table_data[i] <= (-0x8000 + 0.5) / (255 << PRECISION_BITS)) { + if (item <= (-0x8000 + 0.5) / (255 << PRECISION_BITS)) { prepared[i] = -0x8000; continue; } - if (table_data[i] < 0) { - prepared[i] = table_data[i] * (255 << PRECISION_BITS) - 0.5; + if (item < 0) { + prepared[i] = item * (255 << PRECISION_BITS) - 0.5; } else { - prepared[i] = table_data[i] * (255 << PRECISION_BITS) + 0.5; + prepared[i] = item * (255 << PRECISION_BITS) + 0.5; } } diff --git a/src/libImaging/ImPlatform.h b/src/libImaging/ImPlatform.h index 7b42510d495..3e49cf330c0 100644 --- a/src/libImaging/ImPlatform.h +++ b/src/libImaging/ImPlatform.h @@ -71,6 +71,7 @@ #endif /* assume IEEE; tweak if necessary (patches are welcome) */ +#define FLOAT16 UINT16 #define FLOAT32 float #define FLOAT64 double From 497e9d82518d2e3ad5e92808d0bb4acbcfc4dbfa Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 15 Apr 2018 00:33:15 +0300 Subject: [PATCH 0228/1393] full buffer support --- Tests/test_color_lut.py | 41 ++++++++++++++++++++++++++++++++ src/_imaging.c | 47 +++++++++++++++++++++++++++++++------ src/libImaging/ImPlatform.h | 2 +- 3 files changed, 82 insertions(+), 8 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 4cd10b739b7..2d4ff592ccb 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -317,6 +317,47 @@ def test_numpy_sources(self): table[0] = 33 self.assertEqual(lut.table[0], 33) + @unittest.skipIf(numpy is None, "Numpy is not installed") + def test_numpy_formats(self): + g = Image.linear_gradient('L') + im = Image.merge('RGB', [g, g.transpose(Image.ROTATE_90), + g.transpose(Image.ROTATE_180)]) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = numpy.array(lut.table, dtype=numpy.float32)[:-1] + with self.assertRaisesRegexp(ValueError, "should have table_channels"): + im.filter(lut) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = (numpy.array(lut.table, dtype=numpy.float32) + .reshape((7 * 9 * 11), 3)) + with self.assertRaisesRegexp(ValueError, "should have table_channels"): + im.filter(lut) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = numpy.array(lut.table, dtype=numpy.float16) + self.assert_image_equal(im, im.filter(lut)) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = numpy.array(lut.table, dtype=numpy.float32) + self.assert_image_equal(im, im.filter(lut)) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = numpy.array(lut.table, dtype=numpy.float64) + self.assert_image_equal(im, im.filter(lut)) + + lut = ImageFilter.Color3DLUT.generate((7, 9, 11), + lambda r, g, b: (r, g, b)) + lut.table = numpy.array(lut.table, dtype=numpy.int32) + im.filter(lut) + lut.table = numpy.array(lut.table, dtype=numpy.int8) + im.filter(lut) + def test_repr(self): lut = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) self.assertEqual(repr(lut), diff --git a/src/_imaging.c b/src/_imaging.c index 2fcd1b2ee45..3c945654926 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -729,19 +729,50 @@ static INT16* _prepare_lut_table(PyObject* table, Py_ssize_t table_size) { int i; - float item; + Py_buffer buffer_info; INT32 data_type = TYPE_FLOAT32; - void* table_data; + float item = 0; + 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) - table_data = getlist(table, &table_size, - "The table should have table_channels * " - "size1D * size2D * size3D float items.", TYPE_FLOAT32); + 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 (buffer_info.ndim == 1 && buffer_info.shape[0] == table_size) { + if (strlen(buffer_info.format) == 1) { + switch (buffer_info.format[0]) { + case 'e': + data_type = TYPE_FLOAT16; + table_data = buffer_info.buf; + break; + case 'f': + data_type = TYPE_FLOAT32; + table_data = buffer_info.buf; + break; + case 'd': + data_type = TYPE_DOUBLE; + table_data = buffer_info.buf; + break; + } + } + } + PyBuffer_Release(&buffer_info); + } + } + if ( ! table_data) { - return NULL; + free_table_data = 1; + table_data = getlist(table, &table_size, wrong_size, TYPE_FLOAT32); + if ( ! table_data) { + return NULL; + } } /* malloc check ok, max is 2 * 4 * 65**3 = 2197000 */ @@ -781,7 +812,9 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) } #undef PRECISION_BITS - free(table_data); + if (free_table_data) { + free(table_data); + } return prepared; } diff --git a/src/libImaging/ImPlatform.h b/src/libImaging/ImPlatform.h index 3e49cf330c0..b2d4db78594 100644 --- a/src/libImaging/ImPlatform.h +++ b/src/libImaging/ImPlatform.h @@ -71,7 +71,7 @@ #endif /* assume IEEE; tweak if necessary (patches are welcome) */ -#define FLOAT16 UINT16 +#define FLOAT16 UINT16 #define FLOAT32 float #define FLOAT64 double From 4c983674c0fb83b65de495b13be9b463480987fc Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 15 Apr 2018 01:20:57 +0300 Subject: [PATCH 0229/1393] avoid compilation varnings --- src/_imaging.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/_imaging.c b/src/_imaging.c index 3c945654926..a1c9839a2f2 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -445,6 +445,7 @@ float16tofloat32(const FLOAT16 in) { UINT32 t1; UINT32 t2; UINT32 t3; + FLOAT32 out[1] = {0}; t1 = in & 0x7fff; // Non-sign bits t2 = in & 0x8000; // Sign bit @@ -459,7 +460,8 @@ float16tofloat32(const FLOAT16 in) { t1 |= t2; // Re-insert sign bit - return *(FLOAT32 *)&t1; + memcpy(&t1, out, 4); + return out[0]; } static inline PyObject* From cc70972a20ff2761b182f007d5c6582f13851023 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 15 Apr 2018 01:23:45 +0300 Subject: [PATCH 0230/1393] install numpy on all travis machines --- .travis/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/install.sh b/.travis/install.sh index cad0e3c3203..f18aff07974 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -15,6 +15,7 @@ pip install -U pytest pip install -U pytest-cov pip install pyroma pip install test-image-results +pip install numpy # docs only on Python 2.7 if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ]; then pip install -r requirements.txt ; fi From d11702651132cf21a26eed316903a087d3913748 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 15 Apr 2018 01:46:26 +0300 Subject: [PATCH 0231/1393] fix float16tofloat32 --- src/_imaging.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_imaging.c b/src/_imaging.c index a1c9839a2f2..7c244276631 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -460,7 +460,7 @@ float16tofloat32(const FLOAT16 in) { t1 |= t2; // Re-insert sign bit - memcpy(&t1, out, 4); + memcpy(out, &t1, 4); return out[0]; } From 43d9068fc3be182469abfbaf0f03df60ad437c4e Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 15 Apr 2018 10:35:46 +0300 Subject: [PATCH 0232/1393] Revert conversion removal --- src/PIL/Image.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c4ff94b6df1..22ee46bfc82 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1725,6 +1725,8 @@ def resize(self, size, resample=NEAREST, box=None): ): raise ValueError("unknown resampling filter") + size = tuple(size) + if box is None: box = (0, 0) + self.size else: From 33c0b5df2140100e40ad4e7ab0268b19aa4bed29 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 15 Apr 2018 23:35:41 +0300 Subject: [PATCH 0233/1393] use assertRaisesRegex --- Tests/test_color_lut.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index dad4efcd8cf..c9793c9507b 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -287,7 +287,7 @@ def test_convert_table(self): @unittest.skipIf(numpy is None, "Numpy is not installed") def test_numpy_sources(self): table = numpy.ones((5, 6, 7, 3), dtype=numpy.float16) - with self.assertRaisesRegexp(ValueError, "should have either channels"): + with self.assertRaisesRegex(ValueError, "should have either channels"): lut = ImageFilter.Color3DLUT((5, 6, 7), table) table = numpy.ones((7, 6, 5, 3), dtype=numpy.float16) @@ -326,14 +326,14 @@ def test_numpy_formats(self): lut = ImageFilter.Color3DLUT.generate((7, 9, 11), lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.float32)[:-1] - with self.assertRaisesRegexp(ValueError, "should have table_channels"): + with self.assertRaisesRegex(ValueError, "should have table_channels"): im.filter(lut) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), lambda r, g, b: (r, g, b)) lut.table = (numpy.array(lut.table, dtype=numpy.float32) .reshape((7 * 9 * 11), 3)) - with self.assertRaisesRegexp(ValueError, "should have table_channels"): + with self.assertRaisesRegex(ValueError, "should have table_channels"): im.filter(lut) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), From b33b045e9bd76d9baff150c4c681d1aff88195d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 17 Apr 2018 14:06:05 +1000 Subject: [PATCH 0234/1393] Changed test_imagetk to run on Python 3 --- Tests/test_imagetk.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index fbf48a1b6eb..dd0d67d5e9d 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -1,10 +1,13 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image try: from PIL import ImageTk - import Tkinter as tk + if py3: + import tkinter as tk + else: + import Tkinter as tk dir(ImageTk) HAS_TK = True except (OSError, ImportError) as v: From e3800c6d6b872bb587d73e7daa24264ab7f8433e Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 17 Apr 2018 17:06:43 +0300 Subject: [PATCH 0235/1393] Update links to new PyPI --- README.rst | 2 +- RELEASING.md | 2 +- docs/about.rst | 2 +- docs/index.rst | 2 +- docs/installation.rst | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index d48e88bf73e..285f618b1ba 100644 --- a/README.rst +++ b/README.rst @@ -44,7 +44,7 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors `_. Only the latest major +`_. Only the latest major releases for Python 2.x and 3.x are visible, but all releases are available by direct URL access -e.g. https://pypi.python.org/pypi/Pillow/1.0. +e.g. https://pypi.org/project/Pillow/1.0/. From 30c9ca15fbfc1a60629dd494a5532e89a4e23d0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 9 Apr 2018 23:13:19 +1000 Subject: [PATCH 0236/1393] Fixed docstrings --- src/PIL/Image.py | 4 ++-- src/PIL/PngImagePlugin.py | 2 +- src/PIL/SpiderImagePlugin.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 22ee46bfc82..9057c5f8d18 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -358,7 +358,7 @@ def getmodebands(mode): def preinit(): - "Explicitly load standard file format drivers." + """Explicitly load standard file format drivers.""" global _initialized if _initialized >= 1: @@ -2246,7 +2246,7 @@ class ImageTransformHandler(object): # Debugging def _wedge(): - "Create greyscale wedge (for debugging only)" + """Create greyscale wedge (for debugging only)""" return Image()._new(core.wedge("L")) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 621e19b9a30..9eb36420644 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -663,7 +663,7 @@ def load_end(self): def putchunk(fp, cid, *data): - "Write a PNG chunk (including CRC field)" + """Write a PNG chunk (including CRC field)""" data = b"".join(data) diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index d89a3e1b326..d502779e2a3 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -200,7 +200,7 @@ def tkPhotoImage(self): # given a list of filenames, return a list of images def loadImageSeries(filelist=None): - " create a list of Image.images for use in montage " + """create a list of Image.images for use in montage""" if filelist is None or len(filelist) < 1: return From 06f4cd62addea2e138913f2b88d20c0438c62bcf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 9 Apr 2018 23:19:59 +1000 Subject: [PATCH 0237/1393] Removed redundant backslashes --- src/PIL/features.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/features.py b/src/PIL/features.py index d96bf385fdd..9926445ec4f 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -73,8 +73,8 @@ def get_supported_features(): def check(feature): - return (feature in modules and check_module(feature) or \ - feature in codecs and check_codec(feature) or \ + return (feature in modules and check_module(feature) or + feature in codecs and check_codec(feature) or feature in features and check_feature(feature)) From cbc056f43d8ae0432de5b9e8d882155b4eb74961 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 9 Apr 2018 23:48:36 +1000 Subject: [PATCH 0238/1393] Fixed whitespace --- Tests/test_font_pcf.py | 2 +- Tests/test_image_access.py | 2 +- Tests/test_image_transform.py | 2 +- src/PIL/IcnsImagePlugin.py | 2 +- src/PIL/PdfParser.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 2b344c6c28c..9d7d4d558d4 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -66,7 +66,7 @@ def test_textsize(self): def _test_high_characters(self, message): tempname = self.save_font() font = ImageFont.load(tempname) - im = Image.new("L", (750, 30) , "white") + 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: diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 155fa5c2ea8..9cc62385645 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -295,7 +295,7 @@ def test_embeddable(self): compiler.add_include_dir(sysconfig.get_python_inc()) libdir = sysconfig.get_config_var('LIBDIR') or sysconfig.get_python_inc().replace('include', 'libs') - print (libdir) + print(libdir) compiler.add_library_dir(libdir) objects = compiler.compile(['embed_pil.c']) compiler.link_executable(objects, 'embed_pil') diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index a3ab7805f71..9cb6ac2c2c9 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -59,7 +59,7 @@ def test_fill(self): (0, 0, w*2, h*2), Image.BILINEAR, - fillcolor = 'red') + fillcolor='red') self.assertEqual(transformed.getpixel((w-1, h-1)), (255, 0, 0)) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index b382a73e124..acc7fcba069 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -310,7 +310,7 @@ def _save(im, fp, filename): # create the temporary set of pngs iconset = tempfile.mkdtemp('.iconset') - provided_images = {im.width:im for im in + provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} last_w = None for w in [16, 32, 128, 256, 512]: diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index b6938fdb786..5cc5a1bbb00 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -211,7 +211,7 @@ def __repr__(self): def from_pdf_stream(klass, data): return klass(PdfParser.interpret_name(data)) - allowed_chars = set(range(33,127)) - set(ord(c) for c in "#%/()<>[]{}") + allowed_chars = set(range(33, 127)) - set(ord(c) for c in "#%/()<>[]{}") def __bytes__(self): if str == bytes: # Python 2.x From 37f5f1120a39b03a42dce864ce98013d5ba271c5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 10 Apr 2018 23:00:33 +1000 Subject: [PATCH 0239/1393] Fixed block comments --- Tests/test_file_eps.py | 2 +- Tests/test_font_pcf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 2313b292c0f..bd7c79f82cd 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -76,7 +76,7 @@ def test_showpage(self): plot_image = Image.open("Tests/images/reqd_showpage.eps") target = Image.open("Tests/images/reqd_showpage.png") - #should not crash/hang + # should not crash/hang plot_image.load() # fonts could be slightly different self.assert_image_similar(plot_image, target, 6) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 9d7d4d558d4..0b757b963a0 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -20,7 +20,7 @@ def save_font(self): with open(fontname, "rb") as test_file: font = PcfFontFile.PcfFontFile(test_file) self.assertIsInstance(font, FontFile.FontFile) - #check the number of characters in the font + # check the number of characters in the font self.assertEqual(len([_f for _f in font.glyph if _f]), 223) tempname = self.tempfile("temp.pil") From bf77bba323763226982a59e71452a671ca493596 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 11 Apr 2018 23:32:15 +1000 Subject: [PATCH 0240/1393] Changed dictionary comprehension style --- src/PIL/IcnsImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index acc7fcba069..dc93f6a74f8 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -310,8 +310,8 @@ def _save(im, fp, filename): # create the temporary set of pngs iconset = tempfile.mkdtemp('.iconset') - provided_images = {im.width: im for im in - im.encoderinfo.get("append_images", [])} + provided_images = {im.width: im + for im in im.encoderinfo.get("append_images", [])} last_w = None for w in [16, 32, 128, 256, 512]: prefix = 'icon_{}x{}'.format(w, w) From b560f5b4173c102952dbd3b8ba518385da16a49d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 19 Apr 2018 19:40:56 +1000 Subject: [PATCH 0241/1393] Changed Python version checks in tests to use helper --- Tests/check_icns_dos.py | 7 ++++--- Tests/check_j2k_dos.py | 10 ++++++---- Tests/test_file_eps.py | 20 ++++++++++---------- Tests/test_file_png.py | 4 ++-- Tests/test_font_pcf.py | 3 ++- Tests/test_format_hsv.py | 14 +++++++------- Tests/test_image.py | 10 +++++----- Tests/test_imagepath.py | 8 ++++---- 8 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Tests/check_icns_dos.py b/Tests/check_icns_dos.py index e56709bbb2f..0a7734ddb9b 100644 --- a/Tests/check_icns_dos.py +++ b/Tests/check_icns_dos.py @@ -2,10 +2,11 @@ # Run from anywhere that PIL is importable. from PIL import Image +from helper import py3 from io import BytesIO -if bytes is str: - Image.open(BytesIO(bytes('icns\x00\x00\x00\x10hang\x00\x00\x00\x00'))) -else: +if py3: Image.open(BytesIO(bytes('icns\x00\x00\x00\x10hang\x00\x00\x00\x00', 'latin-1'))) +else: + Image.open(BytesIO(bytes('icns\x00\x00\x00\x10hang\x00\x00\x00\x00'))) diff --git a/Tests/check_j2k_dos.py b/Tests/check_j2k_dos.py index 9f06888a31b..b8f6a996221 100644 --- a/Tests/check_j2k_dos.py +++ b/Tests/check_j2k_dos.py @@ -2,12 +2,14 @@ # Run from anywhere that PIL is importable. from PIL import Image +from helper import py3 from io import BytesIO -if bytes is str: - Image.open(BytesIO(bytes( - '\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang'))) -else: +if py3: Image.open(BytesIO(bytes( '\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang', 'latin-1'))) + +else: + Image.open(BytesIO(bytes( + '\x00\x00\x00\x0cjP\x20\x20\x0d\x0a\x87\x0a\x00\x00\x00\x00hang'))) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 2313b292c0f..48b13498329 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image, EpsImagePlugin import io @@ -206,19 +206,19 @@ def _test_readline_stringio(self, test_string, ending): self._test_readline(t, ending) def _test_readline_io(self, test_string, ending): - if str is bytes: - t = io.StringIO(unicode(test_string)) - else: + if py3: t = io.StringIO(test_string) + else: + t = io.StringIO(unicode(test_string)) self._test_readline(t, ending) def _test_readline_file_universal(self, test_string, ending): f = self.tempfile('temp.txt') with open(f, 'wb') as w: - if str is bytes: - w.write(test_string) - else: + if py3: w.write(test_string.encode('UTF-8')) + else: + w.write(test_string) with open(f, 'rU') as t: self._test_readline(t, ending) @@ -226,10 +226,10 @@ def _test_readline_file_universal(self, test_string, ending): def _test_readline_file_psfile(self, test_string, ending): f = self.tempfile('temp.txt') with open(f, 'wb') as w: - if str is bytes: - w.write(test_string) - else: + if py3: w.write(test_string.encode('UTF-8')) + else: + w.write(test_string) with open(f, 'rb') as r: t = EpsImagePlugin.PSFile(r) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index abf3f295300..d45b4aacf0e 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, PillowLeakTestCase, hopper +from helper import unittest, PillowTestCase, PillowLeakTestCase, hopper, py3 from PIL import Image, ImageFile, PngImagePlugin from io import BytesIO @@ -419,7 +419,7 @@ def rt_text(value): im = roundtrip(im, pnginfo=info) self.assertEqual(im.info, {"Text": value}) - if str is not bytes: + if py3: rt_text(" Aa" + chr(0xa0) + chr(0xc4) + chr(0xff)) # Latin1 rt_text(chr(0x400) + chr(0x472) + chr(0x4ff)) # Cyrillic rt_text(chr(0x4e00) + chr(0x66f0) + # CJK diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 2b344c6c28c..952c975d3a9 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -2,6 +2,7 @@ from PIL import Image, FontFile, PcfFontFile from PIL import ImageFont, ImageDraw +from helper import py3 codecs = dir(Image.core) @@ -76,7 +77,7 @@ def test_high_characters(self): message = "".join(chr(i+1) for i in range(140, 232)) self._test_high_characters(message) # accept bytes instances in Py3. - if bytes is not str: + if py3: self._test_high_characters(message.encode('latin1')) diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index 2cc54c910d6..8b9a122867c 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image @@ -57,10 +57,10 @@ def to_xxx_colorsys(self, im, func, mode): (r, g, b) = im.split() - if bytes is str: - conv_func = self.str_to_float - else: + if py3: conv_func = self.int_to_float + else: + conv_func = self.str_to_float if hasattr(itertools, 'izip'): iter_helper = itertools.izip @@ -72,11 +72,11 @@ def to_xxx_colorsys(self, im, func, mode): for (_r, _g, _b) in iter_helper(r.tobytes(), g.tobytes(), b.tobytes())] - if str is bytes: - new_bytes = b''.join(chr(h)+chr(s)+chr(v) for ( + if py3: + new_bytes = b''.join(bytes(chr(h)+chr(s)+chr(v), 'latin-1') for ( h, s, v) in converted) else: - new_bytes = b''.join(bytes(chr(h)+chr(s)+chr(v), 'latin-1') for ( + new_bytes = b''.join(chr(h)+chr(s)+chr(v) for ( h, s, v) in converted) hsv = Image.frombytes(mode, r.size, new_bytes) diff --git a/Tests/test_image.py b/Tests/test_image.py index f64ea241b8d..305d5da1d49 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image import os @@ -60,12 +60,12 @@ def test_width_height(self): self.assertEqual(im.height, 4) def test_invalid_image(self): - if str is bytes: - import StringIO - im = StringIO.StringIO('') - else: + if py3: import io im = io.BytesIO(b'') + else: + import StringIO + im = StringIO.StringIO('') self.assertRaises(IOError, Image.open, im) def test_bad_mode(self): diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py index 98a6d3416cf..05d24b89b4b 100644 --- a/Tests/test_imagepath.py +++ b/Tests/test_imagepath.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase +from helper import unittest, PillowTestCase, py3 from PIL import ImagePath, Image @@ -77,10 +77,10 @@ def test_overflow_segfault(self): # This fails due to the invalid malloc above, # and segfaults for i in range(200000): - if str is bytes: - x[i] = "0"*16 - else: + if py3: x[i] = b'0'*16 + else: + x[i] = "0"*16 class evil: From b4e6cdadacec9145402a0ff6bc83316c05e17590 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 20 Apr 2018 09:19:13 +1000 Subject: [PATCH 0242/1393] Added py3 variable to _util --- Tests/check_icns_dos.py | 2 +- Tests/check_j2k_dos.py | 2 +- Tests/helper.py | 3 +-- Tests/test_file_eps.py | 3 ++- Tests/test_file_libtiff.py | 3 ++- Tests/test_file_png.py | 3 ++- Tests/test_file_tiff.py | 3 ++- Tests/test_font_pcf.py | 2 +- Tests/test_format_hsv.py | 3 ++- Tests/test_image.py | 3 ++- Tests/test_image_getim.py | 3 ++- Tests/test_imagepath.py | 3 ++- Tests/test_imagetk.py | 3 ++- src/PIL/EpsImagePlugin.py | 9 ++++---- src/PIL/Image.py | 13 ++++++----- src/PIL/ImageFont.py | 8 +++---- src/PIL/ImageMath.py | 5 +++-- src/PIL/ImageQt.py | 8 +++---- src/PIL/PSDraw.py | 3 ++- src/PIL/PdfParser.py | 45 +++++++++++++++++++------------------- src/PIL/PngImagePlugin.py | 7 +++--- src/PIL/SgiImagePlugin.py | 3 ++- src/PIL/TiffImagePlugin.py | 17 +++++++------- src/PIL/WmfImagePlugin.py | 3 ++- src/PIL/_binary.py | 11 +++++----- src/PIL/_util.py | 14 +++++++----- 26 files changed, 100 insertions(+), 82 deletions(-) diff --git a/Tests/check_icns_dos.py b/Tests/check_icns_dos.py index 0a7734ddb9b..d4c3cf7cb55 100644 --- a/Tests/check_icns_dos.py +++ b/Tests/check_icns_dos.py @@ -2,7 +2,7 @@ # Run from anywhere that PIL is importable. from PIL import Image -from helper import py3 +from PIL._util import py3 from io import BytesIO if py3: diff --git a/Tests/check_j2k_dos.py b/Tests/check_j2k_dos.py index b8f6a996221..4ea31cec212 100644 --- a/Tests/check_j2k_dos.py +++ b/Tests/check_j2k_dos.py @@ -2,7 +2,7 @@ # Run from anywhere that PIL is importable. from PIL import Image -from helper import py3 +from PIL._util import py3 from io import BytesIO if py3: diff --git a/Tests/helper.py b/Tests/helper.py index 606dca006e8..d70b6f51d5b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -8,6 +8,7 @@ import unittest from PIL import Image, ImageMath +from PIL._util import py3 import logging logger = logging.getLogger(__name__) @@ -265,8 +266,6 @@ def _test_leak(self, core): # helpers -py3 = sys.version_info.major >= 3 - if not py3: # Remove DeprecationWarning in Python 3 PillowTestCase.assertRaisesRegex = PillowTestCase.assertRaisesRegexp diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 48b13498329..81c87b35e90 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,6 +1,7 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import Image, EpsImagePlugin +from PIL._util import py3 import io # Our two EPS test files (they are identical except for their bounding boxes) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index dc3b1084573..05433d9b6fb 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1,6 +1,7 @@ from __future__ import print_function -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import features +from PIL._util import py3 from ctypes import c_float import io diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index d45b4aacf0e..c78351464aa 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -1,5 +1,6 @@ -from helper import unittest, PillowTestCase, PillowLeakTestCase, hopper, py3 +from helper import unittest, PillowTestCase, PillowLeakTestCase, hopper from PIL import Image, ImageFile, PngImagePlugin +from PIL._util import py3 from io import BytesIO import zlib diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 334f5c96b66..282a0c676d9 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -3,9 +3,10 @@ import struct import sys -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import Image, TiffImagePlugin +from PIL._util import py3 from PIL.TiffImagePlugin import X_RESOLUTION, Y_RESOLUTION, RESOLUTION_UNIT logger = logging.getLogger(__name__) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 952c975d3a9..25ccfc196cb 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -2,7 +2,7 @@ from PIL import Image, FontFile, PcfFontFile from PIL import ImageFont, ImageDraw -from helper import py3 +from PIL._util import py3 codecs = dir(Image.core) diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index 8b9a122867c..31309da6066 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,6 +1,7 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import Image +from PIL._util import py3 import colorsys import itertools diff --git a/Tests/test_image.py b/Tests/test_image.py index 305d5da1d49..7222e389b2d 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1,6 +1,7 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import Image +from PIL._util import py3 import os diff --git a/Tests/test_image_getim.py b/Tests/test_image_getim.py index bc562de5ab8..1452e584ebe 100644 --- a/Tests/test_image_getim.py +++ b/Tests/test_image_getim.py @@ -1,4 +1,5 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper +from PIL._util import py3 class TestImageGetIm(PillowTestCase): diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py index 05d24b89b4b..8df71121d73 100644 --- a/Tests/test_imagepath.py +++ b/Tests/test_imagepath.py @@ -1,6 +1,7 @@ -from helper import unittest, PillowTestCase, py3 +from helper import unittest, PillowTestCase from PIL import ImagePath, Image +from PIL._util import py3 import array import struct diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index dd0d67d5e9d..2df35c5847f 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -1,5 +1,6 @@ -from helper import unittest, PillowTestCase, hopper, py3 +from helper import unittest, PillowTestCase, hopper from PIL import Image +from PIL._util import py3 try: diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index b5034877140..1ae7865b10f 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -26,6 +26,7 @@ import sys from . import Image, ImageFile from ._binary import i32le as i32 +from ._util import py3 __version__ = "0.5" @@ -206,12 +207,12 @@ def _open(self): # Rewrap the open file pointer in something that will # convert line endings and decode to latin-1. try: - if bytes is str: - # Python2, no encoding conversion necessary - fp = open(self.fp.name, "Ur") - else: + if py3: # Python3, can use bare open command. fp = open(self.fp.name, "Ur", encoding='latin-1') + else: + # Python2, no encoding conversion necessary + fp = open(self.fp.name, "Ur") except: # Expect this for bytesio/stringio fp = PSFile(self.fp) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 22ee46bfc82..236f48fedc2 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -25,6 +25,7 @@ # from . import VERSION, PILLOW_VERSION, _plugins +from ._util import py3 import logging import warnings @@ -1260,10 +1261,10 @@ def getpalette(self): self.load() try: - if bytes is str: - return [i8(c) for c in self.im.getpalette()] - else: + if py3: return list(self.im.getpalette()) + else: + return [i8(c) for c in self.im.getpalette()] except ValueError: return None # no palette @@ -1586,10 +1587,10 @@ def putpalette(self, data, rawmode="RGB"): palette = ImagePalette.raw(data.rawmode, data.palette) else: if not isinstance(data, bytes): - if bytes is str: - data = "".join(chr(x) for x in data) - else: + if py3: data = bytes(data) + else: + data = "".join(chr(x) for x in data) palette = ImagePalette.raw(rawmode, data) self.mode = "P" self.palette = palette diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index f3b55e0c4d0..5ae6c3a4e15 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -26,7 +26,7 @@ # from . import Image -from ._util import isDirectory, isPath +from ._util import isDirectory, isPath, py3 import os import sys @@ -314,10 +314,10 @@ def load_path(filename): for directory in sys.path: if isDirectory(directory): if not isinstance(filename, str): - if bytes is str: - filename = filename.encode("utf-8") - else: + if py3: filename = filename.decode("utf-8") + else: + filename = filename.encode("utf-8") try: return load(os.path.join(directory, filename)) except IOError: diff --git a/src/PIL/ImageMath.py b/src/PIL/ImageMath.py index c5bea708ace..d985877a6c8 100644 --- a/src/PIL/ImageMath.py +++ b/src/PIL/ImageMath.py @@ -16,6 +16,7 @@ # from . import Image, _imagingmath +from ._util import py3 try: import builtins @@ -100,7 +101,7 @@ def __bool__(self): # an image is "true" if it contains at least one non-zero pixel return self.im.getbbox() is not None - if bytes is str: + if not py3: # Provide __nonzero__ for pre-Py3k __nonzero__ = __bool__ del __bool__ @@ -151,7 +152,7 @@ def __pow__(self, other): def __rpow__(self, other): return self.apply("pow", other, self) - if bytes is str: + if not py3: # Provide __div__ and __rdiv__ for pre-Py3k __div__ = __truediv__ __rdiv__ = __rtruediv__ diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 280cbc6fcca..ca5fff180da 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -17,7 +17,7 @@ # from . import Image -from ._util import isPath +from ._util import isPath, py3 from io import BytesIO qt_is_installed = True @@ -123,10 +123,10 @@ def _toqclass_helper(im): # handle filename, if given instead of image name if hasattr(im, "toUtf8"): # FIXME - is this really the best way to do this? - if str is bytes: - im = unicode(im.toUtf8(), "utf-8") - else: + if py3: im = str(im.toUtf8(), "utf-8") + else: + im = unicode(im.toUtf8(), "utf-8") if isPath(im): im = Image.open(im) diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index de34713ea86..1c17c61b245 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -16,6 +16,7 @@ # from . import EpsImagePlugin +from ._util import py3 import sys ## @@ -34,7 +35,7 @@ def __init__(self, fp=None): self.fp = fp def _fp_write(self, to_write): - if bytes is str or self.fp == sys.stdout: + if not py3 or self.fp == sys.stdout: self.fp.write(to_write) else: self.fp.write(bytes(to_write, 'UTF-8')) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index b6938fdb786..1aa94a6d7e4 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -4,6 +4,7 @@ import os import re import zlib +from ._util import py3 try: from UserDict import UserDict # Python 2.x @@ -11,12 +12,12 @@ UserDict = collections.UserDict # Python 3.x -if str == bytes: # Python 2.x - def make_bytes(s): # pragma: no cover - return s # pragma: no cover -else: # Python 3.x +if py3: # Python 3.x def make_bytes(s): return s.encode("us-ascii") +else: # Python 2.x + def make_bytes(s): # pragma: no cover + return s # pragma: no cover # see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set on page 656 @@ -72,10 +73,10 @@ def encode_text(s): def decode_text(b): if b[:len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: return b[len(codecs.BOM_UTF16_BE):].decode("utf_16_be") - elif str == bytes: # Python 2.x - return u"".join(PDFDocEncoding.get(ord(byte), byte) for byte in b) - else: + elif py3: # Python 3.x return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + else: # Python 2.x + return u"".join(PDFDocEncoding.get(ord(byte), byte) for byte in b) class PdfFormatError(RuntimeError): @@ -214,20 +215,18 @@ def from_pdf_stream(klass, data): allowed_chars = set(range(33,127)) - set(ord(c) for c in "#%/()<>[]{}") def __bytes__(self): - if str == bytes: # Python 2.x - result = bytearray(b"/") - for b in self.name: - if ord(b) in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % ord(b)) - else: # Python 3.x - result = bytearray(b"/") - for b in self.name: + result = bytearray(b"/") + for b in self.name: + if py3: # Python 3.x if b in self.allowed_chars: result.append(b) else: result.extend(make_bytes("#%02X" % b)) + else: # Python 2.x + if ord(b) in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % ord(b)) return bytes(result) __str__ = __bytes__ @@ -281,7 +280,7 @@ def __bytes__(self): out.extend(b"\n>>") return bytes(out) - if str == bytes: + if not py3: __str__ = __bytes__ @@ -289,13 +288,13 @@ class PdfBinary: def __init__(self, data): self.data = data - if str == bytes: # Python 2.x + if py3: # Python 3.x + def __bytes__(self): + return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) + else: # Python 2.x def __str__(self): return "<%s>" % "".join("%02X" % ord(b) for b in self.data) - else: # Python 3.x - def __bytes__(self): - return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) class PdfStream: @@ -333,7 +332,7 @@ def pdf_repr(x): return bytes(PdfDict(x)) elif isinstance(x, list): return bytes(PdfArray(x)) - elif (str == bytes and isinstance(x, unicode)) or (str != bytes and isinstance(x, str)): + elif (py3 and isinstance(x, str)) or (not py3 and isinstance(x, unicode)): return pdf_repr(encode_text(x)) elif isinstance(x, bytes): return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 621e19b9a30..c281d7b28dd 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -38,6 +38,7 @@ from . import Image, ImageFile, ImagePalette from ._binary import i8, i16be as i16, i32be as i32, o16be as o16, o32be as o32 +from ._util import py3 __version__ = "0.9" @@ -437,7 +438,7 @@ def chunk_tEXt(self, pos, length): k = s v = b"" if k: - if bytes is not str: + if py3: k = k.decode('latin-1', 'strict') v = v.decode('latin-1', 'replace') @@ -473,7 +474,7 @@ def chunk_zTXt(self, pos, length): v = b"" if k: - if bytes is not str: + if py3: k = k.decode('latin-1', 'strict') v = v.decode('latin-1', 'replace') @@ -510,7 +511,7 @@ def chunk_iTXt(self, pos, length): return s else: return s - if bytes is not str: + if py3: try: k = k.decode("latin-1", "strict") lang = lang.decode("utf-8", "strict") diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 8b34561e539..ef0f40ebd62 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -24,6 +24,7 @@ from . import Image, ImageFile from ._binary import i8, o8, i16be as i16 +from ._util import py3 import struct import os @@ -165,7 +166,7 @@ def _save(im, fp, filename): pinmax = 255 # Image name (79 characters max, truncated below in write) imgName = os.path.splitext(os.path.basename(filename))[0] - if str is not bytes: + if py3: imgName = imgName.encode('ascii', 'ignore') # Standard representation of pixel in the file colormap = 0 diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index f9039183e46..167f0cba14f 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -43,6 +43,7 @@ from . import Image, ImageFile, ImagePalette, TiffTags from ._binary import i8, o8 +from ._util import py3 import collections from fractions import Fraction @@ -519,7 +520,7 @@ def __getitem__(self, tag): def __contains__(self, tag): return tag in self._tags_v2 or tag in self._tagdata - if bytes is str: + if not py3: def has_key(self, tag): return tag in self @@ -528,7 +529,7 @@ def __setitem__(self, tag, value): def _setitem(self, tag, value, legacy_api): basetypes = (Number, bytes, str) - if bytes is str: + if not py3: basetypes += unicode, info = TiffTags.lookup(tag) @@ -549,14 +550,14 @@ def _setitem(self, tag, value, legacy_api): elif all(isinstance(v, float) for v in values): self.tagtype[tag] = 12 else: - if bytes is str: - # Never treat data as binary by default on Python 2. - self.tagtype[tag] = 2 - else: + if py3: if all(isinstance(v, str) for v in values): self.tagtype[tag] = 2 + else: + # Never treat data as binary by default on Python 2. + self.tagtype[tag] = 2 - if self.tagtype[tag] == 7 and bytes is not str: + if self.tagtype[tag] == 7 and py3: values = [value.encode("ascii", 'replace') if isinstance( value, str) else value] @@ -1503,7 +1504,7 @@ def _save(im, fp, filename): if tag not in TiffTags.LIBTIFF_CORE: continue if tag not in atts and tag not in blocklist: - if isinstance(value, unicode if bytes is str else str): + if isinstance(value, str if py3 else unicode): atts[tag] = value.encode('ascii', 'replace') + b"\0" elif isinstance(value, IFDRational): atts[tag] = float(value) diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index 173ddb25b7c..213584497a5 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -23,13 +23,14 @@ from . import Image, ImageFile from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long +from ._util import py3 __version__ = "0.2" _handler = None -if str != bytes: +if py3: long = int diff --git a/src/PIL/_binary.py b/src/PIL/_binary.py index b15f796c0da..7e0d560b51b 100644 --- a/src/PIL/_binary.py +++ b/src/PIL/_binary.py @@ -12,19 +12,20 @@ # from struct import unpack, pack +from ._util import py3 -if bytes is str: +if py3: def i8(c): - return ord(c) + return c if c.__class__ is int else c[0] def o8(i): - return chr(i & 255) + return bytes((i & 255,)) else: def i8(c): - return c if c.__class__ is int else c[0] + return ord(c) def o8(i): - return bytes((i & 255,)) + return chr(i & 255) # Input, le = little endian, be = big endian diff --git a/src/PIL/_util.py b/src/PIL/_util.py index 51c6f6887d3..6618c625fe3 100644 --- a/src/PIL/_util.py +++ b/src/PIL/_util.py @@ -1,17 +1,19 @@ -import os +import os, sys -if bytes is str: +py3 = sys.version_info.major >= 3 + +if py3: def isStringType(t): - return isinstance(t, basestring) + return isinstance(t, str) def isPath(f): - return isinstance(f, basestring) + return isinstance(f, (bytes, str)) else: def isStringType(t): - return isinstance(t, str) + return isinstance(t, basestring) def isPath(f): - return isinstance(f, (bytes, str)) + return isinstance(f, basestring) # Checks if an object is a string, and that it points to a directory. From eebe3ea923415bb799443a0fd8430214f01c462c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Apr 2018 13:42:39 +1000 Subject: [PATCH 0243/1393] Corrected undefined behaviour --- src/libImaging/Effects.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libImaging/Effects.c b/src/libImaging/Effects.c index 26b063a11f9..6d25f4fffe4 100644 --- a/src/libImaging/Effects.c +++ b/src/libImaging/Effects.c @@ -79,6 +79,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) Imaging imOut; int x, y; int nextok; + int d; double this, next; imOut = ImagingNewDirty("L", xsize, ysize); @@ -106,7 +107,8 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) this = factor * v1; next = factor * v2; } - out[x] = (unsigned char) (128 + sigma * this); + d = 128 + sigma * this; + out[x] = d<0 ? 0 : (d>UCHAR_MAX ? UCHAR_MAX : d); } } From 99dcc57720d4ab42434cd283b7bdd9fe9254a718 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Apr 2018 16:35:58 +1000 Subject: [PATCH 0244/1393] Moved CLIP definitions into ImagingUtils.h --- src/_imaging.c | 6 ++---- src/libImaging/Bands.c | 3 --- src/libImaging/Convert.c | 1 - src/libImaging/Effects.c | 4 +--- src/libImaging/ImagingUtils.h | 2 ++ src/libImaging/Unpack.c | 2 -- 6 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 808917ad15a..d9e6dff35ee 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -96,8 +96,6 @@ #undef VERBOSE -#define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) - #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)) @@ -744,7 +742,7 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) prepared[i] = table_data[i] * (255 << PRECISION_BITS) + 0.5; } } - + #undef PRECISION_BITS free(table_data); return prepared; @@ -803,7 +801,7 @@ _color_lut_3d(ImagingObject* self, PyObject* args) return NULL; } - if ( ! ImagingColorLUT3D_linear(imOut, self->image, + if ( ! ImagingColorLUT3D_linear(imOut, self->image, table_channels, size1D, size2D, size3D, prepared_table)) { free(prepared_table); diff --git a/src/libImaging/Bands.c b/src/libImaging/Bands.c index 7f86d497322..58f4df1d945 100644 --- a/src/libImaging/Bands.c +++ b/src/libImaging/Bands.c @@ -19,9 +19,6 @@ #include "Imaging.h" -#define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) - - Imaging ImagingGetBand(Imaging imIn, int band) { diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index b3e48e52b08..582f9ca6874 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -38,7 +38,6 @@ #define MAX(a, b) (a)>(b) ? (a) : (b) #define MIN(a, b) (a)<(b) ? (a) : (b) -#define CLIP(v) ((v) <= 0 ? 0 : (v) >= 255 ? 255 : (v)) #define CLIP16(v) ((v) <= -32768 ? -32768 : (v) >= 32767 ? 32767 : (v)) /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ diff --git a/src/libImaging/Effects.c b/src/libImaging/Effects.c index 6d25f4fffe4..1745302d930 100644 --- a/src/libImaging/Effects.c +++ b/src/libImaging/Effects.c @@ -79,7 +79,6 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) Imaging imOut; int x, y; int nextok; - int d; double this, next; imOut = ImagingNewDirty("L", xsize, ysize); @@ -107,8 +106,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) this = factor * v1; next = factor * v2; } - d = 128 + sigma * this; - out[x] = d<0 ? 0 : (d>UCHAR_MAX ? UCHAR_MAX : d); + out[x] = CLIP(128 + sigma * this); } } diff --git a/src/libImaging/ImagingUtils.h b/src/libImaging/ImagingUtils.h index a2f2aa8e2ec..ad29f087475 100644 --- a/src/libImaging/ImagingUtils.h +++ b/src/libImaging/ImagingUtils.h @@ -30,6 +30,8 @@ (MULDIV255(in1, (255 - mask), tmp1) + in2) +#define CLIP(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 */ diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 0e7462c6e96..dd849ce645a 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -45,8 +45,6 @@ #define Y 2 #define K 3 -#define CLIP(x) ((x) <= 0 ? 0 : (x) < 256 ? (x) : 255) - /* byte-swapping macros */ #define C16N\ From 57c7a51b51b2fa967921182d2640f1d444ba8d9d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Apr 2018 18:14:05 +1000 Subject: [PATCH 0245/1393] Renamed CLIP to CLIP8 --- src/_imaging.c | 28 ++++++++++++++-------------- src/libImaging/Bands.c | 2 +- src/libImaging/Convert.c | 34 +++++++++++++++++----------------- src/libImaging/Effects.c | 2 +- src/libImaging/ImagingUtils.h | 2 +- src/libImaging/Unpack.c | 24 ++++++++++++------------ 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index d9e6dff35ee..922c7bb8cf2 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -407,7 +407,7 @@ getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) switch (type) { case TYPE_UINT8: itemp = PyInt_AsLong(op); - ((UINT8*)list)[i] = CLIP(itemp); + ((UINT8*)list)[i] = CLIP8(itemp); break; case TYPE_INT32: itemp = PyInt_AsLong(op); @@ -527,7 +527,7 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } - ink[0] = CLIP(r); + ink[0] = CLIP8(r); ink[1] = ink[2] = ink[3] = 0; } else { a = 255; @@ -547,10 +547,10 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } - ink[0] = CLIP(r); - ink[1] = CLIP(g); - ink[2] = CLIP(b); - ink[3] = CLIP(a); + ink[0] = CLIP8(r); + ink[1] = CLIP8(g); + ink[2] = CLIP8(b); + ink[3] = CLIP8(a); } return ink; case IMAGING_TYPE_INT32: @@ -1282,17 +1282,17 @@ _point(ImagingObject* self, PyObject* args) im = ImagingPoint(self->image, mode, (void*) data); else if (mode && bands > 1) { for (i = 0; i < 256; i++) { - lut[i*4] = CLIP(data[i]); - lut[i*4+1] = CLIP(data[i+256]); - lut[i*4+2] = CLIP(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] = CLIP(data[i+768]); + lut[i*4+3] = CLIP8(data[i+768]); } im = ImagingPoint(self->image, mode, (void*) lut); } else { /* map individual bands */ for (i = 0; i < n; i++) - lut[i] = CLIP(data[i]); + lut[i] = CLIP8(data[i]); im = ImagingPoint(self->image, mode, (void*) lut); } free(data); @@ -1356,7 +1356,7 @@ _putdata(ImagingObject* self, PyObject* args) else /* Scaled and clipped string data */ for (i = x = y = 0; i < n; i++) { - image->image8[y][x] = CLIP((int) (p[i] * scale + offset)); + image->image8[y][x] = CLIP8((int) (p[i] * scale + offset)); if (++x >= (int) image->xsize) x = 0, y++; } @@ -1370,7 +1370,7 @@ _putdata(ImagingObject* self, PyObject* args) /* Clipped data */ for (i = x = y = 0; i < n; i++) { op = PySequence_Fast_GET_ITEM(seq, i); - image->image8[y][x] = (UINT8) CLIP(PyInt_AsLong(op)); + image->image8[y][x] = (UINT8) CLIP8(PyInt_AsLong(op)); if (++x >= (int) image->xsize){ x = 0, y++; } @@ -1380,7 +1380,7 @@ _putdata(ImagingObject* self, PyObject* args) /* Scaled and clipped data */ for (i = x = y = 0; i < n; i++) { PyObject *op = PySequence_Fast_GET_ITEM(seq, i); - image->image8[y][x] = CLIP( + image->image8[y][x] = CLIP8( (int) (PyFloat_AsDouble(op) * scale + offset)); if (++x >= (int) image->xsize){ x = 0, y++; diff --git a/src/libImaging/Bands.c b/src/libImaging/Bands.c index 58f4df1d945..e38e228194f 100644 --- a/src/libImaging/Bands.c +++ b/src/libImaging/Bands.c @@ -211,7 +211,7 @@ ImagingFillBand(Imaging imOut, int band, int color) if (imOut->bands == 2 && band == 1) band = 3; - color = CLIP(color); + color = CLIP8(color); /* Insert color into image */ for (y = 0; y < imOut->ysize; y++) { diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index 582f9ca6874..39ddf8721de 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -140,7 +140,7 @@ la2lA(UINT8* out, const UINT8* in, int xsize) if (alpha == 255 || alpha == 0) { pixel = in[0]; } else { - pixel = CLIP((255 * in[0]) / alpha); + pixel = CLIP8((255 * in[0]) / alpha); } *out++ = (UINT8) pixel; *out++ = (UINT8) pixel; @@ -315,8 +315,8 @@ rgb2hsv(UINT8* out, const UINT8* in, int xsize) // incorrect hue happens if h/6 is negative. h = fmod((h/6.0 + 1.0), 1.0); - uh = (UINT8)CLIP((int)(h*255.0)); - us = (UINT8)CLIP((int)(s*255.0)); + uh = (UINT8)CLIP8((int)(h*255.0)); + us = (UINT8)CLIP8((int)(s*255.0)); *out++ = uh; *out++ = us; @@ -354,9 +354,9 @@ hsv2rgb(UINT8* out, const UINT8* in, int xsize) 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)CLIP(p); - uq = (UINT8)CLIP(q); - ut = (UINT8)CLIP(t); + up = (UINT8)CLIP8(p); + uq = (UINT8)CLIP8(q); + ut = (UINT8)CLIP8(t); switch (i%6) { case 0: @@ -465,9 +465,9 @@ rgba2rgbA(UINT8* out, const UINT8* in, int xsize) *out++ = in[1]; *out++ = in[2]; } else { - *out++ = CLIP((255 * in[0]) / alpha); - *out++ = CLIP((255 * in[1]) / alpha); - *out++ = CLIP((255 * in[2]) / alpha); + *out++ = CLIP8((255 * in[0]) / alpha); + *out++ = CLIP8((255 * in[1]) / alpha); + *out++ = CLIP8((255 * in[2]) / alpha); } *out++ = in[3]; } @@ -536,9 +536,9 @@ cmyk2rgb(UINT8* out, const UINT8* in, int xsize) int x, nk, tmp; for (x = 0; x < xsize; x++) { nk = 255 - in[3]; - out[0] = CLIP(nk - MULDIV255(in[0], nk, tmp)); - out[1] = CLIP(nk - MULDIV255(in[1], nk, tmp)); - out[2] = CLIP(nk - MULDIV255(in[2], nk, tmp)); + out[0] = CLIP8(nk - MULDIV255(in[0], nk, tmp)); + out[1] = CLIP8(nk - MULDIV255(in[1], nk, tmp)); + out[2] = CLIP8(nk - MULDIV255(in[2], nk, tmp)); out[3] = 255; out += 4; in += 4; @@ -1131,9 +1131,9 @@ topalette(Imaging imOut, Imaging imIn, ImagingPalette inpalette, int dither) int d2; INT16* cache; - r = CLIP(in[0] + (r + e[3+0])/16); - g = CLIP(in[1] + (g + e[3+1])/16); - b = CLIP(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); @@ -1235,7 +1235,7 @@ tobilevel(Imaging imOut, Imaging imIn, int dither) for (x = 0; x < imIn->xsize; x++) { /* pick closest colour */ - l = CLIP(in[x] + (l + errors[x+1])/16); + l = CLIP8(in[x] + (l + errors[x+1])/16); out[x] = (l > 128) ? 255 : 0; /* propagate errors */ @@ -1263,7 +1263,7 @@ tobilevel(Imaging imOut, Imaging imIn, int dither) for (x = 0; x < imIn->xsize; x++, in += 4) { /* pick closest colour */ - l = CLIP(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 */ diff --git a/src/libImaging/Effects.c b/src/libImaging/Effects.c index 1745302d930..7b4ff0b4380 100644 --- a/src/libImaging/Effects.c +++ b/src/libImaging/Effects.c @@ -106,7 +106,7 @@ ImagingEffectNoise(int xsize, int ysize, float sigma) this = factor * v1; next = factor * v2; } - out[x] = CLIP(128 + sigma * this); + out[x] = CLIP8(128 + sigma * this); } } diff --git a/src/libImaging/ImagingUtils.h b/src/libImaging/ImagingUtils.h index ad29f087475..d25da80ae2b 100644 --- a/src/libImaging/ImagingUtils.h +++ b/src/libImaging/ImagingUtils.h @@ -30,7 +30,7 @@ (MULDIV255(in1, (255 - mask), tmp1) + in2) -#define CLIP(v) ((v) <= 0 ? 0 : (v) < 256 ? (v) : 255) +#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. diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index dd849ce645a..05b4299b068 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -747,9 +747,9 @@ unpackRGBa16L(UINT8* _out, const UINT8* in, int pixels) } else if (a == 255) { out[i] = MAKE_UINT32(in[1], in[3], in[5], a); } else { - out[i] = MAKE_UINT32(CLIP(in[1] * 255 / a), - CLIP(in[3] * 255 / a), - CLIP(in[5] * 255 / a), a); + out[i] = MAKE_UINT32(CLIP8(in[1] * 255 / a), + CLIP8(in[3] * 255 / a), + CLIP8(in[5] * 255 / a), a); } in += 8; } @@ -768,9 +768,9 @@ unpackRGBa16B(UINT8* _out, const UINT8* in, int pixels) } else if (a == 255) { out[i] = MAKE_UINT32(in[0], in[2], in[4], a); } else { - out[i] = MAKE_UINT32(CLIP(in[0] * 255 / a), - CLIP(in[2] * 255 / a), - CLIP(in[4] * 255 / a), a); + out[i] = MAKE_UINT32(CLIP8(in[0] * 255 / a), + CLIP8(in[2] * 255 / a), + CLIP8(in[4] * 255 / a), a); } in += 8; } @@ -789,9 +789,9 @@ unpackRGBa(UINT8* _out, const UINT8* in, int pixels) } else if (a == 255) { out[i] = MAKE_UINT32(in[0], in[1], in[2], a); } else { - out[i] = MAKE_UINT32(CLIP(in[0] * 255 / a), - CLIP(in[1] * 255 / a), - CLIP(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 += 4; } @@ -810,9 +810,9 @@ unpackBGRa(UINT8* _out, const UINT8* in, int pixels) } else if (a == 255) { out[i] = MAKE_UINT32(in[2], in[1], in[0], a); } else { - out[i] = MAKE_UINT32(CLIP(in[2] * 255 / a), - CLIP(in[1] * 255 / a), - CLIP(in[0] * 255 / a), a); + out[i] = MAKE_UINT32(CLIP8(in[2] * 255 / a), + CLIP8(in[1] * 255 / a), + CLIP8(in[0] * 255 / a), a); } in += 4; } From 101c095e99bbf068aa16eba03f6535d270e27104 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Apr 2018 19:51:57 +0300 Subject: [PATCH 0246/1393] Add tests for wrong types --- Tests/test_imagemorph.py | 20 ++++++++++++++++++-- src/_imagingmorph.c | 6 +++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index b51b212e0db..89a4022ae6c 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -1,8 +1,7 @@ # Test the ImageMorphology functionality from helper import unittest, PillowTestCase, hopper -from PIL import Image -from PIL import ImageMorph +from PIL import Image, ImageMorph, _imagingmorph class MorphTests(PillowTestCase): @@ -284,6 +283,23 @@ def test_set_lut(self): # Assert self.assertEqual(mop.lut, lut) + def test_wrong_mode(self): + lut = ImageMorph.LutBuilder(op_name='corner').build_lut() + imrgb = Image.new('RGB', (10, 10)) + iml = Image.new('L', (10, 10)) + + with self.assertRaises(ValueError): + _imagingmorph.apply(bytes(lut), imrgb.im.id, iml.im.id) + + with self.assertRaises(ValueError): + _imagingmorph.apply(bytes(lut), iml.im.id, imrgb.im.id) + + with self.assertRaises(ValueError): + _imagingmorph.match(bytes(lut), imrgb.im.id) + + # Should not raise + _imagingmorph.match(bytes(lut), iml.im.id) + if __name__ == '__main__': unittest.main() diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index b700f8482aa..0b60e4c8078 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -66,12 +66,12 @@ apply(PyObject *self, PyObject* args) if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { - PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); + PyErr_SetString(PyExc_ValueError, "Unsupported image type"); return NULL; } if (imgout->type != IMAGING_TYPE_UINT8 || imgout->bands != 1) { - PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); + PyErr_SetString(PyExc_ValueError, "Unsupported image type"); return NULL; } @@ -169,7 +169,7 @@ match(PyObject *self, PyObject* args) if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { - PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); + PyErr_SetString(PyExc_ValueError, "Unsupported image type"); return NULL; } From 997e554593dba01e0e2e84a744812d3fe5e73b09 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Apr 2018 20:52:38 +0300 Subject: [PATCH 0247/1393] Revert ValueErrors to RuntimeErrors in ImageMorph module --- Tests/test_imagemorph.py | 6 +++--- src/_imagingmorph.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index 89a4022ae6c..cad3caebd02 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -288,13 +288,13 @@ def test_wrong_mode(self): imrgb = Image.new('RGB', (10, 10)) iml = Image.new('L', (10, 10)) - with self.assertRaises(ValueError): + with self.assertRaises(RuntimeError): _imagingmorph.apply(bytes(lut), imrgb.im.id, iml.im.id) - with self.assertRaises(ValueError): + with self.assertRaises(RuntimeError): _imagingmorph.apply(bytes(lut), iml.im.id, imrgb.im.id) - with self.assertRaises(ValueError): + with self.assertRaises(RuntimeError): _imagingmorph.match(bytes(lut), imrgb.im.id) # Should not raise diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index 0b60e4c8078..b700f8482aa 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -66,12 +66,12 @@ apply(PyObject *self, PyObject* args) if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { - PyErr_SetString(PyExc_ValueError, "Unsupported image type"); + PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } if (imgout->type != IMAGING_TYPE_UINT8 || imgout->bands != 1) { - PyErr_SetString(PyExc_ValueError, "Unsupported image type"); + PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } @@ -169,7 +169,7 @@ match(PyObject *self, PyObject* args) if (imgin->type != IMAGING_TYPE_UINT8 || imgin->bands != 1) { - PyErr_SetString(PyExc_ValueError, "Unsupported image type"); + PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); return NULL; } From 001c2fec88c310d3872373a6f3a9cb39be3c6dcb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 23 Apr 2018 10:27:40 +1000 Subject: [PATCH 0248/1393] Updated libwebp to 1.0.0 --- depends/install_webp.sh | 2 +- winbuild/config.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 37a77243603..e27fedc5100 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,7 +1,7 @@ #!/bin/bash # install webp -archive=libwebp-0.6.1 +archive=libwebp-1.0.0 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/winbuild/config.py b/winbuild/config.py index 1a8ef3a0b59..4f39bff1960 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -66,9 +66,9 @@ 'version': '8.6.8', }, 'webp': { - 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-0.6.1.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'libwebp-0.6.1.tar.gz', - 'dir': 'libwebp-0.6.1', + 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-1.0.0.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'libwebp-1.0.0.tar.gz', + 'dir': 'libwebp-1.0.0', }, 'openjpeg': { 'url': SF_MIRROR+'/project/openjpeg/openjpeg/2.3.0/openjpeg-2.3.0.tar.gz', From b77e89b286a274c8c826b9d472fbac34dfd9e1be Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 22:15:16 +0800 Subject: [PATCH 0249/1393] Added getsize_multiline support for ImageFont --- src/PIL/ImageFont.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 5ae6c3a4e15..3ac29e8f6f9 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -147,6 +147,10 @@ def __init__(self, font=None, size=10, index=0, encoding="", self.font = core.getfont( "", size, index, encoding, self.font_bytes, layout_engine) + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + return text.split(split_character) + def getname(self): return self.font.family, self.font.style @@ -157,6 +161,16 @@ def getsize(self, text, direction=None, features=None): size, offset = self.font.getsize(text, direction, features) return (size[0] + offset[0], size[1] + offset[1]) + def getsize_multiline(self, text, direction=None, spacing=4, features=None): + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.getsize('A')[1] + spacing + for line in lines: + line_width, line_height = self.getsize(line, direction, features) + max_width = max(max_width, line_width) + + return max_width, len(lines)*line_spacing - spacing + def getoffset(self, text): return self.font.getsize(text)[1] From 3fda581963ffaa588e854ba0343f5864a4dc8b66 Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 22:27:29 +0800 Subject: [PATCH 0250/1393] Added test for getsize_multiline --- Tests/test_imagefont.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 986b0b5efe6..aae7fa8cc1b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -509,6 +509,12 @@ def test_imagefont_getters(self): self.assertEqual(t.getsize('M'), self.metrics['getters']) self.assertEqual(t.getsize('y'), (12, 20)) self.assertEqual(t.getsize('a'), (12, 16)) + self.assertEqual(t.getsize_multiline('A'),(12,16)) + self.assertEqual(t.getsize_multiline('AB'),(24,16)) + self.assertEqual(t.getsize_multiline('a'),(12,16)) + self.assertEqual(t.getsize_multiline('ABC\n'),(36,36)) + self.assertEqual(t.getsize_multiline('ABC\nA'),(36,36)) + self.assertEqual(t.getsize_multiline('ABC\nAaaa'),(48,36)) @unittest.skipUnless(HAS_RAQM, "Raqm not Available") From ce505b7d1be47fc509bb5c5cb2614a4adc8daee9 Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 22:34:23 +0800 Subject: [PATCH 0251/1393] Added documentation for ImageFont.getsize_multiline --- docs/reference/ImageFont.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 76fde44ff4a..8ef7dcd9ff5 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -51,6 +51,10 @@ Methods :return: (width, height) +.. py:method:: PIL.ImageFont.ImageFont.getsize_multiline(text) + + :return: (width, height) + .. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='', direction=None, features=[]) Create a bitmap for the text. From d6926009d0ba3e1d0d59fef318d1a8369b2ab202 Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 22:54:27 +0800 Subject: [PATCH 0252/1393] Fixed bug: ImageDraw.multiline_textsize() returning wrong size by adding extra spacing --- src/PIL/ImageDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 89df2733811..2db4981bf8f 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -271,7 +271,7 @@ def multiline_textsize(self, text, font=None, spacing=4, direction=None, line_width, line_height = self.textsize(line, font, spacing, direction, features) max_width = max(max_width, line_width) - return max_width, len(lines)*line_spacing + return max_width, len(lines)*line_spacing - spacing def Draw(im, mode=None): From 58474d1c8dae355a5190aad7bf09ad3f54d2b712 Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 22:55:17 +0800 Subject: [PATCH 0253/1393] Added test to ensure ImageDraw.multiline_textsize returns same value as ImageFont.getsize for single lines --- Tests/test_imagefont.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 986b0b5efe6..3968b53c7ec 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -230,7 +230,10 @@ def test_multiline_size(self): # Test that textsize() correctly connects to multiline_textsize() self.assertEqual(draw.textsize(TEST_TEXT, font=ttf), draw.multiline_textsize(TEST_TEXT, font=ttf)) - + # Test that multiline_textsize corresponds to ImageFont.textsize() + # for single line text + self.assertEqual(ttf.getsize('A'), + draw.multiline_textsize('A', font=ttf)) # Test that textsize() can pass on additional arguments # to multiline_textsize() draw.textsize(TEST_TEXT, font=ttf, spacing=4) From 4420f360d8695789140245bc808c9252342fe951 Mon Sep 17 00:00:00 2001 From: tianyu Date: Tue, 24 Apr 2018 23:19:31 +0800 Subject: [PATCH 0254/1393] Removed bugged documentation --- docs/reference/ImageFont.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 8ef7dcd9ff5..76fde44ff4a 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -51,10 +51,6 @@ Methods :return: (width, height) -.. py:method:: PIL.ImageFont.ImageFont.getsize_multiline(text) - - :return: (width, height) - .. py:method:: PIL.ImageFont.ImageFont.getmask(text, mode='', direction=None, features=[]) Create a bitmap for the text. From 244a44c5f8d2cdf503b817fb563072a95b701b81 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 25 Apr 2018 08:43:04 +0300 Subject: [PATCH 0255/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1f9f2389a0a..30af3ce628b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Update libwebp to 1.0.0 #3108 + [radarhere] + - Build macOS wheels with Xcode 6.4, supporting older macOS versions #3068 [wiredfool] From e33dd498f5f702fc47b42087773fc8f3b04c418d Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 12:05:09 +0300 Subject: [PATCH 0256/1393] Prefer more conventional __version__ rather than PILLOW_VERSION --- Tests/test_pyroma.py | 4 ++-- docs/conf.py | 4 ++-- selftest.py | 2 +- src/PIL/Image.py | 6 +++--- src/PIL/ImageCms.py | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index 962535f03fa..cf5fc361f60 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase -from PIL import PILLOW_VERSION +from PIL import __version__ try: import pyroma @@ -26,7 +26,7 @@ def test_pyroma(self): rating = pyroma.ratings.rate(data) # Assert - if 'rc' in PILLOW_VERSION: + if 'rc' in __version__: # Pyroma needs to chill about RC versions # and not kill all our tests. self.assertEqual(rating, (9, [ diff --git a/docs/conf.py b/docs/conf.py index 4053e24e6ef..ba0a552b3d1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -53,9 +53,9 @@ # # The short X.Y version. import PIL -version = PIL.PILLOW_VERSION +version = PIL.__version__ # The full version, including alpha/beta/rc tags. -release = PIL.PILLOW_VERSION +release = PIL.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/selftest.py b/selftest.py index 3f358c583d4..ed2ba815f91 100755 --- a/selftest.py +++ b/selftest.py @@ -161,7 +161,7 @@ def testimage(): exit_status = 0 print("-"*68) - print("Pillow", Image.PILLOW_VERSION, "TEST SUMMARY ") + print("Pillow", Image.__version__, "TEST SUMMARY ") print("-"*68) print("Python modules loaded from", os.path.dirname(Image.__file__)) print("Binary modules loaded from", os.path.dirname(Image.core.__file__)) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index bf187f2d48d..dfc6ae800cf 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -24,7 +24,7 @@ # See the README file for information on usage and redistribution. # -from . import VERSION, PILLOW_VERSION, _plugins +from . import VERSION, PILLOW_VERSION, __version__, _plugins from ._util import py3 import logging @@ -59,13 +59,13 @@ def __getattr__(self, id): # Also note that Image.core is not a publicly documented interface, # and should be considered private and subject to change. from . import _imaging as core - if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): + if __version__ != getattr(core, 'PILLOW_VERSION', None): raise ImportError("The _imaging extension was built for another " "version of Pillow or PIL:\n" "Core version: %s\n" "Pillow version: %s" % (getattr(core, 'PILLOW_VERSION', None), - PILLOW_VERSION)) + __version__)) except ImportError as v: core = _imaging_not_installed() diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index d82e30efc46..640f8953fed 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -951,5 +951,5 @@ def versions(): return ( VERSION, core.littlecms_version, - sys.version.split()[0], Image.VERSION + sys.version.split()[0], Image.__version__ ) From d80ed2e948d508a9187ad457399265741fe03aa6 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 12:16:34 +0300 Subject: [PATCH 0257/1393] Deprecate PILLOW_VERSION and VERSION, use __version__ instead --- src/PIL/Image.py | 1 + src/PIL/__init__.py | 1 + 2 files changed, 2 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index dfc6ae800cf..0b9c52899de 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -24,6 +24,7 @@ # See the README file for information on usage and redistribution. # +# PILLOW_VERSION and VERSION are deprecated and will be removed in Pillow 6.0.0. Use __version__ instead. from . import VERSION, PILLOW_VERSION, __version__, _plugins from ._util import py3 diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index 012586fa453..7b8f0595f1d 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -13,6 +13,7 @@ from . import _version +# PILLOW_VERSION and VERSION are deprecated and will be removed in Pillow 6.0.0. Use __version__ instead. VERSION = '1.1.7' # PIL Version PILLOW_VERSION = __version__ = _version.__version__ From 34d66494ca0fda6f7ebe5fad546521fddc36ddae Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 15:54:06 +0300 Subject: [PATCH 0258/1393] Keep Image.VERSION here --- src/PIL/ImageCms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 640f8953fed..d82e30efc46 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -951,5 +951,5 @@ def versions(): return ( VERSION, core.littlecms_version, - sys.version.split()[0], Image.__version__ + sys.version.split()[0], Image.VERSION ) From 312b91717cd076731137810e55eb13267c1aa8aa Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 16:03:52 +0300 Subject: [PATCH 0259/1393] Document deprecations in release note --- docs/releasenotes/5.2.0.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 073daaf03de..477bb32e40f 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -1,6 +1,17 @@ 5.2.0 ----- +API Changes +=========== + +Deprecations +^^^^^^^^^^^^ + +Two version constants – ``VERSION`` (the old PIL version 1.1.7) and +``PILLOW_VERSION`` – have been deprecated and will be removed in the next +major release. Use ``__version__`` instead. + + API Additions ============= From 3508d679991b92d956857ff02640ddaa64808aa7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Apr 2018 17:02:24 +0300 Subject: [PATCH 0260/1393] Explicitly enumerate version constants --- docs/releasenotes/5.2.0.rst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 477bb32e40f..2ae6ee2923f 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -7,9 +7,15 @@ API Changes Deprecations ^^^^^^^^^^^^ -Two version constants – ``VERSION`` (the old PIL version 1.1.7) and -``PILLOW_VERSION`` – have been deprecated and will be removed in the next -major release. Use ``__version__`` instead. +These version constants have been deprecated and will be removed in the next +major release: + +* ``PIL.VERSION`` (old PIL version 1.1.7) +* ``PIL.PILLOW_VERSION`` +* ``PIL.Image.VERSION`` +* ``PIL.Image.PILLOW_VERSION`` + +Use ``__version__`` instead. API Additions From c18dce5625755564e7664f617f5dc7b277d03d01 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 15 Apr 2018 10:37:50 +0300 Subject: [PATCH 0261/1393] 'Use PIL.__version__ instead.' --- docs/releasenotes/5.2.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 2ae6ee2923f..88e34f66624 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -15,7 +15,7 @@ major release: * ``PIL.Image.VERSION`` * ``PIL.Image.PILLOW_VERSION`` -Use ``__version__`` instead. +Use ``PIL.__version__`` instead. API Additions From ef9bf76ce836d04630c48122cb828eba751096f0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 22 Apr 2018 22:00:39 +0300 Subject: [PATCH 0262/1393] PILLOW_VERSION will be removed in a future release --- docs/releasenotes/5.2.0.rst | 4 ++-- src/PIL/Image.py | 4 +++- src/PIL/__init__.py | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 88e34f66624..3a86a1d1194 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -7,8 +7,8 @@ API Changes Deprecations ^^^^^^^^^^^^ -These version constants have been deprecated and will be removed in the next -major release: +These version constants have been deprecated. ``VERSION`` will be removed in +Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed in a future release. * ``PIL.VERSION`` (old PIL version 1.1.7) * ``PIL.PILLOW_VERSION`` diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 0b9c52899de..87cfc5a0273 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -24,7 +24,9 @@ # See the README file for information on usage and redistribution. # -# PILLOW_VERSION and VERSION are deprecated and will be removed in Pillow 6.0.0. Use __version__ instead. +# VERSION is deprecated and will be removed in Pillow 6.0.0. +# PILLOW_VERSION is deprecated and will be removed in a future release. +# Use __version__ instead. from . import VERSION, PILLOW_VERSION, __version__, _plugins from ._util import py3 diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index 7b8f0595f1d..5806a217464 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -13,7 +13,9 @@ from . import _version -# PILLOW_VERSION and VERSION are deprecated and will be removed in Pillow 6.0.0. Use __version__ instead. +# VERSION is deprecated and will be removed in Pillow 6.0.0. +# PILLOW_VERSION is deprecated and will be removed in a future release. +# Use __version__ instead. VERSION = '1.1.7' # PIL Version PILLOW_VERSION = __version__ = _version.__version__ From de6baf65f364a5c2f39b9c84f99832fde55b1c3b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 25 Apr 2018 11:13:56 +0300 Subject: [PATCH 0263/1393] Clarify PILLOW_VERSION will be removed after VERSION --- docs/releasenotes/5.2.0.rst | 2 +- src/PIL/Image.py | 2 +- src/PIL/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 3a86a1d1194..65b2d8fd16b 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -8,7 +8,7 @@ Deprecations ^^^^^^^^^^^^ These version constants have been deprecated. ``VERSION`` will be removed in -Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed in a future release. +Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed after that. * ``PIL.VERSION`` (old PIL version 1.1.7) * ``PIL.PILLOW_VERSION`` diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 87cfc5a0273..1954c52ee05 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -25,7 +25,7 @@ # # VERSION is deprecated and will be removed in Pillow 6.0.0. -# PILLOW_VERSION is deprecated and will be removed in a future release. +# PILLOW_VERSION is deprecated and will be removed after that. # Use __version__ instead. from . import VERSION, PILLOW_VERSION, __version__, _plugins from ._util import py3 diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index 5806a217464..eee0abde54b 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -14,7 +14,7 @@ from . import _version # VERSION is deprecated and will be removed in Pillow 6.0.0. -# PILLOW_VERSION is deprecated and will be removed in a future release. +# PILLOW_VERSION is deprecated and will be removed after that. # Use __version__ instead. VERSION = '1.1.7' # PIL Version PILLOW_VERSION = __version__ = _version.__version__ From 4ff25b751b2bef742fd74678566eb31081751bf2 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 26 Apr 2018 11:23:11 +0300 Subject: [PATCH 0264/1393] Update CHANGES.rst --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 30af3ce628b..4c3b240899a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Deprecate PILLOW_VERSION and VERSION #3090 + [hugovk] + +- Support Python 3.7 #3076 + [hugovk] + - Update libwebp to 1.0.0 #3108 [radarhere] From f77adb5ab3172b257e70651774b173c4f69ca408 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Apr 2018 11:01:09 +1000 Subject: [PATCH 0265/1393] Replaced broken URLs with archive URLs --- src/PIL/DdsImagePlugin.py | 2 +- src/libImaging/BcnDecode.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 9508e61c872..e755f94b9d9 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -3,7 +3,7 @@ Jerome Leclanche Documentation: - http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt The contents of this file are hereby released in the public domain (CC0) Full text of the CC0 license: diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index 58d3ecc1068..8876494410e 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -4,7 +4,7 @@ * decoder for DXTn-compressed data * * Format documentation: - * http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + * https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt * * The contents of this file are in the public domain (CC0) * Full text of the CC0 license: From 765a6c7e7431c36397fbc3f261a7f66c48403dcf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Apr 2018 14:20:32 +1000 Subject: [PATCH 0266/1393] Updated redirected URLs --- src/PIL/PdfParser.py | 2 +- src/libImaging/BcnDecode.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index ceea7dd2e65..c18846068a3 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -341,7 +341,7 @@ def pdf_repr(x): class PdfParser: - """Based on http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + """Based on https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf Supports PDF up to 1.4 """ diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index 8876494410e..1472b02961c 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -178,7 +178,7 @@ static void decode_bc5_block(rgba *col, const UINT8* src) { } /* BC6 and BC7 are described here: - https://www.opengl.org/registry/specs/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) { int by = bit >> 3; From 7206f950616a3ec5a858e917b55f46a0c12c0c67 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 4 May 2018 19:35:59 +1000 Subject: [PATCH 0267/1393] Updated freetype to 2.9.1 --- winbuild/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 4f39bff1960..563cebfc6d9 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -34,9 +34,9 @@ 'dir': 'tiff-4.0.9', }, 'freetype': { - 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.9.tar.gz', - 'dir': 'freetype-2.9', + 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.9.1.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'freetype-2.9.1.tar.gz', + 'dir': 'freetype-2.9.1', }, 'lcms': { 'url': SF_MIRROR+'/project/lcms/lcms/2.7/lcms2-2.7.zip', From 3dbd4fb9e83c129dbb7b8b56a618301c663d88bc Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 6 May 2018 15:31:43 +0300 Subject: [PATCH 0268/1393] Fix DeprecationWarning in Python 3.7 --- src/PIL/Image.py | 10 ++++++++-- src/PIL/TiffImagePlugin.py | 9 ++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1954c52ee05..06014c8841c 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -121,8 +121,14 @@ def __getattr__(self, id): import atexit # type stuff -import collections import numbers +try: + # Python 3 + from collections.abc import Callable +except ImportError: + # Python 2.7 + from collections import Callable + # works everywhere, win for pypy, not cpython USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') @@ -1142,7 +1148,7 @@ def filter(self, filter): self.load() - if isinstance(filter, collections.Callable): + if isinstance(filter, Callable): filter = filter() if not hasattr(filter, "filter"): raise TypeError("filter argument should be ImageFilter.Filter " + diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 167f0cba14f..6f032f49d19 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -58,6 +58,13 @@ from .TiffTags import TYPES +try: + # Python 3 + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import MutableMapping + __version__ = "1.3.5" DEBUG = False # Needs to be merged with the new logging approach. @@ -398,7 +405,7 @@ def delegate(self, *args): __round__ = _delegate('__round__') -class ImageFileDirectory_v2(collections.MutableMapping): +class ImageFileDirectory_v2(MutableMapping): """This class represents a TIFF tag directory. To speed things up, we don't decode tags unless they're asked for. From b6f337fa601d7f60253ec280b6c75450de4b5848 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 6 Apr 2018 09:22:10 +0300 Subject: [PATCH 0269/1393] Clarify bounding box for arc, chord, ellipse, pieslice --- docs/reference/ImageDraw.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 6b686568d99..45046aa1b1e 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -132,7 +132,8 @@ Methods angles, inside the given bounding box. :param xy: Two points to define the bounding box. Sequence of - ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. + ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``, + where ``x1 >= x0`` and ``y1 >= y0``. :param start: Starting angle, in degrees. Angles are measured from 3 o'clock, increasing clockwise. :param end: Ending angle, in degrees. @@ -155,7 +156,8 @@ Methods with a straight line. :param xy: Two points to define the bounding box. Sequence of - ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. + ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``, + where ``x1 >= x0`` and ``y1 >= y0``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. @@ -164,7 +166,8 @@ Methods Draws an ellipse inside the given bounding box. :param xy: Two points to define the bounding box. Sequence of either - ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. + ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``, + where ``x1 >= x0`` and ``y1 >= y0``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. @@ -188,7 +191,8 @@ Methods center of the bounding box. :param xy: Two points to define the bounding box. Sequence of - ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``. + ``[(x0, y0), (x1, y1)]`` or ``[x0, y0, x1, y1]``, + where ``x1 >= x0`` and ``y1 >= y0``. :param start: Starting angle, in degrees. Angles are measured from 3 o'clock, increasing clockwise. :param end: Ending angle, in degrees. From baa987de0f1b3884bdd00080ba3ead4ccfd0174e Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 9 May 2018 22:54:03 +0300 Subject: [PATCH 0270/1393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 4c3b240899a..32140d34892 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,7 +11,7 @@ Changelog (Pillow) - Support Python 3.7 #3076 [hugovk] -- Update libwebp to 1.0.0 #3108 +- Depends: Update freetype to 2.9.1, libwebp to 1.0.0 #3121, #3108 [radarhere] - Build macOS wheels with Xcode 6.4, supporting older macOS versions #3068 From c38f25a876c89c2d0c7ecd7ee65823cf02cf887e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 13 May 2018 20:52:11 +1000 Subject: [PATCH 0271/1393] Corrected documentation syntax --- Tests/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index d70b6f51d5b..4e11f269dcf 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -239,7 +239,7 @@ def _get_mem_usage(self): Gets the RUSAGE memory usage, returns in K. Encapsulates the difference between OSX and Linux rss reporting - :returns; memory usage in kilobytes + :returns: memory usage in kilobytes """ from resource import getrusage, RUSAGE_SELF From 1c88afe5c0a1c4905d5832e775da19c4eb43c14f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 13 May 2018 20:55:04 +1000 Subject: [PATCH 0272/1393] Changed OS X references to macOS --- Tests/helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 4e11f269dcf..5dbdb66beb3 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -230,14 +230,14 @@ def open_withImagemagick(self, f): @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or macOS") class PillowLeakTestCase(PillowTestCase): - # requires unix/osx + # requires unix/macOS iterations = 100 # count mem_limit = 512 # k def _get_mem_usage(self): """ Gets the RUSAGE memory usage, returns in K. Encapsulates the difference - between OSX and Linux rss reporting + between macOS and Linux rss reporting :returns: memory usage in kilobytes """ From 1a61ab2f23bfc7461bfc30ff84bd43134f94d5c1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 16:10:01 +0300 Subject: [PATCH 0273/1393] AppVeyor: upgrade to PyPy 6.0.0 --- winbuild/appveyor_install_pypy.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/appveyor_install_pypy.cmd b/winbuild/appveyor_install_pypy.cmd index 1fe39f1a195..f68e75daa9d 100644 --- a/winbuild/appveyor_install_pypy.cmd +++ b/winbuild/appveyor_install_pypy.cmd @@ -1,3 +1,3 @@ -curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.10.0-win32.zip -7z x pypy2.zip -oc:\ -c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v5.10.0-win32\pypy.exe c:\vp\pypy2 +curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v6.0.0-win32.zip +7z x pypy2.zip -oc:\ +c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v6.0.0-win32\pypy.exe c:\vp\pypy2 From 90ab677d44891550ba12383db8cd6ae124bd5230 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 18:07:56 +0300 Subject: [PATCH 0274/1393] Re-enable test for PyPy --- Tests/test_imagedraw.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index a79a75ca0dd..a1b8fb19ab0 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -360,8 +360,6 @@ def test_floodfill(self): ImageDraw.floodfill(im, (W, H), red) self.assert_image_equal(im, im_floodfill) - @unittest.skipIf(hasattr(sys, 'pypy_version_info'), - "Causes fatal RPython error on PyPy") def test_floodfill_border(self): # floodfill() is experimental From d524664215bbed37ee175a38b867958494684153 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 21:42:20 +0300 Subject: [PATCH 0275/1393] Re-enable test for PyPy, we're long past 5.3.1 --- Tests/test_numpy.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 3f95865135b..4ccd358622b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -1,7 +1,6 @@ from __future__ import print_function -import sys -from helper import unittest, PillowTestCase, hopper +from helper import PillowTestCase, hopper, unittest from PIL import Image try: @@ -15,13 +14,6 @@ TEST_IMAGE_SIZE = (10, 10) -# Numpy on pypy as of pypy 5.3.1 is corrupting the numpy.array(Image) -# call such that it's returning a object of type numpy.ndarray, but -# the repr is that of a PIL.Image. Size and shape are 1 and (), not the -# size and shape of the array. This causes failures in several tests. -SKIP_NUMPY_ON_PYPY = hasattr(sys, 'pypy_version_info') and ( - sys.pypy_version_info <= (5, 3, 1, 'final', 0)) - class TestNumpy(PillowTestCase): @@ -121,7 +113,6 @@ def _test_img_equals_nparray(self, img, np): for y in range(0, img.size[1], int(img.size[1]/10)): self.assert_deep_equal(px[x, y], np[y, x]) - @unittest.skipIf(SKIP_NUMPY_ON_PYPY, "numpy.array(Image) is flaky on PyPy") def test_16bit(self): img = Image.open('Tests/images/16bit.cropped.tif') np_img = numpy.array(img) @@ -152,7 +143,6 @@ def test_save_tiff_uint16(self): img_px = img.load() self.assertEqual(img_px[0, 0], pixel_value) - @unittest.skipIf(SKIP_NUMPY_ON_PYPY, "numpy.array(Image) is flaky on PyPy") def test_to_array(self): def _to_array(mode, dtype): From 33592b4f73b25b420ea5395f4e936f1e0735cb7a Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 23:21:47 +0300 Subject: [PATCH 0276/1393] No need to import sys --- Tests/test_imagedraw.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index a1b8fb19ab0..f9377634f58 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1,11 +1,7 @@ -from helper import unittest, PillowTestCase, hopper - -from PIL import Image -from PIL import ImageColor -from PIL import ImageDraw import os.path -import sys +from helper import PillowTestCase, hopper, unittest +from PIL import Image, ImageColor, ImageDraw BLACK = (0, 0, 0) WHITE = (255, 255, 255) From e92ef63cac505f31e0f6702af4023505785b077e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 May 2018 20:56:55 +1000 Subject: [PATCH 0277/1393] Updated libjpeg to 9c --- winbuild/config.py | 6 +++--- winbuild/nmake.opt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 563cebfc6d9..404ce16a7da 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -24,9 +24,9 @@ 'dir': 'zlib-1.2.11', }, 'jpeg': { - 'url': 'http://www.ijg.org/files/jpegsr9b.zip', - 'filename': PILLOW_DEPENDS_DIR + 'jpegsr9b.zip', - 'dir': 'jpeg-9b', + 'url': 'http://www.ijg.org/files/jpegsr9c.zip', + 'filename': PILLOW_DEPENDS_DIR + 'jpegsr9c.zip', + 'dir': 'jpeg-9c', }, 'tiff': { 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.9.zip', diff --git a/winbuild/nmake.opt b/winbuild/nmake.opt index b155daaccc0..28aab347904 100644 --- a/winbuild/nmake.opt +++ b/winbuild/nmake.opt @@ -55,7 +55,7 @@ LOGLUV_SUPPORT = 1 # Uncomment and edit following lines to enable JPEG support. # JPEG_SUPPORT = 1 -JPEGDIR = $(BUILD)\jpeg-9b +JPEGDIR = $(BUILD)\jpeg-9c JPEG_INCLUDE = -I$(JPEGDIR) JPEG_LIB = $(JPEGDIR)/libjpeg.lib From 3bbd0a58109c840a8895f364ffc7127cee04a30b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 May 2018 22:15:45 +1000 Subject: [PATCH 0278/1393] Fixed saving a multiframe image as a single frame PDF --- Tests/test_file_pdf.py | 10 ++++++++++ src/PIL/PdfImagePlugin.py | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index f17da8d746a..3d359f44512 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -104,6 +104,16 @@ def imGenerator(ims): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) + def test_multiframe_normal_save(self): + # Test saving a multiframe image without save_all + im = Image.open("Tests/images/dispose_bgnd.gif") + + outfile = self.tempfile('temp.pdf') + im.save(outfile) + + self.assertTrue(os.path.isfile(outfile)) + self.assertGreater(os.path.getsize(outfile), 0) + def test_pdf_open(self): # fail on a buffer full of null bytes self.assertRaises(PdfParser.PdfFormatError, PdfParser.PdfParser, buf=bytearray(65536)) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index e8e0c4f3bad..8538bcd4915 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -113,7 +113,8 @@ def _save(im, fp, filename, save_all=False): pageNumber = 0 for imSequence in ims: - for im in ImageSequence.Iterator(imSequence): + im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence] + for im in im_pages: # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports # Flatedecode (zip compression). From 07b657203dfc0866e9c9760a49d3d1c50fa531ac Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 18 May 2018 15:23:51 +0300 Subject: [PATCH 0279/1393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 32140d34892..a36f3e0db8e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,7 +11,7 @@ Changelog (Pillow) - Support Python 3.7 #3076 [hugovk] -- Depends: Update freetype to 2.9.1, libwebp to 1.0.0 #3121, #3108 +- Depends: Update freetype to 2.9.1, libjpeg to 9c, libwebp to 1.0.0 #3121, #3136, #3108 [radarhere] - Build macOS wheels with Xcode 6.4, supporting older macOS versions #3068 From efa045a755da6e22145d49309c66598fad757cb0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 24 May 2018 17:57:43 +0300 Subject: [PATCH 0280/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a36f3e0db8e..13c8af6c6bc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- AppVeyor: upgrade to PyPy 6.0.0 #3133 + [hugovk] + - Deprecate PILLOW_VERSION and VERSION #3090 [hugovk] From 4d7fa5f1156898a6832390b2826f49167999f7fa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 May 2018 20:10:54 +1000 Subject: [PATCH 0281/1393] Updated winbuild python versions --- winbuild/get_pythons.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/get_pythons.py b/winbuild/get_pythons.py index 448450afb25..376f056b7be 100644 --- a/winbuild/get_pythons.py +++ b/winbuild/get_pythons.py @@ -2,7 +2,7 @@ import os if __name__ == '__main__': - for version in ['2.7.10', '3.4.3']: + for version in ['2.7.15', '3.4.4']: for platform in ['', '.amd64']: for extension in ['', '.asc']: fetch('https://www.python.org/ftp/python/%s/python-%s%s.msi%s' From ed6cb7da5bb47bdf4a69af108eb10963ba0d7db8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 May 2018 12:30:41 +1000 Subject: [PATCH 0282/1393] Fixed typo --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 285f618b1ba..b88a103b05f 100644 --- a/README.rst +++ b/README.rst @@ -14,7 +14,7 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Sun, 27 May 2018 15:32:22 +1000 Subject: [PATCH 0283/1393] Changed ellipse point calculations to be more evenly distributed --- Tests/test_imagedraw.py | 10 ++++++++++ src/libImaging/Draw.c | 29 +++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index f9377634f58..1c8fe3153ad 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -169,6 +169,16 @@ def test_ellipse_edge(self): self.assert_image_similar( im, Image.open("Tests/images/imagedraw_ellipse_edge.png"), 1) + def test_ellipse_symmetric(self): + for bbox in [ + (25, 25, 76, 76), + (25, 25, 75, 75) + ]: + im = Image.new("RGB", (101, 101)) + draw = ImageDraw.Draw(im) + draw.ellipse(bbox, fill="green", outline="blue") + self.assert_image_equal(im, im.transpose(Image.FLIP_LEFT_RIGHT)) + def helper_line(self, points): # Arrange im = Image.new("RGB", (W, H)) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 69cd884447a..7b7c5fac05c 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -732,6 +732,29 @@ ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink, #define CHORD 1 #define PIESLICE 2 +static void +ellipsePoint(int cx, int cy, int w, int h, + float i, int *x, int *y) +{ + float i_cos, i_sin; + float x_f, y_f; + double modf_int; + i_cos = cos(i*M_PI/180); + i_sin = sin(i*M_PI/180); + x_f = (i_cos * w/2) + cx; + y_f = (i_sin * h/2) + cy; + if (modf(x_f, &modf_int) == 0.5) { + *x = i_cos > 0 ? FLOOR(x_f) : CEIL(x_f); + } else { + *x = FLOOR(x_f + 0.5); + } + if (modf(y_f, &modf_int) == 0.5) { + *y = i_sin > 0 ? FLOOR(y_f) : CEIL(y_f); + } else { + *y = FLOOR(y_f + 0.5); + } +} + static int ellipse(Imaging im, int x0, int y0, int x1, int y1, float start, float end, const void* ink_, int fill, @@ -781,8 +804,7 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, if (i > end) { i = end; } - x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); - y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); + ellipsePoint(cx, cy, w, h, i, &x, &y); if (i != start) add_edge(&e[n++], lx, ly, x, y); else @@ -812,8 +834,7 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, if (i > end) { i = end; } - x = FLOOR((cos(i*M_PI/180) * w/2) + cx + 0.5); - y = FLOOR((sin(i*M_PI/180) * h/2) + cy + 0.5); + ellipsePoint(cx, cy, w, h, i, &x, &y); if (i != start) draw->line(im, lx, ly, x, y, ink); else From ce8d2b5d1aef7e9b58784d9f36151e88d877f261 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 27 May 2018 13:14:15 +0300 Subject: [PATCH 0284/1393] Update CHANGES.rst --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 13c8af6c6bc..92de24c1946 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,10 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ -- AppVeyor: upgrade to PyPy 6.0.0 #3133 +- AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3133 + [radarhere] + +- AppVeyor: Upgrade to PyPy 6.0.0 #3133 [hugovk] - Deprecate PILLOW_VERSION and VERSION #3090 From 85cb8eee8b95bc5b576ceb1fdf5d8bc914012f1a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 May 2018 21:39:26 +1000 Subject: [PATCH 0285/1393] Corrected PR number [ci skip] --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 92de24c1946..9c6882a9f25 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ -- AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3133 +- AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3141 [radarhere] - AppVeyor: Upgrade to PyPy 6.0.0 #3133 @@ -43,7 +43,7 @@ Changelog (Pillow) - Fix dereferencing type-punned pointer will break strict-aliasing #3069 [jdufresne] - + 5.1.0 (2018-04-02) ------------------ From e06e2777bc7667912959b4cbfd31aaf58eecd913 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 27 May 2018 21:41:09 +1000 Subject: [PATCH 0286/1393] Corrected PR number [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9c6882a9f25..3eb6840cc18 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ -- AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3141 +- AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3140 [radarhere] - AppVeyor: Upgrade to PyPy 6.0.0 #3133 From 821862c401ec9d905e48c38887402d79e7b91fb3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 May 2018 21:21:53 +1000 Subject: [PATCH 0287/1393] If a Qt version is already imported, attempt to use it first --- src/PIL/ImageQt.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index ca5fff180da..c9dc363128b 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -19,25 +19,33 @@ from . import Image from ._util import isPath, py3 from io import BytesIO - -qt_is_installed = True -qt_version = None -try: - from PyQt5.QtGui import QImage, qRgba, QPixmap - from PyQt5.QtCore import QBuffer, QIODevice - qt_version = '5' -except (ImportError, RuntimeError): +import sys + +qt_versions = [ + ['5', 'PyQt5'], + ['4', 'PyQt4'], + ['side', 'PySide'] +] +# 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: - from PyQt4.QtGui import QImage, qRgba, QPixmap - from PyQt4.QtCore import QBuffer, QIODevice - qt_version = '4' - except (ImportError, RuntimeError): - try: + if qt_module == 'PyQt5': + from PyQt5.QtGui import QImage, qRgba, QPixmap + from PyQt5.QtCore import QBuffer, QIODevice + elif qt_module == 'PyQt4': + from PyQt4.QtGui import QImage, qRgba, QPixmap + from PyQt4.QtCore import QBuffer, QIODevice + elif qt_module == 'PySide': from PySide.QtGui import QImage, qRgba, QPixmap from PySide.QtCore import QBuffer, QIODevice - qt_version = 'side' - except ImportError: - qt_is_installed = False + except (ImportError, RuntimeError): + continue + qt_is_installed = True + break +else: + qt_is_installed = False + qt_version = None def rgb(r, g, b, a=255): From e67849dc09c68e37a66b92d33ddc59e22ca01619 Mon Sep 17 00:00:00 2001 From: Thijs Triemstra Date: Tue, 29 May 2018 15:47:20 +0200 Subject: [PATCH 0288/1393] add raspbian stretch to supported platforms --- docs/installation.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 99f248e5582..1501d1de16b 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -446,7 +446,9 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Debian 8.2 Jessie | 2.7, 3.4 | 3.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ -| Raspian Jessie | 2.7, 3.4 | 3.1.0 |arm | +| Raspbian Jessie | 2.7, 3.4 | 3.1.0 |arm | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ +| Raspbian Stretch | 2.7, 3.5 | 4.0.0 |arm | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | Gentoo Linux | 2.7, 3.2 | 2.1.0 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ From adda3b7473be722f6bdbe81bbd9907795a137994 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 May 2018 21:00:44 +1000 Subject: [PATCH 0289/1393] Allow float values in getrgb hsl color string --- Tests/test_imagecolor.py | 4 ++++ src/PIL/ImageColor.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py index 64e88cf9c22..81ad179e6d4 100644 --- a/Tests/test_imagecolor.py +++ b/Tests/test_imagecolor.py @@ -78,6 +78,10 @@ def test_functions(self): self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360,100%,50%)")) self.assertEqual((0, 255, 255), ImageColor.getrgb("hsl(180,100%,50%)")) + # floats + self.assertEqual((254, 3, 3), ImageColor.getrgb("hsl(0.1,99.2%,50.3%)")) + self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360.,100.0%,50%)")) + # case insensitivity self.assertEqual(ImageColor.getrgb("RGB(255,0,0)"), ImageColor.getrgb("rgb(255,0,0)")) diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 4a1c90b27c3..0e97022288e 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -87,7 +87,7 @@ def getrgb(color): int((int(m.group(3)) * 255) / 100.0 + 0.5) ) - m = re.match(r"hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + m = re.match(r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) if m: from colorsys import hls_to_rgb rgb = hls_to_rgb( From f0c4a436f39f1cd144b00c2e45fe861595c2f01f Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 30 May 2018 12:14:54 +0100 Subject: [PATCH 0290/1393] Fix transform fill color for alpha images --- 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 1954c52ee05..30d0f5f9bda 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2115,11 +2115,11 @@ def transform(self, size, method, data=None, resample=NEAREST, if self.mode == 'LA': return self.convert('La').transform( - size, method, data, resample, fill).convert('LA') + size, method, data, resample, fill, fillcolor).convert('LA') if self.mode == 'RGBA': return self.convert('RGBa').transform( - size, method, data, resample, fill).convert('RGBA') + size, method, data, resample, fill, fillcolor).convert('RGBA') if isinstance(method, ImageTransformHandler): return method.transform(size, self, resample=resample, fill=fill) From 06efe1826b1075444ff86015ecc1b55b309b16e8 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 30 May 2018 14:27:18 +0300 Subject: [PATCH 0291/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3eb6840cc18..684f59f64f2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Allow float values in getrgb HSL color string #3146 + [radarhere] + - AppVeyor: Upgrade to Python 2.7.15 and 3.4.4 #3140 [radarhere] From d2854f3925de1595d678df8bf07fcb17d3e4ddea Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 30 May 2018 15:05:58 +0100 Subject: [PATCH 0292/1393] Add unit tests for alpha fill color fix --- Tests/test_image_rotate.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 61ce78a7183..8ddb5ddf854 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -109,6 +109,19 @@ def test_rotate_with_fill(self): im = im.rotate(45, fillcolor='white') self.assert_image_equal(im, target) + def test_alpha_rotate_no_fill(self): + # Alpha images are handled differently internally + im = Image.new('RGBA', (10, 10), 'green') + im = im.rotate(45, expand=1) + corner = im.getpixel((0,0)) + self.assertEqual(corner, (0, 0, 0, 0)) + + def test_alpha_rotate_with_fill(self): + # Alpha images are handled differently internally + im = Image.new('RGBA', (10, 10), 'green') + im = im.rotate(45, expand=1, fillcolor=(255, 0, 0, 255)) + corner = im.getpixel((0,0)) + self.assertEqual(corner, (255, 0, 0, 255)) if __name__ == '__main__': unittest.main() From b50f63430f32e9c4821a8598d57e3eca5c1c0425 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 May 2018 06:13:22 +1000 Subject: [PATCH 0293/1393] Added getrgb hsv color string --- Tests/test_imagecolor.py | 17 +++++++++++++++++ docs/reference/ImageColor.rst | 5 +++++ src/PIL/ImageColor.py | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py index 81ad179e6d4..22b0d1c73e0 100644 --- a/Tests/test_imagecolor.py +++ b/Tests/test_imagecolor.py @@ -78,10 +78,17 @@ def test_functions(self): self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360,100%,50%)")) self.assertEqual((0, 255, 255), ImageColor.getrgb("hsl(180,100%,50%)")) + self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(0,100%,100%)")) + self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(360,100%,100%)")) + self.assertEqual((0, 255, 255), ImageColor.getrgb("hsv(180,100%,100%)")) + # floats self.assertEqual((254, 3, 3), ImageColor.getrgb("hsl(0.1,99.2%,50.3%)")) self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360.,100.0%,50%)")) + self.assertEqual((253, 2, 2), ImageColor.getrgb("hsv(0.1,99.2%,99.3%)")) + self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(360.,100.0%,100%)")) + # case insensitivity self.assertEqual(ImageColor.getrgb("RGB(255,0,0)"), ImageColor.getrgb("rgb(255,0,0)")) @@ -91,6 +98,8 @@ def test_functions(self): ImageColor.getrgb("rgba(255,0,0,0)")) self.assertEqual(ImageColor.getrgb("HSL(0,100%,50%)"), ImageColor.getrgb("hsl(0,100%,50%)")) + self.assertEqual(ImageColor.getrgb("HSV(0,100%,50%)"), + ImageColor.getrgb("hsv(0,100%,50%)")) # space agnosticism self.assertEqual((255, 0, 0), @@ -101,6 +110,8 @@ def test_functions(self): ImageColor.getrgb("rgba( 255 , 0 , 0 , 0 )")) self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl( 0 , 100% , 50% )")) + self.assertEqual((255, 0, 0), + ImageColor.getrgb("hsv( 0 , 100% , 100% )")) # wrong number of components self.assertRaises(ValueError, ImageColor.getrgb, "rgb(255,0)") @@ -120,6 +131,12 @@ def test_functions(self): self.assertRaises(ValueError, ImageColor.getrgb, "hsl(0,100,50%)") self.assertRaises(ValueError, ImageColor.getrgb, "hsl(0,100%,50)") + self.assertRaises(ValueError, ImageColor.getrgb, "hsv(0,100%)") + self.assertRaises(ValueError, ImageColor.getrgb, "hsv(0,100%,0%,0%)") + self.assertRaises(ValueError, ImageColor.getrgb, "hsv(0%,100%,50%)") + self.assertRaises(ValueError, ImageColor.getrgb, "hsv(0,100,50%)") + self.assertRaises(ValueError, ImageColor.getrgb, "hsv(0,100%,50)") + # look for rounding errors (based on code by Tim Hatch) def test_rounding_errors(self): diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index f3e6a6f902b..caab6214afb 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -31,6 +31,11 @@ The ImageColor module supports the following string formats: (black=0%, normal=50%, white=100%). For example, ``hsl(0,100%,50%)`` is pure red. +* Hue-Saturation-Value (HSV) functions, given as ``hsv(hue, saturation%, + value%)`` where hue and saturation are the same as HSL, and value is between + 0% and 100% (black=0%, normal=100%). For example, ``hsv(0,100%,100%)`` is + pure red. + * Common HTML color names. The :py:mod:`~PIL.ImageColor` module provides some 140 standard color names, based on the colors supported by the X Window system and most web browsers. color names are case insensitive. For example, diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 0e97022288e..278bc21ba64 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -101,6 +101,20 @@ def getrgb(color): int(rgb[2] * 255 + 0.5) ) + m = re.match(r"hsv\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + if m: + from colorsys import hsv_to_rgb + rgb = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5) + ) + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) if m: From 3d82672404730656bfc5c1eeb59743841bbbdcaf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 31 May 2018 06:14:29 +1000 Subject: [PATCH 0294/1393] Added getrgb hsb color string --- Tests/test_imagecolor.py | 6 ++++++ docs/reference/ImageColor.rst | 4 +++- src/PIL/ImageColor.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py index 22b0d1c73e0..0aac212784e 100644 --- a/Tests/test_imagecolor.py +++ b/Tests/test_imagecolor.py @@ -82,6 +82,10 @@ def test_functions(self): self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(360,100%,100%)")) self.assertEqual((0, 255, 255), ImageColor.getrgb("hsv(180,100%,100%)")) + # alternate format + self.assertEqual(ImageColor.getrgb("hsb(0,100%,50%)"), + ImageColor.getrgb("hsv(0,100%,50%)")) + # floats self.assertEqual((254, 3, 3), ImageColor.getrgb("hsl(0.1,99.2%,50.3%)")) self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360.,100.0%,50%)")) @@ -100,6 +104,8 @@ def test_functions(self): ImageColor.getrgb("hsl(0,100%,50%)")) self.assertEqual(ImageColor.getrgb("HSV(0,100%,50%)"), ImageColor.getrgb("hsv(0,100%,50%)")) + self.assertEqual(ImageColor.getrgb("HSB(0,100%,50%)"), + ImageColor.getrgb("hsb(0,100%,50%)")) # space agnosticism self.assertEqual((255, 0, 0), diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index caab6214afb..187306f1b77 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -34,7 +34,9 @@ The ImageColor module supports the following string formats: * Hue-Saturation-Value (HSV) functions, given as ``hsv(hue, saturation%, value%)`` where hue and saturation are the same as HSL, and value is between 0% and 100% (black=0%, normal=100%). For example, ``hsv(0,100%,100%)`` is - pure red. + pure red. This format is also known as Hue-Saturation-Brightness (HSB), and + can be given as ``hsb(hue, saturation%, brightness%)``, where each of the + values are used as they are in HSV. * Common HTML color names. The :py:mod:`~PIL.ImageColor` module provides some 140 standard color names, based on the colors supported by the X Window diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 278bc21ba64..08c00fd5421 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -101,7 +101,7 @@ def getrgb(color): int(rgb[2] * 255 + 0.5) ) - m = re.match(r"hsv\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + m = re.match(r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) if m: from colorsys import hsv_to_rgb rgb = hsv_to_rgb( From 33972b8452072dab245ed1626813abb74d2b8b31 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 31 May 2018 09:07:05 +0300 Subject: [PATCH 0295/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 684f59f64f2..f1a2ebe37d6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Add getrgb HSB/HSV color strings #3148 + [radarhere] + - Allow float values in getrgb HSL color string #3146 [radarhere] From 031c4d937fa0af0f944eeba3ffa5c2b8020e9e6a Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 23:14:23 +0300 Subject: [PATCH 0296/1393] Test ImageDraw2 --- Tests/images/imagedraw2_text.png | Bin 0 -> 974 bytes Tests/test_imagedraw2.py | 191 +++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 Tests/images/imagedraw2_text.png create mode 100644 Tests/test_imagedraw2.py diff --git a/Tests/images/imagedraw2_text.png b/Tests/images/imagedraw2_text.png new file mode 100644 index 0000000000000000000000000000000000000000..b22e6545b9c6036f1077b4c6e48b238f6c8f960a GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^DIm+lTF% zTPFx*C#POiGP)}=lhw^tP*G6O$;q+ou*&TnCp=cXP}-6s>9|GXP==tR>#_@n!qO&a z+�tDNih{#E^fPX}7VmaqtII<8w94pZ|olPycRn{^R*-n--vr41e-BMy$Dc^XBj0 zzfYb#dE>^77j6H)6lT`c{P`Omw%T-8tzg#HS?d;PWYyNrJ^$QYHEi|Ob?erB`dQO{ z_~N~La#PQ|mzI+HwOsqx@86t?g@uJiGjmc?RkdcOrlwAOeemGH6)A2tMVst4-F|!d z@?~>#^Vrzf)2B~QpFVx(&Ydk2K7A@`KkOJd<@8gbPM0sw9z9B0e);E*9~L$?IYu+Z z#Kbrhg*uOhaKgzHquFO8BO_Y`7GLxT42g=Gbu?+`zJ2G;pZ~w5 z!|vbIsZ(1fOqnv}`t|T%svUc{T3cK5wp(i%cm24uK}uR$vkPd^)vH$*FJ8QM?OIh; z)s_h@Ei7u2CHdMlyRtGe6k0ai%;|Ltj*mb8_#+=5A5&w4)53(!H)UmIeSLjn^tJ{wNG_1CJs0UBR^*31`sSzAE%jR3 zwM0}@w9{qL&!0avd|!&kONl8S$=dp>#%}i6ZCkfKEwM^YN}A!5R$jh6M$g~RZ`$dn zK%FfDjSd@j?5F@n#HUY5CQ|!rf4k|gx|-F0T$qQgzpwAtuV0%sZ~i|)UxZ6vPw&O+ z0*f_Qv$k*F{{G!NU{KiWa&9eKhA~YU3xMaizlMnAVA1v0rc%6njYYUz^WvkUe@}P&_FYs& returned NULL without setting an error' + draw.textsize("", font) + draw.textsize("\n", font) + draw.textsize("test\n", font) + + def test_flush(self): + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw2.Draw(im) + font = ImageDraw2.Font("white", FONT_PATH) + + # Act + draw.text((5, 5), "ImageDraw2", font) + im2 = draw.flush() + + # Assert + self.assert_image_equal(im, im2) + + +if __name__ == "__main__": + unittest.main() From 9050b47169d13f292db13986e53d9277ccd01b9f Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 17 May 2018 23:14:35 +0300 Subject: [PATCH 0297/1393] Not in this version, not in any version --- src/PIL/ImageDraw2.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/PIL/ImageDraw2.py b/src/PIL/ImageDraw2.py index a1763350d91..f7902b031f6 100644 --- a/src/PIL/ImageDraw2.py +++ b/src/PIL/ImageDraw2.py @@ -98,9 +98,6 @@ def polygon(self, xy, *options): def rectangle(self, xy, *options): self.render("rectangle", xy, *options) - def symbol(self, xy, symbol, *options): - raise NotImplementedError("not in this version") - def text(self, xy, text, font): if self.transform: xy = ImagePath.Path(xy) From 67e5540021b994417b77191dbe0e01bc0e3bbf1e Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 18 May 2018 10:32:57 +0300 Subject: [PATCH 0298/1393] Skip font tests when ImageFont not available --- Tests/test_imagedraw2.py | 7 ++++++- Tests/test_imagefont.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagedraw2.py b/Tests/test_imagedraw2.py index 1e4edd27db9..a54d60fac6a 100644 --- a/Tests/test_imagedraw2.py +++ b/Tests/test_imagedraw2.py @@ -1,7 +1,7 @@ import os.path from helper import PillowTestCase, hopper, unittest -from PIL import Image, ImageDraw2 +from PIL import Image, ImageDraw2, features BLACK = (0, 0, 0) WHITE = (255, 255, 255) @@ -28,6 +28,7 @@ KITE_POINTS = [(10, 50), (70, 10), (90, 50), (70, 90), (10, 50)] +HAS_FREETYPE = features.check("freetype2") FONT_PATH = "Tests/fonts/FreeMono.ttf" @@ -135,6 +136,7 @@ def test_big_rectangle(self): # Assert self.assert_image_similar(im, Image.open(expected), 1) + @unittest.skipUnless(HAS_FREETYPE, "ImageFont not available") def test_text(self): # Arrange im = Image.new("RGB", (W, H)) @@ -148,6 +150,7 @@ def test_text(self): # Assert self.assert_image_similar(im, Image.open(expected), 13) + @unittest.skipUnless(HAS_FREETYPE, "ImageFont not available") def test_textsize(self): # Arrange im = Image.new("RGB", (W, H)) @@ -160,6 +163,7 @@ def test_textsize(self): # Assert self.assertEqual(size[1], 12) + @unittest.skipUnless(HAS_FREETYPE, "ImageFont not available") def test_textsize_empty_string(self): # Arrange im = Image.new("RGB", (W, H)) @@ -173,6 +177,7 @@ def test_textsize_empty_string(self): draw.textsize("\n", font) draw.textsize("test\n", font) + @unittest.skipUnless(HAS_FREETYPE, "ImageFont not available") def test_flush(self): # Arrange im = Image.new("RGB", (W, H)) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 986b0b5efe6..4d36334e1e3 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -42,7 +42,7 @@ def __exit__(self, type, value, traceback): delattr(self._parent_obj, self._attr_name) -@unittest.skipUnless(HAS_FREETYPE, "ImageFont not Available") +@unittest.skipUnless(HAS_FREETYPE, "ImageFont not available") class TestImageFont(PillowTestCase): LAYOUT_ENGINE = ImageFont.LAYOUT_BASIC From e2127a6d60669211ef0804b3a5d27e216e7453dd Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 20 May 2018 17:11:07 +0300 Subject: [PATCH 0299/1393] Test ImageDraw2.ellipse --- Tests/test_imagedraw2.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Tests/test_imagedraw2.py b/Tests/test_imagedraw2.py index a54d60fac6a..c5faeb6163c 100644 --- a/Tests/test_imagedraw2.py +++ b/Tests/test_imagedraw2.py @@ -47,6 +47,39 @@ def test_sanity(self): pen = ImageDraw2.Pen("blue", width=7) draw.line(list(range(10)), pen) + def helper_ellipse(self, mode, bbox): + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw2.Draw(im) + pen = ImageDraw2.Pen("blue", width=2) + brush = ImageDraw2.Brush("green") + expected = "Tests/images/imagedraw_ellipse_{}.png".format(mode) + + # Act + draw.ellipse(bbox, pen, brush) + + # Assert + self.assert_image_similar(im, Image.open(expected), 1) + + def test_ellipse1(self): + self.helper_ellipse("RGB", BBOX1) + + def test_ellipse2(self): + self.helper_ellipse("RGB", BBOX2) + + def test_ellipse_edge(self): + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw2.Draw(im) + brush = ImageDraw2.Brush("white") + + # Act + draw.ellipse(((0, 0), (W-1, H)), brush) + + # Assert + self.assert_image_similar( + im, Image.open("Tests/images/imagedraw_ellipse_edge.png"), 1) + def helper_line(self, points): # Arrange im = Image.new("RGB", (W, H)) From 30b292c6d872225c1843676147045bbe300f76d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 1 Jun 2018 20:18:41 +1000 Subject: [PATCH 0300/1393] Corrected argument name in documentation --- src/PIL/PSDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index 1c17c61b245..d2ded6fea02 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -25,7 +25,7 @@ class PSDraw(object): """ - Sets up printing to the given file. If **file** is omitted, + Sets up printing to the given file. If **fp** is omitted, :py:attr:`sys.stdout` is assumed. """ From 1947d65c7bf32dcdd17ae77f4339f29195a664bf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 3 Jun 2018 16:43:30 +1000 Subject: [PATCH 0301/1393] Removed unnecessary init method --- src/PIL/PdfParser.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index c18846068a3..c3b00e62475 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -240,9 +240,6 @@ def __bytes__(self): class PdfDict(UserDict): - def __init__(self, *args, **kwargs): - UserDict.__init__(self, *args, **kwargs) - def __setattr__(self, key, value): if key == "data": if hasattr(UserDict, "__setattr__"): From 5ef5a3c9b276529e18351bb2e3f74664eee181af Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 6 Jun 2018 22:34:09 +1000 Subject: [PATCH 0302/1393] Corrected test --- Tests/test_file_tiff.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 282a0c676d9..3d63e084d46 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -63,8 +63,11 @@ def test_wrong_bits_per_sample(self): im.load() def test_set_legacy_api(self): - with self.assertRaises(Exception): - ImageFileDirectory_v2.legacy_api = None + ifd = TiffImagePlugin.ImageFileDirectory_v2() + with self.assertRaises(Exception) as e: + ifd.legacy_api = None + self.assertEqual(str(e.exception), + "Not allowing setting of legacy api") def test_xyres_tiff(self): filename = "Tests/images/pil168.tif" From 15a4aaec7c6474acc2a73829277d8a2759aff84a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Jun 2018 22:04:13 +1000 Subject: [PATCH 0303/1393] Improved Image.transform documentation [ci skip] --- src/PIL/Image.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1954c52ee05..7a8f6797395 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2101,6 +2101,20 @@ def transform(self, size, method, data=None, resample=NEAREST, :py:attr:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or :py:attr:`PIL.Image.MESH` (map a number of source quadrilaterals in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + class Example(Image.ImageTransformHandler): + def transform(size, method, data, resample, fill=1): + # Return result + + It may also be an object with a :py:meth:`~method.getdata` method + that returns a tuple supplying new **method** and **data** values:: + class Example(object): + def getdata(self): + method = Image.EXTENT + data = (0, 0, 100, 100) + return method, data :param data: Extra data to the transformation method. :param resample: Optional resampling filter. It can be one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), @@ -2108,6 +2122,9 @@ def transform(self, size, method, data=None, resample=NEAREST, environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline interpolation in a 4x4 environment). If omitted, or if the image has mode "1" or "P", it is set to :py:attr:`PIL.Image.NEAREST`. + :param fill: If **method** is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. :param fillcolor: Optional fill color for the area outside the transform in the output image. :returns: An :py:class:`~PIL.Image.Image` object. From ccf267c6f0b116c8e5a533b43c801db48cbfa49c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jun 2018 10:27:03 +1000 Subject: [PATCH 0304/1393] Updated URL [ci skip] --- winbuild/build.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/winbuild/build.rst b/winbuild/build.rst index 847a6e1d270..b4b288d0a5d 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -58,7 +58,8 @@ Download and install: * `Microsoft Windows SDK for Windows 7 and .NET Framework 4 `_ -* `CMake-2.8.10.2-win32-x86.exe `_ +* `CMake-2.8.10.2-win32-x86.exe + `_ The samples and the .NET SDK portions aren't required, just the compilers and other tools. UNDONE -- check exact wording. From 39683665c2ed7d0f11681cb6e962921af08a2035 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jun 2018 14:09:55 +1000 Subject: [PATCH 0305/1393] Fixed typo [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index f1a2ebe37d6..c2aea5c9499 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -356,7 +356,7 @@ Changelog (Pillow) - Fixed doc syntax in ImageDraw #2752 [radarhere] -- Fixed support for building on Windows/msys2. Added Appveyor CI coverage for python3 on msys2 #2476 +- Fixed support for building on Windows/msys2. Added Appveyor CI coverage for python3 on msys2 #2746 [wiredfool] - Fix ValueError in Exif/Tiff IFD #2719 From 531f7dac9086725a81a6f53c5c74892b3bba1f3f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 9 Jun 2018 14:20:36 +1000 Subject: [PATCH 0306/1393] Added PR numbers in CHANGES [ci skip] --- CHANGES.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index c2aea5c9499..0945f37049b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -428,7 +428,7 @@ Changelog (Pillow) - Use RGBX rawmode for RGB JPEG images where possible #1989 [homm] -- Remove palettes from non-palette modes in _new #2702 +- Remove palettes from non-palette modes in _new #2704 [wiredfool] - Delete transparency info when convert'ing RGB/L to RGBA #2633 @@ -851,10 +851,10 @@ Changelog (Pillow) - Add center and translate option to Image.rotate. #2328 [lambdafu] -- Test: Relax WMF test condition, fixes #2323 +- Test: Relax WMF test condition, fixes #2323. #2327 [wiredfool] -- Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. +- Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. #2262 [wiredfool] - SGI: Save uncompressed SGI/BW/RGB/RGBA files #2325 @@ -1185,10 +1185,10 @@ Changelog (Pillow) 3.3.2 (2016-10-03) ------------------ -- Fix negative image sizes in Storage.c #2105 +- Fix negative image sizes in Storage.c #2146 [wiredfool] -- Fix integer overflow in map.c #2105 +- Fix integer overflow in map.c #2146 [wiredfool] 3.3.1 (2016-08-18) @@ -1326,7 +1326,7 @@ Changelog (Pillow) - Skip tests that require libtiff if it is not installed #1893 (fixes #1866) [wiredfool] -- Skip test when icc profile is not available, fixes #1887 +- Skip test when icc profile is not available, fixes #1887. #1892 [doko42] - Make deprecated functions raise NotImplementedError instead of Exception. #1862, #1890 @@ -1931,7 +1931,7 @@ Changelog (Pillow) 2.8.1 (2015-04-02) ------------------ -- Bug fix: Catch struct.error on invalid JPEG, fixes #1163 +- Bug fix: Catch struct.error on invalid JPEG, fixes #1163. #1165 [wiredfool, hugovk] 2.8.0 (2015-04-01) @@ -2066,7 +2066,7 @@ Changelog (Pillow) - Updated manifest #957 [wiredfool] -- Fix PyPy 2.4 regression #952 +- Fix PyPy 2.4 regression #958 [wiredfool] - Webp Metadata Skip Test comments #954 @@ -2108,7 +2108,7 @@ Changelog (Pillow) - Use redistributable ICC profiles for testing, skip if not available #923 [wiredfool] -- Additional documentation for JPEG info and save options #890 +- Additional documentation for JPEG info and save options #922 [wiredfool] - Fix JPEG Encoding memory leak when exif or qtables were specified #921 From 01c06ad6c68dfa4174a37eb385aea9d0a0968707 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 9 Jun 2018 20:47:46 -0700 Subject: [PATCH 0307/1393] Update Python 2 doc URLs to Python 3 Python 3 docs are more actively maintained and are the future. --- Makefile | 2 +- docs/reference/Image.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1e888ee3512..1803e617d15 100644 --- a/Makefile +++ b/Makefile @@ -91,7 +91,7 @@ sdist: test: pytest -qq -# https://docs.python.org/2/distutils/packageindex.html#the-pypirc-file +# https://docs.python.org/3/distutils/packageindex.html#the-pypirc-file upload-test: # [test] # username: diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 9a9bf57d74b..388116a10e0 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -59,7 +59,7 @@ Functions documentation`_ to have warnings output to the logging facility instead of stderr. .. _decompression bombs: https://en.wikipedia.org/wiki/Zip_bomb - .. _the logging documentation: https://docs.python.org/2/library/logging.html?highlight=logging#integration-with-the-warnings-module + .. _the logging documentation: https://docs.python.org/3/library/logging.html#integration-with-the-warnings-module Image processing ^^^^^^^^^^^^^^^^ From 6346c693e8f042192744575b71628f266c23be7c Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 11 Jun 2018 17:31:00 +0300 Subject: [PATCH 0308/1393] Temporarily use --no-cache-dir for pip on mingw32 --- winbuild/appveyor_install_msys2_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/appveyor_install_msys2_deps.sh b/winbuild/appveyor_install_msys2_deps.sh index fbab280b3c2..5cbc53ac379 100644 --- a/winbuild/appveyor_install_msys2_deps.sh +++ b/winbuild/appveyor_install_msys2_deps.sh @@ -6,7 +6,7 @@ pacman -S --noconfirm mingw32/mingw-w64-i686-python3-pip \ mingw32/mingw-w64-i686-python2-setuptools \ mingw-w64-i686-libjpeg-turbo -C:/msys64/mingw32/bin/python3 -m pip install --upgrade pip +C:/msys64/mingw32/bin/python3 -m pip install --upgrade --no-cache-dir pip -/mingw32/bin/pip install pytest pytest-cov olefile -/mingw32/bin/pip3 install pytest pytest-cov olefile +/mingw32/bin/pip install --no-cache-dir pytest pytest-cov olefile +/mingw32/bin/pip3 install --no-cache-dir pytest pytest-cov olefile From 8be7de809ca14811cd3f9e5f49a29cc2dc351906 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 11 Jun 2018 21:16:00 +0300 Subject: [PATCH 0309/1393] For commands which do not have a built in retry feature, use the travis_retry function to retry it up three times if the return code is non-zero --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9e306d6a6a7..c71dda49984 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: - if [ "$DOCKER" == "" ]; then .travis/install.sh; fi before_install: - - if [ "$DOCKER" ]; then docker pull pythonpillow/$DOCKER:$DOCKER_TAG; fi + - if [ "$DOCKER" ]; then travis_retry docker pull pythonpillow/$DOCKER:$DOCKER_TAG; fi before_script: # Qt needs a display for some of the tests, and it's only run on the system site packages install From 62c870f5cf5218b559a552765a17a159b2e7a71f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 7 Jun 2018 19:43:13 +1000 Subject: [PATCH 0310/1393] Fixed raising of no exception --- 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 6a18fff1914..a5871e86615 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -683,7 +683,7 @@ def validate_qtables(qtables): for idx, table in enumerate(qtables): try: if len(table) != 64: - raise + raise TypeError table = array.array('B', table) except TypeError: raise ValueError("Invalid quantization table") From 9a3d554c1d38ec23fe3180458793098518d3cf2f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Jun 2018 19:17:48 +1000 Subject: [PATCH 0311/1393] Changed Exception tests to be more specific --- Tests/test_file_jpeg.py | 12 ++++++------ Tests/test_file_tiff.py | 2 +- Tests/test_image_quantize.py | 2 +- Tests/test_imagemorph.py | 37 ++++++++++++++++++++++++++++-------- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index e7e639f0526..9804c2676a1 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -439,17 +439,17 @@ def test_qtables(self): self._n_qtables_helper(4, "Tests/images/pil_sample_cmyk.jpg") # not a sequence - self.assertRaises(Exception, self.roundtrip, im, qtables='a') + self.assertRaises(ValueError, self.roundtrip, im, qtables='a') # sequence wrong length - self.assertRaises(Exception, self.roundtrip, im, qtables=[]) + self.assertRaises(ValueError, self.roundtrip, im, qtables=[]) # sequence wrong length - self.assertRaises(Exception, + self.assertRaises(ValueError, self.roundtrip, im, qtables=[1, 2, 3, 4, 5]) # qtable entry not a sequence - self.assertRaises(Exception, self.roundtrip, im, qtables=[1]) + self.assertRaises(ValueError, self.roundtrip, im, qtables=[1]) # qtable entry has wrong number of items - self.assertRaises(Exception, + self.assertRaises(ValueError, self.roundtrip, im, qtables=[[1, 2, 3, 4]]) @unittest.skipUnless(djpeg_available(), "djpeg not available") @@ -599,7 +599,7 @@ def test_fd_leak(self): im = Image.open(tmpfile) fp = im.fp self.assertFalse(fp.closed) - self.assertRaises(Exception, os.remove, tmpfile) + self.assertRaises(WindowsError, os.remove, tmpfile) im.load() self.assertTrue(fp.closed) # this should not fail, as load should have closed the file. diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 3d63e084d46..aac845e0fcf 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -505,7 +505,7 @@ def test_fd_leak(self): im = Image.open(tmpfile) fp = im.fp self.assertFalse(fp.closed) - self.assertRaises(Exception, os.remove, tmpfile) + self.assertRaises(WindowsError, os.remove, tmpfile) im.load() self.assertTrue(fp.closed) diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 6a9ff1187e8..5b10d2de396 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -39,7 +39,7 @@ def test_octree_quantize(self): def test_rgba_quantize(self): image = hopper('RGBA') image.quantize() - self.assertRaises(Exception, image.quantize, method=0) + self.assertRaises(ValueError, image.quantize, method=0) def test_quantize(self): image = Image.open('Tests/images/caption_6_33_22.png').convert('RGB') diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index cad3caebd02..83fa0b5a913 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -80,9 +80,15 @@ def test_lut(self): def test_no_operator_loaded(self): mop = ImageMorph.MorphOp() - self.assertRaises(Exception, mop.apply, None) - self.assertRaises(Exception, mop.match, None) - self.assertRaises(Exception, mop.save_lut, None) + with self.assertRaises(Exception) as e: + mop.apply(None) + self.assertEqual(str(e.exception), 'No operator loaded') + with self.assertRaises(Exception) as e: + mop.match(None) + self.assertEqual(str(e.exception), 'No operator loaded') + with self.assertRaises(Exception) as e: + mop.save_lut(None) + self.assertEqual(str(e.exception), 'No operator loaded') # Test the named patterns def test_erosion8(self): @@ -213,9 +219,18 @@ def test_non_binary_images(self): im = hopper('RGB') mop = ImageMorph.MorphOp(op_name="erosion8") - self.assertRaises(Exception, mop.apply, im) - self.assertRaises(Exception, mop.match, im) - self.assertRaises(Exception, mop.get_on_pixels, im) + with self.assertRaises(Exception) as e: + mop.apply(im) + self.assertEqual(str(e.exception), + 'Image must be binary, meaning it must use mode L') + with self.assertRaises(Exception) as e: + mop.match(im) + self.assertEqual(str(e.exception), + 'Image must be binary, meaning it must use mode L') + with self.assertRaises(Exception) as e: + mop.get_on_pixels(im) + self.assertEqual(str(e.exception), + 'Image must be binary, meaning it must use mode L') def test_add_patterns(self): # Arrange @@ -248,7 +263,10 @@ def test_pattern_syntax_error(self): lb.add_patterns(new_patterns) # Act / Assert - self.assertRaises(Exception, lb.build_lut) + with self.assertRaises(Exception) as e: + lb.build_lut() + self.assertEqual(str(e.exception), + 'Syntax error in pattern "a pattern with a syntax error"') def test_load_invalid_mrl(self): # Arrange @@ -256,7 +274,10 @@ def test_load_invalid_mrl(self): mop = ImageMorph.MorphOp() # Act / Assert - self.assertRaises(Exception, mop.load_lut, invalid_mrl) + with self.assertRaises(Exception) as e: + mop.load_lut(invalid_mrl) + self.assertEqual(str(e.exception), + 'Wrong size operator file!') def test_roundtrip_mrl(self): # Arrange From ae2ffb8a05037a00d7dbf9499cc7cf51e9d87e84 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Jun 2018 20:50:06 +1000 Subject: [PATCH 0312/1393] Fixed transform fillcolor argument when image mode is RGBA or LA --- Tests/test_image_transform.py | 21 +++++++++++++-------- src/PIL/Image.py | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 9cb6ac2c2c9..add8cc5e72a 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -53,15 +53,20 @@ def test_quad(self): self.assert_image_equal(transformed, scaled) def test_fill(self): - im = hopper('RGB') - (w, h) = im.size - transformed = im.transform(im.size, Image.EXTENT, - (0, 0, - w*2, h*2), - Image.BILINEAR, - fillcolor='red') + for mode, pixel in [ + ['RGB', (255, 0, 0)], + ['RGBA', (255, 0, 0, 255)], + ['LA', (76, 0)] + ]: + im = hopper(mode) + (w, h) = im.size + transformed = im.transform(im.size, Image.EXTENT, + (0, 0, + w*2, h*2), + Image.BILINEAR, + fillcolor='red') - self.assertEqual(transformed.getpixel((w-1, h-1)), (255, 0, 0)) + self.assertEqual(transformed.getpixel((w-1, h-1)), pixel) def test_mesh(self): # this should be a checkerboard of halfsized hoppers in ul, lr diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1954c52ee05..30d0f5f9bda 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2115,11 +2115,11 @@ def transform(self, size, method, data=None, resample=NEAREST, if self.mode == 'LA': return self.convert('La').transform( - size, method, data, resample, fill).convert('LA') + size, method, data, resample, fill, fillcolor).convert('LA') if self.mode == 'RGBA': return self.convert('RGBa').transform( - size, method, data, resample, fill).convert('RGBA') + size, method, data, resample, fill, fillcolor).convert('RGBA') if isinstance(method, ImageTransformHandler): return method.transform(size, self, resample=resample, fill=fill) From a73dcf42ad3ec3a75b0d5a21ffb347f935a86735 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 Jun 2018 14:11:08 +1000 Subject: [PATCH 0313/1393] Corrected argument name in documentation --- 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 1954c52ee05..d427462cf36 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1880,7 +1880,7 @@ def save(self, fp, format=None, **params): format to use is determined from the filename extension. If a file object was used instead of a filename, this parameter should always be used. - :param options: Extra parameters to the image writer. + :param params: Extra parameters to the image writer. :returns: None :exception KeyError: If the output format could not be determined from the file name. Use the format option to solve this. From 3b7e563d3218512992525039cbc6f78a8037f359 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 14 Jun 2018 09:57:03 +0300 Subject: [PATCH 0314/1393] Update CHANGES.rst --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0945f37049b..1b5491a8c77 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,21 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Docs: Correct argument name #3171 + [radarhere] + +- Docs: Update CMake download URL #3166 + [radarhere] + +- Docs: Improve Image.transform documentation #3164 + [radarhere] + +- Fix transform fillcolor argument when image mode is RGBA or LA #3163 + [radarhere] + +- Tests: More specific Exception testing #3158 + [radarhere] + - Add getrgb HSB/HSV color strings #3148 [radarhere] From 39fae6e0770086b1aed7928c32f7cd6f66f5a844 Mon Sep 17 00:00:00 2001 From: Daniel Plakhotich Date: Thu, 14 Jun 2018 12:18:08 +0300 Subject: [PATCH 0315/1393] TGA: Read and write LA data --- Tests/images/la.tga | Bin 0 -> 7205 bytes Tests/test_file_tga.py | 24 +++++++++++++++++++----- docs/handbook/image-file-formats.rst | 12 +++++++----- src/PIL/TgaImagePlugin.py | 6 +++++- 4 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 Tests/images/la.tga diff --git a/Tests/images/la.tga b/Tests/images/la.tga new file mode 100644 index 0000000000000000000000000000000000000000..8c83104ed7e59a750906aae922ceb4b66fdccb38 GIT binary patch literal 7205 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 Date: Thu, 14 Jun 2018 12:20:04 +0300 Subject: [PATCH 0316/1393] TestFilePng: Fix test_save_l_transparency() It now really tests the file after saving. --- Tests/test_file_png.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index c78351464aa..bc2b557d2a8 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -292,15 +292,29 @@ def test_save_p_transparent_black(self): self.assertEqual(im.getcolors(), [(100, (0, 0, 0, 0))]) def test_save_l_transparency(self): + # There are 559 transparent pixels in l_trns.png. + num_transparent = 559 + in_file = "Tests/images/l_trns.png" im = Image.open(in_file) + self.assertEqual(im.mode, "L") + self.assertEqual(im.info["transparency"], 255) + + im_rgba = im.convert('RGBA') + self.assertEqual( + im_rgba.getchannel("A").getcolors()[0][0], num_transparent) test_file = self.tempfile("temp.png") im.save(test_file) - # There are 559 transparent pixels. - im = im.convert('RGBA') - self.assertEqual(im.getchannel('A').getcolors()[0][0], 559) + test_im = Image.open(test_file) + self.assertEqual(test_im.mode, "L") + self.assertEqual(test_im.info["transparency"], 255) + self.assert_image_equal(im, test_im) + + test_im_rgba = test_im.convert('RGBA') + self.assertEqual( + test_im_rgba.getchannel('A').getcolors()[0][0], num_transparent) def test_save_rgb_single_transparency(self): in_file = "Tests/images/caption_6_33_22.png" From 56ab9d3fd49ded74632a367583b2f5729c6910ab Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 14 Jun 2018 13:49:24 +0300 Subject: [PATCH 0317/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1b5491a8c77..5030603b1ff 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Tests: TestFilePng: Fix test_save_l_transparency() #3182 + [danpla] + - Docs: Correct argument name #3171 [radarhere] From 1d20056234d7bcfc64aa14e74fcf8e297ed51293 Mon Sep 17 00:00:00 2001 From: Daniel Plakhotich Date: Fri, 15 Jun 2018 23:01:06 +0300 Subject: [PATCH 0318/1393] TGA: Add support for writing RLE data --- Tests/images/tga/common/1x1_l.png | Bin 0 -> 67 bytes Tests/images/tga/common/1x1_l_bl_raw.tga | Bin 0 -> 45 bytes Tests/images/tga/common/1x1_l_bl_rle.tga | Bin 0 -> 46 bytes Tests/images/tga/common/1x1_l_tl_raw.tga | Bin 0 -> 45 bytes Tests/images/tga/common/1x1_l_tl_rle.tga | Bin 0 -> 46 bytes Tests/images/tga/common/200x32_l.png | Bin 0 -> 385 bytes Tests/images/tga/common/200x32_l_bl_raw.tga | Bin 0 -> 6444 bytes Tests/images/tga/common/200x32_l_bl_rle.tga | Bin 0 -> 2714 bytes Tests/images/tga/common/200x32_l_tl_raw.tga | Bin 0 -> 6444 bytes Tests/images/tga/common/200x32_l_tl_rle.tga | Bin 0 -> 2714 bytes Tests/images/tga/common/200x32_la.png | Bin 0 -> 2137 bytes Tests/images/tga/common/200x32_la_bl_raw.tga | Bin 0 -> 12844 bytes Tests/images/tga/common/200x32_la_bl_rle.tga | Bin 0 -> 12900 bytes Tests/images/tga/common/200x32_la_tl_raw.tga | Bin 0 -> 12844 bytes Tests/images/tga/common/200x32_la_tl_rle.tga | Bin 0 -> 12900 bytes Tests/images/tga/common/200x32_p.png | Bin 0 -> 4054 bytes Tests/images/tga/common/200x32_p_bl_raw.tga | Bin 0 -> 7212 bytes Tests/images/tga/common/200x32_p_bl_rle.tga | Bin 0 -> 7778 bytes Tests/images/tga/common/200x32_p_tl_raw.tga | Bin 0 -> 7212 bytes Tests/images/tga/common/200x32_p_tl_rle.tga | Bin 0 -> 7778 bytes Tests/images/tga/common/200x32_rgb.png | Bin 0 -> 5236 bytes Tests/images/tga/common/200x32_rgb_bl_raw.tga | Bin 0 -> 19244 bytes Tests/images/tga/common/200x32_rgb_bl_rle.tga | Bin 0 -> 19308 bytes Tests/images/tga/common/200x32_rgb_tl_raw.tga | Bin 0 -> 19308 bytes Tests/images/tga/common/200x32_rgb_tl_rle.tga | Bin 0 -> 19308 bytes Tests/images/tga/common/200x32_rgba.png | Bin 0 -> 6759 bytes .../images/tga/common/200x32_rgba_bl_raw.tga | Bin 0 -> 25644 bytes .../images/tga/common/200x32_rgba_bl_rle.tga | Bin 0 -> 25708 bytes .../images/tga/common/200x32_rgba_tl_raw.tga | Bin 0 -> 25644 bytes .../images/tga/common/200x32_rgba_tl_rle.tga | Bin 0 -> 25708 bytes Tests/images/tga/common/readme.txt | 12 ++ Tests/test_file_tga.py | 66 ++++++++ setup.py | 8 +- src/PIL/TgaImagePlugin.py | 15 +- src/_imaging.c | 2 + src/encode.c | 32 ++++ src/libImaging/Imaging.h | 2 + src/libImaging/TgaRleEncode.c | 153 ++++++++++++++++++ 38 files changed, 284 insertions(+), 6 deletions(-) create mode 100644 Tests/images/tga/common/1x1_l.png create mode 100644 Tests/images/tga/common/1x1_l_bl_raw.tga create mode 100644 Tests/images/tga/common/1x1_l_bl_rle.tga create mode 100644 Tests/images/tga/common/1x1_l_tl_raw.tga create mode 100644 Tests/images/tga/common/1x1_l_tl_rle.tga create mode 100644 Tests/images/tga/common/200x32_l.png create mode 100644 Tests/images/tga/common/200x32_l_bl_raw.tga create mode 100644 Tests/images/tga/common/200x32_l_bl_rle.tga create mode 100644 Tests/images/tga/common/200x32_l_tl_raw.tga create mode 100644 Tests/images/tga/common/200x32_l_tl_rle.tga create mode 100644 Tests/images/tga/common/200x32_la.png create mode 100644 Tests/images/tga/common/200x32_la_bl_raw.tga create mode 100644 Tests/images/tga/common/200x32_la_bl_rle.tga create mode 100644 Tests/images/tga/common/200x32_la_tl_raw.tga create mode 100644 Tests/images/tga/common/200x32_la_tl_rle.tga create mode 100644 Tests/images/tga/common/200x32_p.png create mode 100644 Tests/images/tga/common/200x32_p_bl_raw.tga create mode 100644 Tests/images/tga/common/200x32_p_bl_rle.tga create mode 100644 Tests/images/tga/common/200x32_p_tl_raw.tga create mode 100644 Tests/images/tga/common/200x32_p_tl_rle.tga create mode 100644 Tests/images/tga/common/200x32_rgb.png create mode 100644 Tests/images/tga/common/200x32_rgb_bl_raw.tga create mode 100644 Tests/images/tga/common/200x32_rgb_bl_rle.tga create mode 100644 Tests/images/tga/common/200x32_rgb_tl_raw.tga create mode 100644 Tests/images/tga/common/200x32_rgb_tl_rle.tga create mode 100644 Tests/images/tga/common/200x32_rgba.png create mode 100644 Tests/images/tga/common/200x32_rgba_bl_raw.tga create mode 100644 Tests/images/tga/common/200x32_rgba_bl_rle.tga create mode 100644 Tests/images/tga/common/200x32_rgba_tl_raw.tga create mode 100644 Tests/images/tga/common/200x32_rgba_tl_rle.tga create mode 100644 Tests/images/tga/common/readme.txt create mode 100644 src/libImaging/TgaRleEncode.c diff --git a/Tests/images/tga/common/1x1_l.png b/Tests/images/tga/common/1x1_l.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a2cb813286e2f4a54d9b2f5d46c3a52af6b49a GIT binary patch literal 67 zcmeAS@N?(olHy`uVBq!ia0vp^j3CSbBp9sfW`_bPE>9Q75RU7~89;UuL*rfNtS=y0 MPgg&ebxsLQ0CxTj*#H0l literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/1x1_l_bl_raw.tga b/Tests/images/tga/common/1x1_l_bl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..c79e125eaaafdfb6a3c4457fd0c6acfce6336408 GIT binary patch literal 45 ncmZQzU}k^;Mg~R(4u%F8HzX+3HOw>E)89`w!p+miRgVDxLW>1? literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/1x1_l_bl_rle.tga b/Tests/images/tga/common/1x1_l_bl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..ee1a7d2d8b8e75e5ee8d607e2d4a56ecce5e45b1 GIT binary patch literal 46 ocmZQz;AVgUMg~R(4hDt>7(XN^)HTdA*wf!nH^R-+$5oF307Ll&fdBvi literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/1x1_l_tl_raw.tga b/Tests/images/tga/common/1x1_l_tl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..6c99687582a1b99d1fec9db269c4e1aebe184051 GIT binary patch literal 45 ncmZQzU}k^-Mg|b%P-uYi8A5_WUBf(sJ^lT3BiuZFT=f_LMlJ=K literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/1x1_l_tl_rle.tga b/Tests/images/tga/common/1x1_l_tl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..efd4e3af40a95146ee04fa632ae9beff9c4a3d18 GIT binary patch literal 46 pcmZQz;AVgTMg|b%P+(|)3NVBOg}R1$27CJZ=|;GD`nc*b002k51)=}| literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_l.png b/Tests/images/tga/common/200x32_l.png new file mode 100644 index 0000000000000000000000000000000000000000..ff37cbe30a9b570d6e02e37af8fee990e37679f3 GIT binary patch literal 385 zcmV-{0e=38P)+5Jt~f?%M~@_kS=<`VKW=dVzo_yY8-?q-kLi@#jKM&NnK;uN=B8%ks6vk>p}( zG#l}wDaeB=ZfGcNQG_HN(T5}>^JM$4bx*~)2F)7|I%2FchpCUs$g>)D&3(|Z21|s& zI#+d%oND0qTed(X9m5(d5g4p<)r{7jrR-=mwK64I`9RhdvCdVA)*Y5+oV1;(q+|7= fL;Q?*dk($<(#mIgWB9lR00000NkvXXu0mjfeTk}; literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_l_bl_raw.tga b/Tests/images/tga/common/200x32_l_bl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..e629910a080db5a7657797196e4cdba8134a2b6f GIT binary patch literal 6444 zcmZQzU}k`U6ATIr91Kh>?3_G&0>YvaQnK<&D(ad#dWObk7FM?QPA=}AK7N70p%GEB z@kuFZnb~;-#iiv{HT8|nZ5`dc{gb9ln>l;#f<;S~tz5l!{iZG3cI?`-@4%rW$4;C& zbN2j&OP8-)yMFz~&6_um(E&jGAt)>+AuX$*q^ho^qYv_jwXK7btGkzve_(J}M09LI zQfhi;PF`VgSw&TCeN#(&XLsL(NmHlKnlo?V;-$-1ty#Bm^VaPaq7c^PTTd-*9@|A1WZ2(3GI8`CMapNY)7xy1LeE9g-szREAK4gE$$SEqTX=v*j z7@3+|+1NX}K>QIJ9u*Ux2+1BrknGU{${wI(H4~hyR;*gPej_kQAJHtTMyw6Pj9~fST+Y`4`4P& z${v%aLX#CRmv7j#1(G{J(E;_woxArRJbL`(>C*KimR*~ST+Y`kDmUCpi+0<0&r;sO;*4%7aAQ9Z#;hT?D@-AuU)&jI;kfwHLgI#)z01f4uG;b zBzu69)r(he-vhnz<0sG`v;|oFf!-`ZuFgsG$Fmo&-+uV?_507?k7?fCMUM{+E$aK@ z*B@ZZgx28L`#}l*|N8pj_0tEpuU$NI{Lr55o7S#aJa6WdzRs5Vs?vh&)P(4;Kp%G} z8*?LF4P`k=5k5|q`-2jY?vL|>5|HkX{eu#a?vM3@5|HkX`GXRW?vMUK2}t)x{h$P- z`y+o)0@D2vKPUm|{_r1^fOLP@4@y9~KlBGBAl)DGgA$PL5B@<3NcRVI2a~8}8u|VR W2?})$^9=U%_tTAV^Yn4mV*mg@ChqwF literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_l_bl_rle.tga b/Tests/images/tga/common/200x32_l_bl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..2e6f9377b75185d286efbd3b11d33bcee62ce240 GIT binary patch literal 2714 zcmb`Jc~lcu7{y0+M8ySn1QZusfQk!^q9}@pBFGX%5ffxlM1{CkT;fEmYeQYeipnA) zLKH!2>n;@QXj>GaAt40FGVC!zIZ~_bIrP1mNfWgG;T+%p_x#TH-Fv_D5X1`6y{Cu+ zVu3^$nV4Jl>DPbI;9(<1*^e1JVd4~*snceDIctum*Fqm(KmWjBcG#*2&f4hMxcJS9 zTet5_+QUZ=e0})XHz_AipGiHRmYJ2ElXo@0py=k0x9{G6SW@~k{`A+fXXP&{e-}$o zDN-$v5jcm!3>Y+I*vL^1W5!LGG{qHSX3v@DwoXvri@+7aULriw*wmtT zU+aN3Lv<`?SGVczERVVK7c5%5blLKtkQFOeuZfI`T_3+GVav9iyY}ou4;(yvlwMwX zX4d5^dDpHNf~m;e=~2}(K&n?LQI!#ai|TkrLJ`i<<819lJC1jn?EHn>4EI?cp7R${ zIQEKFt2vRBS6e8rlA%{{iK*lgb4B?DH-J@eGSaE%FDk{7>Kb`ny;6m$1%weU63W@e zJiy}`n^{=(?LTnv&=I!wqsNY)IN3$d^Iht{T$c@K8pwu$X{RuHlOP&}MK>wW;B+*u zwoai`6AfsiX%iSv$dj>5*bo`{Kgek_4C6@UBwCk~-FpqpBhv^M3St7n2)qMXgw|C_ zW%4?OO5M=d)Qq;6l1R4H)|5p;xh7_oRv&f%hLi4qE}R=S>JkH8Jf3m_Rvo-;db^JvgW7>nftR)Q zN_9h1ORMH3sx_mrVq0^B=Ei+Gmufs!MYhE1~&#K3D^o|RS}KNtr~562ij>uQmfgt zuj|O$#*~?sk(Etl3AUxA6r{K8IovNu5?C)p{?Ylm3nFWHRC;4SGY}domdND5&&KAq zm#;cHU;p_A0BeP0KVv?Q`|up->q#9t*cEtEVQlZ*dsqVVL-|Oqw53hk4rqV9CGdI? zJU-Fy!`?r2hPUU_U`;I=ZAWL6*G|)USnJebXL}riK kGm%+i)=XpwhA@!n{+=O0Z0}ItVBY|L=deY-e%>y~zm+&J82|tP literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_l_tl_raw.tga b/Tests/images/tga/common/200x32_l_tl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..f9ed8b9c2248cad9d81f3a9dc6672b2a14ae3ef6 GIT binary patch literal 6444 zcmZQzU}k^-1%?w03Je?yQ0^e3{{Q;=;q}u8x3671bNtYr?VHxFSUhj$l)lcE`l`}` z?9_zlus|PoCmVAkT@7V9NfACy7XCpANcV^Qpai7*Lw`^L(*0pSC;{pI@E??bbbrJT zNRX5|HkX{y_;y_s9G}2}t+H`auau_s9N02}t+H`9TRt_s9J~2}t+H z`#}jv_Xi6*Cl8;Xu$Y9jtb&rNhL*0rk%_sbjh&;jn}@e=Ku~CSR7`wgN?K-iUO{nb zMOAHmQ%ieiPv6AJ(`L+`yI|4M<*U}L-?(Ml&fWVC96oyD)YJN1q_~YmA$H!<5R$=%fz<<9~2TE855V7oR*QDTToP5UR6`y*wWV7-8W(K)ETqp&R?`-`N}ox zHg4XwWB1+zhmIaUb>{rVE7xw`zW3nK)90_=y!!z3$akPW`e+FXsqc@IXU<)`eC@{V zyZ0YGdG_-4+xH(oefbLVMGmGk@WdWh+;&+pu}-j$M2AA3AdEQV z3zX5HJ_mW^!>3PRe}vKsSVH{4#>vemAS@~&B`dF_qOPf?($wj*!2VdVdhLcyTet7pv;W}XV<%2S3as0A z9{?ld#jDqE-@X3;@rNaCfDF0*XlQQj=<4mCG-dkCIrA1SUbbS@+Vz{ZY~Q&DQt$#Z z2ryv*BLwV`m#^QveGB!63@rcyL4UZod;0hV28TsN$0j7Drf22k7nYP&R@Z_3(bGS1 z%CwoY=Pg(at3bdR{m5}p!UEMGz#Q`M@snrIU%q zuc)G?sjX*VY-(X;Ywv{OkCgPxoV>!~vWn{3hNjl`E<{BLEwF$Y1d_0THQ_~I4gq`Q z(UYgop1*hj@dqtp17s#7U19Nuk*T?rjlH9bo2R#5KyYY8RBU__*dIt0I=tWoXLMi& zfg~(o$qR`PP|CV{|G}fjPo6$~2KEPSatFv%a6V^d<>2Dw7ZMSdl#x?ZR@2bdHGumA zqhSKCK%f~NoI#d?G6=9`0!&!@4<0#o;?x;X$^v@i_T76A9zJ>mY?J`YU0Rh^Aag!dxMW8=WDiC;q1pIXYH*eCqwF@#IR;Y&rg}R1$27CJZ=|;GD`nc*b002+??>PVf literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_l_tl_rle.tga b/Tests/images/tga/common/200x32_l_tl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..03c797e537c7868b9ecb4d48961c52f88251e5f1 GIT binary patch literal 2714 zcmcJRd00$)9LA6KL|L*#DssuCQkD!6U6n{_nM5*^HVHMzk|ifuvP_l^vJ|ppNJO$k zR8C1(TBm86r8!O8NZlS?mwTV5`#X!NuKaP2d(Z#x^Lf7C@B6;L13@|v`I$h4kO`z^ z(gh)qRo9o!c7Ci`o?p z#~z3~!aaTpIeYG6@|CMMZr;9g@BYI_PoKTWeN|9YTvA$5B@l|GGI?Xm`w#7a_6b9I zwOmyWz=izBxYxyROUtXOg(8WpzM)ys+V)$=$4-Fb)^OCAIMDxxfESW4U%h_w)}6ce zGao&9mXn*0zJBxeU3n$H26u?O5hu389cnm{Q_WOo5X?|D4Q(CWK|_a)95u#x-1v!; zrdU`_n>lOF-1+tnPK#aK+`YV4_^xIL1g%}SA$-%8Z98`Df%hFabmZ9algOEK1T*zk z+TD!ItS8wyFZ0mCH>4|tA}N@%sYTKHp{<=jGOHLGh9uPg-$VEA+kfcrvG|h-XA&t&l%O^%-ovdLB$ZKNs0mSA_V>99ot#}<-95d1eEryK zffRUqm4{V`)Jf2 zg`hMq)7j0{+{e+`#lZsl8>dn* ASpWb4 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_la.png b/Tests/images/tga/common/200x32_la.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c4f274f8598cbcc69d8d59984fa4bfa3d0e503 GIT binary patch literal 2137 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�%>GWEEstEK88^?90rADgo z1)}XaI$4pt-7Ve0S*6~@NE&_hMEJ9k*ikQ$Un1I4UtXtMCxp$CTrE%$V(!1 zHd06AG1y4stR?>?KbN1$Pvpn4EkBg+%Xj4}xl+C<-;l4#?Xe^yU5OR6WIxVHj`hKo5Q;;^OUn}=v`O-02y?2OE@#No zAoOfGM;7ErX&sv8T9R5Fzy+$MdOGJ7hJ(vEFo=A_SN74i7zI0cr zk}T<_bVIr-U6C$H=cTjKDXC04F6q({>5!yJ`=sxs5~*0)E~(O1Ns)@AjZ&esPFf=s zNGqg#X{jVhi=~Cqd})r9C(V*(O4(ADlqr2I@lu+UD#0lfDM?C{SSel_CykL}q)`$r zjgTUx2q|0&lPKwJsh<=og-AW6ASqDlCIv|TlAqK;@{usfTWT$NN*cse ziR2``A~l0o&Eee^QcJ0o)JAFtSNpC#6Kc9t|l%7Mqom1?rqOCM=iYHfy6O9f}I_L05+ zQ)<2Rk!p?Hf>Nu-*HXTnqAvG7QEDEutk6RHGDxG7W!*MxH6l5k!) zBb*k>gcHIsp;R~|91!*k-wV5iVqu4%3R?t4C=xabg~B>vjZh%05b}j(!V+Pzut=CM z%n|Yg=tcxMh$3VP83He)38_MgkSrt#?+dIDFT@FBgcxCzKno*;NFhQ97s3Qecw6Wz zgbKZdU?E5d6uJokg1_*l;4AnDnBXmV37&$7;4Zicu7Zo;EHn|Egja-S!mC1ac-KQ{ zDYSyC+6nF9j*dbnp|j8xRtbXDLWDlB@&MQ&Oc)HiMG8?7!bl-n7%jv?DDgsqkSI)q z@KPYmG$9>A&VZt!g6G#cz$X9}o}ypT%!o)~YUk8)dBt z+zakG_l$eOJ?0*954ro?J+6wgxSL!BcaUTq$>mJHYMd_Hw(q zVr~bga$7ltE8;eCg`CW-<_fr#Tt2sqTf&LlB5po6hs)z;aXDNz_X(HDWpF%~#!cZ; zxDU7_?tLzSi|69FF&x81b2JylMRG&A!CV+eaRa!1Tqqa9_2h!M9$YuB3+K=IalV`n z*N*e%yf{zJgF`tt?lsPZYdV{AO5&WkW}GY6oO9<|a4q4AHgIKoxT7Q2i3{Mma)BJd z1;dJcxV~I}*kKUtG=v)lyN-n2W4Ks|BpxD~0Ffm_gsBi|Iz*hwWpOj$2?ThOIgV1R zx*J&v-AG-jRcGuq-AHxPs*y-F5M4Mn<0Nz=H8%3H_^qmyNW*TVuGC^*uz#}8*r)7c z_7VG#z0clb@358ZO}2u)#+I`e+4Jlf_7q#j9%ps7ls&{AVE41%v%A@1b~~%GTUdoH zVmGib)MD4L1?);TpIyo>VHdLt+4<~THjkaf&SbOMPuNWMW0q&r*i<%!O=gqWM3!aa z*>UU`mSIP+G&_QgWQVfh>^tm0b^zOt4P`^vo@@}?gYCu!u$|a9Szp$N#aM5)HS5W~ z!J@1i>&iA`o3c$UQL%MC$s(e8n%ytFybJb z1bPBJkxqsXQ|YO6I)prp&Z1|~Iq(>{bmMlUhRFYxS~VJZS!$h}cDhz0H644y;5Pz$COPyr0!Gqs4B{$OsayqMwL^SsPoiW>NHhG9jA1vl!8+a)P8C& zwVNuYwo@v#l~Sl8Y6DeBt)tdZ1=I>EpIS;Sp%zmMsrl4gDvz2)&7`uaEGm=Apm>U- zQmGUwnM$G(sRSyX8b^(xVyI|}rbbYa)KF?L6-H6i0IDw)N`+9tR1g(Nb)y0(f9g%D z1LZ@tqr53E%9HY-P|A&ZjcP_YQ%xu*_}Pql72a{DT2L+F3U9d5hw`QTs7`QqS6GFB z)p}8VVCDX>Lm2Edgc?RgMNlKDQPgM%BM!nzpe9fgA-u^DW*UT>K~00uv#A_PfJdpe zk%q-@U4vL>BXt`2cVlljL#fVM)uomlSY2v0Zbyi}i08x~#8cuiVG|FC`@~(Mil`)R z5*5TX;tFwzfWa?unkXZV6FPB(I7A#E_7i)F5~7&cL8!zQVlz=hY$OT^nOIE}5G#m$ zVi~c7SWGM=<`Z*>Tw)e6lgK8rh)g1b;E6OMl}I6yi6kPCV2OAlju=BQ#3+I$Mi7z2 zP$HZNBL)%!h<-#U(VGY+f`~w(8xcVG6MjSo!iQ)_coSZPC*eV$gd5>XG$WjeCWI65 z3jF3uG$-7N7DP+9q77Wxp713)5}n}guCPiFtk#R@Ly$y&f+7aNP7$zUR0M1tO~eqf z#8?O?0m7OH;iW*BX+%2l5it!y&n9x;B9#$N3sHKkVL;`e3Ns_~Kk-&CuPNS(3Q zPqhU61^yg=hCjg{<2L>fzmMO=t8h4nf>+>I@pAkkejY!IpT^7Z6S$5a!4KgF@csB+ zyaX@Cx8o|l6<6>gd?UUdm+{qj0losy$Cu&~z8GJK&&TKDdH5_m2hYZ{@Ju`d=kYW= z6;HuGz?1MqJOPi#drFr2~%;C=B>yf@wx55jxk-S7as6Yht1 zzoS~cy+OCPyB{#xwy+968Au~xN4Uep!86VSiVKhbCCQxr~^ zq7TuZ(R*kWT8Z97E6}TGIeHO2kDftKqh;s`R7XqEL+Al?AG#MUL3g6tQ5D^SDrgb9 z0WCz=p=;0rbOoA^E<=}~i_t~sd~`0Fht5KC&}=jd%|t&&c{B~3f~KI!XcC%;CZO?X z96APN&`~IjMxl{t1R9Qpp%gj*?T3b?aXa+hBoet6Gz*FR+HKo=|W3QG-V<6RY z#yT7M_uBX645eo9`@j7m@&b8|JVTx!kKy3ZL*zbk52->d!XZjiENAcTm6kk2nsw;kLM)8fiku$01VX9SK{JtboV-o!3eBED> Y#EfFXV~33%Mvn{}J7ic?cn{?N0X1EqLjV8( literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_la_tl_raw.tga b/Tests/images/tga/common/200x32_la_tl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..6af1fa053b0b157f46e0e2c3cfecfa7a2cda2523 GIT binary patch literal 12844 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 NXym}bu~FTT{|93ljuij^ literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_la_tl_rle.tga b/Tests/images/tga/common/200x32_la_tl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..fce83e3cf010cb970a3dfc557bdced122794d775 GIT binary patch literal 12900 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_p.png b/Tests/images/tga/common/200x32_p.png new file mode 100644 index 0000000000000000000000000000000000000000..a57a8a22af2d8ca4a146b40b3c83492be09c36ff GIT binary patch literal 4054 zcmV;{4=M18P)M*sjz0s&0`22cP1RRRH71q@sO17ZadUjqqc z2@Yor7it6>Z3qu>3mSC;icmk0PdkTFIfha`mQFW|Q96iGM2JsWhfzs}QBIppIE7JD zolP``PHvJ=H-u4HhEQIjOf`j2V}wt1A9x9;OE;-YGKEfmf>CaSQE7rud4N!Vu1Yh2 zPl|$0kb_Tzx<@jCOsBO;FoR8;uuCq_LM?z#mVi#7!bUE3iz@?<7~aQ|MD4oR3CdvyOyniBD9CxmtVU6~eGoEU$4|6-gA z@Ng;eaUzI&{9d6EgMa>HpdRsdBy6A|i-G!Mr5A3Z7hb3uhlTy{d?td4|9GSvVyqvE ziu>?^DT1aUg^&JUvLx?^Dvgl(il`-xsT}Q#Er^x^?V8u4>oGxR=EwQmAk*4|Vpf6|1GK{MG z@1iKWv?-LV`0b}E!L%%7&^M2;`^2^+?W``%xG8DWJd(Eg?6ENJvM6NPK-Ib~l)L!Z zye90oDrntA-@Pi2!29gHE@|LS=)W$P!}xCESdz#3naK8W<6?5V$smjhfo`gYA`s@1240q@3XQi}0n1@~)lc_Kx$mm+JV9^}e6&^_TU( zl=jAw`Ocg8&!O}5nEKb1``(=R_@DdWoc-vd`}C#!=%W7cHKr6Z000b;NklQC8ppFnN|U8w2xFHti6LPsrNhjz)v>ggN^fXI3YDZ1?`w&7Y&o{FOX!2hQnqaA z#MmNB#@+`*Szx(@K1_lNO_3AZf(6C{nMvWUAHfd^P zY;0m;+T6^nRm;|`zqRtU3i1mI3JZ&!7n`KfZrr$Y$H60K&tAE5>)M@yg7asNAK$-s z+m;Q#EnmEF{@l62!K#3tJv=-;Jl(w9+}zxqot<5Vx(s!7#LupO|6aY?w{L6Fu2aXJ zmNvcn{W#z!he6{;j2<(7g17gSU;TYTXU?7z7Z<-MIXNX|bL#fp2M!!Qb@A%G`%j;h z{rBC+x=%ILZz?OxOP@R{x>;D5pPzjpJ2x|H&z?=2v};!`GpNVrXaI9GGBj-36y`8C zH8nG9(V}%L^VU{Ye!e(IczA5AMzea|)*br}9zA*K%C%c}Z``gwv~1cTUHTX*f;-J(s0@4NKq+s*cefdl^GFml|8 zQDetXoHWJ9$3HN1_Ux#b`1qwuSFPE+dHZ&lKW zfXIJnko~*1ZIA{D4nQIvDwxEbO@cgJe}O@q?1xzQ>Dn1L>-!!(`}XcPZ~zh+F?#Iy z@sqr#_ykT54Fw=E@k^F2U6TStV6%>$I(PB*y^^P8udCkG)zws2|5aID{sITNnGZy= zbF;HDvXF>&nM9-!jAGchX;UO(ibPtpqRj##uvw51j0hugy-m9gT{>EJv-x2l5*ayy6Y&8eGiOId#l-`WRVn{Y zP2HV-`0%N7K&0g5%hy%4wVyw{fAhb}iqaR49|91}2+To5)@xU)iAa4;#E@^6i68=5 z_vIOxmjr{X+qi>>K-TYKM$YE|k!?U^`SOJe=K_&{01uH7cNj$`;$(+JdUfvJ)}jp% zu_PkOtosv@IWaIuaxxOZ&BCnTz7G+>&HD5KA_7F7KQ1mREY7FZ%F4>vvndTCvMj*> zHw%gItQ$2mAtEhWz#vG(Z>k^9x?0P#e)iI}Ye3{O64?(#HY^ueXPc!UGE@+8qO5mq z3lZtmrH5s=-blm&h>RNh&k2(z`ydfmt*CfdtyMr|`}TAgn6vf;AmOlCiAh?mv{_JEuv$9p3q*oLR5XdF7ZRb) z!a07yNu2EMp?y0;`$E>G_8o~?2O^UpBQVFDs5nK|0m!MVS1IdQS~a|VpFb)px>=lG z2&I*qmAQvXOM^t}ArZD(NCdOq+>D4=5fR?LiE{hq(IVGV%CS@YE2>{fq|@jfe5UY+`cdfw(sYf_tg*)k#%}S zV6!sPkjS!x1fCJLSwN&2wyzn>y1B?YwXX(=?Av#gh}^xy-orygWCbfNBto0zrEFi| z0U2?!r}wbC1!NuC*T$A*eVml_KxNibQd840>(su_fXGKAg6&)W>M?KMT*ydfCTm}{ znq`D-7G(w_k~G-$c*qv7(~4q+xOtflhnQi1(@~yEbA*4!XUvR0V@8k zdrI#*z9OuB`}gTZL|FUU_M`S4Cfe8EAF@6h+IJDWhrE3cA3JyP`u#timN6nM>o1-_ zL~df%*}I;WwtoFeB2o{4D6(#B+#LKw5b+}-n00L5ty_1B&BFFYB73oYS1cApMAkVG z7iuk>L~dWqdS5{V-}MO-C+oEDs#TjoP|{gxU4Kx*vtA>&ukL%eeyx^>&>&woE!r)X zkwo40y>*8Z!OhwrvL3)&>q{bbPW_Qcdm_TKKG#Tic)A~%NRUx-8looGaAcBL)re#R)p{WU(R!eGM)9s+5e*}va9<;1BmS>jKZ`M6XmQkB9QgtI_*0vWLkjoZ-ixp zy&}}U^d7cjre%w!HGG_|`_74pSt6SjxGxFHQbKOskoB8|`Nh0_fe4uv5|P|j zYF}nr=AyG^prItGi3kpoN2bNx7a}6NZ?N>Pd+C{$+`f?Yj+Qo(`yvr;TD*PHv{K;r zkh|{#=DuWFko8i`I%}=m%N1zJS;pm3A4TtN((m& z+?U#yOlupM)(YmnssI(4mK*yU!Og-!T+w}{_Engc!hQXxQ$)ypQ@Hz{!v9?9uZq2g z*uG5S(X_yQ)AkS%7=*cRL)~}X4BD5uZ;)_bjd0&Qbl-v-x~4UsnU;sX`wr!%1zGPS zxi7UZxG$L2s4?7q6{fWcf7o^YbE|4U%ULfH?wcu03!af^9U|hdN_Jm(*ICwqi2PTj zXIk8SL!@`z(@WvLBI~Suzr(EewPF9c%(TFLr<22T_a)P!%{q1U`h7AjseQ|_eK8|Y zTF|~^TI;cW6BrTpiU=a)zQBWLWCk-W&Fa-;T9EbMZ|VJ2Eym57HBBYG>mnnr(%*=1 zUus{;eMgT1_x%@?mUMYgx-YgbH?2?LzS4hgVSZt@ly&C5NJR0jQ$|d=X<138CI9C_ z*7JDQIgu@r`^rS{J^X?QWgXpDX-zt>koEN4EbI46Kv1ea*5Tzrm{t*w$cZf0 zzGzy}5eD*2ixEN767H*f55axq_Jz&LVeX5YMgO^8!2$e&;;Ca=_)}$Pr!+0@zGzyb zglYM+_KlBEPL|yllo8z*2l=Fvb?I+J{O2Y_U`7-~XtPYgv=r?d7Ad*!K3(@cM7JPj zTIjw?(^3$@_8me*EG#JNHnz6xKX)A6w5WYUxoIuI%}Uk%&wW>0i>3wtxuq{26-(}m ze?8=DktKscS?)!hT&fi0vL$t5>8xcg>eYJh@J)9XeM`~Yg zTGEwK%DQxAydYf}>91-*M1+CfUlqL~czCcv_l44$ft!^CS!brD=e}$ZrTeO6BGOIE z(S8VC8Nsype{R2l{I5!KU-`^>^_fTrzLUH%ScO8hVME6A^4Q10Z!grla zOCrKA9^)3&NQv0@T(}Avxy=@hy#s70d6<5a1sp&|B znO2$pm9a?AeOdcT8EO2Lo0czTB$8hlxoMrfB1(&29u%gfbJKEnk=)mgT^{hS3jcHY zm65qG%X(mFsN#Mtxi4(iGjU~ntGF^2bJNO5gU!;e!}l=aZ{-VWfx^htLI3~&07*qo IM6N<$f;7npkpKVy literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_p_bl_raw.tga b/Tests/images/tga/common/200x32_p_bl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..89145aa8141d2fddc997ea3f265ae222c295e424 GIT binary patch literal 7212 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_p_bl_rle.tga b/Tests/images/tga/common/200x32_p_bl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc53f2f9346cf1f8533bd1a3d2f10c5ae70e26c1 GIT binary patch literal 7778 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_p_tl_rle.tga b/Tests/images/tga/common/200x32_p_tl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..3092ff9236efe749fd2bb747d85eee6a958570a2 GIT binary patch literal 7778 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_rgb.png b/Tests/images/tga/common/200x32_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..6614141a5c0202d51007469059d6b9dbb6ef1ea4 GIT binary patch literal 5236 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_rgb_tl_raw.tga b/Tests/images/tga/common/200x32_rgb_tl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..2122ffa1038703ff27f3c11645380976d3207ccd GIT binary patch literal 19308 zcmZvkhkuUe`-WvnP@AH5_8zvX5kZW1Qe8%NLRG6(O77X^M z*^&7s@jI{Uex5hc@6X4daDJZmK9BRb(xF4=4&vXi4qtZ|)}jBf2xGfW#txl~9XlC0 zn;E&98I3SA8fj`Y+SF)_so^+N!`C|+PUvVj*~HM@#9+E{hndD5<`{NR85+zrHkfZ> z^p2VFf-c63U+L)6-PFH_X;AM@%UWhgjk!mS`NSIYNmUk;DlI0LSx)}fYVuR7 z$xp1OJhGnhx3&9y8}~nLr~Ym`^{(C2+jbr|?L2PSd;H`u?FWbH-#bqK&T0DBjx)Y; zn(?LcjLXiRms~tAxXwI1V%E`-bM}pzvvZ81XsmMUICc8#nv^%RNmI4)bF}gEH1P|y zvHqIa<(imPnwSW6bb>m1qdF=}9a*G`*sY2`inB;4`s+BWpKG7 zxK6S5#hf)SG{G<43~qfpv~^)vt9MvyKzPfN$d(VHT0V|$`81|^ZA^1moGvP^IX*$R zE z^QMx@){@7~1-~_I{jnkIYF*m7=c$Kll6O=lWtYW8{}cNDqgC_nf8hDYlIg!KnRX{= z>aC#3zXVPEDQLp?LF2v+9DOBV#ODDn7Xlnl``aD&vp(!+zTbDqE}wxVKK%;3`{a0u zWSNO%8OzBs9Bpbi7Rl;J$$G=YV6usUhcP8Mw_u1(3DkW>efGp2}Iod(_ zi-r^|8CJY<`1S~kUF$6Oq+9PVusyWL?#OZb;};!Ied~PY7ngJQ-7Y?JJ5%at@ZBrCbxA)&%Ps?si`!gh6~%?eJIKPT(mYO8tGmda|2nbqb~rDT~;s<4<; zYB~9t<>Y^?CO@{G^3dA-ZyQS1AGT9}vz>ZJO4hU+_S1f{N3y0}bDZ{_NHMP;xui7LKFX{Hh!@-E>IKuktX&tO-!UZI#C^! zs*223M;5Ch_NXF`s=__bDZ{U*!oF9A-BO1BsR((Z2(C~BH_Tbvs#xF1jcRwZw* zNXjUS4SyOM^l+v2{<0aIEDuW7lF2uMCjJ=o`uBljzX_mZUG{gr;O}tS-}bnlgym!5V97G@d_L6HN@Jm>5ho?l8mH zfRkmQF*2BEY=mUJ+li9p)vcp%chi7gW=r~Tviei9Rv}qK>6;bK$%?h83Wp69_VGwo1tn`$rR_(RHt$#3AX$s6 zt=_4&oL6n3tg-N{wh+mhSYb{9D>MFHKw!B`ao)CMHT9y-ppqSsk@i9aW-^*r$p(j&Ig^W%yNP*mY&t zZAIukMaWY{aHS%+5#KEQ*9N!FN3ud&7a>{Ut%01Z52KntiEdtvWX0+tVv#HzeX|mE z8Qkl59G$!O}u-}7~%6so~vVxE-_gg`eZUnvY zW8nB}l&n!#0^L6McRug$aLUi-n4je#zu|i+S+7yDynAPP(>Ke=v6HcrnGq!mzlNqr zmf`4*_-4t;>S%~$d6*b@iewpe&=?xdGckP2)ac#LCJVcC^y+Hr+XKn!w6ssB4_@v3 z(SRyM=JFqO5yzvU;y`?33(-WcA%LvR}re0a>#KZk<0U-+O4$2g6EM zo9~FW*qv;-H_Q4!iS3~Sc1KS+ocO}&)c4M3e|0_ox7&qM*VCmgN6TCelsfO^WaXAS zW|TXmmOHF3w~w#1i>R~)5nQEMtHU=-#mRaryy>EZDZqJN><~!w1zJ;8m?v4|B_SpM{eDt z{Mz!u+S=mU)@}c`6#b>kztxy?ts&#{+ASw*HtwrhUsRE}u{3JUleOLtKAwGV>5Si( z;@8mQ*Cp;ZgC_kP_{I-Ges_G5XtJRPu44|26tVHWSMu5u;>wO)ho`nSAu=-^^Se<%}T{LYgGS?DX(SE8MyWB z!3DlUik1)Cw$^+{tmW=aR{L^n4s5eMe9->rX@?VEI-UB#twH3*#aM)Dgu&%;Bw!$vF(spg7?aE5q<0lGVI2y7{x1mXO$HBrBGawSkkBzD}3Dp($@eV^K;IlC^JB~HHcF4k^7UX!w?YJFiv!uo$BKYhGr z(cdfZ$ig>k+TA5ne_b-=CO@*S2U4=W3K;oCfa@iHr?dX{C;e=W`dJ`Zdwd4%@EuU- z(>K?pHoc);KV@#hOl^Wz8~2_z&QBA&OcT3O z6BDYAj@3jbtD-X0QTeLKovMgKs_@gwaL>!t?!lAU)r&a?FD3X&C!=ev222r7p7X5snXdxI06?|ms*;|64Ua4~#u zNI}5R;*W=K3$@spK*exhp3T8sc85_6&pV#{+WGX)F6aJmyYR&AT&XK3%LU2WUhZ5_ z?wC{VkcMQHqZr!9RElC~^Kq5!2URwKRo32BRtu^u=T}>*t1V_#TTJ6*O~f|~kE}9_ zN&oWmU7su}hBi_$M6zzuBTHWlrRV!s;`#0(7ehA`!`b^sD|U`n7LQe-7-me+YfbKW5kcy0z}Fyjm1PB&)Hw`bEi;=7Qgwa(`;b{;EFhTy5&% z>g1hONx9{5vHyfEf3)hYzdodI79}gl{q~Y6R15sDK`rU5y8OT}>dRYDG)c)kndaB9S? zBU}uD916!$F-)I8$RW`~n*ij1Vz@{X7ods#P!qcv$UzgGpo!kZ$UzjtBdYMTNY#F>FOK#5ZecM9cC>LJlZ~Yh!^Nnxh#xBmp^~7y>!0 zr(#%;OvR9q0~JFchi`x!a_Sj5)IMuN4v(4(?l$EDIb5krJNtaop(;WSnPst2GIE&l z$I|J)FY&mu#QoNiDfE1ois7g$0dAKAoX=CTPz4IbayVG#yt~Y~gph+H zki%vqtK5N#AtQ%XKn^H|Ro4DhR*S2w-l-DB(0pbMki&2ZW+7Qr4C#^89yuUc?toc$ zY^UC~7vC&G4stPM~s_=8FFwZXuIfUL)v>^w%7_M!dAI!xtl#&$~-YOvnB#XaU z;c+@3hlGS?LJo<#ElIk}^}4M{)&>+qMh>Y|3@@iQ06E+Ma>%WHz{ml`P*+k;$e{qp z;krN$HJeZjw^byimBxfU4GDa>Qhk4!CzACWiXoB}1mr-)kdQ+lCF^ra79$6L%R|2A z`+SG&^nDG8 z7;2LzY7?fY_&8Gc84i$;1rP0Apf_)!+GDkuVD272? z41=f`0y&@EgTo7MJwH)G_$#Sruz$s*)H$wDzS zP`->D7IiT}F~m2EiXoowuXg#UKac~8AtMKKf>}tGD29X_L@^xMKV$NMtl2;ggY$g| zIc)pPd`FDs?i8!NSzHVca4{6f;g0Kt2W}VsW#quckYSc1kVB?G4i!k2gdA2@+I)y& zSS1xhMh=#WYKs{)7AS`F$f_dbz?hVhH3i9PLk@aOYL8+#4aHEvtTyD}?1^OIr|_by z=Q+1oC%70ga!}=uS7(jaYzA_e1mrL`9?0PxZJf6z7RUj`P#}l(R1BkX)sfp7Ih;_1 zUsQ&90y+E$i-1-(5LqZM_ZOK|0gJRem5=X@_CSHeRiDD>{ zg+~^{EEL0rV_XccWYhyW+?0_+Sz&Em@pFM3n)7cpWq((najACm2?;qQr2HGT8pz@A z6*K=_Dq&JChLe6qvP3Z?q2B&%npS2rX}`Zbi2rAH1D z%tA3Fm^BT>P#^~?h6eLG8UbceF+{SucJ%9E7T6obkdOlxLpUn`0s z!K`F;R5~Gt$Q`PPgQ|#As_;vo4k(5aa!`i+OUPkuGu~M!hDg@i470rWn+2Ff#SkzH z$RV~lG_E<4la-j*ERqG71>^usT9n+lJ*9C!kOPV#BZu#^>u=@M|Cw9+gpfmReF>1m zKP^Q9Ieb%>4&-pG8pvT?K}Ev4ecN{ZfFV9yuKF z9fo4K-A6(WnciJf@y&8HBTNdCh37jkDR!MPaxt7>!pMP>HPe`$?<&I%j2sN97C+V%UOYsn@=kN6BhkKrpM-FQS!-VPrEE!jTh7FzshVtF}%IC?tWg~Q!a)LB|r{OnhXDEl90ps+SH@f$-96Y zDiRW&MXY$V`dz6Q22H!OWa{lD(qagh^{oW6TrT=^F$8k(wb&2j;4^TWPya%x7*eu~ z5G%r@GR%?|!?rCNyAE&Bgd7Z1Mq)8UvIu6;7TrxMhRga&iy^_RA%q-|EZ(Af#oP8y zWaN+{kb}HM=K(oji~bl}w8bvkqOE9)-eq^>sKfE|jwgT|Zn&J4kppkh1hcl6I~9~U zVT(?~Vn|ywB`d7Lj<)DZn`M>O*rI_Putm?Wwotci(fBFkZj=O`N}$w&>OBm~c%r zkOObgQH5&Sq7SRWyc96W&>eo+EBgg#P)$Xhg$72HZ&G%tpP9FQz5hLJ5RL@}f- zx|z4=X4;~WtaX$u-lBmV8h54;a=;dSiMMDZ3&oI-Lp~P6+NP2!+M)}8Bjk{EwI0P# z+M;vH;$ohKeeh`2{J)k1W}z5zvhd9c3Wv5XthhIzn6YP~M{Z(-uw0 zq3cHR%_914N*^o$c=62|FJKm14xB7r3?<}1TlBl_w&;LfrvKfd@qA~PC2i4UISAzN z>gEys(q11RBZnb{LBmS0MFTmkv!Y@sw&-IHgdDI%-*h>DkG5za2i~Hc2|1KGV~Zxs zfsg~XXuIf2fgAv{WXqx2iniz)LJruX*>VuicgsnXEWj+w$-Ec}6>+(wrJjU94T4Ca=>DU=R1%CZPBCtXNyKLR4{UY?Fr7arBp@uAniq;Zr(Raym$o#S{?M%(4L)9C$SJD<8 z@icVF!Xjcr$ahW{w2%dSgGrQGM8NfIh2v*KwC5x!wNgzqV2Fn!*Y<3gC%Xz zHEcN$a*+KQ6hkBnFpGB`cVRiuVrc75$r6?W?K&O;IS|Z(Kf~XwF95T+7}8?M$KQrIp&0&_i!HkLUnHye zId9Q_>!=uBr(}`kaG;8cA&^7p)8K%ID^>So%K?jF+ZG)pBM081DOu7MO~?Vo5SBw0 zA%`yX%@RL_!k@ve!&|g~S%z=OTQrh|#Ss3Cgd9Y&UNI5KA)qJiI`C(x7y>yAresN5 zG$99A4(+z+5&hG}7X9YneD5KJ%Z8Pp7)D#}PPW>YWwXD;_V9jtY|+OrJD$2GZPBnC zPM5mU7EQ^LEC)gkVvDY@i>#2h=qf@EVv9zywAG>*iY=Nksk|6Y!Sh}6XRN1ivc&UU z`ex~iA--AqM;4MrTeRy;P8PQ4IeW$cIRIv!+ z(dy{+>gX-1NZz6&u|=a8UQmUBICx@4m?EaxrA&fW;77v;?!>>rDO(p6|RxON${}4ul-m4(%Q~oSyFl zv&3S^->glp{b-AxOj~sBTR;v&3YQNnSp(!?0pzeR8_2;9KLa+#gJhZC(C6fZP6oV9~>#RXqB)Wutig{JhhA*utjTQmug}@(ZmL; zsThhaIuFQ!x9Af}LJlAfoQD^x2st!u z-$=;e#O6k^MgNdhe`{;qy}UX?4n@zY7;byo%$7q#_Sbdk7iv?19ClYxF-+nudcoiN zEjq~Kb{lfQ7Ci>Y;mZJ*Oa4F(b|?LKi}o9~+eaXWKAbER!%iF8B};l_k)$k=C0h%?pC))R6%Yh~3vHfX_Rt?I1 zZ*YPC(Bc)twuhMSOt9RYYQ3M3gB@88*rI_PXp45m7JZ&2<-=uM49lDg`T5RUw1ZR( zD<#VTTQp!+`z?BQ4YugvWI3>;41Y%2qJ{8>Zx-nLJuZeqQWlnj@Mpv~3y&*xgRmU1MN7%T7EQ%a({77q%i#lc>?(Ckm^wOM6UAG!9y!2rpknwfUhp?yIVgb~ zg2fiyg2j-L1Nk#hNg*l2pFuH%KSRYZnvg>%C963uUMFqQupDSH)In0l^Br6Cfz$?U z(HGMjzRGC$F{>V1G>`*|VO3#mV+n21Erc9?Zpiw&KJEPT%|~j09Fp?NVm(l3Ux{!YRl z>+c4WI~s~&IMc`gk1W>TSyJv~ynrkRJ#sLUki&p3c)mk_UrW0V{Th^N)h5n8$+Tr*G2WgA`!wvd7V3xiZ5^|7|gkqNY8hclwa20Wy?Vp6g$T# zi?BtHQxS5QpiT17#=~-$$H)Q2aJicGcWlvZ`g^rv=u{LbQ~-PmXx8tljXpYG8aR!MGNFWTeO56>UfI=a**}+cF3Vx zufK;ad$j7!`^#ti$-*CsA?xp441-V%At}3|7@h}m@Pp+*`a2dw2{{Ou<<)hQmsz`H zNyq{IjQ*QNhZWd$U}lk|jA96wWnwVjl=Sxnkd#pj$#O827DHKoUjvxM$ztTtlPm{b z3^!tnMlpo`KI65Vxr6c+4JlkQwD?o#?}Qvkf2S>4(%%_5xSl8d9fuVz$IEb7(Y8f1 za&Sy8mo0}%xflvbxeCYuTQnnwmy01CR)}HU{X;G_4>Or zErzE?%szrG`u{-=bK^;W*TkV1VvGJzLt8W~2h!iwKn~cV2{{~7MVwQGLvlbb^n~Rg z^mjfE={EC)^&4l5ujLw`T!2jl?# z9m%3%2;_k0dm5haUS{j?%>pB3N!gH|?>MZ`TMh)XgykR|R!}j-VFi+<-=hDczhg0c z2|4sYF(l+b`a79flq_t~q`wc&6I=AE;oC`nx7?d)eSo%T`=cl9h5p{QMVGbd?_!IF z{=S*@cla|Xh9Q-tzXLh&7X7mRjx8Fy4u7*I3(J93QnDQIQwU6Y5BfWhgV5ix>#*}D z7DLwG>G_Vs3aJ>9q&(~7h*^h5&Ox%Ezvn|G75Y0Q<>{~-G}xl!7HeZ={XIHL9V3v# zRuxIgLVrK6683wj=WS&O>+fw_G?E46K!+7r41H*eZhb#OY|$;Nqg%Kb>cnE$9ywsw z5&jJHcO;98VFT&!v_%tgC@p;cyr{ON1p2!`4y3==VT(pFB;>HUjP!T^ho2}#vhGTf zGFc8-46g-^{TlkaupE#q*5AbzEg=U^7LY^AV$&o_Rwv$d%#bX@G35M_q|DEEY|)17 z&(I?aDk&F3u^1XJEM$U!=+=ui4PZPA0M7?S=zob-1TLu}D9 zayW7MKl(c%2T00*S;gf}tiL;M0&>6>U1|S6`n&a_YS!OtEEH4>d5gw7>pzn6BP&TI zCFDSuly@Ck3`tVfCrhZLSDdg#d(y7s;(68;k}@TWEeAPS6ST>bw23pQ7{o)wk;aSK}^w}zbZoSD`|_aniEXLP`Q@AS@IU$0^}ep2P}r4L<{{L z$N|Y}PDljIY68qkW6J?Bt1wy8-?2r@`g`5YoO;sVW#rJh4VD9nA?fe+q`!+Ty0{|Y zCHAtwtk>*pXUhGaPeu>MZSfwpMCEFcHkqJ3T?{oO}K4qhEOS<*@OwtI3QUq{Wc7XuGMuGA5;D@nXn_6*GVw=wwG;3<2QV^!G8? zqE&h0@y(Jg2k7r)IY|0DkOTDh==R6~TQuqKj2wjh?sK7{w}uY99e(g zNcwv@>+esXzjHCfui@PwdcH${7s(R(JCFk;W!j?st)ai;`M$?@5DqH}eO}$_-7C|p z>t?Uc8@xIuF5+K9f?3#g%=mg$dcH$aCjFg?p^>~r8w>s2XhA0|hUCvcQVt}Ql(%R; z*}-D?lKze@+Ck{=kdz5IWK3nt;awENA;mxr!R9;TEq13057C;WXMO#S85|~t84DroscfD#$$-=H9 zzFBm=>cILt!z|u)r04s~`nyWnq9y-l-=29hSrAj2tjU zd)`%&qzwK2xgwa0VK6KQ{b2=)Atei2H0$puhAm_{u>KC@0Ly`pgE*{UNg4V(AqUxV z_#wNVw`fWhB;^L^?}Qxw)aBi1%p&9f{k`c`A+(~A8paweIY6L-AacQ0y&r@$jPEJLw;l#$(WRcKR&GJ0GP#=gMn5`78OHS z4s;jIhZU^9^I-)QLnI6OyHpJEd{4ynDqxli4lDYljU(ictsX>MH1u~MhfqQeWI2%j zZhPd2(BEa`@RX7z?xJanE~70v2U~QxxQn(IchPI87-BKBCjGtIdO;OQ$|#1g9IzNp z!aIwR1D@{!IZP3j!vnrv#bQX710@T0(QVhOj2v(YCM4yT?xJy6A+~5(4$>BlV(8BL z`#jR$X^Z|q1LP1L4&=baFjIvsI&!y~w`d>-6%|7e2hZOrS%e&RG~9V`cN7mY0%#Ss1sEC+!c4#~(t(%*CH?&s27bXC#w#$wu{TMB>I z<^I%&yXbV>MIRCRds%$!GwAQD-@+D+4;D$v(BBDWO~hhIhZO;1E)(_M7l0&LMkOT@)}lGUCxY|*&5C;j~x-9+jg2At~eH9>{@U79$6`i*DPZ^%wU*4${RvBL}>*=+{sd{vOfuom5hBagW8Y z4LOMGRflP~F(k_Y#Smr|>+e!A{QtIST--x{Pk57%!%JHZyQb~7hlJ24}r8fXM z{G20Q-2Yd9r;B@`zvHli^!IY;?_oL&2chPjRV=CPkVlkvGT9T9rIiMKQ#XYW9^)L&?P=9gHk1V>l z7nTF7q%k%?4t#OXCp)tKK9GF>izKIOaU^;UbZMN7y5`n%&v*53&^@D>f^aInl} zcbSls=`LCnLrH(Hq{9kXf47GIE?wN?E?Uyx<--bDf0q_R+(n}pV%lN-o&1@b_V{MW z$U!=+kT32xVR4{l~f=HPL{a1Z^dFr7xx6Ss2EBY_u`u+kb`VFl(6N{9yyTyzP0WF zw&+6MqTB25@)phdJCK8%{ywBT{23uB^A-)5 zMR(DXEfRCcP@so9H74k%NO^&MN7y5chM+@q`$XUNf~DGT{OcizPJ~~ko*~53`r%$t|R#~ zVlkv*DD?N4=iOjA%qHX@-9^*$owjJ`?Ed3}-%$*wii>+l%0J5bJ1vH? zq)f$7x{GH0-KTe^cegEGof$b8#o(JIp6>!?$=9p27z+Iz7x(gAw7f-kLNTPjMKwI>HY#;~PqEQTCISl75+HzmEHSVGh9k4%!yXY^R zPGgJy)#dyHS0qb+7cDFYfgIq^tfRvU=Gme!O}!ZPAkc4&;El=(wfg z;$BU~5SBxliuHFj6+@xFqZt0Ez!V+oDK74-6~VZ;r^T=xa-dyDMh@aGnhq=Umcxc5 zzPOhTD;fzoq|jY-JN+HV0T=hRkMiqiizfY@x9I$vO*y2$*Fk?z*~@p)FX`|2DP+q5 z#js6(hvk49!;6$Ghm*4Yj*ENVqUo>#$wDzqUfeNZv7wwSQ$h}aS#q*SQkM01hFOLT zvpO1zEt-)7wrEon!=-$^`Vrqnv*o~d(YUzB-*SLTN*DKf{k>nt6j^`A#r=o4xF0TG z+)Ky-#gO!OX^VEnUGyo^-<`2V?E9f6IXuLs$+6aB)9IQ8GrE zr{AJc45ckvzPQI04dfuU=yVm`MGO5M7x$NxVbZ}pl7+iyNq?6uhjx;(Kn~KyeG3jN zPz?Fv9+I-Gzr%8%i+eh(VEw&8Ukn9uxF;^|=`Nb|cP@r}agQw;`a2;9(%+v&tbDv? zAr(XXEeGi?n)G)dhwDM(2szLejbs5i*vZI2=7X^M z*^&7s@jI{Uex5hc@6X4daDJZmK9BRb(xF4=4&vXi4qtZ|)}jBf2xGfW#txl~9XlC0 zn;E&98I3SA8fj`Y+SF)_so^+N!`C|+PUvVj*~HM@#9+E{hndD5<`{NR85+zrHkfZ> z^p2VFf-c63U+L)6-PFH_X;AM@%UWhgjk!mS`NSIYNmUk;DlI0LSx)}fYVuR7 z$xp1OJhGnhx3&9y8}~nLr~Ym`^{(C2+jbr|?L2PSd;H`u?FWbH-#bqK&T0DBjx)Y; zn(?LcjLXiRms~tAxXwI1V%E`-bM}pzvvZ81XsmMUICc8#nv^%RNmI4)bF}gEH1P|y zvHqIa<(imPnwSW6bb>m1qdF=}9a*G`*sY2`inB;4`s+BWpKG7 zxK6S5#hf)SG{G<43~qfpv~^)vt9MvyKzPfN$d(VHT0V|$`81|^ZA^1moGvP^IX*$R zE z^QMx@){@7~1-~_I{jnkIYF*m7=c$Kll6O=lWtYW8{}cNDqgC_nf8hDYlIg!KnRX{= z>aC#3zXVPEDQLp?LF2v+9DOBV#ODDn7Xlnl``aD&vp(!+zTbDqE}wxVKK%;3`{a0u zWSNO%8OzBs9Bpbi7Rl;J$$G=YV6usUhcP8Mw_u1(3DkW>efGp2}Iod(_ zi-r^|8CJY<`1S~kUF$6Oq+9PVusyWL?#OZb;};!Ied~PY7ngJQ-7Y?JJ5%at@ZBrCbxA)&%Ps?si`!gh6~%?eJIKPT(mYO8tGmda|2nbqb~rDT~;s<4<; zYB~9t<>Y^?CO@{G^3dA-ZyQS1AGT9}vz>ZJO4hU+_S1f{N3y0}bDZ{_NHMP;xui7LKFX{Hh!@-E>IKuktX&tO-!UZI#C^! zs*223M;5Ch_NXF`s=__bDZ{U*!oF9A-BO1BsR((Z2(C~BH_Tbvs#xF1jcRwZw* zNXjUS4SyOM^l+v2{<0aIEDuW7lF2uMCjJ=o`uBljzX_mZUG{gr;O}tS-}bnlgym!5V97G@d_L6HN@Jm>5ho?l8mH zfRkmQF*2BEY=mUJ+li9p)vcp%chi7gW=r~Tviei9Rv}qK>6;bK$%?h83Wp69_VGwo1tn`$rR_(RHt$#3AX$s6 zt=_4&oL6n3tg-N{wh+mhSYb{9D>MFHKw!B`ao)CMHT9y-ppqSsk@i9aW-^*r$p(j&Ig^W%yNP*mY&t zZAIukMaWY{aHS%+5#KEQ*9N!FN3ud&7a>{Ut%01Z52KntiEdtvWX0+tVv#HzeX|mE z8Qkl59G$!O}u-}7~%6so~vVxE-_gg`eZUnvY zW8nB}l&n!#0^L6McRug$aLUi-n4je#zu|i+S+7yDynAPP(>Ke=v6HcrnGq!mzlNqr zmf`4*_-4t;>S%~$d6*b@iewpe&=?xdGckP2)ac#LCJVcC^y+Hr+XKn!w6ssB4_@v3 z(SRyM=JFqO5yzvU;y`?33(-WcA%LvR}re0a>#KZk<0U-+O4$2g6EM zo9~FW*qv;-H_Q4!iS3~Sc1KS+ocO}&)c4M3e|0_ox7&qM*VCmgN6TCelsfO^WaXAS zW|TXmmOHF3w~w#1i>R~)5nQEMtHU=-#mRaryy>EZDZqJN><~!w1zJ;8m?v4|B_SpM{eDt z{Mz!u+S=mU)@}c`6#b>kztxy?ts&#{+ASw*HtwrhUsRE}u{3JUleOLtKAwGV>5Si( z;@8mQ*Cp;ZgC_kP_{I-Ges_G5XtJRPu44|26tVHWSMu5u;>wO)ho`nSAu=-^^Se<%}T{LYgGS?DX(SE8MyWB z!3DlUik1)Cw$^+{tmW=aR{L^n4s5eMe9->rX@?VEI-UB#twH3*#aM)Dgu&%;Bw!$vF(spg7?aE5q<0lGVI2y7{x1mXO$HBrBGawSkkBzD}3Dp($@eV^K;IlC^JB~HHcF4k^7UX!w?YJFiv!uo$BKYhGr z(cdfZ$ig>k+TA5ne_b-=CO@*S2U4=W3K;oCfa@iHr?dX{C;e=W`dJ`Zdwd4%@EuU- z(>K?pHoc);KV@#hOl^Wz8~2_z&QBA&OcT3O z6BDYAj@3jbtD-X0QTeLKovMgKs_@gwaL>!t?!lAU)r&a?FD3X&C!=ev222r7p7X5snXdxI06?|ms*;|64Ua4~#u zNI}5R;*W=K3$@spK*exhp3T8sc85_6&pV#{+WGX)F6aJmyYR&AT&XK3%LU2WUhZ5_ z?wC{VkcMQHqZr!9RElC~^Kq5!2URwKRo32BRtu^u=T}>*t1V_#TTJ6*O~f|~kE}9_ zN&oWmU7su}hBi_$M6zzuBTHWlrRV!s;`#0(7ehA`!`b^sD|U`n7LQe-7-me+YfbKW5kcy0z}Fyjm1PB&)Hw`bEi;=7Qgwa(`;b{;EFhTy5&% z>g1hONx9{5vHyfEf3)hYzdodI79}gl{q~Y6R15sDK`rU5y8OT}>dRYDG)c)kndaB9S? zBU}uD916!$F-)I8$RW`~n*ij1Vz@{X7ods#P!qcv$UzgGpo!kZ$UzjtBdYMTNY#F>FOK#5ZecM9cC>LJlZ~Yh!^Nnxh#xBmp^~7y>!0 zr(#%;OvR9q0~JFchi`x!a_Sj5)IMuN4v(4(?l$EDIb5krJNtaop(;WSnPst2GIE&l z$I|J)FY&mu#QoNiDfE1ois7g$0dAKAoX=CTPz4IbayVG#yt~Y~gph+H zki%vqtK5N#AtQ%XKn^H|Ro4DhR*S2w-l-DB(0pbMki&2ZW+7Qr4C#^89yuUc?toc$ zY^UC~7vC&G4stPM~s_=8FFwZXuIfUL)v>^w%7_M!dAI!xtl#&$~-YOvnB#XaU z;c+@3hlGS?LJo<#ElIk}^}4M{)&>+qMh>Y|3@@iQ06E+Ma>%WHz{ml`P*+k;$e{qp z;krN$HJeZjw^byimBxfU4GDa>Qhk4!CzACWiXoB}1mr-)kdQ+lCF^ra79$6L%R|2A z`+SG&^nDG8 z7;2LzY7?fY_&8Gc84i$;1rP0Apf_)!+GDkuVD272? z41=f`0y&@EgTo7MJwH)G_$#Sruz$s*)H$wDzS zP`->D7IiT}F~m2EiXoowuXg#UKac~8AtMKKf>}tGD29X_L@^xMKV$NMtl2;ggY$g| zIc)pPd`FDs?i8!NSzHVca4{6f;g0Kt2W}VsW#quckYSc1kVB?G4i!k2gdA2@+I)y& zSS1xhMh=#WYKs{)7AS`F$f_dbz?hVhH3i9PLk@aOYL8+#4aHEvtTyD}?1^OIr|_by z=Q+1oC%70ga!}=uS7(jaYzA_e1mrL`9?0PxZJf6z7RUj`P#}l(R1BkX)sfp7Ih;_1 zUsQ&90y+E$i-1-(5LqZM_ZOK|0gJRem5=X@_CSHeRiDD>{ zg+~^{EEL0rV_XccWYhyW+?0_+Sz&Em@pFM3n)7cpWq((najACm2?;qQr2HGT8pz@A z6*K=_Dq&JChLe6qvP3Z?q2B&%npS2rX}`Zbi2rAH1D z%tA3Fm^BT>P#^~?h6eLG8UbceF+{SucJ%9E7T6obkdOlxLpUn`0s z!K`F;R5~Gt$Q`PPgQ|#As_;vo4k(5aa!`i+OUPkuGu~M!hDg@i470rWn+2Ff#SkzH z$RV~lG_E<4la-j*ERqG71>^usT9n+lJ*9C!kOPV#BZu#^>u=@M|Cw9+gpfmReF>1m zKP^Q9Ieb%>4&-pG8pvT?K}Ev4ecN{ZfFV9yuKF z9fo4K-A6(WnciJf@y&8HBTNdCh37jkDR!MPaxt7>!pMP>HPe`$?<&I%j2sN97C+V%UOYsn@=kN6BhkKrpM-FQS!-VPrEE!jTh7FzshVtF}%IC?tWg~Q!a)LB|r{OnhXDEl90ps+SH@f$-96Y zDiRW&MXY$V`dz6Q22H!OWa{lD(qagh^{oW6TrT=^F$8k(wb&2j;4^TWPya%x7*eu~ z5G%r@GR%?|!?rCNyAE&Bgd7Z1Mq)8UvIu6;7TrxMhRga&iy^_RA%q-|EZ(Af#oP8y zWaN+{kb}HM=K(oji~bl}w8bvkqOE9)-eq^>sKfE|jwgT|Zn&J4kppkh1hcl6I~9~U zVT(?~Vn|ywB`d7Lj<)DZn`M>O*rI_Putm?Wwotci(fBFkZj=O`N}$w&>OBm~c%r zkOObgQH5&Sq7SRWyc96W&>eo+EBgg#P)$Xhg$72HZ&G%tpP9FQz5hLJ5RL@}f- zx|z4=X4;~WtaX$u-lBmV8h54;a=;dSiMMDZ3&oI-Lp~P6+NP2!+M)}8Bjk{EwI0P# z+M;vH;$ohKeeh`2{J)k1W}z5zvhd9c3Wv5XthhIzn6YP~M{Z(-uw0 zq3cHR%_914N*^o$c=62|FJKm14xB7r3?<}1TlBl_w&;LfrvKfd@qA~PC2i4UISAzN z>gEys(q11RBZnb{LBmS0MFTmkv!Y@sw&-IHgdDI%-*h>DkG5za2i~Hc2|1KGV~Zxs zfsg~XXuIf2fgAv{WXqx2iniz)LJruX*>VuicgsnXEWj+w$-Ec}6>+(wrJjU94T4Ca=>DU=R1%CZPBCtXNyKLR4{UY?Fr7arBp@uAniq;Zr(Raym$o#S{?M%(4L)9C$SJD<8 z@icVF!Xjcr$ahW{w2%dSgGrQGM8NfIh2v*KwC5x!wNgzqV2Fn!*Y<3gC%Xz zHEcN$a*+KQ6hkBnFpGB`cVRiuVrc75$r6?W?K&O;IS|Z(Kf~XwF95T+7}8?M$KQrIp&0&_i!HkLUnHye zId9Q_>!=uBr(}`kaG;8cA&^7p)8K%ID^>So%K?jF+ZG)pBM081DOu7MO~?Vo5SBw0 zA%`yX%@RL_!k@ve!&|g~S%z=OTQrh|#Ss3Cgd9Y&UNI5KA)qJiI`C(x7y>yAresN5 zG$99A4(+z+5&hG}7X9YneD5KJ%Z8Pp7)D#}PPW>YWwXD;_V9jtY|+OrJD$2GZPBnC zPM5mU7EQ^LEC)gkVvDY@i>#2h=qf@EVv9zywAG>*iY=Nksk|6Y!Sh}6XRN1ivc&UU z`ex~iA--AqM;4MrTeRy;P8PQ4IeW$cIRIv!+ z(dy{+>gX-1NZz6&u|=a8UQmUBICx@4m?EaxrA&fW;77v;?!>>rDO(p6|RxON${}4ul-m4(%Q~oSyFl zv&3S^->glp{b-AxOj~sBTR;v&3YQNnSp(!?0pzeR8_2;9KLa+#gJhZC(C6fZP6oV9~>#RXqB)Wutig{JhhA*utjTQmug}@(ZmL; zsThhaIuFQ!x9Af}LJlAfoQD^x2st!u z-$=;e#O6k^MgNdhe`{;qy}UX?4n@zY7;byo%$7q#_Sbdk7iv?19ClYxF-+nudcoiN zEjq~Kb{lfQ7Ci>Y;mZJ*Oa4F(b|?LKi}o9~+eaXWKAbER!%iF8B};l_k)$k=C0h%?pC))R6%Yh~3vHfX_Rt?I1 zZ*YPC(Bc)twuhMSOt9RYYQ3M3gB@88*rI_PXp45m7JZ&2<-=uM49lDg`T5RUw1ZR( zD<#VTTQp!+`z?BQ4YugvWI3>;41Y%2qJ{8>Zx-nLJuZeqQWlnj@Mpv~3y&*xgRmU1MN7%T7EQ%a({77q%i#lc>?(Ckm^wOM6UAG!9y!2rpknwfUhp?yIVgb~ zg2fiyg2j-L1Nk#hNg*l2pFuH%KSRYZnvg>%C963uUMFqQupDSH)In0l^Br6Cfz$?U z(HGMjzRGC$F{>V1G>`*|VO3#mV+n21Erc9?Zpiw&KJEPT%|~j09Fp?NVm(l3Ux{!YRl z>+c4WI~s~&IMc`gk1W>TSyJv~ynrkRJ#sLUki&p3c)mk_UrW0V{Th^N)h5n8$+Tr*G2WgA`!wvd7V3xiZ5^|7|gkqNY8hclwa20Wy?Vp6g$T# zi?BtHQxS5QpiT17#=~-$$H)Q2aJicGcWlvZ`g^rv=u{LbQ~-PmXx8tljXpYG8aR!MGNFWTeO56>UfI=a**}+cF3Vx zufK;ad$j7!`^#ti$-*CsA?xp441-V%At}3|7@h}m@Pp+*`a2dw2{{Ou<<)hQmsz`H zNyq{IjQ*QNhZWd$U}lk|jA96wWnwVjl=Sxnkd#pj$#O827DHKoUjvxM$ztTtlPm{b z3^!tnMlpo`KI65Vxr6c+4JlkQwD?o#?}Qvkf2S>4(%%_5xSl8d9fuVz$IEb7(Y8f1 za&Sy8mo0}%xflvbxeCYuTQnnwmy01CR)}HU{X;G_4>Or zErzE?%szrG`u{-=bK^;W*TkV1VvGJzLt8W~2h!iwKn~cV2{{~7MVwQGLvlbb^n~Rg z^mjfE={EC)^&4l5ujLw`T!2jl?# z9m%3%2;_k0dm5haUS{j?%>pB3N!gH|?>MZ`TMh)XgykR|R!}j-VFi+<-=hDczhg0c z2|4sYF(l+b`a79flq_t~q`wc&6I=AE;oC`nx7?d)eSo%T`=cl9h5p{QMVGbd?_!IF z{=S*@cla|Xh9Q-tzXLh&7X7mRjx8Fy4u7*I3(J93QnDQIQwU6Y5BfWhgV5ix>#*}D z7DLwG>G_Vs3aJ>9q&(~7h*^h5&Ox%Ezvn|G75Y0Q<>{~-G}xl!7HeZ={XIHL9V3v# zRuxIgLVrK6683wj=WS&O>+fw_G?E46K!+7r41H*eZhb#OY|$;Nqg%Kb>cnE$9ywsw z5&jJHcO;98VFT&!v_%tgC@p;cyr{ON1p2!`4y3==VT(pFB;>HUjP!T^ho2}#vhGTf zGFc8-46g-^{TlkaupE#q*5AbzEg=U^7LY^AV$&o_Rwv$d%#bX@G35M_q|DEEY|)17 z&(I?aDk&F3u^1XJEM$U!=+=ui4PZPA0M7?S=zob-1TLu}D9 zayW7MKl(c%2T00*S;gf}tiL;M0&>6>U1|S6`n&a_YS!OtEEH4>d5gw7>pzn6BP&TI zCFDSuly@Ck3`tVfCrhZLSDdg#d(y7s;(68;k}@TWEeAPS6ST>bw23pQ7{o)wk;aSK}^w}zbZoSD`|_aniEXLP`Q@AS@IU$0^}ep2P}r4L<{{L z$N|Y}PDljIY68qkW6J?Bt1wy8-?2r@`g`5YoO;sVW#rJh4VD9nA?fe+q`!+Ty0{|Y zCHAtwtk>*pXUhGaPeu>MZSfwpMCEFcHkqJ3T?{oO}K4qhEOS<*@OwtI3QUq{Wc7XuGMuGA5;D@nXn_6*GVw=wwG;3<2QV^!G8? zqE&h0@y(Jg2k7r)IY|0DkOTDh==R6~TQuqKj2wjh?sK7{w}uY99e(g zNcwv@>+esXzjHCfui@PwdcH${7s(R(JCFk;W!j?st)ai;`M$?@5DqH}eO}$_-7C|p z>t?Uc8@xIuF5+K9f?3#g%=mg$dcH$aCjFg?p^>~r8w>s2XhA0|hUCvcQVt}Ql(%R; z*}-D?lKze@+Ck{=kdz5IWK3nt;awENA;mxr!R9;TEq13057C;WXMO#S85|~t84DroscfD#$$-=H9 zzFBm=>cILt!z|u)r04s~`nyWnq9y-l-=29hSrAj2tjU zd)`%&qzwK2xgwa0VK6KQ{b2=)Atei2H0$puhAm_{u>KC@0Ly`pgE*{UNg4V(AqUxV z_#wNVw`fWhB;^L^?}Qxw)aBi1%p&9f{k`c`A+(~A8paweIY6L-AacQ0y&r@$jPEJLw;l#$(WRcKR&GJ0GP#=gMn5`78OHS z4s;jIhZU^9^I-)QLnI6OyHpJEd{4ynDqxli4lDYljU(ictsX>MH1u~MhfqQeWI2%j zZhPd2(BEa`@RX7z?xJanE~70v2U~QxxQn(IchPI87-BKBCjGtIdO;OQ$|#1g9IzNp z!aIwR1D@{!IZP3j!vnrv#bQX710@T0(QVhOj2v(YCM4yT?xJy6A+~5(4$>BlV(8BL z`#jR$X^Z|q1LP1L4&=baFjIvsI&!y~w`d>-6%|7e2hZOrS%e&RG~9V`cN7mY0%#Ss1sEC+!c4#~(t(%*CH?&s27bXC#w#$wu{TMB>I z<^I%&yXbV>MIRCRds%$!GwAQD-@+D+4;D$v(BBDWO~hhIhZO;1E)(_M7l0&LMkOT@)}lGUCxY|*&5C;j~x-9+jg2At~eH9>{@U79$6`i*DPZ^%wU*4${RvBL}>*=+{sd{vOfuom5hBagW8Y z4LOMGRflP~F(k_Y#Smr|>+e!A{QtIST--x{Pk57%!%JHZyQb~7hlJ24}r8fXM z{G20Q-2Yd9r;B@`zvHli^!IY;?_oL&2chPjRV=CPkVlkvGT9T9rIiMKQ#XYW9^)L&?P=9gHk1V>l z7nTF7q%k%?4t#OXCp)tKK9GF>izKIOaU^;UbZMN7y5`n%&v*53&^@D>f^aInl} zcbSls=`LCnLrH(Hq{9kXf47GIE?wN?E?Uyx<--bDf0q_R+(n}pV%lN-o&1@b_V{MW z$U!=+kT32xVR4{l~f=HPL{a1Z^dFr7xx6Ss2EBY_u`u+kb`VFl(6N{9yyTyzP0WF zw&+6MqTB25@)phdJCK8%{ywBT{23uB^A-)5 zMR(DXEfRCcP@so9H74k%NO^&MN7y5chM+@q`$XUNf~DGT{OcizPJ~~ko*~53`r%$t|R#~ zVlkv*DD?N4=iOjA%qHX@-9^*$owjJ`?Ed3}-%$*wii>+l%0J5bJ1vH? zq)f$7x{GH0-KTe^cegEGof$b8#o(JIp6>!?$=9p27z+Iz7x(gAw7f-kLNTPjMKwI>HY#;~PqEQTCISl75+HzmEHSVGh9k4%!yXY^R zPGgJy)#dyHS0qb+7cDFYfgIq^tfRvU=Gme!O}!ZPAkc4&;El=(wfg z;$BU~5SBxliuHFj6+@xFqZt0Ez!V+oDK74-6~VZ;r^T=xa-dyDMh@aGnhq=Umcxc5 zzPOhTD;fzoq|jY-JN+HV0T=hRkMiqiizfY@x9I$vO*y2$*Fk?z*~@p)FX`|2DP+q5 z#js6(hvk49!;6$Ghm*4Yj*ENVqUo>#$wDzqUfeNZv7wwSQ$h}aS#q*SQkM01hFOLT zvpO1zEt-)7wrEon!=-$^`Vrqnv*o~d(YUzB-*SLTN*DKf{k>nt6j^`A#r=o4xF0TG z+)Ky-#gO!OX^VEnUGyo^-<`2V?E9f6IXuLs$+6aB)9IQ8GrE zr{AJc45ckvzPQI04dfuU=yVm`MGO5M7x$NxVbZ}pl7+iyNq?6uhjx;(Kn~KyeG3jN zPz?Fv9+I-Gzr%8%i+eh(VEw&8Ukn9uxF;^|=`Nb|cP@r}agQw;`a2;9(%+v&tbDv? zAr(XXEeGi?n)G)dhwDM(2szLejbs5i*vZI2=-EUv8)0`MY8iF_y2$D<~gymERv`^^iyFR$h5P!# zeSPb5{X-w?8=vb-YkdRjAHez+)|Y^fC!YIHJog`X?LY9`f8w?O#8ZFZ`T7IT*T3=K z=fCjR^Z)VR$G`A={Rh|^+5%o1*su8h+|cU|i#<7Yje(Bla_>h=o@00jS! zc3S||kBf1imgZ;9OE@?BHUWUl=X0LVc)h;`?ceyVhy~zAV1W@}`HTf%ksZS%u|SaV zas8b7AYK0~E=WTEU6y~|wdAT8MkrMNJJa5NevKB;wT)9#t7J)^86bNb6>a4tv&?2}NV+G?q z>UmlO#az~t&ZEE;MT^Dc?u4cU2G6QrlJHjw`#syiWGZ#4~1NgZV*xij56Sm@3o1Y3!(@L z908{ZHh`p}{AW;LRWJaHBqL~;Ki5h|rd##84kD5SGbgF?jxRIwSF6XDsJs-aTt-rn z%NAA!!eVE%4y?rtH|E8Q-<%d0nYSvVP!KnyCw2yj^aPF&QNK1#%Lj<&P5WDt<{eC0~0pOg0-0p{7=BZpSB$PQN!s*bM%VFI86NLU1J^}MP! z^*Ne~p>yScEhsZMfz2(kvU#pOq%CRN^~uoD&P=4rQ(h&if(Y!_TDp=D@058i(j$ZL76(lTne&QBfeurngKHq7F64jOI1;<;y`O*sh7KQeqOt(8nM}{ zDpc`a>B2s7T zBv~Tu)T4}EO%lRUIM{6!bhcE2jy7r9rVKHAE^+-Ye#3g5s$zJ1)+^0!rDDyMEf;X> zv@=(R9#EW*tBgSZ72-ZIH-6M^RdR|=-l@tqxpL#Od(ht8gf7ioRfcYdvVKwGv~h92 zy56g+3A3G&^1cj+Y%mB-O^xKP4vMS{797%Tkt+g%%j)#BV?eZNA|p~NIH0^O@0_XF z@Kvq6x-1}?C}!*JLkzqxq1@_vWilv zC@%tGKW}9R(rtQHlV4$y!XHou1)<*LU0WIt5RsFRohOeH;=zEy935=R)H7`oNi5N7 zd*wM!H7JtSGjTWVV;I#$10?=E1!0_Ql|u5ME+1az$&hFhw7Wa^}0l&MmV zai*@)S}}Bc#cmXM1Ocb*isskyCL7G3eHCLn4ZMz}kqT$zZ6O*g7Oo3`+yLF4-C#Vg z8ai@U!59E5QyzA!>8W9&j{Yp+p~suITT2Ry$#$~MCM<~cMTcmeWE%o5ip+PJ7Pd!uOK%C(DLk_&uigajDZDk!{ypXuCA8iN%9aEqoXHZWP+ z8jhu! z9zb2G3J4A#{5KT@=Nr>13ORh$pxl$4y0&Y&0(4#|-h<}N{b2+^C6r7<%`a8~yLr;7 ziULh@A-wgQoT^gwqpO8yb)51~D<=)uX?lgUjXf`1vO8%d&JejVN$Ntv=W{C%5+P*^ zwMFe6zz(~scXTX`BgCcXk{nY+U?gqZE0$%$9!u?nOIT63Y06aqxyo6q^D@0UNTg@)P+1M8uQVKvWXc*f>twNt=B0^v zwW)vco|bwsK>Hwo^Zpb#8o(PcKdEA8foYY87ixD>&+skr1~;o9D>qKHWV*CeI)Ga& zNrP^w;Q2P<M_bF+N=Z}u4L;e6>J3qHs5OC7E@p(3y?!h zEFsh?Enp>;8$qPN%L`l)2uSUu^LA4l%{GxokQ`ksy=W5$K)3#3NZ)SMqBb!V5xSVg zA*yS6cC+Q4(+Z$Jv9p?7QnbU36KB|V*0q}S_fVCNFlZf+>{e^qsZ%qF>&ga0O%@mv zHP>HfkNJ1%eL)yw@Ru|Cu6FtLHul1 zVP|9Ut9<3$h%4#yyrcp<;3Uzsj^u3ij*b@+cl3e5YQ^8OGCD|N-Ov?f+ofuLBDrasA~3eyJ%Q88RNlWj;m~;EZpbgRZ$5`~mP_GqSdCJ;JJq?|Q$5CT zkdNsM9Kz`0q0CnWWU~4L-s?*fG;HEFbM9=-LLP9A3Tz2*f+Tn+DsjlPJxRY76x60w zgKouwSWZEa&336M+(45-4iu8?UQ>IQ=8N(Ppan*ee}zLL zSVH^QSv}-w%9Fn?0(gstvVh9xms*v+8WTsZZI3fpY@twnKdsVCV8Bv}w^)Kv!*E@d zZ}t07#w}oO2Ou|$LJuTZwI3E^G)i_mb$Ag}j8*~it}v0z>+0-ikC<0!w2xL=c9of` zAX7!SOLsNua8KpQfB`SMZrm>>c#rQZSf|1qYsnZbjUF#ZvsQ%=2Z#@A#Y-@) z6$;kTJ+|e5l|*(!^+IbY3YI|3wwzEh+;PIc_CD+&#Yz{+){Uyik)H_^JJr=FO_Qa6 zu&G~dYqz{=m9x>B`q-$l9IT{um074Yk5!LZjbFodMfDhIiB%PfsFfKPG^l~dKEeWn z&6PzImVj0Fk5L7O)g+g&y`yk(uyWcH+RxNMUKayHDj?F)GBqwql&9@tq0`6l2@A$e z(MT~G6;Q1dp%bXXH#;sg@zv3LX`k#qbG7w5AK0S}6vEg@HEw(p5;^JZR3B1-$lg?p z?VPkOrgk?F&kf(HrwyR{5dX@(J5-vEsv?#`zZ<}3Jty5s*HuUrz}pzHli3eY7tz^< zLuPU>HN3$)(pu7$g5BwaFsPNCzqxoz-(_#>lz_8wrdIi>oOLI;*i}NnwYsz-ABCI% zmASd7WiqVdoOr+U%DScQ-qvByYJXG_ugXn#2K{RBlp~+0d7rbm{!HR0(&6X=% zHI6ry>Gqf360ficF-cMhSyV8s@-w|r3ra% z75mrVn~gm(b?q!iI|beLS)uSmcv!ZaN;Wz9w6>4ceJ7QX`8Vj@cIuXebCFnOH(4~M zD%-C}IfMsR3Wqrzlr|Fw-{Ys^YO@k20MM-&4?u6W_Eom{0Oi(#uepe)6L)}mnW;A( zKw3;f199DBOo}=vSxxOfG!HaW(%!=qc+O4#3#-ZXI}9%vl&}qcb;^4y#RllW#c|RO zgN4J8?Hm7acmGXrmyMbP2iL1cbN&byU$Z`72 zWilLeuw0VJJ@4CQMeO*Ug47e+IwF!%7!7L>!TecaH;D_q+Tw1()D3R`XPbOw=3fa; zeA(MzebBoZTxYu#@0I^%6IaIkwPbA;$6A7u;*FqCs^`&OHAt_2_f^#^h24ZGmjJGa zQ6&_@=Q>8oJk`i+HORJ$=Cyj81!0Se@4iR9w_a9}9GEZXVR{6}4T{NTEgs;#D~36q zylZr4Zqx`?BUFv+cI&&2s&eX0=D#{NdG@87V=7cv62e$3UV?2rSm;23wu;rtKZmAW z(D}WwjwIb1B4UYxQF)dHMQs0?3DH_(j_d5U1l7F9(p3`~fy*!kr)CsN9rb)M<;5D6 zP$kZlq@t#qRSiS6ru)L)RXtwroo+L#JKZ`kaC)tHwYpzG>pD&78X@9vedrvdvVAS` zqKWWi2RtKKr77@m`hYD+Y_?;9CUJ+%9&cvGMYI+E1n9*f)o@hOuiGX+e0mV6cns-o zELK$lx(A{XQtKTY9D<$iKMa?>&PH}Lv|&TXeNGrE#Tuz6|JL}fl$MdyMN(lm9|Bo( zAJU>+7*q$>YI_Jwx8;nn)dy;Ir`sxe4N5WbO8S9=_FZU4aGK=JuAQ?VZ81q&x0anr z%W{BvuvalK1=BBh6$rhm?Dpsz_#cK#n@5bSZrI4@tC%z z7acOcJ+I{0AqILCDa>&*?c>(twwg3XUH}`6#mF49X>~zEx>pDZJFF=A%58PToVLB; zc`EBNHjAB~=o1M2`U50o<5%!BdvS>jv9J|kI=rW7w;=)qy*F$5C#auwe~%If54!N>*QW=o`~!>146W=xAailL1(1 zck_zCqmAMbFg}w`n_rCJVOJ2kNYvXOOw)i{ z)os+aM8z22ZKa*zz@xg-fZSWO_h7YKLB|rz_Q@HloZQD)Of)T2isGxR@JS7?)2|S_ z=a@k&|9Wy$O4H*wec6OT&!QhPV)?B=o^Dh7(#0IR-v_0V_}&N&r0|Et(~2P<4UsDe zjWcwxTbUnwwYOD}H+Qa21lk-g4em6ErxhQ=G8P;sndRl8Y?3s)q~2!Cy-|ptEkNtw zh6`?Caj)BgMZ;LJ($i6Av01}XM(NU~44bW@b7D0x)!KcyZsi^-n%B|iIn?&}8sAmg z=XaZU+w?tz42#w+5fFz#k;efIt&Texeo((`$8XZKi6?{{ZbDQEk!xsL8?mK|`o)+N zwW`_xBv-!g3`>oxJAeBY3N08Ktjj7%nH2E^iox<>wJ2{b)F->1@3Pa3_YIgV?cd+0K7>a1KM@&xK1`1rqD*B zdL{%H+T?t^+O0m2;jpI1X71)Wf35+irVRWvl%{)|tXJwP`(X3wW|<9!jeW*u%^p&N zQ}mg1&V*r29u`lisXB3)%{E^(0M(C#8?rrDrnC?4X#Z9TTXk?l8SS0+MV)^ln-yYr zzx!e>*>*9;#T#0P%`-CF07KI2h8{8RLgDv|bAN0K;&TiiAe z=E`T$`3p_t=B$;YM4AR7o4jsY%6PMI)iMW*Y~S?KagIzJ`crU{3g?vz3pdyl%0M4=J>y}dlMPGR&)ThhRG=WUlpnZo z6$W_`5~X8`&a}ndl*;nLF~|2@haqxK!~8PKs>GBt z*(;e0^8FmF)dLCdgzHoiJLE;Bh-m*}7Gy`3IZh1lJY(8?Utn+)Z6oQ)z<~rcZQd0|LG|vjn3M@VWk;SvPi!un=Nvk6#)BFfHz>d@JMF|L z3T?h^=1y{&P(24`fe?1;*x(fqeRy04LCu3C)ob`=Dp2jv@s0oAMHIdIz&s7<<*e-yE|oJ>)Q+ zOr2Xthi>!Zc1WDHLYogDgX0{M;z7wW4h77?1y`cX@grYCy_;SX;;Go87YW(q^4rESXP>r_fHmpIG9@{FL$0DB-Jt zi;i2|SLGV8on~^{-krsA&RQ*P=U^>*cHCw>3WUQ>PP9!t2QQ`VBmlEaDX%8(Fgffw zT;Wo*18mD0z%ncL%tu?{^ZoW2d@D|e$O*tS9kPz|Nd@K!<2qkrCmzzvCW*c%ViVO1Zu(K`)nXwO=#^W>6d zsL11>hLyr%`L8?|_TJkk>t}U3rdx;6+OA%krt#*%YP^w5)mEJ-!mZOXV#$=zMtS9$ zV}9y1XZ7i5pmr*;I)Pd2gR+`On)g|H(Pja4n=T0$f7%iK2NxA{8p$D$sh`qIIo#`1BZ)=Do?dv&NVTQ^IXZ(JZO zHm?#^+qMXsod<;N?o+~k?^RLfzBc1!hYGOeEWsT zS@v_2)9q#@f3k^6d217z`ocOO^|7^A>OHG}(r#LgO}%0{BJI4zptMsKebbMccTeAM z=9#|Bv{S|w({>r_O&l{;o3>70X4*P+p=s;nxn`|D#+f<3pJDF!Cc?bUt6+;ZFZ?Xp zJey|e^yD8)r$=M0+TI^&)%NZXYv()tt(|Z5vT?rF#m42T!M5F{PIm1sxY)Hj=V;&V zOmlnJQ;i&4kJoi*f6S&%`y=LcI_$4iuj8&i8g$xRt)bhxN{w|%KQz`aF5Ap~Uh(Gc zaiv;#Mwe^j8Bw8wXLuD)&+uP+d4yFT@cuns+?7rT2^b4K$_zyboNf|mX?>wDXfG~K4 z7IgNWUeLoQwxEx1e8B*}#DXFIi}ObWB;}6@TAM#UXj9%l!Q1nvhV04n4Lg(<5OzE- zH2h3%WW>e18If0WXHCDIn-KLNCvnEpoW(O<!_*e92rPK8uy&UEVVBICrtQnLS^e&zvI;f0-?Irq2}X z)1t-Fln4>^K0y5QdYb6_e7tD?c$9E`I8wOWA1T`286n!-93fg?A0b*?9wC}u7%m#0 z87>-}946`>87k}#3>DUUh6;-vLxkz(!J^i>!Q#(VgT$}P28ybS28v2^2Z#!B14Q{5 z{YB}B{-Q*1KcVsgBa)9sa8iVi60J&$5|R&R$p=4;k75cR{CnN`&-5-YO2bF#0q`-T zB79U9d zb*>|PbP|6o>@KP=86;{hA1i7lO@)sTVY)6>m~EU7A1j5`*3Iy-4?a!^`+b*%!-2b^ z&Y>6l_wYf~g^xNr_-%rZweYdxQ-S@Wkx*l5xwV~t6x^cAM9QWwL=Jk!=6 zW}7*_i-nI!_y{p?^TOZ4>6w>>)00V7PLIY}wS6$!y6wH8@G-!~`DSk$=j+{UoUeM= zx?Fa%ZFixaUAyyb>|D>buy1#&vAyewdhlTj9~N~x95AWZard9~J8k);q1*b(jdUw3 zG|?|9*VH|+WHa~KC0cmSDA&4k#1F2W!z;UchW*mhBka#X9$~ddd4yU_^a!!@b`P!> z;vU>M+C8{Mf+48QBKN>{tK0)RZ8rG3?>6{%J)-yP1t0yd>U@XZ)BBEkrt=y1PUrnk zy3TuAuA7%1e1r&3?}&o#J~Ik>`_3-t?>7%V78MK+Se`#Ra1DHHgpaLxQ$u#=`Gg*T zkE3}Z;iqyVBF^W|m@fIa1t0fw6QiHxESm8$ds)o8?3J;}*&Anl&fYmYE9+1~e%7hE zBJ*OR_<9RI9xW1IUM&${lb4AvU*V%*rFfseTs+NPB5vg@5EnA%ilbj=i`^NqVgr0E zgOAt`L1M}qFEQ}>1ku6B$Agi=`7V6iQu%0kWw>Z2`8YdVG(4g5;c#%Mu!Rpx_%Pc7 z9~%aX>hST~@;NBK;bVZPv23)cnKT(bg5V=Y zm~WUTEH|%!kB!25`yOGt>p1h{qHx%MhuQI5)RTPdhmD>5Hh)z3a99B&i<5Kg=1D%1 zQ*EPD-rIzyytWQZeP->Q^1y0x>TRp>sn_7+qQ#K3GZy{RkD2#OKWNrDeUGUwW4mel zj7=s^pVz`il1b~-CGaud%<)qK^CQ;G@lBL@o7bThZC(bzhqr~((@D&a@s{vm)%M;n zE9cvTtetQ6v2nTH-PYx*r)|5-I$M{E?cu}8uHBiI%#SAa?N8Kqa6M-4(Ef;Joeqag z>UG#%y?&>yzcp~%Pz64IY^+~WzNsOxR5Oow$w!%1p77xrUeVwgUbTm3*dGHt!fK85 z2sNMR9%3`iJ-BX=M{uJk_n_vp-Gf>$bPse%G6Z(qXb3Ru())Kgr1$H2+Th#ovfgj- zUA^zfCpw?8Z}r}Pr|G<==14yDUcm*P-r)t^e4^nauAraaoPxpr3k!xRe5}eJ7qmYA z@8B)@Q$lvZ$G+Tvup_x4;U^V7q9ZTo&YXTDH$Lia&b;WyxeI5!$XOcmHfLq*r|b>0 z(zABNWo93U&&xb9S7cpahTMdYhYQ8mmy5-hPfNv@FU*kqB=NCeg?OH~MBK?Ci@g~$#iq0wVg-D}eGC@fZ@tBk7k>-4C!>YyBjyKuw7oY%INjFxxH>{KyEt4l zk$lMcadfDVeAw)TkDW#MSUpJmzC!XbNK}!0#KT8ye^GXNe^IiK5B@&a=10jU%nF&R1)Pz@{Kj7n)q&@X-=J+KWFHbQXUu?hhZMm>-kiBT$&G zjTYwX=L(BW%iv=JeC&dcqrz^_1^Bqd{CKMHQ4c=q?)oI^Y~i;KHj?~>UGP}X_qX9rk%CupLW8$SNdV|F6n#C^cg$h zV~a`KjCHkJWvn!9mA2Hhb;<%W$B%Q&96!u5b9^iL2!oG6`0!zVOtEbHc%r4#!@uBT zxRvvr!Pd^V`r5eM=)pHuXIqymdidx7AI^5|&bGF9J>As7^<)FSu^j5OKWbg4{UNh@ z9ro0$-)Ys^-I5NYM5W9nR`O979KIBTXv58&ZTq2Pdd-=pSyX6|JL6# zwB~S+P}A`qA=Xnpf*k@qf*VeE4{93c9@u(;A+YTVLtuvud}Hk}1av-V@b7U-@7MRT z-gnS#z3*`N81qKwGcm=@drFp@w-0;-GC#r!y23|K-|M=S4rtSvcbve7wm?iv5_g zZf08c_PDQE`x0`qj?WQU=i%eVe35w{K3?#B^?~`3!TiWe63OuKGHqDtZb@e_P}A3H$dqf{7-)KT+?vZAmv8D$LOk}JbZjN zk@=zUQA6XyL{tnk7ZpRuAmL`oPBs=EvWn_9{PN zvSvDbB*4c~VYy`;eC*^K>xi)1d!BEs8=}s^$7GOqqV7TX*v?TY2Fv~v~%(oUN9PCsJSHGQ9% zfeg|iW2=cX8KjlWAZc0#`7{?k;>;c2&VY{yi#D%}cz9-o@UP4B~paIeav-CxgHT8RU?8-41(e)$g>O z46?CWL*431jrGgEZ)#XT21zL1+#|MBOV8=$+j>U)=;j$wrK@MyuYEm2YYZcUj3a|g zaSyQ%a1X8@K?a#c2AOXNbXraZSq~rE_5Pj*^nTq>8vOcP)cX#+MFx4K^BMh`43ez# znw&`n5xQvs!rePmboH4odiut~M|{CRzxf5j{Fmg93S0pnYvE&4{^XGDd0wG=^8CUM z<_3iygO4-0QIQwn<67=)GRWMh2e}KQpXMx?@j5#x_I>u+S*h9EW`D`rM+P|xALroX zI`iWmd^}$)zP@LEq%RkrbCN`AL6Ud{ANS$oYF45+^)*2pfRAnIF=BPE5?!ADrSc&&$i0!mNoElEXmxG4XmODYqVZAh_%MYJyM6Gn8$PxT5hfdlh?;8# zi9eDCiC>ls6hAK*D1MqVK>RRkfG8K;Uz7^t`%3abMlT`1u{1tP!iO?HWJYIxlyFk{ zC`JY;=BDxC$^7WbH_P z_y{4R`&&9a^@5LoEZaUDPeva_Mkj;Z8er{mqc?nXvvIlNZtHT%jf~!o{NZHZ?sN-# z*OQHzA7qfDc6HhxwyfJ>pGp0WJF7S7w22I|rgCH53Npw-_?T0oxyQ_sEj*`}b>bVV zlV^D4E}r4P^dW-`^$a!n%OlisvU{+dKN%#P3^LO_sKq=o$TIgp*L7r&Z3cgj{d&Ky z#|?hHFX(*-+|c_DeW>>t^-||O?h_g0tIlhhaGT}_A0Y)@ydw*G_{OLi-G5&GQ2#~w zBLgHKtMez2K_-W6%l8W1t?_X*H!R{5^W#EpEEzp6>Q?UD==(YIXFSPS67w==MeMtr zH8WGPx5j-(tI$wOf3nNd-=Bv?iAH4f z`tVWb@K9m5pNtM47Lt!m@Ua#?R+7<|s(e%|!bj=wZ+s{jq!ElXh7Fm~<@|t;64GHw zKBU9yKnBtHC{~1zl6}bN{mJM!tg=HZigMCn$@w827JSHzZsbFCSnweoR+!31m1w@N zq{CA9XiP?Lt2wM*IIN+f#)@&G_DXN~2q%NY!N)@QSS_r#ZBrfAp3}l%-!(G&1NeBY z^07yCSPCDjnIFrNh226j$eiRab~DK!)5#zqDX*;kQ=VE+OMPJVPwH*Uv1!*VMvy@U zrJXkKlYShBb;!(v4ALomyQvEq#4%$n4ohYbnb8yZ#)?-mdYd=X&D*>TwQzbt26^fY zACs6L6X0VEd0^JA8QHu-t52E|5XawN*37Nxrd;lR=K!!-rMf4*N~( zDST}Ht)Xsh75MnEiD6OsW`?`-oi7gEDr1Yj%1L|p5fJclR*Z1gw`J85n_(R zvhno@u8YHJh{I|=*AVEq)DY;h#yz0pR)fD`ufe~|F@t}vb7b`Edfy@U^*$qCl0iP| zy#M}8M$gwNd<5gL!bJ}yqsQT}=91AD;;@$G{}s3@Z+!6j{7Gc=X`#FFeZ%(W1%@BN zVV%sKE;BkAB#v*aIZ^j==g)YYvpD8O&Wf0KIjhO&n`WhF?~c#JVdX0h>k8jjcbFef z$scdvBbEG-wL)azu-jr$Bg^$CZXNw(V^tEYGVo7qih@3L z6^Auaby(M=!y==fA1)f5#$mxn-6O+Phb8&gE*%zptb>nLgW+S4sJiff9aa%O8o-4y zgD8CPuO%O?_&FIfI*j13ipz}dSwfWPqGojIc%{RVj<>Ahu%zStS)Ct+4vYCA9hR@= zu!3bq$6-a1L8RlA4l9mttoTOo(T4fqra7#^io>eCa+)xaj(0tdcS8}!yJNrNckud|bB} zNd_5A2I-r2+^l>0VI0<89M(=8?`HT|XVN--C47)UK9NB_kkQ|fLEc20JH8@=ya>ec z`rvq{kkKc?$6tJ3!N(n$(fh(jPck|gg+O$>{_Z)Qj=-OOV)8DvIj9M*U3JtKZ{CxhUye#7zB9PJTe_BR;> z$LoN@YB0k+s9A!0V5`OMfzCMI4md3R9=(5O999n;RzDo?;Cnis;m^q+INpgk-YK~{ zFCQFMkmLi06;;s3Zx(#afsY07u{3`S8AS5&Pw?ivsi8abe8TqS28JKX4Glj|Mn4N5 zmvC6ua}vntiDZz)G0$_B$G*;975h>0k+pO7*Q`Txa;3w{GCJPJI4sFWGJJeZ5?|m$ zI;31dbOz$RMqxK$>_f=BZI(4<#{+>>9A%D5M?4IALR=jujHcy^W&St;@e6(EF5nM zXa1BKU2(iHqB&m0VQD)MIX}t_#_{5?zByiPerS&OC&lsp+hJ9S()f@&kofxW(VC1d z9d9@BCyuwqvcJgaQ^@GSisLokn25tlVh6HG*zDK~AJSo6QXH@1up}S*itvHsbyxu( zi^w2z$sn_m({WgzY{F9C!p941@6^XulgQ}fQg2$0OuLN3I%m-@{Una}h*{^1{Wz>$ zINmL$Z8A2HK~}*B86-I4n~fuca4zkYM&8(e6P_638Hn$mpvK z0qr-DL2$gDhYfz+&#(u%N(Q;B^Bwk7?=$AT&S!j@oA)I6@Ft@N;IKmBV>%8i7RMW( zKiGdhj&});HwnkP7KgPNhqWDtwFk$02#0knFCy|xZgk|uoSDHFN=AV zy>jMz999aB_e<8ngq*CC@S!>0OdRjmSJGjT(Z8sU_oL!?7mM3Ctc&n*>`Oe3cc$0~ zAJSpX{1_yrNyqzQqUiL59f;4_|p*XBzio>dh!?ORE!x|!L!AEuJuoTBT zNK{TFgTRN(=w+nClKDe%yx-=BlF^%~^P{-YVHx>Q999X{VRg|QR!`OOmMP+R%Z3E;vuwY~VCs9{%ys#m6AgaTX89fV!m4U-bwuvBv z1d>5~$RLwb?^{hEqmLqk3?+l~Pd|m@J!;k^{eY=HV>b?K8;)1rM;QOu8_@G*crAsOUqH!Y*HCp^y{L>`0QW-%|8A%Ce!X#6 z1McX3hT^bBy_J0Eye4J4d3hD+z5L-LM0E3sEa=6a5Izb9`6uQN4_H(%nhY{7XbpU9 z%%2jx4TrTGJ`TdiQRc^K_&AT_y^<3jbqmLPpB>0k9M(%5*1PQW@UcBEBkMpycGiix z1z8u^5#q4EK7@~#IING$#OKed6IwMv~ESysH9)$=WC!)|`JiUYlJwtUc!y z$6Hr%yzfQb1NbZHc**DvI9`V&7+FFFnNJ3ZXAcsSoB|&oY=X!jzNt^GCzC-Yq}{e0 z%^pPIgACFu{WyFa#9{5hVQt6pZi0`sCaq;gPgz1nCxg6?H*51YmW)0f$4drzPDXzs zGst9igk)bi~2c1WFrLG=f)%tsc{ek1HHO?c%Vk#LV zfD97p9@Hp~41&XQT;U$zg5&M9lRXHIx9dsvAeYD>xAZ%zU)B;kwJzAEW}|g%O4xKI)7r&1{~Jbd~fz3{$!9~GDvvD$-F4| zh@E~J$9pq(9^Y6C$RJB&Uf{6a=B%Ch2|m(syqP%Oe8urzhY#s^aadnI@QsDz{gRs` zQi?d zA^u#{hm1ZPJ~YR>b~+hEI^HFPj@NeAVfLcu$mr7XK4N~nRUPjx7?FHP$GeK}tEK$r zlR*;5ATcRv@bM9c^#(qkTTe}Wh{L*L^;g<;9PcF@?-`5UWc03N5cl+brXA9E;IKBc z16jxXSP368gUrWaCBVl_94~v2mtpY19^@$*MDp=aW{@#t5WcZwM!&%xa@ZO^$ROKmHgMbYdqdrtpBw9!|J1~=fIY~Z z(m1SQIIPmnp5fo)uzu>|8CJEgN7(N;-kM|GL(C?td^q5E8{n{-C6YmKyv{h@4%^A- z`^g|D$RIeZzPEI~gCFUAhQHEz|CLMz!C@(U2oLX|g05tcp1#rWF*AQ48DuCKeIyxV zY|yIw3Bl`eSetRYJ8)S0a)ZMT=Z1x!!112NVO_%U-pH97eFr`s;jo_Lu-+(qY>i9H z+8h5B$D5Za9q%>xkdF7+H^=)$bG)x{ybp44SUBF(nbPsb6*}JepTa~ij(5zf$)fAi zvBH%-y0Qbo@wSzG;ILXshjmGHyb2%3hq5D+4r|Caho$i$9k0yj((y`%RY7ySCGGj& zexu{n_>dW-sKZivScMKt%OD0g@ni?0Io^^oqstxPz@O-0kwMsjNXIK3*7pV(bs18f^uzof=EM-U7M0LCi4DiugaagM3^-&!!4$ETGBKTOt4n#UE z>3Gi+alCItJ$hKm4rCi_XpUDpEcnQSk4)Q{WROTQNC$FukUNwWX{y+wKH;eD9X!r={8;d>2Q(u`u ztehUQ2f06%`5`k1dypIb*rSs{u8=`48OZ2lkhAPT&aekL+03E+@rF3wI(0f6w!vYU zhy`SfC_8{ls1IIh?0eeCm?-(5KgfDJhlW|zy z!ks-~7xo}M$RK_FBp(T6^!WuN1DDXlN`jAd`IE`$)8NCG3=&8eD~yajoeUDg9waX6 zTF#v4+wk!)cS+2%>=m)Eal9Y0H^-&oc)#L!bF$8mL9X(Rbysy*U*GYKl|}~1P7>)N zNxZ@FK7x_8Udu)=Uy<6ln^J)Vs#bi8U0%jmG!fv_WNDjk;W zVM&K29k1+R?H(%3w+|L3^stIL-m36XY0f~khs6%0C?E3sO6~|1$1C@QisMx?x^!42 zl%ArI4|as`A$y9-4n$^jb|6YdSLO#j6UhfXEVXB%@ln`QRC`#J!lc70(o-}#-g!VXDK@9Iut+W5)sb_;*iHaacIsI`C0P_7rhg_R?W3_*8(y z%En=R#$hGnu-;kwr@n-bCpfJ8@No;rdliRu9>;qM$9ojVd%&y{dysZy5J#EO)7OyE z`Nm3Kgu^0(yo=-eN@jHSAToo3|hE>P$n&5aXalCdo-g-FRCOF=f^c0=e7y?}BDZ1^|`+FQEgW!03!2KHU6`k_doe$5FD02e1wSZWRO0-G5G_?=tIaLBLf!WuvV}GS(E=y$VPft+sNp< z;o|@f>sa1&_8>8l7jok0V$F%Zl{=q|zL-78@|agStH|h^$RN9Cf6hJ(AF`)-MfMco z;|cTQjoMTEoRw7Qcom10HD7hSU*hN~#)@^)@siP}(^H&?0z4R2=UjwWnBP znd~V_$E)@f&FLvx(o?jSJ>DJk6nC8c`13w)%|Q~Y2Pkn-BfOX1^zBH75cmjy5B7wQ=qkz#a(6U6EHcPVx{BB7V#$nt$pb#v6P|M= zqmw~SkwH#0A*0tLqub+nt#G_14LWV9-oS0$uZ?s`Rhk%<{76r+JbbVtoKd2+XGGcd zp5Z^>cq`#}s}1rD{bQ6zNbSGrDtgn!!tvI{@ixNoHplTguA-}mONl0gQ+VNHb(KOAo`d_>@|Bp-1FLjvX&j0ju=AIosOt8u&=;A1O% z>>{H}K917kJ*i~$S!DEtsGB(6dt~&-@bMDI`<9+!a`vv-8T1shGEdFTmp$IE^msF+ z<9#h1uk0z}cnf=qi^VN^yh=||alEmL<6RCPGjLdwalHNMDYk#C?m%1~;CSgNIw?I~ z=7-VolF^kO?@=7DbXf2qdx}brS2`@Mr&v|v<41bDvZq+e9=}`YuwX^mfxw5-!%`iV z(!;{>7B@O9>3C%Zkv%MSASJppLzJGP?D5K;qIA4u5V-@94olgA$ev=+9`FC>cDYs~ zX6!I=Vh=(_r-zlq{8$Pf>_Ofu8N`ANLPnPvB*3E06EesnGRS>0$h|T2c(pyD!bcAr z7G1@Q>_N`42RTCqIn@e2n!-l|_;9G(;UF1gw;4Uf8uWO7Yph%Oa})j2pPIVQFW=lF zzBGIkgOAd#>_O-$R-~s`bs!mJq-SW&3G6}W@!ABt2iKv;+c4e`*o>ZH>y=~>9B)S) zuO7$S1&7t+ir%;19rhqkbv`5L@&1*r^O~6BHf>6QewwfFWDnBaC!CBPP0wT&J;gcn zuomEWm*KEh!N+>|*qrCh9wZ=aA3fe9III)!aV}@p^h@*r+5*EbsWdLN9ifzcvB-4$Loc| z8bnXAQ<0vc?D49OcQ`#Pbq7+|Q>2F_`H(#<%bi2%@#1)84{P;cwa1IY`sR4y!%mwY zT93DcF@s1xj1J4#<87<$K#V;_rN>J~FXY4Mu(TaWp~I3rMXiVRKaN*AEYBhn7KYJqo2?+$dNiYUX_oI+sGgr$RMlO6E3ZY!}=bFRi=e!Z1I+!5vAIBhL_j# zjn&N~{AV22Z#do>I9}6f?jhEJWDp#0eH?F7dWtQR3;}I%yzO_AL2y`}^b~vGu=?K7 z`3}Ni4af10N!58x!0}ENau4F^9f0Ev6}^0;;3F1?m5@IyV1B`!4J9lTb_ z=-y-y|FFF{tV4Mb5y#=&PJ6XQyWEPxz8~oNui2 z%n#{!A83wOb6B7AR*IsI_g_6l9F}yv2_Hj*FMJHcVHt2(atEUJ6tx|Qbi8DA#qpj~ zdy4hoL+L5vc%{QKE7DU`9WOmz>9C~ZojE|^qmJSVUiRq94y1_VE$s2CJw=rdzOmSWRH4VK^c1DzO=vED zQyiA;DfU%*inWsd!SVX5j(3A}yi4I@z0y;(E#i3V9D0JodN1nXc={vx9&d%NWc0qCp}*p=s?$?6p{Hm`Ptgv?TYr`zsPTM5P>bb;04E%;>khrY8$Csj zlX~B7^b~v3QylPE=R5Q@UBwig*LZr0licXkHY1kl5)LaJ<)WShwKg0en2gVZEfs`#yVHTnatK z&soRjX5)AZGOy9Wx(^@H@yecJhT2n1p@;R7p1aypls(=Au|H#$*h-Ig6&Zc*r%(~_ z)>m=7ouAU<?ziurzrW5J;f^XaacIs zA7-lgyrl6POWqRxYkn|8j6E#)P#_MicKDC-i zMjw-U%VHQAePG%Jdc3D`SjSA=GY*<|%-9Vd+u>s)d}tZ{6B*<~qPdzu=qkP>gFGjL zJe3*58;3;~>)v?2uVh9artsl>tq(hp?#vHk1|g%LRx$`ZUb>1$$smXA;lr|i#~oyl zP1Wfs{?b^tymAx6!V2^h%gLT%%g#|H+IohUb%PHaZzUY>FZ2}u97_g)4-0>fU|V{M zb#c6n64`?+a}RJ_$DWX$VyFEEKX)8f*9&Bjn`DrOI^Q9$$RIf0u{d51E65=3-hS{A z%q?LA4r>MuD=vR%z&sq*B6c9laagO_fo#b0B7^va?aB*c4-y_B`8Wk1=W$q9$mln7 z7O*E=67!fI){E>l>xA&%p6!WuBdvuk;i($NNP(EPA}s@hUw?vw|$Q_7!OE{b!FFh0Ku+Gs_JWbEt$cNTbG^dAUvPpATisLo* z6v^nu`5`m9{Jzp|ZIvFcoF9B&Df6QRY$!cN{#1I3Wc0$GqUv}hAIdGE?D5Kst~g$` z$E)@fB_DDJLI&~D_>dXBu%}qmVX-GnXbc~1aaejBZ%?JiTVweIwWqk2o}$v@RUNOD z(o;N0&qO-jYuwtZJw>JGE_;gG$mxpXg^y*QgxvyubCPpyXQq6$nVymgA0KS|$sp6n zAb*oV#-`n|9G-fep5jFu)>-&C&JN@-j(4w#3mL?b4AMG{JxB_BkWcIhKh8HNgK$eY zlO8V_;^WYLfG6u+aVNY6dG7(K-@9qB4|_6)1o+as(h4(pGM!`QD2YUbTlsMpt_7MI5gW^FzBOtSlX`a%(Gl?%J&_ zx9Gplbt-a;t~%aYNjTosI9}}*-Lmi&eLwR_L=_P8aLlTy8;T!ACR>iwyEi$spX?PSr9x8RYf|9PeNpZ$IV-UB%0t z?OZMx>|A9AIpa)5CxaYs#w}q(=0_cFZEbM8=Jh*mu8HIQy^%htS`+=^icQ_;eUHN; zgG3i|B!l31zw_`2|EU*U#ld9s(Vn3-aJ*)|WDp#d1CF=B9QVK`INnzD6x-r>+tcIK z;dm83aJ+r*>wE@1XHSUZ9YarXLY~YZ1}`5RRv>(YiQZ(80e&;d=n3=`7vQj#(8F3u zMqfuyaWl8*J8-;v$>@i2BO{M{?~u_S;;^3KuwLVMKW6WWPo>BE z6~~*Kd5L^(bXbbx#bIS8ski8bJ;nLr96esyQ~x|m0R0yx9C60j9!EfWd~y9 zqp-)@06w@yPgHw~>Mc4w#g)=wg}_HFJzm*U^OEyz^@+_G7K?Zp=jU9;0Aat?rjD(M&@WCGB zs>~o{^b0bBbR>h2(N8%#v_C-xIob$^Rkv>YgSOnFTd)JEjl=qbo?^Aeh9#AoxhMWW zkGCv6-V*e9OL2={9>-guCtXE)ioeiPtWJ;D#M>jp3O?-VDb}Z_*o0g3mh=?c;ILeA zSZ+98PaJPI9B*%KZ3l9TK8&8?XdKpfZqX;xQ}hy@z5Q`mAvoShdRVaqg9GB}VI|_Q z7UQsz*nzCYVQr$vyB&wM2R;tqu#VB=Jq;fha9CIADc+{Xdmo4O6o>T^$NQchZwik0 zGd`&AZqbWm^#9zVvm^Y^tu2mM zxkXociqc^XRBq8L(c_i3=q2qWAAB1*$c)aPMQ+jm<#;6@GNWsJ$Xnauyk+vu@xqmM zi>~$*B_BB6|8-dZPft~w(6AOEa z);r`ay6h=l`k$U6Gh`=z7l)W!ugO5ebxoJL3~2D;;?qZ$9^2vQ5@DO_&ATlx&j|J znIHGa=uhZjy~Odp!|^8Lcr!9jkU=hxLA0LY7p^KN z=+a>+x9D%Y#o!{h=>NL4rRT0VUgIsgv8O0^AbbC(r&xH4{>||geqR;sVKG0{9+sRR z>JFrMOW2SZUE6^uZ#Bprh|%%N9@f9!YA`xpqr+l;6zM7c=tBmP-&eAysPuT%TXe-? z$)0esVq&teolORbVGj~c1_?_203Wa6$pCWDvSo zm&xcCJ>i24a<)Agoju6OR`g7oa%#eQTEdWyf}cx%y9G!Nt(E7Bvl4!7tHalFk|uqVV}x!`y^95ndp zxwY+bN$=b9w$8U7j(0FU#StlFkZkrKIIOAcKz!jNh#g3HK|l5&gV=)%XAd$eZ~+c$ z84hbDJ(Klh^eynQGdDPVAAB64r+AVc*16nxGRVB>8@$zUH)kn(!j-WvaJ+AESRb?Y z$EVX%%*65Lski9t2w%vaBJ%@2WKZ$mx9ExLEjoM{Z_%aWExbjS4(pNZVX;G(x3+~n zMI3LDTXeO@J522DYxiKPf?v}KZohHKpK=|g?N^c4Rhqmw~yum`!;SIr=o zy1)lr#j_o_wIzd`Yz-gH;6uwGdu{4>+-`>Bt=UMo=J&?BWmV}ZR>Wa_*TN&V3_V`S zM=2cEcR1dk;Nxc;?{7HX8dKPV(Brj=@Cdf&7QH?_#ilC^0j=pNwxy@o;eg&>M~}BN zj<*Lr-oD(T58@VmIJf9yzPfo$pvOCfo}#ztN(Sla6NbZzf{&T>coXtRkwL}=E>-#9 z8_SCf;ztGvCZmT(9O9PnI1cM9j`tF`w%6!k-C=$_WC!vrd+p5E+}eJ`@up=RoAZ^P zVy<+&nbKhy9q)f`(HH&e7JX})c8iYV4SMG*M&q#LExN1ZLvy@Nx9MRiI}l@!SL?ac z!*V!82Ekz|Z#5{lwq*38x9FPVEoH-ZmHftHe*7zg$Q~B?qtIc=`5`m9pNXP33A2=-8QWTnJzl#7 z%#Q>z$jsy{9B+nANNO^-=75aFDRvzjR`s-LS$Rsj|KV3x}uN@An{yalqlV$7)aac~<^!~2&c-?Tk zo;cp_H*~(eAL@Jt;;@F{utwvs#uwe51DVcS4YAy!$J4_~%>OHB zF+Hp#Zf(~vKQ_U~_Pn6*J@j}F=1q@0Mi1*W4(lR2kZZXMX51o!JizfjrKk7`$NL_K zm6COo403i}wt9=M_ISU@TXgBLvR9}*MS8psl^*YWafY7aK^&HRt3kO%PYx5I^mxa@ zNB2U9CEtsax9Dn5QF*Ju*i)3Zwlbq1R{4;(=*n9SisR)ilYjMi2MQw}vgiIUJ~W5* zpZ64KCL?5gW4^+d{0s1L)n4w zo}zSE+@edzTY%%u<`(@kJ;h{titll}uW-CixV3$N!@7mzy=vY!{Q|ePr_DSvj^TI@ z;;?qZ$2M+l*@L96!SSx3=e~#?2pQxJU94BJ@WCF04C3_IpPoAzHI(x{7C9nIDpmmh==GlhNzZkw2a9DqGi~cK)w{la% z+zQP-W|hP7mTc2GqC^Mwgr1&ZKX8j)i5~ASV?09t#9`I;bq}@(We*Z#2&#+YZH&We zPEWB7J>GWv^!}Z2yzV&OZaCgv4|G2Lc~5Z&x9B6kkU{cwUM!})rfGZxb88!sKhQsh z`7t|xMBqFe)?#{C%i&{n{xtR=zM)%r%VamV=m&7TN8#fXJCF-GbI9oPB_A{Hvm<@>~-cyv0_bnOZ5pOjZ9j|hWE_;g7 z@zUds)Ow1&p2_zVaac-E@!O8j=&+O?FFO#04|$8u{IH?NtKOnZ$IGqlN;0~1ShB}U zPf_7RbG*u}t<30hhhFG-HHRhlgoX2?v?#`VqpIVT8C~0f^eD@Fqs$_Dir;S0rNfdv zUfIJ^Z*7$xmhACLhZR5u2{u>ehvIm-MXy@uu;hD+##?mbd!zIeWsi6DxA#U>ho$ut zcc1*`cn^QOMK5$%I9}dUls!cpZ;HV2=HPh0z(=a&1IPOshxLpd$OFrfskd=h*Kk-D z>G7VShjpA=^h5Bmho0gN_}B~|WRPSngS=NWNSoK(gS_Ay>scrciwyFJJ>mVy+!Bt* z@xsT=;q*+%AXnIfT<#7ZWRP=i>_EsMr^p~=^!7)|AcyPMZGXU?o}v{F%amL68uS$5 zV=);-X7o5RdUPpzyv4aiFXKT5;l0s{+@e?Iz0u!sST%jfAUG@=dWv=EDK=bU2xz{V z3_?%Qh4)4~9?|<7xJB=RFg?YQ^c2VD>8AZ%p!c4N!}6u)9z;eD$MHtf z={M)%QlZCDh&TQ$}PIl@oGIq?H0X`e5*me zrzm^wk`L*4=kkpeM@ElM{%RARnug>3h~s@jPw_do=#Ox`cj+l!r>A%c$9opXdjdWV zo4B$Eae@yr2s@BoA7u0=>Jjfnow{?R~Tgm9_$sj9#=hn6=4yz&# ziwrWOG`F_JT6<9IvMQ|xh9=hGL*JBXg*a2(bc9Ph*egVz)smJg0MkR3=EjyDR2HB;eZG#Pz- z&{7=lN^a5D;jlLIp5hK1);{<+jKew(A7|NtT%w0{9fx%X$NP|5^k+D%*Ep?z7y^yN6L|J})nI&Ylpa<|nLp$Xgbbqgc;P~Gyy_iDQ9j^8 z?g;5&6_Yy9>;;&_X`$4d`u z?!SAAg}3O+dx|r-wdEH5|LZC4zs;?f@fKY=Uh;?Hcr`v`j~9o9jm$PKIYc;9=EnPxkbN%<2{GNI*G$NV%nYz(v}P&`5>d4ILZw2aTyM4A&z%0 ze2_t2vIlu4GkP%d!n6 z4hQS-o}w-9DVjHQ+du|c^#=~C8t*Aq!eRZuEqYnrQ!K%IiY0Ma<-2=^Re+Bw^b~)^ zVb#F#n&NmZ;lmEcTYn*YkR@ZrUKqX9UqP#o`cdRQ|HhO-A56_|+QT})3gDQ^lH-8*zsZb0aEdWw5;Wk!!8 zgUpD3-=tExoBlKF2S9MrgkGHU=DBn|*8GSgn z=*IUHHOH&<6ssG1SlTVRoFAoZ$sUpqnL&&@5PDeuby%>WI9@e_sPB#bkK-kyD|a9` ztit!={@lR@^dC)`Fx-&mXX zMyu0P`~}C$o-lz75=%ypEa^f<=N7#j4y!_c&#=lk-e1O(L2$ga>G4|7Q?!jU1lF7H z9@rR%)dGjrW(OJMAQ|M8!Ow#pZ&%(M?TzCdfa4vC;~kad<~5Ft&Vjf0G~QG6=dFei z99AUnjmFSZoDCoIaJ-ATMPES=YfYXv8N@$q8+`1}3nzm_MIOaro#NK^e9qjcD>$s1 zyr*~{hxHi8`;zw*-{G*5alD^1&nISOUY}o}yf>=cqQi%DSU6tw7JZ5G-slx>361ZK zZoy&6TXfk|^rxpdLf)d|cnf>HycgFNhb3>(TV4I;u;i_+>|r_3Q&euzd2iGVhb3>( zB_Hy=(O(wRTD=*7FK4okk(P^!Q2 zJw^5)(qYl#EkBkWh~}`ATXf~EhHs8nzBeizuY8YJzE`cj$6KVQ$Srz}qPOU4)Sja8 z7Tt=TqRr03+!CH6dui{D%3E~V<5e85#s}{yI?z*89WNOqHYEp#^~E}v4C0si0f+S( z$NLOE9^!a!!^bro??v7lJ!59bIF92zL{D)qe6S}>+oWU=M>4wOhsDefx>#=#=$Wtw zdCs2jDc@L+1IXy!WOOpfoe2sb&NtW-UK@zR>Wjnb&Nr4PJ$Id&K~AzKJkB0O%OD;0 z+0(#MJ;mR6Pmw+0oFCz%JnxN`qNi9K$6L0GNBH;jcq`(ts?k&YgIn}k z^mxs=MYpA=SQp3Jh#qe|PcaBS!f{y9yf+$`KQeGG4r?KfcNsmbRXD5-I4m+cU99kk{k*4mgdNC9 z9Pc^a8@-&nfIZ=on0whtF^_P(FL1nX=_!7~@n+Cd%;Xk5zwo_L>9C48UiB7TeQ)$M zJzn{q;x?_PsNSM~bG*j)cwH1e)E=+eQ{)z1-r7n&c*~@YbXdIAU=1JYdy48?4a$3? h%6p0fgz^6kq-*DH?YejD($U>u-_y0DuAM`%{{x70*FgXP literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_rgba_bl_rle.tga b/Tests/images/tga/common/200x32_rgba_bl_rle.tga new file mode 100644 index 0000000000000000000000000000000000000000..1727fe338fc0bb705f6d340c969567c76e618fe9 GIT binary patch literal 25708 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ν+XfPJX_?GSD8Sy9)@^Ap*1`BTq~qI^2BYIP_9AZk2qPS=8!*0|Zs>ixbF<#}rQT-{4aVU# z7)SF4<3AYR$rxWh-e3%dkO+KM46l^N=MN8>jn7(u@m)$kYb8EwJwA)HPDd*uavyIn z9%d(U0^@s@S4uDC&S!JDIQDLKQtU&F?{kdr8ybusF}@iz7&Ez9&o6wXRQjwU##g;r zS6?YTMaNgZ!MIgxFse7}UyZNv9bXrP5Vhm0HW;~CmlwH`5Z*nhEqxZRI#@%9`Ua!= ms)O=MsqzM6KVkfT6Y1QsOWUsPJGJ*P*mrkruWRd2?Ee6lU+@V4 literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/200x32_rgba_tl_raw.tga b/Tests/images/tga/common/200x32_rgba_tl_raw.tga new file mode 100644 index 0000000000000000000000000000000000000000..92ab8940d4fb368eef467932fcf4e06c1a69bdb3 GIT binary patch literal 25644 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 U?$)7m2X}*g50?%)=Q_pyAK3@+NdN!< literal 0 HcmV?d00001 diff --git a/Tests/images/tga/common/readme.txt b/Tests/images/tga/common/readme.txt new file mode 100644 index 00000000000..4535d7fe617 --- /dev/null +++ b/Tests/images/tga/common/readme.txt @@ -0,0 +1,12 @@ +Images in this directory were created with GIMP. + +TGAs have names in the following format: + + {width}x{height}_{mode}_{origin}_{compression}.tga + +Where: + mode is PIL mode in lower case (L, P, RGB, etc.) + origin: + "bl" - bottom left + "tl" - top left + compression is either "raw" or "rle" diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index ef3acfe6549..9f6bee67d4a 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -1,10 +1,76 @@ +import os +from glob import glob +from itertools import product + from helper import unittest, PillowTestCase from PIL import Image +_TGA_DIR = os.path.join("Tests", "images", "tga") +_TGA_DIR_COMMON = os.path.join(_TGA_DIR, "common") + + class TestFileTga(PillowTestCase): + _MODES = ("L", "P", "RGB", "RGBA") + _ORIGINS = ("tl", "bl") + + _ORIGIN_TO_ORIENTATION = { + "tl": 1, + "bl": -1 + } + + def test_sanity(self): + for mode in self._MODES: + png_paths = glob( + os.path.join( + _TGA_DIR_COMMON, "*x*_{}.png".format(mode.lower()))) + + for png_path in png_paths: + reference_im = Image.open(png_path) + self.assertEqual(reference_im.mode, mode) + + path_no_ext = os.path.splitext(png_path)[0] + for origin, rle in product(self._ORIGINS, (True, False)): + tga_path = "{}_{}_{}.tga".format( + path_no_ext, origin, "rle" if rle else "raw") + + original_im = Image.open(tga_path) + if rle: + self.assertEqual( + original_im.info["compression"], "tga_rle") + self.assertEqual( + original_im.info["orientation"], + self._ORIGIN_TO_ORIENTATION[origin]) + if mode == "P": + self.assertEqual( + original_im.getpalette(), + reference_im.getpalette()) + + self.assert_image_equal(original_im, reference_im) + + # Generate a new test name every time so the + # test will not fail with permission error + # on Windows. + test_file = self.tempfile("temp.tga") + + original_im.save(test_file, rle=rle) + saved_im = Image.open(test_file) + if rle: + self.assertEqual( + saved_im.info["compression"], + original_im.info["compression"]) + self.assertEqual( + saved_im.info["orientation"], + original_im.info["orientation"]) + if mode == "P": + self.assertEqual( + saved_im.getpalette(), + original_im.getpalette()) + + self.assert_image_equal(saved_im, original_im) + def test_id_field(self): # tga file with id field test_file = "Tests/images/tga_id_field.tga" diff --git a/setup.py b/setup.py index 2e630f24a8a..761d552cccf 100755 --- a/setup.py +++ b/setup.py @@ -46,10 +46,10 @@ "Negative", "Offset", "Pack", "PackDecode", "Palette", "Paste", "Quant", "QuantOctree", "QuantHash", "QuantHeap", "PcdDecode", "PcxDecode", "PcxEncode", "Point", "RankFilter", "RawDecode", "RawEncode", "Storage", - "SgiRleDecode", "SunRleDecode", "TgaRleDecode", "Unpack", "UnpackYCC", - "UnsharpMask", "XbmDecode", "XbmEncode", "ZipDecode", "ZipEncode", - "TiffDecode", "Jpeg2KDecode", "Jpeg2KEncode", "BoxBlur", "QuantPngQuant", - "codec_fd") + "SgiRleDecode", "SunRleDecode", "TgaRleDecode", "TgaRleEncode", "Unpack", + "UnpackYCC", "UnsharpMask", "XbmDecode", "XbmEncode", "ZipDecode", + "ZipEncode", "TiffDecode", "Jpeg2KDecode", "Jpeg2KEncode", "BoxBlur", + "QuantPngQuant", "codec_fd") DEBUG = False diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 76d9ba8de71..7a6fb82aec2 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -147,6 +147,11 @@ def _save(im, fp, filename): except KeyError: raise IOError("cannot write mode %s as TGA" % im.mode) + rle = im.encoderinfo.get("rle", False) + + if rle: + imagetype += 8 + if colormaptype: colormapfirst, colormaplength, colormapentry = 0, 256, 24 else: @@ -177,8 +182,14 @@ def _save(im, fp, filename): if colormaptype: fp.write(im.im.getpalette("RGB", "BGR")) - ImageFile._save( - im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))]) + if rle: + ImageFile._save( + im, + fp, + [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))]) + else: + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))]) # write targa version 2 footer fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") diff --git a/src/_imaging.c b/src/_imaging.c index 922c7bb8cf2..1fbd367d20f 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3594,6 +3594,7 @@ 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); @@ -3661,6 +3662,7 @@ static PyMethodDef functions[] = { {"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}, #ifdef HAVE_LIBZ diff --git a/src/encode.c b/src/encode.c index ae4277c047d..c60048c41d3 100644 --- a/src/encode.c +++ b/src/encode.c @@ -492,6 +492,38 @@ PyImaging_RawEncoderNew(PyObject* self, PyObject* args) } +/* -------------------------------------------------------------------- */ +/* TGA */ +/* -------------------------------------------------------------------- */ + +PyObject* +PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args) +{ + ImagingEncoderObject* encoder; + + char *mode; + char *rawmode; + int ystep = 1; + + if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &ystep)) + return NULL; + + encoder = PyImaging_EncoderNew(0); + if (encoder == NULL) + return NULL; + + if (get_packer(encoder, mode, rawmode) < 0) + return NULL; + + encoder->encode = ImagingTgaRleEncode; + + encoder->state.ystep = ystep; + + return (PyObject*) encoder; +} + + + /* -------------------------------------------------------------------- */ /* XBM */ /* -------------------------------------------------------------------- */ diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 8c3ad65c3bb..6b553c92826 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -473,6 +473,8 @@ extern int ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingTgaRleDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); +extern int ImagingTgaRleEncode(Imaging im, ImagingCodecState state, + UINT8* buffer, int bytes); extern int ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingXbmEncode(Imaging im, ImagingCodecState state, diff --git a/src/libImaging/TgaRleEncode.c b/src/libImaging/TgaRleEncode.c new file mode 100644 index 00000000000..2fb831e6b14 --- /dev/null +++ b/src/libImaging/TgaRleEncode.c @@ -0,0 +1,153 @@ + +#include "Imaging.h" + +#include +#include + + +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; + int bytesPerPixel; + + if (state->state == 0) { + if (state->ystep < 0) { + state->ystep = -1; + state->y = state->ysize - 1; + } else + state->ystep = 1; + + state->state = 1; + } + + dst = buf; + bytesPerPixel = (state->bits + 7) / 8; + + while (1) { + int flushCount; + + /* + * state->count is the numbers of bytes in the packet, + * excluding the 1-byte descriptor. + */ + if (state->count == 0) { + UINT8* row; + UINT8 descriptor; + int startX; + + assert(state->x <= state->xsize); + + /* Make sure we have space for the descriptor. */ + if (bytes < 1) + break; + + if (state->x == state->xsize) { + state->x = 0; + + state->y += state->ystep; + if (state->y < 0 || state->y >= state->ysize) { + state->errcode = IMAGING_CODEC_END; + break; + } + } + + if (state->x == 0) + state->shuffle( + state->buffer, + (UINT8*)im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->xsize); + + row = state->buffer; + + /* Start with a raw packet for 1 px. */ + descriptor = 0; + startX = state->x; + state->count = bytesPerPixel; + + if (state->x + 1 < state->xsize) { + int maxLookup; + int isRaw; + + isRaw = !comparePixels(row, state->x, bytesPerPixel); + ++state->x; + + /* + * A packet can contain up to 128 pixels; + * 2 are already behind (state->x points to + * the second one). + */ + maxLookup = state->x + 126; + /* A packet must not span multiple rows. */ + if (maxLookup > state->xsize - 1) + maxLookup = state->xsize - 1; + + if (isRaw) { + while (state->x < maxLookup) + if (!comparePixels(row, state->x, bytesPerPixel)) + ++state->x; + else { + /* Two identical pixels will go to RLE packet. */ + --state->x; + break; + } + + state->count += (state->x - startX) * bytesPerPixel; + } else { + descriptor |= 0x80; + + while (state->x < maxLookup) + if (comparePixels(row, state->x, bytesPerPixel)) + ++state->x; + else + break; + } + } + + /* + * state->x currently points to the last pixel to be + * included in the packet. The pixel count in the + * descriptor is 1 less than actual number of pixels in + * the packet, that is, state->x == startX if we encode + * only 1 pixel. + */ + descriptor += state->x - startX; + *dst++ = descriptor; + --bytes; + + /* Advance to past-the-last encoded pixel. */ + ++state->x; + } + + assert(bytes >= 0); + assert(state->count > 0); + assert(state->x > 0); + assert(state->count <= state->x * bytesPerPixel); + + if (bytes == 0) + break; + + flushCount = state->count; + if (flushCount > bytes) + flushCount = bytes; + + memcpy( + dst, + state->buffer + (state->x * bytesPerPixel - state->count), + flushCount); + dst += flushCount; + bytes -= flushCount; + + state->count -= flushCount; + } + + return dst - buf; +} From 2a229b0b5593d32cf25222c68c9cbbe29d90f78b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 16 Jun 2018 20:59:36 +1000 Subject: [PATCH 0319/1393] Updated release notes [ci skip] --- docs/releasenotes/5.2.0.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 65b2d8fd16b..024aaed0489 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -36,3 +36,19 @@ Support added for Python 3.7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow 5.2 supports Python 3.7. + +Build macOS wheels with Xcode 6.4, supporting older macOS versions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The macOS wheels for Pillow 5.1.0 were built with Xcode 9.2, meaning 10.12 +Sierra was the lowest supported version. + +Prior to Pillow 5.1.0, Xcode 8 was used, supporting El Capitan 10.11. + +Instead, Pillow 5.2.0 is built with the oldest available Xcode 6.4 to support +at least 10.10 Yosemite. + +Fix _i2f compilation with some GCC versions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For example, this allows compilation with GCC 4.8 on NetBSD. From 6b224bed344cc06422bf0e5446c79459e30209de Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 16 Jun 2018 22:29:34 +1000 Subject: [PATCH 0320/1393] Updated documentation [ci skip] --- docs/handbook/image-file-formats.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index e014cbd4d6c..e09ac280667 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -141,7 +141,7 @@ are available:: * 3 - Restore to previous content. Pass a single integer for a constant disposal, or a list or tuple - to set the disposal for each frame separately. + to set the disposal for each frame separately. Reading local images ~~~~~~~~~~~~~~~~~~~~ @@ -836,9 +836,8 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following GD ^^ -PIL reads uncompressed GD files. Note that this file format cannot be -automatically identified, so you must use :py:func:`PIL.GdImageFile.open` to -read such a file. +PIL reads uncompressed GD2 files. Note that you must use +:py:func:`PIL.GdImageFile.open` to read such a file. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: From 6c0d1e0f15baf9930a48ebeeb2ba204f3ae932f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Thu, 21 Jun 2018 12:45:54 +0100 Subject: [PATCH 0321/1393] [QuantOctree.c] Remove erroneous attempt to average over an empty range. --- src/libImaging/QuantOctree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libImaging/QuantOctree.c b/src/libImaging/QuantOctree.c index e18ab3c65a2..018dfe1d990 100644 --- a/src/libImaging/QuantOctree.c +++ b/src/libImaging/QuantOctree.c @@ -259,6 +259,10 @@ subtract_color_buckets(ColorCube cube, ColorBucket buckets, long nBuckets) { Pixel p; for (i=0; icount == 0) continue; + avg_color_from_color_bucket(subtrahend, &p); minuend = color_bucket_from_cube(cube, &p); minuend->count -= subtrahend->count; From bf96b9f87a078b2fca7c37b590163f143a903439 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 23 Jun 2018 10:58:41 +1000 Subject: [PATCH 0322/1393] Updated redirected URLs [ci skip] --- Tests/test_imageqt.py | 2 +- docs/reference/ImageDraw.rst | 8 ++++---- docs/reference/ImageFont.rst | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index d3de5875bef..cf9712aceeb 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -46,7 +46,7 @@ def tearDown(self): class TestImageQt(PillowQtTestCase, PillowTestCase): def test_rgb(self): - # from https://doc.qt.io/qt-4.8/qcolor.html + # from https://doc.qt.io/archives/qt-4.8/qcolor.html # typedef QRgb # An ARGB quadruplet on the format #AARRGGBB, # equivalent to an unsigned int. diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 45046aa1b1e..6057712e249 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -264,7 +264,7 @@ Methods example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see - https://www.microsoft.com/typography/otspec/featurelist.htm + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist Requires libraqm. .. versionadded:: 4.2.0 @@ -294,7 +294,7 @@ Methods example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see - https://www.microsoft.com/typography/otspec/featurelist.htm + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist Requires libraqm. .. versionadded:: 4.2.0 @@ -323,7 +323,7 @@ Methods example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see - https://www.microsoft.com/typography/otspec/featurelist.htm + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist Requires libraqm. .. versionadded:: 4.2.0 @@ -350,7 +350,7 @@ Methods example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see - https://www.microsoft.com/typography/otspec/featurelist.htm + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist Requires libraqm. .. versionadded:: 4.2.0 diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 76fde44ff4a..080e52137ca 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -81,7 +81,7 @@ Methods example '-liga' to disable ligatures or '-kern' to disable kerning. To get all supported features, see - https://www.microsoft.com/typography/otspec/featurelist.htm + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist Requires libraqm. .. versionadded:: 4.2.0 From b0d9b0037bbb8a02972c004e5f84fbf905e81140 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 23 Jun 2018 15:14:49 +1000 Subject: [PATCH 0323/1393] Changed ICNS format tests to pass on OS X 10.11 --- Tests/test_file_icns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index d8d6a128e75..06a7e39bb82 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -40,11 +40,11 @@ def test_save_append_images(self): im = Image.open(TEST_FILE) temp_file = self.tempfile("temp.icns") - provided_im = Image.new('RGBA', (32, 32), (255, 0, 0, 0)) + provided_im = Image.new('RGBA', (32, 32), (255, 0, 0, 128)) im.save(temp_file, append_images=[provided_im]) reread = Image.open(temp_file) - self.assert_image_equal(reread, im) + self.assert_image_similar(reread, im, 1) reread = Image.open(temp_file) reread.size = (16, 16, 2) From 7274636a7e36578dae1a82c03b3e7a05d6f2ffe3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 24 Jun 2018 14:34:01 +1000 Subject: [PATCH 0324/1393] Added coordinate system links in documentation --- docs/handbook/concepts.rst | 2 ++ src/PIL/Image.py | 17 ++++++++++------- src/PIL/ImageDraw.py | 3 ++- src/PIL/ImageMorph.py | 4 ++-- src/PIL/ImageTk.py | 4 ++-- src/PIL/ImageTransform.py | 2 +- src/PIL/ImageWin.py | 5 +++-- src/PIL/PyAccess.py | 6 ++++-- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index fd410afe0fa..b2611c11b53 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -58,6 +58,8 @@ You can read the image size through the :py:attr:`~PIL.Image.Image.size` attribute. This is a 2-tuple, containing the horizontal and vertical size in pixels. +.. _coordinate-system: + Coordinate System ----------------- diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 6cc9ec7caa2..31e91c0cfa3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1066,7 +1066,7 @@ def crop(self, box=None): """ Returns a rectangular region from this image. The box is a 4-tuple defining the left, upper, right, and lower pixel - coordinate. + coordinate. See :ref:`coordinate-system`. Note: Prior to Pillow 3.4.0, this was a lazy operation. @@ -1173,8 +1173,9 @@ def getbbox(self): image. :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. If the image - is completely empty, this method returns None. + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. """ @@ -1275,7 +1276,8 @@ def getpixel(self, xy): """ Returns the pixel value at a given position. - :param xy: The coordinate, given as (x, y). + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. :returns: The pixel value. If the image is a multi-layer image, this method returns a tuple. """ @@ -1335,8 +1337,8 @@ def paste(self, im, box=None, mask=None): Pastes another image into this image. The box argument is either a 2-tuple giving the upper left corner, a 4-tuple defining the left, upper, right, and lower pixel coordinate, or None (same as - (0, 0)). If a 4-tuple is given, the size of the pasted image - must match the size of the region. + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. If the modes don't match, the pasted image is converted to the mode of this image (see the :py:meth:`~PIL.Image.Image.convert` method for @@ -1616,7 +1618,8 @@ def putpixel(self, xy, value): * :py:meth:`~PIL.Image.Image.putdata` * :py:mod:`~PIL.ImageDraw` - :param xy: The pixel coordinate, given as (x, y). + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. :param value: The pixel value. """ diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 89df2733811..0de6a9e3b0b 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -327,7 +327,8 @@ def floodfill(image, xy, value, border=None, thresh=0): (experimental) Fills a bounded region with a given color. :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. :param value: Fill color. :param border: Optional border value. If given, the region consists of pixels with a color different from the border color. If not given, diff --git a/src/PIL/ImageMorph.py b/src/PIL/ImageMorph.py index d2367737f73..579ee4e1a2a 100644 --- a/src/PIL/ImageMorph.py +++ b/src/PIL/ImageMorph.py @@ -211,7 +211,7 @@ def match(self, image): an image. Returns a list of tuples of (x,y) coordinates - of all matching pixels.""" + of all matching pixels. See :ref:`coordinate-system`.""" if self.lut is None: raise Exception('No operator loaded') @@ -223,7 +223,7 @@ def get_on_pixels(self, image): """Get a list of all turned on pixels in a binary image Returns a list of tuples of (x,y) coordinates - of all matching pixels.""" + of all matching pixels. See :ref:`coordinate-system`.""" if image.mode != 'L': raise Exception('Image must be binary, meaning it must use mode L') diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index faf52d2b9c1..b5ad53df7a4 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -169,8 +169,8 @@ def paste(self, im, box=None): mode does not match, the image is converted to the mode of the bitmap image. :param box: A 4-tuple defining the left, upper, right, and lower pixel - coordinate. If None is given instead of a tuple, all of - the image is assumed. + coordinate. See :ref:`coordinate-system`. If None is given + instead of a tuple, all of the image is assumed. """ # convert to blittable diff --git a/src/PIL/ImageTransform.py b/src/PIL/ImageTransform.py index 4207ffb83de..c3f6af8b5e4 100644 --- a/src/PIL/ImageTransform.py +++ b/src/PIL/ImageTransform.py @@ -65,7 +65,7 @@ class ExtentTransform(Transform): See :py:meth:`~PIL.Image.Image.transform` :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. + input image's coordinate system. See :ref:`coordinate-system`. """ method = Image.EXTENT diff --git a/src/PIL/ImageWin.py b/src/PIL/ImageWin.py index d8398e92bfa..9b86270bc8e 100644 --- a/src/PIL/ImageWin.py +++ b/src/PIL/ImageWin.py @@ -154,8 +154,9 @@ def paste(self, im, box=None): If the mode does not match, the image is converted to the mode of the bitmap image. :param box: A 4-tuple defining the left, upper, right, and - lower pixel coordinate. If None is given instead of a - tuple, all of the image is assumed. + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. """ im.load() if self.mode != im.mode: diff --git a/src/PIL/PyAccess.py b/src/PIL/PyAccess.py index 7eec1b1606a..cce2de2b811 100644 --- a/src/PIL/PyAccess.py +++ b/src/PIL/PyAccess.py @@ -68,7 +68,8 @@ def __setitem__(self, xy, color): numerical value for single band images, and a tuple for multi-band images - :param xy: The pixel coordinate, given as (x, y). + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. :param color: The pixel value. """ if self.readonly: @@ -82,7 +83,8 @@ def __getitem__(self, xy): value for single band images or a tuple for multiple band images - :param xy: The pixel coordinate, given as (x, y). + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. :returns: a pixel value for single band images, a tuple of pixel values for multiband images. """ From fdbd719da4c77c7e23e2e9e9b71d0d177f2d3369 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 24 Jun 2018 08:25:38 +0300 Subject: [PATCH 0325/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5030603b1ff..e2668a70ef9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Docs: Add coordinate system links in documentation #3204 + [radarhere] + - Tests: TestFilePng: Fix test_save_l_transparency() #3182 [danpla] From 98cff5320a993dffa0dbc9950b6c9fd4bd9dc802 Mon Sep 17 00:00:00 2001 From: Lucy Phipps Date: Sun, 24 Jun 2018 18:00:22 +0100 Subject: [PATCH 0326/1393] unpack_from is faster than unpack of slice --- src/PIL/BlpImagePlugin.py | 16 ++++++++-------- src/PIL/Jpeg2KImagePlugin.py | 8 ++++---- src/PIL/MspImagePlugin.py | 2 +- src/PIL/_binary.py | 14 +++++++------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index ec358db3bc7..9b1a99ae1b3 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -65,7 +65,7 @@ def decode_dxt1(data, alpha=False): for block in range(blocks): # Decode next 8-byte block. idx = block * 8 - color0, color1, bits = struct.unpack("HHIIIIIIIIH', siz[:38]) + = struct.unpack_from('>HHIIIIIIIIH', siz) ssiz = [None]*csiz xrsiz = [None]*csiz yrsiz = [None]*csiz for i in range(csiz): ssiz[i], xrsiz[i], yrsiz[i] \ - = struct.unpack('>BBB', siz[36 + 3 * i:39 + 3 * i]) + = struct.unpack_from('>BBB', siz, 36 + 3 * i) size = (xsiz - xosiz, ysiz - yosiz) if csiz == 1: @@ -114,9 +114,9 @@ def _parse_jp2_header(fp): mode = 'RGBA' break elif tbox == b'colr': - meth, prec, approx = struct.unpack('>BBB', content[:3]) + meth, prec, approx = struct.unpack_from('>BBB', content) if meth == 1: - cs = struct.unpack('>I', content[3:7])[0] + cs = struct.unpack_from('>I', content, 3)[0] if cs == 16: # sRGB if nc == 1 and (bpc & 0x7f) > 8: mode = 'I;16' diff --git a/src/PIL/MspImagePlugin.py b/src/PIL/MspImagePlugin.py index 5ea3c1c49a2..9692d116241 100644 --- a/src/PIL/MspImagePlugin.py +++ b/src/PIL/MspImagePlugin.py @@ -133,7 +133,7 @@ def decode(self, buffer): runtype = i8(row[idx]) idx += 1 if runtype == 0: - (runcount, runval) = struct.unpack("Bc", row[idx:idx+2]) + (runcount, runval) = struct.unpack_from("Bc", row, idx) img.write(runval * runcount) idx += 2 else: diff --git a/src/PIL/_binary.py b/src/PIL/_binary.py index 7e0d560b51b..767c13b9d46 100644 --- a/src/PIL/_binary.py +++ b/src/PIL/_binary.py @@ -11,7 +11,7 @@ # See the README file for information on usage and redistribution. # -from struct import unpack, pack +from struct import unpack_from, pack from ._util import py3 if py3: @@ -36,7 +36,7 @@ def i16le(c, o=0): c: string containing bytes to convert o: offset of bytes to convert in string """ - return unpack("H", c[o:o+2])[0] + return unpack_from(">H", c, o)[0] def i32be(c, o=0): - return unpack(">I", c[o:o+4])[0] + return unpack_from(">I", c, o)[0] # Output, le = little endian, be = big endian From 3a70f4b8fc5d4878ec3eae31f9bbfaf789b4b504 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 26 Jun 2018 22:07:40 +1000 Subject: [PATCH 0327/1393] Fixed typo --- src/_imagingmorph.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index b700f8482aa..fc8f246cc86 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -219,7 +219,7 @@ match(PyObject *self, PyObject* args) } /* Return a list of the coordinates of all turned on pixels in an image. - May be used to extract features after a sequence of MorphOp's were applied. + May be used to extract features after a sequence of MorphOps were applied. This is faster than match as only 1x1 lookup is made. */ static PyObject* From d9653a48c72d73bc60a177fa402dc44fd114d592 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jun 2018 16:44:59 +1000 Subject: [PATCH 0328/1393] Added file handling links in documentation --- docs/reference/open_files.rst | 2 ++ src/PIL/Image.py | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/reference/open_files.rst b/docs/reference/open_files.rst index d60f63a094f..a31a1f37e97 100644 --- a/docs/reference/open_files.rst +++ b/docs/reference/open_files.rst @@ -1,3 +1,5 @@ +.. _file-handling: + File Handling in Pillow ======================= diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 31e91c0cfa3..f297ef2382a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -572,7 +572,8 @@ def close(self): 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. + :py:meth:`~PIL.Image.Image.load` method. See + :ref:`file-handling` for more information. """ try: self.fp.close() @@ -802,8 +803,10 @@ def load(self): Allocates storage for the image and loads the pixel data. In normal cases, you don't need to call this method, since the Image class automatically loads an opened image when it is - accessed for the first time. This method will close the file - associated with the image. + accessed for the first time. + + This method will close the file associated with the image. See + :ref:`file-handling` for more information. :returns: An image access object. :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` @@ -2547,7 +2550,7 @@ def open(fp, mode="r"): the file remains open and the actual image data is not read from the file until you try to process the data (or call the :py:meth:`~PIL.Image.Image.load` method). See - :py:func:`~PIL.Image.new`. + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. :param fp: A filename (string), pathlib.Path object or a file object. The file object must implement :py:meth:`~file.read`, From 98852936c7b7ff69e10d08fb0a2502655c73638d Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 30 Jun 2018 10:35:55 +0300 Subject: [PATCH 0329/1393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index e2668a70ef9..b1cd2990931 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ -- Docs: Add coordinate system links in documentation #3204 +- Docs: Add coordinate system links and file handling links in documentation #3204, #3214 [radarhere] - Tests: TestFilePng: Fix test_save_l_transparency() #3182 From 6793b5bbd5d2020feaab09589e26c9e7e4bbeae5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Jun 2018 21:08:41 +1000 Subject: [PATCH 0330/1393] Added ImageFile get_format_mimetype method --- Tests/test_file_jpeg.py | 1 + Tests/test_file_pixar.py | 1 + Tests/test_imagefile.py | 7 +++++++ src/PIL/ImageFile.py | 5 +++++ 4 files changed, 14 insertions(+) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 9804c2676a1..2d9a9a0919d 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -48,6 +48,7 @@ def test_sanity(self): self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "JPEG") + self.assertEqual(im.get_format_mimetype(), "image/jpeg") def test_app(self): # Test APP/COM reader (@PIL135) diff --git a/Tests/test_file_pixar.py b/Tests/test_file_pixar.py index ae8c7d5f54f..3b00c710e18 100644 --- a/Tests/test_file_pixar.py +++ b/Tests/test_file_pixar.py @@ -13,6 +13,7 @@ def test_sanity(self): self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "PIXAR") + self.assertIsNone(im.get_format_mimetype()) im2 = hopper() self.assert_image_similar(im, im2, 4.8) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 32e44a0e1e8..4b750af0dc4 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -223,6 +223,13 @@ def test_oversize(self): im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] self.assertRaises(ValueError, im.load) + def test_no_format(self): + buf = BytesIO(b'\x00'*255) + + im = MockImageFile(buf) + self.assertIsNone(im.format) + self.assertIsNone(im.get_format_mimetype()) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 1a3c4aa942d..875fc50db5f 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -118,6 +118,11 @@ def draft(self, mode, size): pass + def get_format_mimetype(self): + if self.format is None: + return + return Image.MIME.get(self.format.upper()) + def verify(self): "Check file integrity" From c8380b6d91e90f2f85a96ce0c419f4f9f06c46c4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 30 Jun 2018 23:13:51 +0300 Subject: [PATCH 0331/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b1cd2990931..3c6c71997f5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- unpack_from is faster than unpack of slice #3201 + [landfillbaby] + - Docs: Add coordinate system links and file handling links in documentation #3204, #3214 [radarhere] From 531f13828a2126fe893919ee3f25a4d0583623be Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sat, 30 Jun 2018 19:01:04 -0400 Subject: [PATCH 0332/1393] Remove link to 404 for #3167 [ci skip] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This doc may be outdated … --- winbuild/build.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/winbuild/build.rst b/winbuild/build.rst index b4b288d0a5d..a56f43d1a7c 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -52,9 +52,6 @@ Compilers Download and install: -* `Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 - SP1 `_ - * `Microsoft Windows SDK for Windows 7 and .NET Framework 4 `_ From dbf899fb78c301162a1a2752d36852cd2bce1091 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 1 Jul 2018 12:09:23 +1000 Subject: [PATCH 0333/1393] Removed manual determination of mmap file length --- src/PIL/ImageFile.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 1a3c4aa942d..339917ab77f 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -175,8 +175,7 @@ def load(self): # use mmap, if possible import mmap fp = open(self.filename, "r") - size = os.path.getsize(self.filename) - self.map = mmap.mmap(fp.fileno(), size, access=mmap.ACCESS_READ) + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) self.im = Image.core.map_buffer( self.map, self.size, decoder_name, extents, offset, args ) From c971bac6514b997b27d64cff1fa3503db87fc1da Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 1 Jul 2018 12:19:30 +1000 Subject: [PATCH 0334/1393] Changed mmap file pointer to use context manager --- src/PIL/ImageFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 339917ab77f..63a9d4ca2bd 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -174,8 +174,8 @@ def load(self): else: # use mmap, if possible import mmap - fp = open(self.filename, "r") - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + with open(self.filename, "r") 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, extents, offset, args ) From 4d5994160841eafdb578ecaf6168cf90e2beccab Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 1 Jul 2018 14:47:48 +1000 Subject: [PATCH 0335/1393] Simplified dictionary pop --- src/PIL/Image.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index efd475ed04d..c589526577b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1915,9 +1915,7 @@ def save(self, fp, format=None, **params): # may mutate self! self.load() - save_all = False - if 'save_all' in params: - save_all = params.pop('save_all') + save_all = params.pop('save_all', False) self.encoderinfo = params self.encoderconfig = () From cba0004cdc2af5939dec0c9319272d6cdd440bce Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 09:35:48 +0300 Subject: [PATCH 0336/1393] Update CHANGES.rst [CI skip] --- CHANGES.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3c6c71997f5..1e14e32bdf1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,24 @@ Changelog (Pillow) 5.2.0 (unreleased) ------------------ +- Changed ellipse point calculations to be more evenly distributed #3142 + [radarhere] + +- Only extract first Exif segment #2946 + [hugovk] + +- Tests: Test ImageDraw2, WalImageFile #3135, #2989 + [hugovk] + +- Remove unnecessary '#if 0' code #3075 + [hugovk] + +- Tests: Added GD tests #1817 + [radarhere] + +- Fix collections ABCs DeprecationWarning in Python 3.7 #3123 + [hugovk] + - unpack_from is faster than unpack of slice #3201 [landfillbaby] From 500aa9f8529f1c523b0cf4c0a9f2181bbe8a47b0 Mon Sep 17 00:00:00 2001 From: gnbl Date: Mon, 9 Apr 2018 12:16:54 +0200 Subject: [PATCH 0337/1393] add last PIL release version and date to about.rst --- docs/about.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.rst b/docs/about.rst index 7aeb9b8ddde..323593a3684 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -35,7 +35,7 @@ What about PIL? Prior to Pillow 2.0.0, very few image code changes were made. Pillow 2.0.0 added Python 3 support and includes many bug fixes from many contributors. -As more time passes since the last PIL release, the likelihood of a new PIL release decreases. However, we've yet to hear an official "PIL is dead" announcement. So if you still want to support PIL, please `report issues here first`_, then `open corresponding Pillow tickets here`_. +As more time passes since the last PIL release (1.1.7 in 2009), the likelihood of a new PIL release decreases. However, we've yet to hear an official "PIL is dead" announcement. So if you still want to support PIL, please `report issues here first`_, then `open corresponding Pillow tickets here`_. .. _report issues here first: https://bitbucket.org/effbot/pil-2009-raclette/issues From 36be37c5c56ae042b3a35e3abf3d59061c0e1162 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 10:45:08 +0300 Subject: [PATCH 0338/1393] update package and version module docstrings Co-authored-by: gnbl --- src/PIL/__init__.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index eee0abde54b..a07280e3142 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -1,15 +1,18 @@ -# -# The Python Imaging Library. -# $Id$ -# -# package placeholder -# -# Copyright (c) 1999 by Secret Labs AB. -# -# See the README file for information on usage and redistribution. -# +"""Pillow {} (Fork of the Python Imaging Library) -# ;-) +Pillow is the friendly PIL fork by Alex Clark and Contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and Contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. +PIL.VERSION is the old PIL version and will be removed in the future. + +;-) +""" from . import _version @@ -21,6 +24,9 @@ del _version +__doc__ = __doc__.format(__version__) # include version in docstring + + _plugins = ['BlpImagePlugin', 'BmpImagePlugin', 'BufrStubImagePlugin', From 885c9cb206f47b8edd02d5d61a191f61c1f1d92c Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 1 Jul 2018 07:58:25 -0400 Subject: [PATCH 0339/1393] Add version confusion resolution notes [ci skip] --- docs/releasenotes/5.2.0.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 024aaed0489..e440be11825 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -52,3 +52,18 @@ Fix _i2f compilation with some GCC versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For example, this allows compilation with GCC 4.8 on NetBSD. + +Resolve confusion getting PIL / Pillow version string +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As user gnbl notes in #3082: + +- it's confusing that PIL.VERSION returns the version string of the former PIL instead of Pillow's +- there does not seem to be documentation on this version number (why this, will it ever change, ..) e.g. at https://pillow.readthedocs.io/en/5.1.x/about.html#why-a-fork +- it's confusing that PIL.version is a module and does not return the version information directly or hints on how to get it +- the package information header is essentially useless (placeholder, does not even mention Pillow, nor the version) +- PIL.version module documentation comment could explain how to access the version information + +We have attempted to resolve these issues here: + +- https://github.com/python-pillow/Pillow/pull/3218 From 32e721498a97048d7baafa33f4d3ccccd34eb6c9 Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sun, 1 Jul 2018 14:10:58 +0200 Subject: [PATCH 0340/1393] Use cls instead of klass as first argument This is captured by N804 / https://www.python.org/dev/peps/pep-0008/?#function-and-method-arguments of PEP8 --- src/PIL/PdfParser.py | 86 ++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index c3b00e62475..c0635ef3104 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -67,7 +67,7 @@ def encode_text(s): 0x9D: u"\u0161", 0x9E: u"\u017E", 0xA0: u"\u20AC", - } +} def decode_text(b): @@ -178,7 +178,10 @@ def write(self, f): f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id])) else: this_deleted_object_id = deleted_keys.pop(0) - check_format_condition(object_id == this_deleted_object_id, "expected the next deleted object ID to be %s, instead found %s" % (object_id, this_deleted_object_id)) + check_format_condition(object_id == this_deleted_object_id, + "expected the next deleted object " + "ID to be %s, instead found %s" % + (object_id, this_deleted_object_id)) try: next_in_linked_list = deleted_keys[0] except IndexError: @@ -209,8 +212,8 @@ def __repr__(self): return "PdfName(%s)" % repr(self.name) @classmethod - def from_pdf_stream(klass, data): - return klass(PdfParser.interpret_name(data)) + def from_pdf_stream(cls, data): + return cls(PdfParser.interpret_name(data)) allowed_chars = set(range(33, 127)) - set(ord(c) for c in "#%/()<>[]{}") @@ -293,7 +296,6 @@ def __str__(self): return "<%s>" % "".join("%02X" % ord(b) for b in self.data) - class PdfStream: def __init__(self, dictionary, buf): self.dictionary = dictionary @@ -602,17 +604,17 @@ def read_prev_trailer(self, xref_section_offset): re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) @classmethod - def interpret_trailer(klass, trailer_data): + def interpret_trailer(cls, trailer_data): trailer = {} offset = 0 while True: - m = klass.re_name.match(trailer_data, offset) + m = cls.re_name.match(trailer_data, offset) if not m: - m = klass.re_dict_end.match(trailer_data, offset) + m = cls.re_dict_end.match(trailer_data, offset) check_format_condition(m and m.end() == len(trailer_data), "name not found in trailer, remaining data: " + repr(trailer_data[offset:])) break - key = klass.interpret_name(m.group(1)) - value, offset = klass.get_value(trailer_data, m.end()) + key = cls.interpret_name(m.group(1)) + value, offset = cls.get_value(trailer_data, m.end()) trailer[key] = value check_format_condition(b"Size" in trailer and isinstance(trailer[b"Size"], int), "/Size not in trailer or not an integer") check_format_condition(b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), "/Root not in trailer or not an indirect reference") @@ -621,9 +623,9 @@ def interpret_trailer(klass, trailer_data): re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") @classmethod - def interpret_name(klass, raw, as_text=False): + def interpret_name(cls, raw, as_text=False): name = b"" - for m in klass.re_hashes_in_name.finditer(raw): + for m in cls.re_hashes_in_name.finditer(raw): if m.group(3): name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) else: @@ -650,98 +652,98 @@ def interpret_name(klass, raw, as_text=False): re_stream_end = re.compile(whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") @classmethod - def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): + def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): if max_nesting == 0: return None, None - m = klass.re_comment.match(data, offset) + m = cls.re_comment.match(data, offset) if m: offset = m.end() - m = klass.re_indirect_def_start.match(data, offset) + m = cls.re_indirect_def_start.match(data, offset) if m: check_format_condition(int(m.group(1)) > 0, "indirect object definition: object ID must be greater than 0") check_format_condition(int(m.group(2)) >= 0, "indirect object definition: generation must be non-negative") check_format_condition(expect_indirect is None or expect_indirect == IndirectReference(int(m.group(1)), int(m.group(2))), "indirect object definition different than expected") - object, offset = klass.get_value(data, m.end(), max_nesting=max_nesting-1) + object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting-1) if offset is None: return object, None - m = klass.re_indirect_def_end.match(data, offset) + m = cls.re_indirect_def_end.match(data, offset) check_format_condition(m, "indirect object definition end not found") return object, m.end() check_format_condition(not expect_indirect, "indirect object definition not found") - m = klass.re_indirect_reference.match(data, offset) + m = cls.re_indirect_reference.match(data, offset) if m: check_format_condition(int(m.group(1)) > 0, "indirect object reference: object ID must be greater than 0") check_format_condition(int(m.group(2)) >= 0, "indirect object reference: generation must be non-negative") return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = klass.re_dict_start.match(data, offset) + m = cls.re_dict_start.match(data, offset) if m: offset = m.end() result = {} - m = klass.re_dict_end.match(data, offset) + m = cls.re_dict_end.match(data, offset) while not m: - key, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + key, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) if offset is None: return result, None - value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) result[key] = value if offset is None: return result, None - m = klass.re_dict_end.match(data, offset) + m = cls.re_dict_end.match(data, offset) offset = m.end() - m = klass.re_stream_start.match(data, offset) + m = cls.re_stream_start.match(data, offset) if m: try: stream_len = int(result[b"Length"]) except (TypeError, KeyError, ValueError): raise PdfFormatError("bad or missing Length in stream dict (%r)" % result.get(b"Length", None)) stream_data = data[m.end():m.end() + stream_len] - m = klass.re_stream_end.match(data, m.end() + stream_len) + m = cls.re_stream_end.match(data, m.end() + stream_len) check_format_condition(m, "stream end not found") offset = m.end() result = PdfStream(PdfDict(result), stream_data) else: result = PdfDict(result) return result, offset - m = klass.re_array_start.match(data, offset) + m = cls.re_array_start.match(data, offset) if m: offset = m.end() result = [] - m = klass.re_array_end.match(data, offset) + m = cls.re_array_end.match(data, offset) while not m: - value, offset = klass.get_value(data, offset, max_nesting=max_nesting-1) + value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) result.append(value) if offset is None: return result, None - m = klass.re_array_end.match(data, offset) + m = cls.re_array_end.match(data, offset) return result, m.end() - m = klass.re_null.match(data, offset) + m = cls.re_null.match(data, offset) if m: return None, m.end() - m = klass.re_true.match(data, offset) + m = cls.re_true.match(data, offset) if m: return True, m.end() - m = klass.re_false.match(data, offset) + m = cls.re_false.match(data, offset) if m: return False, m.end() - m = klass.re_name.match(data, offset) + m = cls.re_name.match(data, offset) if m: - return PdfName(klass.interpret_name(m.group(1))), m.end() - m = klass.re_int.match(data, offset) + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) if m: return int(m.group(1)), m.end() - m = klass.re_real.match(data, offset) + m = cls.re_real.match(data, offset) if m: return float(m.group(1)), m.end() # XXX Decimal instead of float??? - m = klass.re_string_hex.match(data, offset) + m = cls.re_string_hex.match(data, offset) if m: hex_string = bytearray([b for b in m.group(1) if b in b"0123456789abcdefABCDEF"]) # filter out whitespace if len(hex_string) % 2 == 1: hex_string.append(ord(b"0")) # append a 0 if the length is not even - yes, at the end return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = klass.re_string_lit.match(data, offset) + m = cls.re_string_lit.match(data, offset) if m: - return klass.get_literal_string(data, m.end()) + return cls.get_literal_string(data, m.end()) #return None, offset # fallback (only for debugging) raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) @@ -766,13 +768,13 @@ def get_value(klass, data, offset, expect_indirect=None, max_nesting=-1): } @classmethod - def get_literal_string(klass, data, offset): + def get_literal_string(cls, data, offset): nesting_depth = 0 result = bytearray() - for m in klass.re_lit_str_token.finditer(data, offset): + for m in cls.re_lit_str_token.finditer(data, offset): result.extend(data[offset:m.start()]) if m.group(1): - result.extend(klass.escaped_chars[m.group(1)[1]]) + result.extend(cls.escaped_chars[m.group(1)[1]]) elif m.group(2): result.append(int(m.group(2)[1:], 8)) elif m.group(3): From 1ba14783d25bfb3dd3df7c5f0e62e1f900a79b78 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 1 Nov 2016 06:16:44 -0700 Subject: [PATCH 0341/1393] Avoid deprecated 'U' mode when opening files Instead, use PSFile() wrapper to handle all newline in the EPS spec. Update line ending tests to handle all combinations of '\n' and '\r'. Fixes warning "DeprecationWarning: 'U' mode is deprecated" in tests. --- Tests/test_file_eps.py | 56 +++++---------------------------------- src/PIL/EpsImagePlugin.py | 12 +-------- 2 files changed, 7 insertions(+), 61 deletions(-) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 9d6bed060fb..66fedee9002 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,7 +1,6 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, EpsImagePlugin -from PIL._util import py3 import io # Our two EPS test files (they are identical except for their bounding boxes) @@ -196,41 +195,15 @@ def _test_readline(self, t, ending): self.assertEqual(t.readline().strip('\r\n'), 'baz', ending) self.assertEqual(t.readline().strip('\r\n'), 'bif', ending) - def _test_readline_stringio(self, test_string, ending): - # check all the freaking line endings possible - try: - import StringIO - except ImportError: - # don't skip, it skips everything in the parent test - return - t = StringIO.StringIO(test_string) + def _test_readline_io_psfile(self, test_string, ending): + f = io.BytesIO(test_string.encode('latin-1')) + t = EpsImagePlugin.PSFile(f) self._test_readline(t, ending) - def _test_readline_io(self, test_string, ending): - if py3: - t = io.StringIO(test_string) - else: - t = io.StringIO(unicode(test_string)) - self._test_readline(t, ending) - - def _test_readline_file_universal(self, test_string, ending): - f = self.tempfile('temp.txt') - with open(f, 'wb') as w: - if py3: - w.write(test_string.encode('UTF-8')) - else: - w.write(test_string) - - with open(f, 'rU') as t: - self._test_readline(t, ending) - def _test_readline_file_psfile(self, test_string, ending): f = self.tempfile('temp.txt') with open(f, 'wb') as w: - if py3: - w.write(test_string.encode('UTF-8')) - else: - w.write(test_string) + w.write(test_string.encode('latin-1')) with open(f, 'rb') as r: t = EpsImagePlugin.PSFile(r) @@ -239,29 +212,12 @@ def _test_readline_file_psfile(self, test_string, ending): def test_readline(self): # check all the freaking line endings possible from the spec # test_string = u'something\r\nelse\n\rbaz\rbif\n' - line_endings = ['\r\n', '\n'] - not_working_endings = ['\n\r', '\r'] + line_endings = ['\r\n', '\n', '\n\r', '\r'] strings = ['something', 'else', 'baz', 'bif'] for ending in line_endings: s = ending.join(strings) - # Native Python versions will pass these endings. - # self._test_readline_stringio(s, ending) - # self._test_readline_io(s, ending) - # self._test_readline_file_universal(s, ending) - - self._test_readline_file_psfile(s, ending) - - for ending in not_working_endings: - # these only work with the PSFile, while they're in spec, - # they're not likely to be used - s = ending.join(strings) - - # Native Python versions may fail on these endings. - # self._test_readline_stringio(s, ending) - # self._test_readline_io(s, ending) - # self._test_readline_file_universal(s, ending) - + self._test_readline_io_psfile(s, ending) self._test_readline_file_psfile(s, ending) def test_open_eps(self): diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 1ae7865b10f..cb2c00d20fb 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -26,7 +26,6 @@ import sys from . import Image, ImageFile from ._binary import i32le as i32 -from ._util import py3 __version__ = "0.5" @@ -206,16 +205,7 @@ def _open(self): # Rewrap the open file pointer in something that will # convert line endings and decode to latin-1. - try: - if py3: - # Python3, can use bare open command. - fp = open(self.fp.name, "Ur", encoding='latin-1') - else: - # Python2, no encoding conversion necessary - fp = open(self.fp.name, "Ur") - except: - # Expect this for bytesio/stringio - fp = PSFile(self.fp) + fp = PSFile(self.fp) # go to offset - start of "%!PS" fp.seek(offset) From 488161ebbaef96bf655d82b70215d7bda5e4bcef Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 20:54:12 +0300 Subject: [PATCH 0342/1393] flake8 --- Tests/test_imagefont.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index aae7fa8cc1b..7429cea1825 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -509,12 +509,12 @@ def test_imagefont_getters(self): self.assertEqual(t.getsize('M'), self.metrics['getters']) self.assertEqual(t.getsize('y'), (12, 20)) self.assertEqual(t.getsize('a'), (12, 16)) - self.assertEqual(t.getsize_multiline('A'),(12,16)) - self.assertEqual(t.getsize_multiline('AB'),(24,16)) - self.assertEqual(t.getsize_multiline('a'),(12,16)) - self.assertEqual(t.getsize_multiline('ABC\n'),(36,36)) - self.assertEqual(t.getsize_multiline('ABC\nA'),(36,36)) - self.assertEqual(t.getsize_multiline('ABC\nAaaa'),(48,36)) + self.assertEqual(t.getsize_multiline('A'), (12, 16)) + self.assertEqual(t.getsize_multiline('AB'), (24, 16)) + self.assertEqual(t.getsize_multiline('a'), (12, 16)) + self.assertEqual(t.getsize_multiline('ABC\n'), (36, 36)) + self.assertEqual(t.getsize_multiline('ABC\nA'), (36, 36)) + self.assertEqual(t.getsize_multiline('ABC\nAaaa'), (48, 36)) @unittest.skipUnless(HAS_RAQM, "Raqm not Available") From 40a03986575e1a6a6c07852ed02b1c9201905895 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 20:55:53 +0300 Subject: [PATCH 0343/1393] Add spacing --- Tests/test_imagefont.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 3968b53c7ec..a5d63743280 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -230,10 +230,12 @@ def test_multiline_size(self): # Test that textsize() correctly connects to multiline_textsize() self.assertEqual(draw.textsize(TEST_TEXT, font=ttf), draw.multiline_textsize(TEST_TEXT, font=ttf)) + # Test that multiline_textsize corresponds to ImageFont.textsize() # for single line text self.assertEqual(ttf.getsize('A'), draw.multiline_textsize('A', font=ttf)) + # Test that textsize() can pass on additional arguments # to multiline_textsize() draw.textsize(TEST_TEXT, font=ttf, spacing=4) From 2302b261b79477befa4382088755929df2c6872e Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 1 Jul 2018 08:00:57 -0400 Subject: [PATCH 0344/1393] WS removal [ci skip] --- docs/releasenotes/5.2.0.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index e440be11825..32defaee9d5 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -17,7 +17,6 @@ Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed after that. Use ``PIL.__version__`` instead. - API Additions ============= From b9a62707a3a29ac6e38c683c10456db4a4bbbfd8 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Sun, 1 Jul 2018 08:14:59 -0400 Subject: [PATCH 0345/1393] Note reference to deprecations [ci skip] --- docs/releasenotes/5.2.0.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index 32defaee9d5..dac3d51c981 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -55,7 +55,7 @@ For example, this allows compilation with GCC 4.8 on NetBSD. Resolve confusion getting PIL / Pillow version string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -As user gnbl notes in #3082: +Re: "version constants deprecated" listed above, as user gnbl notes in #3082: - it's confusing that PIL.VERSION returns the version string of the former PIL instead of Pillow's - there does not seem to be documentation on this version number (why this, will it ever change, ..) e.g. at https://pillow.readthedocs.io/en/5.1.x/about.html#why-a-fork @@ -63,6 +63,6 @@ As user gnbl notes in #3082: - the package information header is essentially useless (placeholder, does not even mention Pillow, nor the version) - PIL.version module documentation comment could explain how to access the version information -We have attempted to resolve these issues here: +We have attempted to resolve these issues: -- https://github.com/python-pillow/Pillow/pull/3218 +- https://github.com/python-pillow/Pillow/pull/3218 From c4f43b5b4ca3f2fb4d1b0c849b470b23e64b9e7e Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 19:56:04 +0300 Subject: [PATCH 0346/1393] Mention the other two version PRs --- docs/releasenotes/5.2.0.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index dac3d51c981..bceb43d259d 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -61,8 +61,6 @@ Re: "version constants deprecated" listed above, as user gnbl notes in #3082: - there does not seem to be documentation on this version number (why this, will it ever change, ..) e.g. at https://pillow.readthedocs.io/en/5.1.x/about.html#why-a-fork - it's confusing that PIL.version is a module and does not return the version information directly or hints on how to get it - the package information header is essentially useless (placeholder, does not even mention Pillow, nor the version) -- PIL.version module documentation comment could explain how to access the version information +- PIL._version module documentation comment could explain how to access the version information -We have attempted to resolve these issues: - -- https://github.com/python-pillow/Pillow/pull/3218 +We have attempted to resolve these issues in #3083, #3090 and #3218. From a2c6a5a38e0a9c63ae51fea98de3823fc540ef82 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 22:24:35 +0300 Subject: [PATCH 0347/1393] Update CHANGES, image-file-formats and release notes [CI skip] --- CHANGES.rst | 35 ++++++++++++++++++++- docs/handbook/image-file-formats.rst | 4 +-- docs/releasenotes/5.2.0.rst | 47 ++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1e14e32bdf1..0c31eb3c7d3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,9 +2,42 @@ Changelog (Pillow) ================== -5.2.0 (unreleased) +5.2.0 (2018-07-01) ------------------ +- Fixed saving a multiframe image as a single frame PDF #3137 + [radarhere] + +- If a Qt version is already imported, attempt to use it first #3143 + [radarhere] + +- Fix transform fill color for alpha images #3147 + [fozcode] + +- TGA: Add support for writing RLE data #3186 + [danpla] + +- TGA: Read and write LA data #3178 + [danpla] + +- QuantOctree.c: Remove erroneous attempt to average over an empty range #3196 + [tkoeppe] + +- Changed ICNS format tests to pass on OS X 10.11 #3202 + [radarhere] + +- Fixed bug in ImageDraw.multiline_textsize() #3114 + [tianyu139] + +- Added getsize_multiline support for PIL.ImageFont #3113 + [tianyu139] + +- Added ImageFile get_format_mimetype method #3190 + [radarhere] + +- Changed mmap file pointer to use context manager #3216 + [radarhere] + - Changed ellipse point calculations to be more evenly distributed #3142 [radarhere] diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index ae077a649d3..1b0661df196 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -562,8 +562,8 @@ TGA ^^^ PIL reads and writes TGA images containing ``L``, ``LA``, ``P``, -``RGB``, and ``RGBA`` data. PIL can read both uncompressed and -run-length encoded TGAs, but writes only uncompressed data. +``RGB``, and ``RGBA`` data. PIL can read and write both uncompressed and +run-length encoded TGAs. TIFF ^^^^ diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index bceb43d259d..75e8da6554d 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -20,6 +20,46 @@ Use ``PIL.__version__`` instead. API Additions ============= +3D color lookup tables +^^^^^^^^^^^^^^^^^^^^^^ + +Support for 3D color lookup table transformations has been added. + +* https://en.wikipedia.org/wiki/3D_lookup_table + +``Color3DLUT.generate`` transforms 3-channel pixels using the values of the +channels as coordinates in the 3D lookup table and interpolating the nearest +elements. + +It allows you to apply almost any color transformation in constant time by +using pre-calculated decimated tables. + +``Color3DLUT.transform()`` allows altering table values with a callback. + +If NumPy is installed, the performance of argument conversion is dramatically +improved when a source table supports buffer interface (NumPy && arrays in +Python >= 3). + +ImageColor.getrgb +^^^^^^^^^^^^^^^^^ + +Previously ``Image.rotate`` only supported HSL color strings. Now HSB and HSV +strings are also supported, as well as float values. For example, +``ImageColor.getrgb("hsv(180,100%,99.5%)")``. + +ImageFile.get_format_mimetype +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``ImageFile.get_format_mimetype`` has been added to return the MIME type of an +image file, where available. For example, +``Image.open("hopper.jpg").get_format_mimetype()`` returns ``"image/jpeg"``. + +ImageFont.getsize_multiline +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A new method to return the size of multiline text, for example +``font.getsize_multiline("ABC\nAaaa")`` + Image.rotate ^^^^^^^^^^^^ @@ -28,6 +68,13 @@ color specifies the background color to use in the area outside the rotated image. This parameter takes the same color specifications as used in ``Image.new``. + +TGA file format +^^^^^^^^^^^^^^^ + +Pillow can now read and write LA data (in addition to L, P, RGB and RGBA), and +write RLE data (in addition to uncompressed). + Other Changes ============= From c28bf86b7e752a9257a0d4451ca878c1385db15c Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 22:40:29 +0300 Subject: [PATCH 0348/1393] 5.2.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 959ab028648..b42628ddeeb 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.2.0.dev0' +__version__ = '5.2.0' From 607224320a8055aaa9a823ca010d1f72e6b4746a Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 1 Jul 2018 23:19:22 +0300 Subject: [PATCH 0349/1393] git checkout -> git clone [CI skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 6541d69d54c..7cb3ad4e947 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -83,7 +83,7 @@ Released as needed privately to individual vendors for critical security-related ### Mac and Linux * [ ] Use the [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels): ``` - $ git checkout https://github.com/python-pillow/pillow-wheels + $ git clone https://github.com/python-pillow/pillow-wheels $ cd pillow-wheels $ git submodule init $ git submodule update From adfcbc94787a9f17c96f6da4fe61353f240d2d60 Mon Sep 17 00:00:00 2001 From: Daniel Plakhotich Date: Mon, 2 Jul 2018 00:50:02 +0300 Subject: [PATCH 0350/1393] Add LA to TGA test modes --- Tests/test_file_tga.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index c7e8ab71bae..226b899dcce 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -13,7 +13,7 @@ class TestFileTga(PillowTestCase): - _MODES = ("L", "P", "RGB", "RGBA") + _MODES = ("L", "LA", "P", "RGB", "RGBA") _ORIGINS = ("tl", "bl") _ORIGIN_TO_ORIENTATION = { From af80067c8abb58a9bdd818e7df32bcf62845d140 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 2 Jul 2018 10:22:48 +0300 Subject: [PATCH 0351/1393] Remove non-applicable step Doesn't apply to the new PyPI (Warehouse) --- RELEASING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 7cb3ad4e947..4b763a136b6 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,7 +7,7 @@ Released quarterly on the first day of January, April, July, October. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/1174 * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](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 TravisCI. +* [ ] 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 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. @@ -24,7 +24,6 @@ Released quarterly on the first day of January, April, July, October. ``` * [ ] Create [binary distributions](#binary-distributions) * [ ] Upload all binaries and source distributions with ``twine upload dist/Pillow-4.1.0-*`` -* [ ] Manually hide old versions on PyPI such that only the latest major release is visible when viewing https://pypi.org/project/Pillow/ (https://pypi.org/manage/project/Pillow/releases/) ## Point Release @@ -34,7 +33,7 @@ Released as needed for security, installation or critical bug fixes. * [ ] Update `CHANGES.rst`. * [ ] Cherry pick individual commits from ``master`` branch to release branch e.g. ``2.9.x``. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in release branch e.g. ``2.9.x``. -* [ ] Checkout release branch e.g.: +* [ ] Check out release branch e.g.: ``` git checkout -t remotes/origin/2.9.x ``` From ae9f62040dfccb54b2030dd31073c78d08ad30c9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 2 Jul 2018 10:26:56 +0300 Subject: [PATCH 0352/1393] 5.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 b42628ddeeb..f4bf34e00bb 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.2.0' +__version__ = '5.3.0.dev0' From f0b841ba5af9f046adea33f3d0c83c9ff3d7472e Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 2 Jul 2018 11:19:29 +0300 Subject: [PATCH 0353/1393] Add final step to append .dev0 to version --- RELEASING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 4b763a136b6..936d68d8d91 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,7 +8,7 @@ Released quarterly on the first day of January, April, July, October. * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](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 https://www.python.org/dev/peps/pep-0440/, update version identifier in `src/PIL/_version.py` +* [ ] 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. * [ ] Create branch and tag for release e.g.: @@ -24,6 +24,7 @@ Released quarterly on the first day of January, April, July, October. ``` * [ ] Create [binary distributions](#binary-distributions) * [ ] Upload all binaries and source distributions with ``twine upload dist/Pillow-4.1.0-*`` +* [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), append `.dev0` to version identifier in `src/PIL/_version.py` ## Point Release @@ -37,7 +38,7 @@ Released as needed for security, installation or critical bug fixes. ``` git checkout -t remotes/origin/2.9.x ``` -* [ ] In compliance with https://www.python.org/dev/peps/pep-0440/, update version identifier in `src/PIL/_version.py` +* [ ] 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 9dedbff713cf86766153bafeb51fb3a3bdd6feef Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 12 Apr 2018 18:15:27 +0300 Subject: [PATCH 0354/1393] Add width parameter to rectangle --- Tests/images/imagedraw_rectangle_width.png | Bin 0 -> 228 bytes .../images/imagedraw_rectangle_width_fill.png | Bin 0 -> 239 bytes Tests/test_imagedraw.py | 24 ++++++++++++++++++ docs/reference/ImageDraw.rst | 5 +++- src/PIL/ImageDraw.py | 4 +-- src/_imaging.c | 7 ++--- src/libImaging/Draw.c | 18 ++++++++----- src/libImaging/Imaging.h | 2 +- 8 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 Tests/images/imagedraw_rectangle_width.png create mode 100644 Tests/images/imagedraw_rectangle_width_fill.png diff --git a/Tests/images/imagedraw_rectangle_width.png b/Tests/images/imagedraw_rectangle_width.png new file mode 100644 index 0000000000000000000000000000000000000000..e39659921fce6d3398d4eab5199f7bb7591c6a60 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^DIm56&GN!3hI>xN`>SPuia@}o%&%|l$&H@bY0qZO{K>YF2?(3+AA7sC@VCDI?llfn og%6g_XZuzV*%$$W5c?Sp@-DAsdZpXg{2wIX>FVdQ&MBb@02WzQ$p8QV literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_rectangle_width_fill.png b/Tests/images/imagedraw_rectangle_width_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..d5243c608b62e7c92b24af025e853bb8323d76c7 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^DImmdKI;Vst07nl> ABLDyZ literal 0 HcmV?d00001 diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 1c8fe3153ad..cd4eb278060 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -343,6 +343,30 @@ def test_big_rectangle(self): # Assert self.assert_image_similar(im, Image.open(expected), 1) + def test_rectangle_width(self): + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw.Draw(im) + expected = "Tests/images/imagedraw_rectangle_width.png" + + # Act + draw.rectangle(BBOX1, outline="green", width=5) + + # Assert + self.assert_image_equal(im, Image.open(expected)) + + def test_rectangle_width_fill(self): + # Arrange + im = Image.new("RGB", (W, H)) + draw = ImageDraw.Draw(im) + expected = "Tests/images/imagedraw_rectangle_width_fill.png" + + # Act + draw.rectangle(BBOX1, fill="blue", outline="green", width=5) + + # Assert + self.assert_image_equal(im, Image.open(expected)) + def test_floodfill(self): # Arrange im = Image.new("RGB", (W, H)) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 6057712e249..7b28aafb002 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -220,7 +220,7 @@ Methods :param outline: Color to use for the outline. :param fill: Color to use for the fill. -.. py:method:: PIL.ImageDraw.ImageDraw.rectangle(xy, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.rectangle(xy, fill=None, outline=None, width=0) Draws a rectangle. @@ -229,6 +229,9 @@ Methods is just outside the drawn rectangle. :param outline: Color to use for the outline. :param fill: Color to use for the fill. + :param width: The line width, in pixels. + + .. versionadded:: 5.2.0 .. py:method:: PIL.ImageDraw.ImageDraw.shape(shape, fill=None, outline=None) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 5bc8902523c..1bbb6e6a679 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -186,13 +186,13 @@ def polygon(self, xy, fill=None, outline=None): if ink is not None: self.draw.draw_polygon(xy, ink, 0) - def rectangle(self, xy, fill=None, outline=None): + def rectangle(self, xy, fill=None, outline=None, width=0): """Draw a rectangle.""" ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_rectangle(xy, fill, 1) if ink is not None: - self.draw.draw_rectangle(xy, ink, 0) + self.draw.draw_rectangle(xy, ink, 0, width) def _multiline_check(self, text): """Draw text.""" diff --git a/src/_imaging.c b/src/_imaging.c index 5004becee9d..3cced9a0fda 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2730,7 +2730,7 @@ _draw_lines(ImagingDrawObject* self, PyObject* args) if (width <= 1) { double *p = NULL; - for (i = 0; i < n-1; i++) { + for (i = 0; i < n-1; i++) { p = &xy[i+i]; if (ImagingDrawLine( self->image->image, @@ -2931,7 +2931,8 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args) PyObject* data; int ink; int fill = 0; - if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) + int width = 0; + if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) return NULL; n = PyPath_Flatten(data, &xy); @@ -2945,7 +2946,7 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args) n = ImagingDrawRectangle(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], - &ink, fill, self->blend + &ink, fill, width, self->blend ); free(xy); diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 7b7c5fac05c..fee1cac6375 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -634,8 +634,9 @@ 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 op) + const void* ink_, int fill, int width, int op) { + int i; int y; int tmp; DRAW* draw; @@ -662,13 +663,16 @@ ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, draw->hline(im, x0, y, x1, ink); } else { - /* outline */ - draw->line(im, x0, y0, x1, y0, ink); - draw->line(im, x1, y0, x1, y1, ink); - draw->line(im, x1, y1, x0, y1, ink); - draw->line(im, x0, y1, x0, y0, ink); - + if (width == 0) { + 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); + } } return 0; diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 6b553c92826..4588602b110 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -368,7 +368,7 @@ 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 op); + const void* ink, int fill, int width, int op); /* Level 2 graphics (WORK IN PROGRESS) */ extern ImagingOutline ImagingOutlineNew(void); From d6e3ef85c2e2780410ca60258ee0e95682947ccd Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 13 Apr 2018 08:37:54 +0300 Subject: [PATCH 0355/1393] Add width parameter to arc, chord, ellipse, pieslice --- Tests/images/imagedraw_arc_width.png | Bin 0 -> 439 bytes Tests/images/imagedraw_arc_width_fill.png | Bin 0 -> 438 bytes Tests/images/imagedraw_chord_width.png | Bin 0 -> 488 bytes Tests/images/imagedraw_chord_width_fill.png | Bin 0 -> 507 bytes Tests/images/imagedraw_ellipse_width.png | Bin 0 -> 452 bytes Tests/images/imagedraw_ellipse_width_fill.png | Bin 0 -> 477 bytes Tests/images/imagedraw_pieslice_width.png | Bin 0 -> 488 bytes .../images/imagedraw_pieslice_width_fill.png | Bin 0 -> 500 bytes Tests/test_imagedraw.py | 96 +++++++++++ docs/reference/ImageDraw.rst | 20 ++- src/PIL/ImageDraw.py | 16 +- src/_imaging.c | 22 ++- src/libImaging/Draw.c | 156 ++++++++++-------- src/libImaging/Imaging.h | 9 +- 14 files changed, 222 insertions(+), 97 deletions(-) create mode 100644 Tests/images/imagedraw_arc_width.png create mode 100644 Tests/images/imagedraw_arc_width_fill.png create mode 100644 Tests/images/imagedraw_chord_width.png create mode 100644 Tests/images/imagedraw_chord_width_fill.png create mode 100644 Tests/images/imagedraw_ellipse_width.png create mode 100644 Tests/images/imagedraw_ellipse_width_fill.png create mode 100644 Tests/images/imagedraw_pieslice_width.png create mode 100644 Tests/images/imagedraw_pieslice_width_fill.png diff --git a/Tests/images/imagedraw_arc_width.png b/Tests/images/imagedraw_arc_width.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3f1f0b21c94c490169ef922a606ba3e7ce0156 GIT binary patch literal 439 zcmV;o0Z9IdP)4zkE(~PRqzagFhNke}zOeEmIku_@0000000000006)^=XrJy;l1zP z%a3UE&=YG`qX&1ap_wjU&WnvM70y`GOGU(CxW+ouaX7|MLO#$%sX>`8+Ts3HYFws^ z^#*?#S}LTmUQVmIr9u~Lzf$2`hSN)hDAx0|+MrY@V(nTgT7C`ZlE>O+T19!R4PF2j zv@>g`X%*bFQYvHZy#_-%vo>3U!7@xCRsyjSh?PLB1Y#u+E1~(UgUGMPR2HDn2eX z>*a^Xdv3f4de~#SH^e1|=Xyl?E{nDRXS++TD;;O@-TJss+f?uJ!K!9^9$nE(5&Fxo z-U(XRy)}Mif!^VlOPxesS4QOqXo+kr(-qa--&TAwIoEjYBAaV$`VHK-W^TQ_h3j3U z=G2Yf;+hrbM$TS)FhO#efOca9=MgW3Fs6+{9aAsVTyuQ#@Z*kGo#*$m=P%fum%66d zZj*RlS9MsE*|d69uk{f!uXD6Fmf3tteK9BIRd(TduND1YZ9dyhKK()8;_{iG@1JVq zCq?M*54!t&DsKDUz3dhMO+4>!M8 zeR{qsvgS(uzikt~#`={^-?(>z*`6QQ)Qb1*`u;{}%9l^?3rzA?)A6n~-f+h2WW eD=^TZ;J_{Y`lP6ULeDZAkcg+NpUXO@geCyd0?HBq literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_chord_width.png b/Tests/images/imagedraw_chord_width.png new file mode 100644 index 0000000000000000000000000000000000000000..33a59b487c4e685f1a12c95323ea861fa17997e3 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^DImaSW-L^LF;ZzGed+*1LcI z*Dq`LS}nSC!lrMZy-kXjP2kyfFtY=w0SPp`ys_=Zws(#(A7AYKvwMO2=ZF{MbPkr+~hDtPJe=kJXoZ;1VXLgvm&S$5%qzD0oRRgfl+tSMcDvP46ZwAPdQQEA-$DXYLVwSy zSo-C|v}s!u+Kd$ZDIyU+|$+1Wt~$(69A!*=T-m! literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_chord_width_fill.png b/Tests/images/imagedraw_chord_width_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..809c3ea1cdffd6aea9bc288f40f8349edb859826 GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^DImI;vs!9fmsl!0SRo7IWBm7qO425`@5I*+*K;>CGLJ1-(5ql zO}AcmFmCnB*M}=NeT-cB?9bE5SI_^C@nx;GJhgZ7w_uLv&E8)Z+f1_#4p(3Q%3J!x z(v|Nry?<@;`w-ug5?Az3=u}p^MV#{2nw2SgvsabY?9xw`-e>kces~#`sO77}e z|8tYt?5y4iPqiOs{g7g~-(X72x`yK178we?I_o%-~%XeL*tv{j9yuj{$11=I9@%jTaf_xjx&$G_5N z#l737=5EY$7fOE|J@3y~+aI6%tL?WwNsK++IZye9*b+|e`#Vp~@&4Ww-^%;w{zHxL udlRQ0iCv)e+dnq@YS}5Icwk_7Q2&Y3-o4D~?~4$5kc6kJpUXO@geCx&%JG~4 literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_ellipse_width.png b/Tests/images/imagedraw_ellipse_width.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0ca6731f69b8728a41a59ae2cd8ebaa0cb71c5 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-il6&m%Sud>DbwD@2Gjxt7H&;1(bid$7#YdI$gZMA$hCvtzzL+_mb^ENzl=Dj-MM#v1sH77sleP5UH zd4|=Ry@5-=Xy?`(*mE#{6We3EQ%e(h?SI}8iyZ@*5m+3DqXc(+l@Q=11{YnQe^tzKiRzFF?;nNRzfgub1aCptm; zT2^+!J|69%ea<|eNhC^Hm$i#o^istG)&HDQ%8&3%nJ#FA1JFQ-otJ;S@ zd+XF0k^PC1R_fEY>3>_p;2QC1{gSd1` z!9IWXbp4fKB~ocmpZ@EgZoQQ8P8i<bP0l+XkKH;l^C literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_ellipse_width_fill.png b/Tests/images/imagedraw_ellipse_width_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7be602916cce5f30f0e305add360c4939b3955 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^DImY3` zviDB&_x4bs%kle!>~d{gTNE?{XBVHFSsHpZ+jhov!Q1=Q*W|98-J>RdZ}~Fa;{w-q z?FsS8kH6!hw#GyD+M-p*4fmRE>hcMlQrXW z^<^shkBzRZl?snrw4tqW)pzmJ|CVx`o_A%_^hYPJ7MlOr{w2{e|HGqwrw)JGd+lDZ zrQF9eo9xZKs#DH;t>AsV#q`JGoRCv9pT;*os*7ynY?ZsZZZVt?^Q_@Yh6KW*@f?wtDA@Xwl@IWdp+-PkN7lE`a(-*~6mUXk~l>t-%J zce=>dCGo7@%60Q9Pk-Gmb@xos)2CiqM@|RKpKiD^!|F`fl<9vvryDQjoD=5vK&GbY zXQ!f#KUe#%m4%p-bCtdV&N!UHx3v IIVCg!0J1dLjsO4v literal 0 HcmV?d00001 diff --git a/Tests/images/imagedraw_pieslice_width.png b/Tests/images/imagedraw_pieslice_width.png new file mode 100644 index 0000000000000000000000000000000000000000..a83c4ab7b3469f0d2171148d31a4c7836311b50c GIT binary patch literal 488 zcmVP)BCwwrp=djxM5P(Q7Xf-4&n^WH0;OpIQMV$1fA81;PH}Fd;i-} zc4z&SlzT3R#0&gp$)s9xSch#jOv-oV$_r~QDQn7UcqS?9G?T*mY%A*&PRa=Do=LT$ zyWy$?VNJA^=?yVFEYtH0k=>hRpQs!+W^PQl(QmW0elk!?O&}GR?0Kr^zvt-!KgDu++TyWSW{~ zNDrxJ)_$pNrXiSb@U0D7s)=LmROu*Hx1}!Dvr?t`mSIn+;x$FF)+b%OLMKJ6zgeoK zJPpSskM(F;6`hLVv5KB&2<^;zFs&-z;J9bq5F4xTtcW0-S(O*mGi8@y#nKgHm7S6m zW0jTu-tfdS!K&jp)v_4V~kuDzoKAJ{ar z)V(~{LlkT8D$CBt_G4Q&vrN65+Y-`cDDP$7z)5%-M)gYg#;ZTXjsKK(I?W_JBhS_8 z`nPhAtJ$PI9p_ZOsB%)RW5tcPQ+i3X+hjV6l;6Fv$$Y1fwMh`t%RTt?9hC>w(#D(~ qYjIhv&QJjW0000000000{9j*)= x0`` and ``y1 >= y0``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. + :param width: The line width, in pixels. + + .. versionadded:: 5.2.0 -.. py:method:: PIL.ImageDraw.ImageDraw.ellipse(xy, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.ellipse(xy, fill=None, outline=None, width=0) Draws an ellipse inside the given bounding box. @@ -170,6 +176,9 @@ Methods where ``x1 >= x0`` and ``y1 >= y0``. :param outline: Color to use for the outline. :param fill: Color to use for the fill. + :param width: The line width, in pixels. + + .. versionadded:: 5.2.0 .. py:method:: PIL.ImageDraw.ImageDraw.line(xy, fill=None, width=0) @@ -185,7 +194,7 @@ Methods .. note:: This option was broken until version 1.1.6. -.. py:method:: PIL.ImageDraw.ImageDraw.pieslice(xy, start, end, fill=None, outline=None) +.. py:method:: PIL.ImageDraw.ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=0) Same as arc, but also draws straight lines between the end points and the center of the bounding box. @@ -198,6 +207,9 @@ Methods :param end: Ending angle, in degrees. :param fill: Color to use for the fill. :param outline: Color to use for the outline. + :param width: The outer line width, in pixels. + + .. versionadded:: 5.2.0 .. py:method:: PIL.ImageDraw.ImageDraw.point(xy, fill=None) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 1bbb6e6a679..23a666e7642 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -118,11 +118,11 @@ def _getink(self, ink, fill=None): fill = self.draw.draw_ink(fill, self.mode) return ink, fill - def arc(self, xy, start, end, fill=None): + def arc(self, xy, start, end, fill=None, width=0): """Draw an arc.""" ink, fill = self._getink(fill) if ink is not None: - self.draw.draw_arc(xy, start, end, ink) + self.draw.draw_arc(xy, start, end, ink, width) def bitmap(self, xy, bitmap, fill=None): """Draw a bitmap.""" @@ -133,21 +133,21 @@ def bitmap(self, xy, bitmap, fill=None): if ink is not None: self.draw.draw_bitmap(xy, bitmap.im, ink) - def chord(self, xy, start, end, fill=None, outline=None): + def chord(self, xy, start, end, fill=None, outline=None, width=0): """Draw a chord.""" ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_chord(xy, start, end, fill, 1) if ink is not None: - self.draw.draw_chord(xy, start, end, ink, 0) + self.draw.draw_chord(xy, start, end, ink, 0, width) - def ellipse(self, xy, fill=None, outline=None): + def ellipse(self, xy, fill=None, outline=None, width=0): """Draw an ellipse.""" ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_ellipse(xy, fill, 1) if ink is not None: - self.draw.draw_ellipse(xy, ink, 0) + self.draw.draw_ellipse(xy, ink, 0, width) def line(self, xy, fill=None, width=0): """Draw a line, or a connected sequence of line segments.""" @@ -164,13 +164,13 @@ def shape(self, shape, fill=None, outline=None): if ink is not None: self.draw.draw_outline(shape, ink, 0) - def pieslice(self, xy, start, end, fill=None, outline=None): + def pieslice(self, xy, start, end, fill=None, outline=None, width=0): """Draw a pieslice.""" ink, fill = self._getink(outline, fill) if fill is not None: self.draw.draw_pieslice(xy, start, end, fill, 1) if ink is not None: - self.draw.draw_pieslice(xy, start, end, ink, 0) + self.draw.draw_pieslice(xy, start, end, ink, 0, width) def point(self, xy, fill=None): """Draw one or more individual pixels.""" diff --git a/src/_imaging.c b/src/_imaging.c index 3cced9a0fda..f1116a36c23 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2561,9 +2561,10 @@ _draw_arc(ImagingDrawObject* self, PyObject* args) PyObject* data; int ink; + int width = 0; float start, end; int op = 0; - if (!PyArg_ParseTuple(args, "Offi|i", &data, &start, &end, &ink)) + if (!PyArg_ParseTuple(args, "Offi|ii", &data, &start, &end, &ink, &width)) return NULL; n = PyPath_Flatten(data, &xy); @@ -2577,7 +2578,7 @@ _draw_arc(ImagingDrawObject* self, PyObject* args) n = ImagingDrawArc(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], - start, end, &ink, op + start, end, &ink, width, op ); free(xy); @@ -2633,9 +2634,10 @@ _draw_chord(ImagingDrawObject* self, PyObject* args) PyObject* data; int ink, fill; + int width = 0; float start, end; - if (!PyArg_ParseTuple(args, "Offii", - &data, &start, &end, &ink, &fill)) + if (!PyArg_ParseTuple(args, "Offii|i", + &data, &start, &end, &ink, &fill, &width)) return NULL; n = PyPath_Flatten(data, &xy); @@ -2649,7 +2651,7 @@ _draw_chord(ImagingDrawObject* self, PyObject* args) n = ImagingDrawChord(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], - start, end, &ink, fill, self->blend + start, end, &ink, fill, width, self->blend ); free(xy); @@ -2670,7 +2672,8 @@ _draw_ellipse(ImagingDrawObject* self, PyObject* args) PyObject* data; int ink; int fill = 0; - if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) + int width = 0; + if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) return NULL; n = PyPath_Flatten(data, &xy); @@ -2684,7 +2687,7 @@ _draw_ellipse(ImagingDrawObject* self, PyObject* args) n = ImagingDrawEllipse(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], - &ink, fill, self->blend + &ink, fill, width, self->blend ); free(xy); @@ -2850,8 +2853,9 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args) PyObject* data; int ink, fill; + int width = 0; float start, end; - if (!PyArg_ParseTuple(args, "Offii", &data, &start, &end, &ink, &fill)) + if (!PyArg_ParseTuple(args, "Offii|i", &data, &start, &end, &ink, &fill, &width)) return NULL; n = PyPath_Flatten(data, &xy); @@ -2865,7 +2869,7 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args) n = ImagingDrawPieslice(self->image->image, (int) xy[0], (int) xy[1], (int) xy[2], (int) xy[3], - start, end, &ink, fill, self->blend + start, end, &ink, fill, width, self->blend ); free(xy); diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index fee1cac6375..37969af7059 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -762,9 +762,10 @@ ellipsePoint(int cx, int cy, int w, int h, static int ellipse(Imaging im, int x0, int y0, int x1, int y1, float start, float end, const void* ink_, int fill, - int mode, int op) + int width, int mode, int op) { float i; + int j; int n; int cx, cy; int w, h; @@ -774,120 +775,131 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, DRAW* draw; INT32 ink; - w = x1 - x0; - h = y1 - y0; - if (w < 0 || h < 0) - return 0; - DRAWINIT(); - cx = (x0 + x1) / 2; - cy = (y0 + y1) / 2; + if (width == 0) { + width = 1; + } - while (end < start) - end += 360; + for (j = 0; j < width; j++) { - if (end - start > 360) { - /* no need to go in loops */ - end = start + 361; - } + w = x1 - x0; + h = y1 - y0; + if (w < 0 || h < 0) + return 0; - if (mode != ARC && fill) { + cx = (x0 + x1) / 2; + cy = (y0 + y1) / 2; - /* Build edge list */ - /* malloc check UNDONE, FLOAT? */ - Edge* e = calloc((end - start + 3), sizeof(Edge)); - if (!e) { - ImagingError_MemoryError(); - return -1; + while (end < start) + end += 360; + + if (end - start > 360) { + /* no need to go in loops */ + end = start + 361; } - n = 0; + if (mode != ARC && fill) { - for (i = start; i < end+1; i++) { - if (i > end) { - i = end; + /* Build edge list */ + /* malloc check UNDONE, FLOAT? */ + Edge* e = calloc((end - start + 3), sizeof(Edge)); + if (!e) { + ImagingError_MemoryError(); + return -1; } - ellipsePoint(cx, cy, w, h, i, &x, &y); - if (i != start) - add_edge(&e[n++], lx, ly, x, y); - else - sx = x, sy = y; - lx = x, ly = y; - } + n = 0; - if (n > 0) { - /* close and draw polygon */ - if (mode == PIESLICE) { - if (x != cx || y != cy) { - add_edge(&e[n++], x, y, cx, cy); - add_edge(&e[n++], cx, cy, sx, sy); + for (i = start; i < end+1; i++) { + if (i > end) { + i = end; } - } else { - if (x != sx || y != sy) - add_edge(&e[n++], x, y, sx, sy); + ellipsePoint(cx, cy, w, h, i, &x, &y); + if (i != start) + add_edge(&e[n++], lx, ly, x, y); + else + sx = x, sy = y; + lx = x, ly = y; } - draw->polygon(im, n, e, ink, 0); - } - free(e); + if (n > 0) { + /* close and draw polygon */ + if (mode == PIESLICE) { + if (x != cx || y != cy) { + add_edge(&e[n++], x, y, cx, cy); + add_edge(&e[n++], cx, cy, sx, sy); + } + } else { + if (x != sx || y != sy) + add_edge(&e[n++], x, y, sx, sy); + } + draw->polygon(im, n, e, ink, 0); + } - } else { + free(e); - for (i = start; i < end+1; i++) { - if (i > end) { - i = end; + } else { + + for (i = start; i < end+1; i++) { + if (i > end) { + i = end; + } + ellipsePoint(cx, cy, w, h, i, &x, &y); + if (i != start) + draw->line(im, lx, ly, x, y, ink); + else + sx = x, sy = y; + lx = x, ly = y; } - ellipsePoint(cx, cy, w, h, i, &x, &y); - if (i != start) - draw->line(im, lx, ly, x, y, ink); - else - sx = x, sy = y; - lx = x, ly = y; - } - if (i != start) { - if (mode == PIESLICE) { - if (x != cx || y != cy) { - draw->line(im, x, y, cx, cy, ink); - draw->line(im, cx, cy, sx, sy, ink); + if (i != start) { + if (mode == PIESLICE) { + if (x != cx || y != cy) { + draw->line(im, x, y, cx, cy, ink); + draw->line(im, cx, cy, sx, sy, ink); + } + } else if (mode == CHORD) { + if (x != sx || y != sy) + draw->line(im, x, y, sx, sy, ink); } - } else if (mode == CHORD) { - if (x != sx || y != sy) - draw->line(im, x, y, sx, sy, ink); } } + x0++; + y0++; + x1--; + y1--; } - return 0; } int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int op) + float start, float end, const void* ink, int width, int op) { - return ellipse(im, x0, y0, x1, y1, start, end, ink, 0, ARC, op); + return ellipse(im, x0, y0, x1, y1, start, end, ink, 0, width, ARC, op); } int ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, int op) + float start, float end, const void* ink, int fill, + int width, int op) { - return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, CHORD, op); + return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, width, CHORD, op); } int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int fill, int op) + const void* ink, int fill, int width, int op) { - return ellipse(im, x0, y0, x1, y1, 0, 360, ink, fill, CHORD, op); + return ellipse(im, x0, y0, x1, y1, 0, 360, ink, fill, width, CHORD, op); } int ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int fill, int op) + float start, float end, const void* ink, int fill, + int width, int op) { - return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, PIESLICE, op); + return ellipse(im, x0, y0, x1, y1, start, end, ink, fill, width, PIESLICE, op); } /* -------------------------------------------------------------------- */ diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 4588602b110..e705e0a604d 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -349,21 +349,22 @@ extern void ImagingCrack(Imaging im, int x0, int y0); /* Graphics */ extern int ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, - float start, float end, const void* ink, int op); + 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 op); + int width, int op); extern int ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, - const void* ink, int fill, int op); + 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 op); + 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); From bf299602837a050b77ddae3754418619178fad6b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 Jun 2018 13:57:19 +1000 Subject: [PATCH 0356/1393] Fixed multiple spaces after operator --- src/PIL/ImageDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 5bc8902523c..920b977f40a 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -384,4 +384,4 @@ def _color_diff(rgb1, rgb2): """ Uses 1-norm distance to calculate difference between two rgb values. """ - return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) + return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) From 5a33e02072f21fe8cdb33bb5b0688368d182befc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 Jun 2018 13:58:28 +1000 Subject: [PATCH 0357/1393] Commented unused variable --- src/PIL/SunImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index fd5e82724df..03b266bc4fd 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -62,7 +62,7 @@ def _open(self): self.size = i32(s[4:8]), i32(s[8:12]) depth = i32(s[12:16]) - data_length = i32(s[16:20]) # unreliable, ignore. + # 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]) From fe42591f5f5705e09a9ceccd05c1fedbd4592099 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 Jun 2018 13:59:17 +1000 Subject: [PATCH 0358/1393] Removed redundant backslash between brackets --- src/PIL/PdfParser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index c0635ef3104..f63d47eb264 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -824,7 +824,7 @@ def read_xref_table(self, xref_section_offset): def read_indirect(self, ref, max_nesting=-1): offset, generation = self.xref_table[ref[0]] - check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" \ + check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" % (ref[1], ref[0], generation, offset)) value = self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] self.cached_objects[ref] = value From e7815ccd621016c16d0ab296fa7906c710ad8983 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Jun 2018 19:40:04 +1000 Subject: [PATCH 0359/1393] Block comment should start with '# ' --- Tests/test_imagefont.py | 2 +- Tests/test_imagefontctl.py | 2 +- src/PIL/PdfParser.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0a36734d212..906f7b06fd9 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -413,7 +413,7 @@ def test_render_empty(self): im = Image.new(mode='RGB', size=(300, 100)) target = im.copy() draw = ImageDraw.Draw(im) - #should not crash here. + # should not crash here. draw.text((10, 10), '', font=font) self.assert_image_equal(im, target) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 89f9563f314..489ed40b501 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -11,7 +11,7 @@ class TestImagecomplextext(PillowTestCase): def test_english(self): - #smoke test, this should not fail + # smoke test, this should not fail ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index f63d47eb264..9031330da8f 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -744,7 +744,7 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): m = cls.re_string_lit.match(data, offset) if m: return cls.get_literal_string(data, m.end()) - #return None, offset # fallback (only for debugging) + # return None, offset # fallback (only for debugging) raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") From 58cc23695d29b58d5329a29c7b5b25ae5c620805 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Jun 2018 19:37:33 +1000 Subject: [PATCH 0360/1393] Continuation line over-indented for visual indent --- Tests/test_imagefont.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 906f7b06fd9..e333346e97b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -210,10 +210,9 @@ def test_unknown_align(self): ttf = self.get_font() # Act/Assert - self.assertRaises(AssertionError, - draw.multiline_text, (0, 0), TEST_TEXT, - font=ttf, - align="unknown") + self.assertRaises( + AssertionError, + draw.multiline_text, (0, 0), TEST_TEXT, font=ttf, align="unknown") def test_draw_align(self): im = Image.new('RGB', (300, 100), 'white') From aeab86c005bd5d710c34bb5874865d248da63b18 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 Jun 2018 15:51:12 +1000 Subject: [PATCH 0361/1393] Too many blank lines --- Tests/test_file_jpeg.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 2d9a9a0919d..c42d67885a0 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -364,7 +364,6 @@ def test_truncated_jpeg_throws_IOError(self): with self.assertRaises(IOError): im.load() - def _n_qtables_helper(self, n, test_file): im = Image.open(test_file) f = self.tempfile('temp.jpg') From dcf6bc047b3f2e1ea180b921e1e9b58fb37032e0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 11 Jun 2018 16:00:57 +1000 Subject: [PATCH 0362/1393] Do not use bare except --- Tests/test_file_libtiff.py | 4 ++-- Tests/test_locale.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 05433d9b6fb..ce77e05de21 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -31,7 +31,7 @@ def _assert_noerr(self, im): try: self.assertEqual(im._compression, 'group4') - except: + except AttributeError: print("No _compression") print(dir(im)) @@ -194,7 +194,7 @@ def test_additional_metadata(self): for tag in im.tag_v2: try: del(core_items[tag]) - except: + except KeyError: pass # Type codes: diff --git a/Tests/test_locale.py b/Tests/test_locale.py index 14275379107..5aef8427b8b 100644 --- a/Tests/test_locale.py +++ b/Tests/test_locale.py @@ -29,7 +29,7 @@ def test_sanity(self): Image.open(path) try: locale.setlocale(locale.LC_ALL, "polish") - except: + except locale.Error: unittest.skip('Polish locale not available') Image.open(path) From 32cebddd1ee185e807ab758afcafd82d29e6a309 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 13 Jun 2018 19:44:36 +1000 Subject: [PATCH 0363/1393] Multiple imports on one line --- src/PIL/_util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/_util.py b/src/PIL/_util.py index 6618c625fe3..e6989d69d26 100644 --- a/src/PIL/_util.py +++ b/src/PIL/_util.py @@ -1,4 +1,5 @@ -import os, sys +import os +import sys py3 = sys.version_info.major >= 3 From c19d77abed4919791e9e5d9a362af8a73856e9cf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 16 Jun 2018 10:06:45 +1000 Subject: [PATCH 0364/1393] Continuation line under-indented for visual indent --- Tests/test_color_lut.py | 152 +++++++++++++++++++---------------- Tests/test_image_resample.py | 4 +- 2 files changed, 84 insertions(+), 72 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index c9793c9507b..e641c5ad350 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -38,112 +38,123 @@ def test_wrong_args(self): im = Image.new('RGB', (10, 10), 0) with self.assertRaisesRegex(ValueError, "filter"): - im.im.color_lut_3d('RGB', Image.CUBIC, - *self.generate_identity_table(3, 3)) + im.im.color_lut_3d('RGB', + Image.CUBIC, + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "image mode"): - im.im.color_lut_3d('wrong', Image.LINEAR, - *self.generate_identity_table(3, 3)) + im.im.color_lut_3d('wrong', + Image.LINEAR, + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "table_channels"): - im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(5, 3)) + im.im.color_lut_3d('RGB', + Image.LINEAR, + *self.generate_identity_table(5, 3)) with self.assertRaisesRegex(ValueError, "table_channels"): - im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(1, 3)) + im.im.color_lut_3d('RGB', + Image.LINEAR, + *self.generate_identity_table(1, 3)) with self.assertRaisesRegex(ValueError, "table_channels"): - im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(2, 3)) + im.im.color_lut_3d('RGB', + Image.LINEAR, + *self.generate_identity_table(2, 3)) with self.assertRaisesRegex(ValueError, "Table size"): - im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (1, 3, 3))) + im.im.color_lut_3d('RGB', + Image.LINEAR, + *self.generate_identity_table(3, (1, 3, 3))) with self.assertRaisesRegex(ValueError, "Table size"): - im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (66, 3, 3))) + im.im.color_lut_3d('RGB', + Image.LINEAR, + *self.generate_identity_table(3, (66, 3, 3))) with self.assertRaisesRegex(ValueError, r"size1D \* size2D \* size3D"): - im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, [0, 0, 0] * 7) + im.im.color_lut_3d('RGB', + Image.LINEAR, + 3, 2, 2, 2, [0, 0, 0] * 7) with self.assertRaisesRegex(ValueError, r"size1D \* size2D \* size3D"): - im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, [0, 0, 0] * 9) + im.im.color_lut_3d('RGB', + Image.LINEAR, + 3, 2, 2, 2, [0, 0, 0] * 9) with self.assertRaises(TypeError): - im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, [0, 0, "0"] * 8) + im.im.color_lut_3d('RGB', + Image.LINEAR, + 3, 2, 2, 2, [0, 0, "0"] * 8) with self.assertRaises(TypeError): - im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, 16) + im.im.color_lut_3d('RGB', + Image.LINEAR, + 3, 2, 2, 2, 16) def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) im.im.color_lut_3d('CMYK', Image.LINEAR, - *self.generate_identity_table(4, 3)) + *self.generate_identity_table(4, 3)) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (2, 3, 3))) + *self.generate_identity_table(3, (2, 3, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (65, 3, 3))) + *self.generate_identity_table(3, (65, 3, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (3, 65, 3))) + *self.generate_identity_table(3, (3, 65, 3))) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (3, 3, 65))) + *self.generate_identity_table(3, (3, 3, 65))) def test_wrong_mode(self): with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('L', (10, 10), 0) im.im.color_lut_3d('L', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) with self.assertRaisesRegex(ValueError, "wrong mode"): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(4, 3)) + *self.generate_identity_table(4, 3)) def test_correct_mode(self): im = Image.new('RGBA', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) im = Image.new('RGBA', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(4, 3)) + *self.generate_identity_table(4, 3)) im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('HSV', Image.LINEAR, - *self.generate_identity_table(3, 3)) + *self.generate_identity_table(3, 3)) im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(4, 3)) + *self.generate_identity_table(4, 3)) def test_identities(self): g = Image.linear_gradient('L') @@ -154,12 +165,12 @@ def test_identities(self): for size in [2, 3, 5, 7, 11, 16, 17]: self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, size)))) + *self.generate_identity_table(3, size)))) # Not so fast self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGB', Image.LINEAR, - *self.generate_identity_table(3, (2, 2, 65))))) + *self.generate_identity_table(3, (2, 2, 65))))) def test_identities_4_channels(self): g = Image.linear_gradient('L') @@ -170,7 +181,7 @@ def test_identities_4_channels(self): self.assert_image_equal( Image.merge('RGBA', (im.split()*2)[:4]), im._new(im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(4, 17)))) + *self.generate_identity_table(4, 17)))) def test_copy_alpha_channel(self): g = Image.linear_gradient('L') @@ -180,7 +191,7 @@ def test_copy_alpha_channel(self): self.assert_image_equal(im, im._new( im.im.color_lut_3d('RGBA', Image.LINEAR, - *self.generate_identity_table(3, 17)))) + *self.generate_identity_table(3, 17)))) def test_channels_order(self): g = Image.linear_gradient('L') @@ -191,13 +202,13 @@ def test_channels_order(self): self.assert_image_equal( Image.merge('RGB', im.split()[::-1]), im._new(im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, [ - 0, 0, 0, 0, 0, 1, - 0, 1, 0, 0, 1, 1, + 3, 2, 2, 2, [ + 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 1, - 1, 0, 0, 1, 0, 1, - 1, 1, 0, 1, 1, 1, - ]))) + 1, 0, 0, 1, 0, 1, + 1, 1, 0, 1, 1, 1, + ]))) def test_overflow(self): g = Image.linear_gradient('L') @@ -205,14 +216,14 @@ def test_overflow(self): g.transpose(Image.ROTATE_180)]) transformed = im._new(im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, - [ - -1, -1, -1, 2, -1, -1, - -1, 2, -1, 2, 2, -1, - - -1, -1, 2, 2, -1, 2, - -1, 2, 2, 2, 2, 2, - ])).load() + 3, 2, 2, 2, + [ + -1, -1, -1, 2, -1, -1, + -1, 2, -1, 2, 2, -1, + + -1, -1, 2, 2, -1, 2, + -1, 2, 2, 2, 2, 2, + ])).load() self.assertEqual(transformed[0, 0], (0, 0, 255)) self.assertEqual(transformed[50, 50], (0, 0, 255)) self.assertEqual(transformed[255, 0], (0, 255, 255)) @@ -223,14 +234,14 @@ def test_overflow(self): self.assertEqual(transformed[205, 205], (255, 255, 0)) transformed = im._new(im.im.color_lut_3d('RGB', Image.LINEAR, - 3, 2, 2, 2, - [ - -3, -3, -3, 5, -3, -3, - -3, 5, -3, 5, 5, -3, - - -3, -3, 5, 5, -3, 5, - -3, 5, 5, 5, 5, 5, - ])).load() + 3, 2, 2, 2, + [ + -3, -3, -3, 5, -3, -3, + -3, 5, -3, 5, 5, -3, + + -3, -3, 5, 5, -3, 5, + -3, 5, 5, 5, 5, 5, + ])).load() self.assertEqual(transformed[0, 0], (0, 0, 255)) self.assertEqual(transformed[50, 50], (0, 0, 255)) self.assertEqual(transformed[255, 0], (0, 255, 255)) @@ -366,22 +377,23 @@ def test_repr(self): lut = ImageFilter.Color3DLUT( (3, 4, 5), array('f', [0, 0, 0, 0] * (3 * 4 * 5)), channels=4, target_mode='YCbCr', _copy_table=False) - self.assertEqual(repr(lut), + self.assertEqual( + repr(lut), "") class TestGenerateColorLut3D(PillowTestCase): def test_wrong_channels_count(self): with self.assertRaisesRegex(ValueError, "3 or 4 output channels"): - ImageFilter.Color3DLUT.generate(5, channels=2, - callback=lambda r, g, b: (r, g, b)) + ImageFilter.Color3DLUT.generate( + 5, channels=2, callback=lambda r, g, b: (r, g, b)) with self.assertRaisesRegex(ValueError, "should have either channels"): ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b, r)) with self.assertRaisesRegex(ValueError, "should have either channels"): - ImageFilter.Color3DLUT.generate(5, channels=4, - callback=lambda r, g, b: (r, g, b)) + ImageFilter.Color3DLUT.generate( + 5, channels=4, callback=lambda r, g, b: (r, g, b)) def test_3_channels(self): lut = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) @@ -392,8 +404,8 @@ def test_3_channels(self): 1.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25, 0.25, 0.0, 0.5, 0.25, 0.0]) def test_4_channels(self): - lut = ImageFilter.Color3DLUT.generate(5, channels=4, - callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) + lut = ImageFilter.Color3DLUT.generate( + 5, channels=4, callback=lambda r, g, b: (b, r, g, (r+g+b) / 2)) self.assertEqual(tuple(lut.size), (5, 5, 5)) self.assertEqual(lut.name, "Color 3D LUT") self.assertEqual(lut.table[:24], [ diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 1ecb6cda60c..cf38c234550 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -245,8 +245,8 @@ def run_levels_case(self, i): for y in range(i.size[1]): used_colors = {px[x, y][0] for x in range(i.size[0])} self.assertEqual(256, len(used_colors), - 'All colors should present in resized image. ' - 'Only {} on {} line.'.format(len(used_colors), y)) + 'All colors should present in resized image. ' + 'Only {} on {} line.'.format(len(used_colors), y)) @unittest.skip("current implementation isn't precise enough") def test_levels_rgba(self): From 0e61d4be9f4cca7cdd24fe5487b264c7e7af7b8a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Jun 2018 19:55:48 +1000 Subject: [PATCH 0365/1393] Removed unused variables --- Tests/test_file_libtiff.py | 2 +- src/PIL/GifImagePlugin.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index ce77e05de21..4f2f9617eea 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -525,7 +525,7 @@ def test_fd_duplication(self): f.write(src.read()) im = Image.open(tmpfile) - count = im.n_frames + im.n_frames im.close() try: os.remove(tmpfile) # Windows PermissionError here! diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 1bfbb5ffdd5..e0da0112966 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -543,7 +543,6 @@ def _write_local_header(fp, im, offset, flags): o8(0)) include_color_table = im.encoderinfo.get('include_color_table') if include_color_table: - palette = im.encoderinfo.get("palette", None) palette_bytes = _get_palette_bytes(im) color_table_size = _get_color_table_size(palette_bytes) if color_table_size: From e7cfa15216436e71ba2b17a006e78d9e4552d1a7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Jun 2018 23:20:24 +1000 Subject: [PATCH 0366/1393] Visually indented line with same indent as next logical line --- src/PIL/TiffImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 6f032f49d19..a4f58b5ff9c 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -577,8 +577,8 @@ def _setitem(self, tag, value, legacy_api): # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. # Don't mess with the legacy api, since it's frozen. - if ((info.length == 1) or - (info.length is None and len(values) == 1 and not legacy_api)): + if (info.length == 1) or \ + (info.length is None and len(values) == 1 and not legacy_api): # Don't mess with the legacy api, since it's frozen. if legacy_api and self.tagtype[tag] in [5, 10]: # rationals values = values, From 145589ef1425765ac1a0080440e18a3a9c5ea3bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 15 Jun 2018 23:44:22 +1000 Subject: [PATCH 0367/1393] Ambiguous variable name 'l' --- Tests/test_image_convert.py | 62 +++++++++++++++++++------------------ Tests/test_imagecms.py | 12 +++---- src/PIL/ContainerIO.py | 6 ++-- src/PIL/ImageStat.py | 4 +-- src/PIL/TiffImagePlugin.py | 10 +++--- 5 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index c7c38138212..14e634e9cc5 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -67,13 +67,13 @@ def test_trns_p(self): f = self.tempfile('temp.png') - l = im.convert('L') - self.assertEqual(l.info['transparency'], 0) # undone - l.save(f) + im_l = im.convert('L') + self.assertEqual(im_l.info['transparency'], 0) # undone + im_l.save(f) - rgb = im.convert('RGB') - self.assertEqual(rgb.info['transparency'], (0, 0, 0)) # undone - rgb.save(f) + im_rgb = im.convert('RGB') + self.assertEqual(im_rgb.info['transparency'], (0, 0, 0)) # undone + im_rgb.save(f) # ref https://github.com/python-pillow/Pillow/issues/664 @@ -83,12 +83,12 @@ def test_trns_p_rgba(self): im.info['transparency'] = 128 # Act - rgba = im.convert('RGBA') + im_rgba = im.convert('RGBA') # Assert - self.assertNotIn('transparency', rgba.info) + self.assertNotIn('transparency', im_rgba.info) # https://github.com/python-pillow/Pillow/issues/2702 - self.assertEqual(rgba.palette, None) + self.assertEqual(im_rgba.palette, None) def test_trns_l(self): im = hopper('L') @@ -96,19 +96,20 @@ def test_trns_l(self): f = self.tempfile('temp.png') - rgb = im.convert('RGB') - self.assertEqual(rgb.info['transparency'], (128, 128, 128)) # undone - rgb.save(f) + im_rgb = im.convert('RGB') + self.assertEqual(im_rgb.info['transparency'], + (128, 128, 128)) # undone + im_rgb.save(f) - p = im.convert('P') - self.assertIn('transparency', p.info) - p.save(f) + im_p = im.convert('P') + self.assertIn('transparency', im_p.info) + im_p.save(f) - p = self.assert_warning( + im_p = self.assert_warning( UserWarning, im.convert, 'P', palette=Image.ADAPTIVE) - self.assertNotIn('transparency', p.info) - p.save(f) + self.assertNotIn('transparency', im_p.info) + im_p.save(f) def test_trns_RGB(self): im = hopper('RGB') @@ -116,23 +117,24 @@ def test_trns_RGB(self): f = self.tempfile('temp.png') - l = im.convert('L') - self.assertEqual(l.info['transparency'], l.getpixel((0, 0))) # undone - l.save(f) + im_l = im.convert('L') + self.assertEqual(im_l.info['transparency'], + im_l.getpixel((0, 0))) # undone + im_l.save(f) - p = im.convert('P') - self.assertIn('transparency', p.info) - p.save(f) + im_p = im.convert('P') + self.assertIn('transparency', im_p.info) + im_p.save(f) - p = im.convert('RGBA') - self.assertNotIn('transparency', p.info) - p.save(f) + im_rgba = im.convert('RGBA') + self.assertNotIn('transparency', im_rgba.info) + im_rgba.save(f) - p = self.assert_warning( + im_p = self.assert_warning( UserWarning, im.convert, 'P', palette=Image.ADAPTIVE) - self.assertNotIn('transparency', p.info) - p.save(f) + self.assertNotIn('transparency', im_p.info) + im_p.save(f) def test_p_la(self): im = hopper('RGBA') diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 4138f455f6e..2f470868949 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -196,13 +196,13 @@ def test_simple_lab(self): # not a linear luminance map. so L != 128: self.assertEqual(k, (137, 128, 128)) - l = i_lab.getdata(0) - a = i_lab.getdata(1) - b = i_lab.getdata(2) + l_data = i_lab.getdata(0) + a_data = i_lab.getdata(1) + b_data = i_lab.getdata(2) - self.assertEqual(list(l), [137] * 100) - self.assertEqual(list(a), [128] * 100) - self.assertEqual(list(b), [128] * 100) + self.assertEqual(list(l_data), [137] * 100) + self.assertEqual(list(a_data), [128] * 100) + self.assertEqual(list(b_data), [128] * 100) def test_lab_color(self): psRGB = ImageCms.createProfile("sRGB") diff --git a/src/PIL/ContainerIO.py b/src/PIL/ContainerIO.py index 496ed68263d..682ad9031bb 100644 --- a/src/PIL/ContainerIO.py +++ b/src/PIL/ContainerIO.py @@ -107,10 +107,10 @@ def readlines(self): :returns: A list of 8-bit strings. """ - l = [] + lines = [] while True: s = self.readline() if not s: break - l.append(s) - return l + lines.append(s) + return lines diff --git a/src/PIL/ImageStat.py b/src/PIL/ImageStat.py index cd58fc8ff4b..d4b38d85689 100644 --- a/src/PIL/ImageStat.py +++ b/src/PIL/ImageStat.py @@ -110,11 +110,11 @@ def _getmedian(self): v = [] for i in self.bands: s = 0 - l = self.count[i]//2 + half = self.count[i]//2 b = i * 256 for j in range(256): s = s + self.h[b+j] - if s > l: + if s > half: break v.append(j) return v diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index a4f58b5ff9c..14b66a1b9b3 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1245,7 +1245,7 @@ def _setup(self): self.info["resolution"] = xres, yres # build tile descriptors - x = y = l = 0 + x = y = layer = 0 self.tile = [] self.use_load_libtiff = False if STRIPOFFSETS in self.tag_v2: @@ -1305,7 +1305,7 @@ def _setup(self): else: for i, offset in enumerate(offsets): - a = self._decoder(rawmode, l, i) + a = self._decoder(rawmode, layer, i) self.tile.append( (self._compression, (0, min(y, ysize), w, min(y+h, ysize)), @@ -1315,7 +1315,7 @@ def _setup(self): y = y + h if y >= self.size[1]: x = y = 0 - l += 1 + layer += 1 a = None elif TILEOFFSETS in self.tag_v2: # tiled image @@ -1324,7 +1324,7 @@ def _setup(self): a = None for o in self.tag_v2[TILEOFFSETS]: if not a: - a = self._decoder(rawmode, l) + a = self._decoder(rawmode, layer) # FIXME: this doesn't work if the image size # is not a multiple of the tile size... self.tile.append( @@ -1336,7 +1336,7 @@ def _setup(self): x, y = 0, y + h if y >= self.size[1]: x = y = 0 - l += 1 + layer += 1 a = None else: if DEBUG: From 0832f9c58b6fecf16d4bfc128931cddd5ddb9e7a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 16 Jun 2018 09:10:58 +1000 Subject: [PATCH 0368/1393] Continuation line unaligned for hanging indent --- Tests/test_color_lut.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index e641c5ad350..5a51b279f9a 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -27,8 +27,8 @@ def generate_identity_table(self, channels, size): g / float(size2D-1) if size2D != 1 else 0, ][:channels] for b in range(size3D) - for g in range(size2D) - for r in range(size1D) + for g in range(size2D) + for r in range(size1D) ] return ( channels, size1D, size2D, size3D, From ce5d0e72b2d8493c73c6ffaa02171345ad8a16a9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 24 Jun 2018 21:55:22 +1000 Subject: [PATCH 0369/1393] Continuation line under-indented for visual indent --- Tests/test_file_webp_animated.py | 6 +- Tests/test_image_resize.py | 16 +- Tests/test_imageops_usm.py | 12 +- Tests/test_imagepalette.py | 6 +- Tests/test_lib_pack.py | 327 +++++++++++++++++-------------- 5 files changed, 204 insertions(+), 163 deletions(-) diff --git a/Tests/test_file_webp_animated.py b/Tests/test_file_webp_animated.py index f98cde764d5..6b3dc162299 100644 --- a/Tests/test_file_webp_animated.py +++ b/Tests/test_file_webp_animated.py @@ -83,7 +83,8 @@ def check(temp_file): temp_file1 = self.tempfile("temp.webp") frame1.copy().save(temp_file1, - save_all=True, append_images=[frame2], lossless=True) + save_all=True, append_images=[frame2], + lossless=True) check(temp_file1) # Tests appending using a generator @@ -92,7 +93,8 @@ def imGenerator(ims): yield im temp_file2 = self.tempfile("temp_generator.webp") frame1.copy().save(temp_file2, - save_all=True, append_images=imGenerator([frame2]), lossless=True) + save_all=True, append_images=imGenerator([frame2]), + lossless=True) check(temp_file2) def test_timestamp_and_duration(self): diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 8d14b900823..535f1d77e44 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -39,15 +39,15 @@ def test_convolution_modes(self): self.assertEqual(r.im.bands, im.im.bands) def test_reduce_filters(self): - for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, - Image.BICUBIC, Image.LANCZOS]: + for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, + Image.HAMMING, Image.BICUBIC, Image.LANCZOS]: r = self.resize(hopper("RGB"), (15, 12), f) self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (15, 12)) def test_enlarge_filters(self): - for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, - Image.BICUBIC, Image.LANCZOS]: + for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, + Image.HAMMING, Image.BICUBIC, Image.LANCZOS]: r = self.resize(hopper("RGB"), (212, 195), f) self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (212, 195)) @@ -66,8 +66,8 @@ def test_endianness(self): } samples['dirty'].putpixel((1, 1), 128) - for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, - Image.BICUBIC, Image.LANCZOS]: + for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, + Image.HAMMING, Image.BICUBIC, Image.LANCZOS]: # samples resized with current filter references = { name: self.resize(ch, (4, 4), f) @@ -90,8 +90,8 @@ def test_endianness(self): self.assert_image_equal(ch, references[channels[i]]) def test_enlarge_zero(self): - for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, - Image.BICUBIC, Image.LANCZOS]: + for f in [Image.NEAREST, Image.BOX, Image.BILINEAR, + Image.HAMMING, Image.BICUBIC, Image.LANCZOS]: r = self.resize(Image.new('RGB', (0, 0), "white"), (212, 195), f) self.assertEqual(r.mode, "RGB") self.assertEqual(r.size, (212, 195)) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index 2666d348269..20758e9f801 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -13,27 +13,25 @@ class TestImageOpsUsm(PillowTestCase): def test_ops_api(self): i = self.assert_warning(DeprecationWarning, - ImageOps.gaussian_blur, im, 2.0) + ImageOps.gaussian_blur, im, 2.0) self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) - i = self.assert_warning(DeprecationWarning, - ImageOps.box_blur, im, 1) + i = self.assert_warning(DeprecationWarning, ImageOps.box_blur, im, 1) self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) - i = self.assert_warning(DeprecationWarning, - ImageOps.gblur, im, 2.0) + i = self.assert_warning(DeprecationWarning, ImageOps.gblur, im, 2.0) self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) i = self.assert_warning(DeprecationWarning, - ImageOps.unsharp_mask, im, 2.0, 125, 8) + ImageOps.unsharp_mask, im, 2.0, 125, 8) self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) i = self.assert_warning(DeprecationWarning, - ImageOps.usm, im, 2.0, 125, 8) + ImageOps.usm, im, 2.0, 125, 8) self.assertEqual(i.mode, "RGB") self.assertEqual(i.size, (128, 128)) diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py index 889f022ae06..3b7087d7aa1 100644 --- a/Tests/test_imagepalette.py +++ b/Tests/test_imagepalette.py @@ -9,7 +9,7 @@ def test_sanity(self): ImagePalette.ImagePalette("RGB", list(range(256))*3) self.assertRaises(ValueError, - ImagePalette.ImagePalette, "RGB", list(range(256))*2) + ImagePalette.ImagePalette, "RGB", list(range(256))*2) def test_getcolor(self): @@ -66,7 +66,7 @@ def test_make_linear_lut_not_yet_implemented(self): # Act self.assertRaises(NotImplementedError, - ImagePalette.make_linear_lut, black, white) + ImagePalette.make_linear_lut, black, white) def test_make_gamma_lut(self): # Arrange @@ -133,7 +133,7 @@ def test_2bit_palette(self): def test_invalid_palette(self): self.assertRaises(IOError, - ImagePalette.load, "Tests/images/hopper.jpg") + ImagePalette.load, "Tests/images/hopper.jpg") if __name__ == '__main__': diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 002db2e19ba..89c8e297f96 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -57,14 +57,18 @@ def test_PA(self): def test_RGB(self): self.assert_pack("RGB", "RGB", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) - self.assert_pack("RGB", "RGBX", + self.assert_pack( + "RGB", "RGBX", b'\x01\x02\x03\xff\x05\x06\x07\xff', (1, 2, 3), (5, 6, 7)) - self.assert_pack("RGB", "XRGB", + self.assert_pack( + "RGB", "XRGB", b'\x00\x02\x03\x04\x00\x06\x07\x08', (2, 3, 4), (6, 7, 8)) self.assert_pack("RGB", "BGR", 3, (3, 2, 1), (6, 5, 4), (9, 8, 7)) - self.assert_pack("RGB", "BGRX", + self.assert_pack( + "RGB", "BGRX", b'\x01\x02\x03\x00\x05\x06\x07\x00', (3, 2, 1), (7, 6, 5)) - self.assert_pack("RGB", "XBGR", + self.assert_pack( + "RGB", "XBGR", b'\x00\x02\x03\x04\x00\x06\x07\x08', (4, 3, 2), (8, 7, 6)) self.assert_pack("RGB", "RGB;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_pack("RGB", "R", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9)) @@ -72,17 +76,19 @@ def test_RGB(self): self.assert_pack("RGB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3)) def test_RGBA(self): - self.assert_pack("RGBA", "RGBA", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_pack("RGBA", "RGBA;L", 4, - (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack( + "RGBA", "RGBA", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_pack( + "RGBA", "RGBA;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_pack("RGBA", "RGB", 3, (1, 2, 3, 14), (4, 5, 6, 15), (7, 8, 9, 16)) self.assert_pack("RGBA", "BGR", 3, (3, 2, 1, 14), (6, 5, 4, 15), (9, 8, 7, 16)) - self.assert_pack("RGBA", "BGRA", 4, + self.assert_pack( + "RGBA", "BGRA", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) - self.assert_pack("RGBA", "ABGR", 4, - (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) - self.assert_pack("RGBA", "BGRa", 4, + self.assert_pack( + "RGBA", "ABGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) + self.assert_pack( + "RGBA", "BGRa", 4, (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12)) self.assert_pack("RGBA", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) self.assert_pack("RGBA", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) @@ -90,22 +96,24 @@ def test_RGBA(self): self.assert_pack("RGBA", "A", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_RGBa(self): - self.assert_pack("RGBa", "RGBa", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_pack("RGBa", "BGRa", 4, - (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) - self.assert_pack("RGBa", "aBGR", 4, - (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) + self.assert_pack( + "RGBa", "RGBa", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_pack( + "RGBa", "BGRa", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) + self.assert_pack( + "RGBa", "aBGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): self.assert_pack("RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack("RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_pack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) self.assert_pack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) - self.assert_pack("RGBX", "BGRX", + self.assert_pack( + "RGBX", "BGRX", b'\x01\x02\x03\x00\x05\x06\x07\x00\t\n\x0b\x00', (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) - self.assert_pack("RGBX", "XBGR", + self.assert_pack( + "RGBX", "XBGR", b'\x00\x02\x03\x04\x00\x06\x07\x08\x00\n\x0b\x0c', (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) self.assert_pack("RGBX", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) @@ -115,19 +123,22 @@ def test_RGBX(self): def test_CMYK(self): self.assert_pack("CMYK", "CMYK", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_pack("CMYK", "CMYK;I", 4, + self.assert_pack( + "CMYK", "CMYK;I", 4, (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) - self.assert_pack("CMYK", "CMYK;L", 4, - (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack( + "CMYK", "CMYK;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_pack("CMYK", "K", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_YCbCr(self): self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) - self.assert_pack("YCbCr", "YCbCrX", + self.assert_pack( + "YCbCr", "YCbCrX", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_pack("YCbCr", "YCbCrK", + self.assert_pack( + "YCbCr", "YCbCrK", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', (1, 2, 3), (5, 6, 7), (9, 10, 11)) self.assert_pack("YCbCr", "Y", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) @@ -135,8 +146,8 @@ def test_YCbCr(self): self.assert_pack("YCbCr", "Cr", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) def test_LAB(self): - self.assert_pack("LAB", "LAB", 3, - (1, 130, 131), (4, 133, 134), (7, 136, 137)) + self.assert_pack( + "LAB", "LAB", 3, (1, 130, 131), (4, 133, 134), (7, 136, 137)) self.assert_pack("LAB", "L", 1, (1, 9, 9), (2, 9, 9), (3, 9, 9)) self.assert_pack("LAB", "A", 1, (9, 1, 9), (9, 2, 9), (9, 3, 9)) self.assert_pack("LAB", "B", 1, (9, 9, 1), (9, 9, 2), (9, 9, 3)) @@ -149,35 +160,35 @@ def test_HSV(self): def test_I(self): self.assert_pack("I", "I;16B", 2, 0x0102, 0x0304) - self.assert_pack("I", "I;32S", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 0x01000083, -2097151999) + self.assert_pack( + "I", "I;32S", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 0x01000083, -2097151999) if sys.byteorder == 'little': self.assert_pack("I", "I", 4, 0x04030201, 0x08070605) - self.assert_pack("I", "I;32NS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 0x01000083, -2097151999) + self.assert_pack( + "I", "I;32NS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 0x01000083, -2097151999) else: self.assert_pack("I", "I", 4, 0x01020304, 0x05060708) - self.assert_pack("I", "I;32NS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - -2097151999, 0x01000083) + self.assert_pack( + "I", "I;32NS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', -2097151999, 0x01000083) def test_F_float(self): - self.assert_pack("F", "F;32F", 4, - 1.539989614439558e-36, 4.063216068939723e-34) + self.assert_pack( + "F", "F;32F", 4, 1.539989614439558e-36, 4.063216068939723e-34) if sys.byteorder == 'little': - self.assert_pack("F", "F", 4, - 1.539989614439558e-36, 4.063216068939723e-34) - self.assert_pack("F", "F;32NF", 4, - 1.539989614439558e-36, 4.063216068939723e-34) + self.assert_pack( + "F", "F", 4, 1.539989614439558e-36, 4.063216068939723e-34) + self.assert_pack( + "F", "F;32NF", 4, 1.539989614439558e-36, 4.063216068939723e-34) else: - self.assert_pack("F", "F", 4, - 2.387939260590663e-38, 6.301941157072183e-36) - self.assert_pack("F", "F;32NF", 4, - 2.387939260590663e-38, 6.301941157072183e-36) + self.assert_pack( + "F", "F", 4, 2.387939260590663e-38, 6.301941157072183e-36) + self.assert_pack( + "F", "F;32NF", 4, 2.387939260590663e-38, 6.301941157072183e-36) class TestLibUnpack(PillowTestCase): @@ -260,7 +271,8 @@ def test_RGB(self): self.assert_unpack("RGB", "BGRX", 4, (3, 2, 1), (7, 6, 5), (11, 10, 9)) self.assert_unpack("RGB", "XRGB", 4, (2, 3, 4), (6, 7, 8), (10, 11, 12)) self.assert_unpack("RGB", "XBGR", 4, (4, 3, 2), (8, 7, 6), (12, 11, 10)) - self.assert_unpack("RGB", "YCC;P", + self.assert_unpack( + "RGB", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data (127, 102, 0), (192, 227, 0), (213, 255, 170), (98, 255, 133)) self.assert_unpack("RGB", "R", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0)) @@ -269,48 +281,58 @@ def test_RGB(self): 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("RGBA", "LA;16B", 4, - (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) - self.assert_unpack("RGBA", "RGBA", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_unpack("RGBA", "RGBa", 4, + self.assert_unpack( + "RGBA", "LA;16B", 4, (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) + self.assert_unpack( + "RGBA", "RGBA", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack( + "RGBA", "RGBa", 4, (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12)) - self.assert_unpack("RGBA", "RGBa", + self.assert_unpack( + "RGBA", "RGBa", b'\x01\x02\x03\x00\x10\x20\x30\xff', (0, 0, 0, 0), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "RGBa;16L", 8, + self.assert_unpack( + "RGBA", "RGBa;16L", 8, (63, 127, 191, 8), (159, 191, 223, 16), (191, 212, 233, 24)) - self.assert_unpack("RGBA", "RGBa;16L", + self.assert_unpack( + "RGBA", "RGBa;16L", b'\x88\x01\x88\x02\x88\x03\x88\x00' b'\x88\x10\x88\x20\x88\x30\x88\xff', (0, 0, 0, 0), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "RGBa;16B", 8, + self.assert_unpack( + "RGBA", "RGBa;16B", 8, (36, 109, 182, 7), (153, 187, 221, 15), (188, 210, 232, 23)) - self.assert_unpack("RGBA", "RGBa;16B", + self.assert_unpack( + "RGBA", "RGBa;16B", b'\x01\x88\x02\x88\x03\x88\x00\x88' b'\x10\x88\x20\x88\x30\x88\xff\x88', (0, 0, 0, 0), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "BGRa", 4, + self.assert_unpack( + "RGBA", "BGRa", 4, (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12)) - self.assert_unpack("RGBA", "BGRa", + self.assert_unpack( + "RGBA", "BGRa", b'\x01\x02\x03\x00\x10\x20\x30\xff', (0, 0, 0, 0), (48, 32, 16, 255)) - self.assert_unpack("RGBA", "RGBA;I", 4, + self.assert_unpack( + "RGBA", "RGBA;I", 4, (254, 253, 252, 4), (250, 249, 248, 8), (246, 245, 244, 12)) - self.assert_unpack("RGBA", "RGBA;L", 4, - (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack( + "RGBA", "RGBA;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_unpack("RGBA", "RGBA;15", 2, (8, 131, 0, 0), (24, 0, 8, 0)) self.assert_unpack("RGBA", "BGRA;15", 2, (0, 131, 8, 0), (8, 0, 24, 0)) self.assert_unpack("RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0)) self.assert_unpack("RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) self.assert_unpack("RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) - self.assert_unpack("RGBA", "BGRA", 4, - (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) - self.assert_unpack("RGBA", "ARGB", 4, - (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) - self.assert_unpack("RGBA", "ABGR", 4, - (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) - self.assert_unpack("RGBA", "YCCA;P", + self.assert_unpack( + "RGBA", "BGRA", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) + self.assert_unpack( + "RGBA", "ARGB", 4, (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) + self.assert_unpack( + "RGBA", "ABGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) + self.assert_unpack( + "RGBA", "YCCA;P", b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data (0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17)) self.assert_unpack("RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) @@ -319,14 +341,14 @@ def test_RGBA(self): self.assert_unpack("RGBA", "A", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) def test_RGBa(self): - self.assert_unpack("RGBa", "RGBa", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_unpack("RGBa", "BGRa", 4, - (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) - self.assert_unpack("RGBa", "aRGB", 4, - (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) - self.assert_unpack("RGBa", "aBGR", 4, - (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) + self.assert_unpack( + "RGBa", "RGBa", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack( + "RGBa", "BGRa", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) + self.assert_unpack( + "RGBa", "aRGB", 4, (2, 3, 4, 1), (6, 7, 8, 5), (10, 11, 12, 9)) + self.assert_unpack( + "RGBa", "aBGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): self.assert_unpack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) @@ -336,20 +358,21 @@ def test_RGBX(self): self.assert_unpack("RGBX", "RGB;15", 2, (8, 131, 0, X), (24, 0, 8, X)) self.assert_unpack("RGBX", "BGR;15", 2, (0, 131, 8, X), (8, 0, 24, X)) self.assert_unpack("RGBX", "RGB;4B", 2, (17, 0, 34, X), (51, 0, 68, X)) - self.assert_unpack("RGBX", "RGBX", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_unpack("RGBX", "RGBXX", 5, - (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) - self.assert_unpack("RGBX", "RGBXXX", 6, - (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) - self.assert_unpack("RGBX", "RGBX;L", 4, - (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack( + "RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack( + "RGBX", "RGBXX", 5, (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) + self.assert_unpack( + "RGBX", "RGBXXX", 6, (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) + self.assert_unpack( + "RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_unpack("RGBX", "RGBX;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) self.assert_unpack("RGBX", "RGBX;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) self.assert_unpack("RGBX", "BGRX", 4, (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) self.assert_unpack("RGBX", "XRGB", 4, (2, 3, 4, X), (6, 7, 8, X), (10, 11, 12, X)) self.assert_unpack("RGBX", "XBGR", 4, (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) - self.assert_unpack("RGBX", "YCC;P", + self.assert_unpack( + "RGBX", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data (127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X)) self.assert_unpack("RGBX", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) @@ -358,40 +381,47 @@ def test_RGBX(self): self.assert_unpack("RGBX", "X", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) def test_CMYK(self): - self.assert_unpack("CMYK", "CMYK", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_unpack("CMYK", "CMYKX", 5, - (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) - self.assert_unpack("CMYK", "CMYKXX", 6, - (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) - self.assert_unpack("CMYK", "CMYK;I", 4, + self.assert_unpack( + "CMYK", "CMYK", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack( + "CMYK", "CMYKX", 5, (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) + self.assert_unpack( + "CMYK", "CMYKXX", 6, (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) + self.assert_unpack( + "CMYK", "CMYK;I", 4, (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) - self.assert_unpack("CMYK", "CMYK;L", 4, - (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_unpack( + "CMYK", "CMYK;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_unpack("CMYK", "C", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) self.assert_unpack("CMYK", "M", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) self.assert_unpack("CMYK", "Y", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) self.assert_unpack("CMYK", "K", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) - self.assert_unpack("CMYK", "C;I", 1, - (254, 0, 0, 0), (253, 0, 0, 0), (252, 0, 0, 0)) - self.assert_unpack("CMYK", "M;I", 1, - (0, 254, 0, 0), (0, 253, 0, 0), (0, 252, 0, 0)) - self.assert_unpack("CMYK", "Y;I", 1, - (0, 0, 254, 0), (0, 0, 253, 0), (0, 0, 252, 0)) - self.assert_unpack("CMYK", "K;I", 1, - (0, 0, 0, 254), (0, 0, 0, 253), (0, 0, 0, 252)) + self.assert_unpack( + "CMYK", "C;I", 1, (254, 0, 0, 0), (253, 0, 0, 0), (252, 0, 0, 0)) + self.assert_unpack( + "CMYK", "M;I", 1, (0, 254, 0, 0), (0, 253, 0, 0), (0, 252, 0, 0)) + self.assert_unpack( + "CMYK", "Y;I", 1, (0, 0, 254, 0), (0, 0, 253, 0), (0, 0, 252, 0)) + self.assert_unpack( + "CMYK", "K;I", 1, (0, 0, 0, 254), (0, 0, 0, 253), (0, 0, 0, 252)) def test_YCbCr(self): - self.assert_unpack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) - self.assert_unpack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) - self.assert_unpack("YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_unpack("YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_unpack("YCbCr", "YCbCrXX", 5, (1, 2, 3), (6, 7, 8), (11, 12, 13)) - self.assert_unpack("YCbCr", "YCbCrXXX", 6, (1, 2, 3), (7, 8, 9), (13, 14, 15)) + self.assert_unpack( + "YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) + self.assert_unpack( + "YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_unpack( + "YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack( + "YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack( + "YCbCr", "YCbCrXX", 5, (1, 2, 3), (6, 7, 8), (11, 12, 13)) + self.assert_unpack( + "YCbCr", "YCbCrXXX", 6, (1, 2, 3), (7, 8, 9), (13, 14, 15)) def test_LAB(self): - self.assert_unpack("LAB", "LAB", 3, - (1, 130, 131), (4, 133, 134), (7, 136, 137)) + self.assert_unpack( + "LAB", "LAB", 3, (1, 130, 131), (4, 133, 134), (7, 136, 137)) self.assert_unpack("LAB", "L", 1, (1, 0, 0), (2, 0, 0), (3, 0, 0)) self.assert_unpack("LAB", "A", 1, (0, 1, 0), (0, 2, 0), (0, 3, 0)) self.assert_unpack("LAB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) @@ -410,30 +440,30 @@ def test_I(self): self.assert_unpack("I", "I;16B", 2, 0x0102, 0x0304) self.assert_unpack("I", "I;16BS", b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("I", "I;32", 4, 0x04030201, 0x08070605) - self.assert_unpack("I", "I;32S", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 0x01000083, -2097151999) + self.assert_unpack( + "I", "I;32S", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 0x01000083, -2097151999) self.assert_unpack("I", "I;32B", 4, 0x01020304, 0x05060708) - self.assert_unpack("I", "I;32BS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - -2097151999, 0x01000083) + self.assert_unpack( + "I", "I;32BS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', -2097151999, 0x01000083) if sys.byteorder == 'little': self.assert_unpack("I", "I", 4, 0x04030201, 0x08070605) self.assert_unpack("I", "I;16N", 2, 0x0201, 0x0403) self.assert_unpack("I", "I;16NS", b'\x83\x01\x01\x83', 0x0183, -31999) self.assert_unpack("I", "I;32N", 4, 0x04030201, 0x08070605) - self.assert_unpack("I", "I;32NS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 0x01000083, -2097151999) + self.assert_unpack( + "I", "I;32NS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 0x01000083, -2097151999) else: self.assert_unpack("I", "I", 4, 0x01020304, 0x05060708) self.assert_unpack("I", "I;16N", 2, 0x0102, 0x0304) self.assert_unpack("I", "I;16NS", b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("I", "I;32N", 4, 0x01020304, 0x05060708) - self.assert_unpack("I", "I;32NS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - -2097151999, 0x01000083) + self.assert_unpack( + "I", "I;32NS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', -2097151999, 0x01000083) def test_F_int(self): self.assert_unpack("F", "F;8", 1, 0x01, 0x02, 0x03, 0x04) @@ -443,55 +473,66 @@ def test_F_int(self): self.assert_unpack("F", "F;16B", 2, 0x0102, 0x0304) self.assert_unpack("F", "F;16BS", b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("F", "F;32", 4, 67305984, 134678016) - self.assert_unpack("F", "F;32S", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 16777348, -2097152000) + self.assert_unpack( + "F", "F;32S", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 16777348, -2097152000) self.assert_unpack("F", "F;32B", 4, 0x01020304, 0x05060708) - self.assert_unpack("F", "F;32BS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - -2097152000, 16777348) + self.assert_unpack( + "F", "F;32BS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', -2097152000, 16777348) if sys.byteorder == 'little': self.assert_unpack("F", "F;16N", 2, 0x0201, 0x0403) self.assert_unpack("F", "F;16NS", b'\x83\x01\x01\x83', 0x0183, -31999) self.assert_unpack("F", "F;32N", 4, 67305984, 134678016) - self.assert_unpack("F", "F;32NS", - b'\x83\x00\x00\x01\x01\x00\x00\x83', - 16777348, -2097152000) + self.assert_unpack( + "F", "F;32NS", + b'\x83\x00\x00\x01\x01\x00\x00\x83', 16777348, -2097152000) else: self.assert_unpack("F", "F;16N", 2, 0x0102, 0x0304) self.assert_unpack("F", "F;16NS", b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("F", "F;32N", 4, 0x01020304, 0x05060708) - self.assert_unpack("F", "F;32NS", + self.assert_unpack( + "F", "F;32NS", b'\x83\x00\x00\x01\x01\x00\x00\x83', -2097152000, 16777348) def test_F_float(self): - self.assert_unpack("F", "F;32F", 4, + self.assert_unpack( + "F", "F;32F", 4, 1.539989614439558e-36, 4.063216068939723e-34) - self.assert_unpack("F", "F;32BF", 4, + self.assert_unpack( + "F", "F;32BF", 4, 2.387939260590663e-38, 6.301941157072183e-36) - self.assert_unpack("F", "F;64F", + self.assert_unpack( + "F", "F;64F", b'333333\xc3?\x00\x00\x00\x00\x00J\x93\xc0', # by struct.pack 0.15000000596046448, -1234.5) - self.assert_unpack("F", "F;64BF", + self.assert_unpack( + "F", "F;64BF", b'?\xc3333333\xc0\x93J\x00\x00\x00\x00\x00', # by struct.pack 0.15000000596046448, -1234.5) if sys.byteorder == 'little': - self.assert_unpack("F", "F", 4, + self.assert_unpack( + "F", "F", 4, 1.539989614439558e-36, 4.063216068939723e-34) - self.assert_unpack("F", "F;32NF", 4, + self.assert_unpack( + "F", "F;32NF", 4, 1.539989614439558e-36, 4.063216068939723e-34) - self.assert_unpack("F", "F;64NF", + self.assert_unpack( + "F", "F;64NF", b'333333\xc3?\x00\x00\x00\x00\x00J\x93\xc0', 0.15000000596046448, -1234.5) else: - self.assert_unpack("F", "F", 4, + self.assert_unpack( + "F", "F", 4, 2.387939260590663e-38, 6.301941157072183e-36) - self.assert_unpack("F", "F;32NF", 4, + self.assert_unpack( + "F", "F;32NF", 4, 2.387939260590663e-38, 6.301941157072183e-36) - self.assert_unpack("F", "F;64NF", + self.assert_unpack( + "F", "F;64NF", b'?\xc3333333\xc0\x93J\x00\x00\x00\x00\x00', 0.15000000596046448, -1234.5) From c2189235afc3fdc36cb781ee6bdcd3e6692f91aa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 24 Jun 2018 22:32:25 +1000 Subject: [PATCH 0370/1393] Line too long --- Tests/helper.py | 6 +- Tests/test_color_lut.py | 3 +- Tests/test_file_gif.py | 3 +- Tests/test_file_libtiff.py | 17 ++- Tests/test_file_pdf.py | 19 ++- Tests/test_file_png.py | 6 +- Tests/test_file_tiff.py | 3 +- Tests/test_font_leaks.py | 3 +- Tests/test_image_access.py | 3 +- Tests/test_image_array.py | 6 +- Tests/test_image_convert.py | 3 +- Tests/test_image_resample.py | 31 ++-- Tests/test_image_rotate.py | 5 +- Tests/test_image_toqimage.py | 5 +- Tests/test_imagecms.py | 137 +++++++++++++----- Tests/test_imagecolor.py | 18 ++- Tests/test_imageenhance.py | 5 +- Tests/test_imagefile.py | 8 +- Tests/test_imagefont.py | 13 +- Tests/test_imagefont_bitmap.py | 3 +- Tests/test_imagefontctl.py | 12 +- Tests/test_imagemorph.py | 5 +- Tests/test_lib_pack.py | 155 +++++++++++++------- Tests/test_map.py | 3 +- Tests/test_numpy.py | 4 +- Tests/test_pdfparser.py | 61 +++++--- setup.py | 15 +- src/PIL/BmpImagePlugin.py | 92 ++++++++---- src/PIL/DdsImagePlugin.py | 3 +- src/PIL/FtexImagePlugin.py | 22 +-- src/PIL/GbrImagePlugin.py | 6 +- src/PIL/GifImagePlugin.py | 19 ++- src/PIL/ImageCms.py | 56 ++++---- src/PIL/ImageDraw.py | 3 +- src/PIL/ImageEnhance.py | 3 +- src/PIL/ImageFile.py | 35 +++-- src/PIL/ImageFont.py | 34 +++-- src/PIL/ImageMode.py | 3 +- src/PIL/ImageQt.py | 3 +- src/PIL/ImageTk.py | 3 +- src/PIL/Jpeg2KImagePlugin.py | 3 +- src/PIL/JpegImagePlugin.py | 3 +- src/PIL/MspImagePlugin.py | 5 +- src/PIL/PdfImagePlugin.py | 63 ++++++--- src/PIL/PdfParser.py | 251 +++++++++++++++++++++++---------- src/PIL/PngImagePlugin.py | 7 +- src/PIL/PpmImagePlugin.py | 3 +- src/PIL/SgiImagePlugin.py | 3 +- src/PIL/SunImagePlugin.py | 3 +- src/PIL/TiffImagePlugin.py | 3 +- src/PIL/TiffTags.py | 7 +- src/PIL/WmfImagePlugin.py | 3 +- 52 files changed, 806 insertions(+), 382 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 5dbdb66beb3..207f497d276 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -153,7 +153,8 @@ def assert_image_similar(self, a, b, epsilon, msg=None): pass raise e - def assert_image_similar_tofile(self, a, filename, epsilon, msg=None, mode=None): + def assert_image_similar_tofile(self, a, filename, epsilon, msg=None, + mode=None): with Image.open(filename) as img: if mode: img = img.convert(mode) @@ -246,7 +247,8 @@ def _get_mem_usage(self): mem = getrusage(RUSAGE_SELF).ru_maxrss if sys.platform == 'darwin': # man 2 getrusage: - # ru_maxrss the maximum resident set size utilized (in bytes). + # ru_maxrss + # This is the maximum resident set size utilized (in bytes). return mem / 1024 # Kb else: # linux diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 5a51b279f9a..6d0b76fed24 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -410,7 +410,8 @@ def test_4_channels(self): self.assertEqual(lut.name, "Color 3D LUT") self.assertEqual(lut.table[:24], [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.125, 0.0, 0.5, 0.0, 0.25, - 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125]) + 0.0, 0.75, 0.0, 0.375, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.25, 0.125 + ]) def test_apply(self): lut = ImageFilter.Color3DLUT.generate(5, lambda r, g, b: (r, g, b)) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index b1006a63044..086a0f5d0f7 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -402,7 +402,8 @@ def test_background(self): def test_comment(self): im = Image.open(TEST_GIF) - self.assertEqual(im.info['comment'], b"File written by Adobe Photoshop\xa8 4.0") + self.assertEqual(im.info['comment'], + b"File written by Adobe Photoshop\xa8 4.0") out = self.tempfile('temp.gif') im = Image.new('L', (100, 100), '#000') diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 4f2f9617eea..77caa0b9dcd 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -126,7 +126,8 @@ def test_adobe_deflate_tiff(self): im.tile[0][:3], ('tiff_adobe_deflate', (0, 0, 278, 374), 0)) im.load() - self.assert_image_equal_tofile(im, 'Tests/images/tiff_adobe_deflate.png') + self.assert_image_equal_tofile(im, + 'Tests/images/tiff_adobe_deflate.png') def test_write_metadata(self): """ Test metadata writing through libtiff """ @@ -217,7 +218,8 @@ def test_additional_metadata(self): if info.length == 0: new_ifd[tag] = tuple(values[info.type] for _ in range(3)) else: - new_ifd[tag] = tuple(values[info.type] for _ in range(info.length)) + new_ifd[tag] = tuple(values[info.type] + for _ in range(info.length)) # Extra samples really doesn't make sense in this application. del(new_ifd[338]) @@ -578,10 +580,14 @@ def test_16bit_RGBa_tiff(self): self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (100, 40)) - self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16N', 'tiff_lzw', False))]) + self.assertEqual( + im.tile, + [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16N', 'tiff_lzw', False))] + ) im.load() - self.assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") + self.assert_image_equal_tofile( + im, "Tests/images/tiff_16bit_RGBa_target.png") def test_gimp_tiff(self): # Read TIFF JPEG images from GIMP [@PIL168] @@ -607,7 +613,8 @@ def test_sampleformat(self): im = Image.open("Tests/images/copyleft.tiff") self.assertEqual(im.mode, 'RGB') - self.assert_image_equal_tofile(im, "Tests/images/copyleft.png", mode='RGB') + self.assert_image_equal_tofile(im, "Tests/images/copyleft.png", + mode='RGB') def test_lzw(self): im = Image.open("Tests/images/hopper_lzw.tif") diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 3d359f44512..f012fb9d824 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -20,7 +20,8 @@ def helper_save_as_pdf(self, mode, **kwargs): self.assertTrue(os.path.isfile(outfile)) self.assertGreater(os.path.getsize(outfile), 0) with PdfParser.PdfParser(outfile) as pdf: - if kwargs.get("append_images", False) or kwargs.get("append", False): + if kwargs.get("append_images", False) or \ + kwargs.get("append", False): self.assertGreater(len(pdf.pages), 1) else: self.assertGreater(len(pdf.pages), 0) @@ -116,7 +117,9 @@ def test_multiframe_normal_save(self): def test_pdf_open(self): # fail on a buffer full of null bytes - self.assertRaises(PdfParser.PdfFormatError, PdfParser.PdfParser, buf=bytearray(65536)) + self.assertRaises( + PdfParser.PdfFormatError, + PdfParser.PdfParser, buf=bytearray(65536)) # make an empty PDF object with PdfParser.PdfParser() as empty_pdf: @@ -153,7 +156,10 @@ def test_pdf_append_fails_on_nonexistent_file(self): im = hopper("RGB") temp_dir = tempfile.mkdtemp() try: - self.assertRaises(IOError, im.save, os.path.join(temp_dir, "nonexistent.pdf"), append=True) + self.assertRaises(IOError, + im.save, + os.path.join(temp_dir, "nonexistent.pdf"), + append=True) finally: os.rmdir(temp_dir) @@ -204,7 +210,8 @@ def test_pdf_append(self): # append two images mode_CMYK = hopper("CMYK") mode_P = hopper("P") - mode_CMYK.save(pdf_filename, append=True, save_all=True, append_images=[mode_P]) + mode_CMYK.save(pdf_filename, + append=True, save_all=True, append_images=[mode_P]) # open the PDF again, check pages and info again with PdfParser.PdfParser(pdf_filename) as pdf: @@ -219,7 +226,9 @@ def test_pdf_append(self): def test_pdf_info(self): # make a PDF file - pdf_filename = self.helper_save_as_pdf("RGB", title="title", author="author", subject="subject", keywords="keywords", creator="creator", producer="producer") + pdf_filename = self.helper_save_as_pdf( + "RGB", title="title", author="author", subject="subject", + keywords="keywords", creator="creator", producer="producer") # open it, check pages and info with PdfParser.PdfParser(pdf_filename) as pdf: diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index bc2b557d2a8..e9dcd52033e 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -355,7 +355,8 @@ def test_verify_ignores_crc_error(self): broken_crc_chunk_data = chunk_data[:-1] + b'q' # break CRC image_data = HEAD + broken_crc_chunk_data + TAIL - self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, BytesIO(image_data)) + self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, + BytesIO(image_data)) ImageFile.LOAD_TRUNCATED_IMAGES = True try: @@ -371,7 +372,8 @@ def test_verify_not_ignores_crc_error_in_required_chunk(self): ImageFile.LOAD_TRUNCATED_IMAGES = True try: - self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, BytesIO(image_data)) + self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, + BytesIO(image_data)) finally: ImageFile.LOAD_TRUNCATED_IMAGES = False diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index aac845e0fcf..79630c77340 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -444,7 +444,8 @@ def imGenerator(ims): for im in ims: yield im mp = io.BytesIO() - im.save(mp, format="TIFF", save_all=True, append_images=imGenerator(ims)) + im.save(mp, format="TIFF", save_all=True, + append_images=imGenerator(ims)) mp.seek(0, os.SEEK_SET) reread = Image.open(mp) diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index 4de28a95a25..f1ce44e6d74 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -16,7 +16,8 @@ def _test_font(self, font): self._test_leak(lambda: draw.text((0, 0), "some text "*1024, # ~10k font=font, fill="black")) - @unittest.skipIf(not features.check('freetype2'), "Test requires freetype2") + @unittest.skipIf(not features.check('freetype2'), + "Test requires freetype2") def test_leak(self): ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20) self._test_font(ttype) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 9cc62385645..7a9378bbde1 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -294,7 +294,8 @@ def test_embeddable(self): compiler = ccompiler.new_compiler() compiler.add_include_dir(sysconfig.get_python_inc()) - libdir = sysconfig.get_config_var('LIBDIR') or sysconfig.get_python_inc().replace('include', 'libs') + libdir = (sysconfig.get_config_var('LIBDIR') or + sysconfig.get_python_inc().replace('include', 'libs')) print(libdir) compiler.add_library_dir(libdir) objects = compiler.compile(['embed_pil.c']) diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index 11c2648bbc3..7a86a3e5484 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -15,9 +15,11 @@ def test(mode): self.assertEqual(test("L"), (3, (100, 128), '|u1', 12800)) # FIXME: wrong? - self.assertEqual(test("I"), (3, (100, 128), Image._ENDIAN + 'i4', 51200)) + self.assertEqual(test("I"), (3, (100, 128), + Image._ENDIAN + 'i4', 51200)) # FIXME: wrong? - self.assertEqual(test("F"), (3, (100, 128), Image._ENDIAN + 'f4', 51200)) + self.assertEqual(test("F"), (3, (100, 128), + Image._ENDIAN + 'f4', 51200)) self.assertEqual(test("LA"), (3, (100, 128, 2), '|u1', 25600)) self.assertEqual(test("RGB"), (3, (100, 128, 3), '|u1', 38400)) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 14e634e9cc5..ed971e69850 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -193,7 +193,8 @@ def matrix_convert(mode): if converted_im.mode == 'RGB': self.assert_image_similar(converted_im, target, 3) else: - self.assert_image_similar(converted_im, target.getchannel(0), 1) + self.assert_image_similar(converted_im, + target.getchannel(0), 1) matrix_convert('RGB') matrix_convert('L') diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index cf38c234550..3687a1a2c4b 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -288,10 +288,14 @@ def run_dirty_case(self, i, clean_pixel): def test_dirty_pixels_rgba(self): case = self.make_dirty_case('RGBA', (255, 255, 0, 128), (0, 0, 255, 0)) self.run_dirty_case(case.resize((20, 20), Image.BOX), (255, 255, 0)) - self.run_dirty_case(case.resize((20, 20), Image.BILINEAR), (255, 255, 0)) - self.run_dirty_case(case.resize((20, 20), Image.HAMMING), (255, 255, 0)) - self.run_dirty_case(case.resize((20, 20), Image.BICUBIC), (255, 255, 0)) - self.run_dirty_case(case.resize((20, 20), Image.LANCZOS), (255, 255, 0)) + self.run_dirty_case(case.resize((20, 20), Image.BILINEAR), + (255, 255, 0)) + self.run_dirty_case(case.resize((20, 20), Image.HAMMING), + (255, 255, 0)) + self.run_dirty_case(case.resize((20, 20), Image.BICUBIC), + (255, 255, 0)) + self.run_dirty_case(case.resize((20, 20), Image.LANCZOS), + (255, 255, 0)) def test_dirty_pixels_la(self): case = self.make_dirty_case('LA', (255, 128), (0, 0)) @@ -367,23 +371,28 @@ def test_nonzero_coefficients(self): im = Image.new('RGBA', (1280, 1280), (0x20, 0x40, 0x60, 0xff)) histogram = im.resize((256, 256), Image.BICUBIC).histogram() - self.assertEqual(histogram[0x100 * 0 + 0x20], 0x10000) # first channel - self.assertEqual(histogram[0x100 * 1 + 0x40], 0x10000) # second channel - self.assertEqual(histogram[0x100 * 2 + 0x60], 0x10000) # third channel - self.assertEqual(histogram[0x100 * 3 + 0xff], 0x10000) # fourth channel + # first channel + self.assertEqual(histogram[0x100 * 0 + 0x20], 0x10000) + # second channel + self.assertEqual(histogram[0x100 * 1 + 0x40], 0x10000) + # third channel + self.assertEqual(histogram[0x100 * 2 + 0x60], 0x10000) + # fourth channel + self.assertEqual(histogram[0x100 * 3 + 0xff], 0x10000) class CoreResampleBoxTest(PillowTestCase): def test_wrong_arguments(self): im = hopper() - for resample in (Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, - Image.BICUBIC, Image.LANCZOS): + for resample in (Image.NEAREST, Image.BOX, Image.BILINEAR, + Image.HAMMING, Image.BICUBIC, Image.LANCZOS): im.resize((32, 32), resample, (0, 0, im.width, im.height)) im.resize((32, 32), resample, (20, 20, im.width, im.height)) im.resize((32, 32), resample, (20, 20, 20, 100)) im.resize((32, 32), resample, (20, 20, 100, 20)) - with self.assertRaisesRegex(TypeError, "must be sequence of length 4"): + with self.assertRaisesRegex(TypeError, + "must be sequence of length 4"): im.resize((32, 32), resample, (im.width, im.height)) with self.assertRaisesRegex(ValueError, "can't be negative"): diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 8ddb5ddf854..17d394a029e 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -95,8 +95,9 @@ def test_center(self): im = hopper() self.rotate(im, im.mode, 45, center=(0, 0)) self.rotate(im, im.mode, 45, translate=(im.size[0]/2, 0)) - self.rotate(im, im.mode, 45, center=(0, 0), translate=(im.size[0]/2, 0)) - + self.rotate(im, im.mode, 45, center=(0, 0), + translate=(im.size[0]/2, 0)) + def test_rotate_no_fill(self): im = Image.new('RGB', (100, 100), 'green') target = Image.open('Tests/images/rotate_45_no_fill.png') diff --git a/Tests/test_image_toqimage.py b/Tests/test_image_toqimage.py index 6d7715c80a1..c9971cf736e 100644 --- a/Tests/test_image_toqimage.py +++ b/Tests/test_image_toqimage.py @@ -43,8 +43,9 @@ def test_sanity(self): if mode == '1': # BW appears to not save correctly on QT4 and QT5 # kicks out errors on console: - # libpng warning: Invalid color type/bit depth combination in IHDR - # libpng error: Invalid IHDR data + # libpng warning: Invalid color type/bit depth combination + # in IHDR + # libpng error: Invalid IHDR data continue # Test saving the file diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 2f470868949..1fdfe916dd8 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -286,53 +286,104 @@ def truncate_tuple(tuple_or_float): self.assertEqual(truncate_tuple(tup1), truncate_tuple(tup2)) self.assertEqual(p.attributes, 4294967296) - assert_truncated_tuple_equal(p.blue_colorant, ((0.14306640625, 0.06060791015625, 0.7140960693359375), (0.1558847490315394, 0.06603820639433387, 0.06060791015625))) - assert_truncated_tuple_equal(p.blue_primary, ((0.14306641366715667, 0.06060790921083026, 0.7140960805782015), (0.15588475410450106, 0.06603820408959558, 0.06060790921083026))) + assert_truncated_tuple_equal( + p.blue_colorant, + ((0.14306640625, 0.06060791015625, 0.7140960693359375), + (0.1558847490315394, 0.06603820639433387, 0.06060791015625))) + assert_truncated_tuple_equal( + p.blue_primary, + ((0.14306641366715667, 0.06060790921083026, 0.7140960805782015), + (0.15588475410450106, 0.06603820408959558, 0.06060790921083026))) assert_truncated_tuple_equal(p.chromatic_adaptation, (((1.04791259765625, 0.0229339599609375, -0.050201416015625), (0.02960205078125, 0.9904632568359375, -0.0170745849609375), (-0.009246826171875, 0.0150604248046875, 0.7517852783203125)), ((1.0267159024652783, 0.022470062342089134, 0.0229339599609375), (0.02951378324103937, 0.9875098886387147, 0.9904632568359375), (-0.012205438066465256, 0.01987915407854985, 0.0150604248046875)))) self.assertIsNone(p.chromaticity) - self.assertEqual(p.clut, {0: (False, False, True), 1: (False, False, True), 2: (False, False, True), 3: (False, False, True)}) + self.assertEqual(p.clut, { + 0: (False, False, True), + 1: (False, False, True), + 2: (False, False, True), + 3: (False, False, True) + }) self.assertEqual(p.color_space, 'RGB') self.assertIsNone(p.colorant_table) self.assertIsNone(p.colorant_table_out) self.assertIsNone(p.colorimetric_intent) self.assertEqual(p.connection_space, 'XYZ ') - self.assertEqual(p.copyright, 'Copyright International Color Consortium, 2009') - self.assertEqual(p.creation_date, datetime.datetime(2009, 2, 27, 21, 36, 31)) + self.assertEqual(p.copyright, + 'Copyright International Color Consortium, 2009') + self.assertEqual(p.creation_date, + datetime.datetime(2009, 2, 27, 21, 36, 31)) self.assertEqual(p.device_class, 'mntr') - assert_truncated_tuple_equal(p.green_colorant, ((0.3851470947265625, 0.7168731689453125, 0.097076416015625), (0.32119769927720654, 0.5978443449048152, 0.7168731689453125))) - assert_truncated_tuple_equal(p.green_primary, ((0.3851470888162112, 0.7168731974161346, 0.09707641738998518), (0.32119768793686687, 0.5978443567149709, 0.7168731974161346))) + assert_truncated_tuple_equal( + p.green_colorant, + ((0.3851470947265625, 0.7168731689453125, 0.097076416015625), + (0.32119769927720654, 0.5978443449048152, 0.7168731689453125))) + assert_truncated_tuple_equal( + p.green_primary, + ((0.3851470888162112, 0.7168731974161346, 0.09707641738998518), + (0.32119768793686687, 0.5978443567149709, 0.7168731974161346))) self.assertEqual(p.header_flags, 0) self.assertEqual(p.header_manufacturer, '\x00\x00\x00\x00') self.assertEqual(p.header_model, '\x00\x00\x00\x00') - self.assertEqual(p.icc_measurement_condition, {'backing': (0.0, 0.0, 0.0), 'flare': 0.0, 'geo': 'unknown', 'observer': 1, 'illuminant_type': 'D65'}) + self.assertEqual(p.icc_measurement_condition, { + 'backing': (0.0, 0.0, 0.0), + 'flare': 0.0, + 'geo': 'unknown', + 'observer': 1, + 'illuminant_type': 'D65' + }) self.assertEqual(p.icc_version, 33554432) self.assertIsNone(p.icc_viewing_condition) - self.assertEqual(p.intent_supported, {0: (True, True, True), 1: (True, True, True), 2: (True, True, True), 3: (True, True, True)}) + self.assertEqual(p.intent_supported, { + 0: (True, True, True), + 1: (True, True, True), + 2: (True, True, True), + 3: (True, True, True) + }) self.assertTrue(p.is_matrix_shaper) self.assertEqual(p.luminance, ((0.0, 80.0, 0.0), (0.0, 1.0, 80.0))) self.assertIsNone(p.manufacturer) - assert_truncated_tuple_equal(p.media_black_point, ((0.012054443359375, 0.0124969482421875, 0.01031494140625), (0.34573304157549234, 0.35842450765864337, 0.0124969482421875))) - assert_truncated_tuple_equal(p.media_white_point, ((0.964202880859375, 1.0, 0.8249053955078125), (0.3457029219802284, 0.3585375327567059, 1.0))) - assert_truncated_tuple_equal((p.media_white_point_temperature,), (5000.722328847392,)) - self.assertEqual(p.model, 'IEC 61966-2-1 Default RGB Colour Space - sRGB') + assert_truncated_tuple_equal( + p.media_black_point, + ((0.012054443359375, 0.0124969482421875, 0.01031494140625), + (0.34573304157549234, 0.35842450765864337, 0.0124969482421875))) + assert_truncated_tuple_equal( + p.media_white_point, + ((0.964202880859375, 1.0, 0.8249053955078125), + (0.3457029219802284, 0.3585375327567059, 1.0))) + assert_truncated_tuple_equal( + (p.media_white_point_temperature,), + (5000.722328847392,)) + self.assertEqual(p.model, + 'IEC 61966-2-1 Default RGB Colour Space - sRGB') self.assertEqual(p.pcs, 'XYZ') self.assertIsNone(p.perceptual_rendering_intent_gamut) - self.assertEqual(p.product_copyright, 'Copyright International Color Consortium, 2009') + self.assertEqual(p.product_copyright, + 'Copyright International Color Consortium, 2009') self.assertEqual(p.product_desc, 'sRGB IEC61966-2-1 black scaled') - self.assertEqual(p.product_description, 'sRGB IEC61966-2-1 black scaled') + self.assertEqual(p.product_description, + 'sRGB IEC61966-2-1 black scaled') self.assertEqual(p.product_manufacturer, '') - self.assertEqual(p.product_model, 'IEC 61966-2-1 Default RGB Colour Space - sRGB') - self.assertEqual(p.profile_description, 'sRGB IEC61966-2-1 black scaled') - self.assertEqual(p.profile_id, b')\xf8=\xde\xaf\xf2U\xaexB\xfa\xe4\xca\x839\r') - assert_truncated_tuple_equal(p.red_colorant, ((0.436065673828125, 0.2224884033203125, 0.013916015625), (0.6484536316398539, 0.3308524880306778, 0.2224884033203125))) - assert_truncated_tuple_equal(p.red_primary, ((0.43606566581047446, 0.22248840582960838, 0.013916015621759925), (0.6484536250319214, 0.3308524944738204, 0.22248840582960838))) + self.assertEqual( + p.product_model, 'IEC 61966-2-1 Default RGB Colour Space - sRGB') + self.assertEqual( + p.profile_description, 'sRGB IEC61966-2-1 black scaled') + self.assertEqual( + p.profile_id, b')\xf8=\xde\xaf\xf2U\xaexB\xfa\xe4\xca\x839\r') + assert_truncated_tuple_equal( + p.red_colorant, + ((0.436065673828125, 0.2224884033203125, 0.013916015625), + (0.6484536316398539, 0.3308524880306778, 0.2224884033203125))) + assert_truncated_tuple_equal( + p.red_primary, + ((0.43606566581047446, 0.22248840582960838, 0.013916015621759925), + (0.6484536250319214, 0.3308524944738204, 0.22248840582960838))) self.assertEqual(p.rendering_intent, 0) self.assertIsNone(p.saturation_rendering_intent_gamut) self.assertIsNone(p.screening_description) self.assertIsNone(p.target) self.assertEqual(p.technology, 'CRT ') self.assertEqual(p.version, 2.0) - self.assertEqual(p.viewing_condition, 'Reference Viewing Condition in IEC 61966-2-1') + self.assertEqual(p.viewing_condition, + 'Reference Viewing Condition in IEC 61966-2-1') self.assertEqual(p.xcolor_space, 'RGB ') def test_profile_typesafety(self): @@ -346,7 +397,8 @@ def test_profile_typesafety(self): with self.assertRaises(TypeError): ImageCms.ImageCmsProfile(1).tobytes() - def assert_aux_channel_preserved(self, mode, transform_in_place, preserved_channel): + def assert_aux_channel_preserved(self, mode, + transform_in_place, preserved_channel): def create_test_image(): # set up test image with something interesting in the tested aux # channel. @@ -379,29 +431,35 @@ def create_test_image(): # create some transform, it doesn't matter which one source_profile = ImageCms.createProfile("sRGB") destination_profile = ImageCms.createProfile("sRGB") - t = ImageCms.buildTransform(source_profile, destination_profile, inMode=mode, outMode=mode) + t = ImageCms.buildTransform( + source_profile, destination_profile, inMode=mode, outMode=mode) # apply transform if transform_in_place: ImageCms.applyTransform(source_image, t, inPlace=True) result_image = source_image else: - result_image = ImageCms.applyTransform(source_image, t, inPlace=False) + result_image = ImageCms.applyTransform( + source_image, t, inPlace=False) result_image_aux = result_image.getchannel(preserved_channel) self.assert_image_equal(source_image_aux, result_image_aux) def test_preserve_auxiliary_channels_rgba(self): - self.assert_aux_channel_preserved(mode='RGBA', transform_in_place=False, preserved_channel='A') + self.assert_aux_channel_preserved(mode='RGBA', + transform_in_place=False, preserved_channel='A') def test_preserve_auxiliary_channels_rgba_in_place(self): - self.assert_aux_channel_preserved(mode='RGBA', transform_in_place=True, preserved_channel='A') + self.assert_aux_channel_preserved(mode='RGBA', + transform_in_place=True, preserved_channel='A') def test_preserve_auxiliary_channels_rgbx(self): - self.assert_aux_channel_preserved(mode='RGBX', transform_in_place=False, preserved_channel='X') + self.assert_aux_channel_preserved(mode='RGBX', + transform_in_place=False, preserved_channel='X') def test_preserve_auxiliary_channels_rgbx_in_place(self): - self.assert_aux_channel_preserved(mode='RGBX', transform_in_place=True, preserved_channel='X') + self.assert_aux_channel_preserved(mode='RGBX', + transform_in_place=True, preserved_channel='X') def test_auxiliary_channels_isolated(self): # test data in aux channels does not affect non-aux channels @@ -422,20 +480,29 @@ def test_auxiliary_channels_isolated(self): source_profile = ImageCms.createProfile(src_format[1]) destination_profile = ImageCms.createProfile(dst_format[1]) source_image = src_format[3] - test_transform = ImageCms.buildTransform(source_profile, destination_profile, inMode=src_format[0], outMode=dst_format[0]) + test_transform = ImageCms.buildTransform( + source_profile, destination_profile, + inMode=src_format[0], outMode=dst_format[0]) # test conversion from aux-ful source if transform_in_place: test_image = source_image.copy() - ImageCms.applyTransform(test_image, test_transform, inPlace=True) + ImageCms.applyTransform( + test_image, test_transform, inPlace=True) else: - test_image = ImageCms.applyTransform(source_image, test_transform, inPlace=False) + test_image = ImageCms.applyTransform( + source_image, test_transform, inPlace=False) # reference conversion from aux-less source - reference_transform = ImageCms.buildTransform(source_profile, destination_profile, inMode=src_format[2], outMode=dst_format[2]) - reference_image = ImageCms.applyTransform(source_image.convert(src_format[2]), reference_transform) - - self.assert_image_equal(test_image.convert(dst_format[2]), reference_image) + reference_transform = ImageCms.buildTransform( + source_profile, destination_profile, + inMode=src_format[2], outMode=dst_format[2]) + reference_image = ImageCms.applyTransform( + source_image.convert(src_format[2]), + reference_transform) + + self.assert_image_equal(test_image.convert(dst_format[2]), + reference_image) if __name__ == '__main__': diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py index 0aac212784e..1ea37544b4d 100644 --- a/Tests/test_imagecolor.py +++ b/Tests/test_imagecolor.py @@ -31,7 +31,8 @@ def test_hash(self): # case insensitivity self.assertEqual(ImageColor.getrgb("#DEF"), ImageColor.getrgb("#def")) - self.assertEqual(ImageColor.getrgb("#CDEF"), ImageColor.getrgb("#cdef")) + self.assertEqual(ImageColor.getrgb("#CDEF"), + ImageColor.getrgb("#cdef")) self.assertEqual(ImageColor.getrgb("#DEFDEF"), ImageColor.getrgb("#defdef")) self.assertEqual(ImageColor.getrgb("#CDEFCDEF"), @@ -80,18 +81,23 @@ def test_functions(self): self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(0,100%,100%)")) self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(360,100%,100%)")) - self.assertEqual((0, 255, 255), ImageColor.getrgb("hsv(180,100%,100%)")) + self.assertEqual((0, 255, 255), + ImageColor.getrgb("hsv(180,100%,100%)")) # alternate format self.assertEqual(ImageColor.getrgb("hsb(0,100%,50%)"), ImageColor.getrgb("hsv(0,100%,50%)")) # floats - self.assertEqual((254, 3, 3), ImageColor.getrgb("hsl(0.1,99.2%,50.3%)")) - self.assertEqual((255, 0, 0), ImageColor.getrgb("hsl(360.,100.0%,50%)")) + self.assertEqual((254, 3, 3), + ImageColor.getrgb("hsl(0.1,99.2%,50.3%)")) + self.assertEqual((255, 0, 0), + ImageColor.getrgb("hsl(360.,100.0%,50%)")) - self.assertEqual((253, 2, 2), ImageColor.getrgb("hsv(0.1,99.2%,99.3%)")) - self.assertEqual((255, 0, 0), ImageColor.getrgb("hsv(360.,100.0%,100%)")) + self.assertEqual((253, 2, 2), + ImageColor.getrgb("hsv(0.1,99.2%,99.3%)")) + self.assertEqual((255, 0, 0), + ImageColor.getrgb("hsv(360.,100.0%,100%)")) # case insensitivity self.assertEqual(ImageColor.getrgb("RGB(255,0,0)"), diff --git a/Tests/test_imageenhance.py b/Tests/test_imageenhance.py index e9727613b60..54288f4db7d 100644 --- a/Tests/test_imageenhance.py +++ b/Tests/test_imageenhance.py @@ -45,8 +45,9 @@ def test_alpha(self): for op in ['Color', 'Brightness', 'Contrast', 'Sharpness']: for amount in [0, 0.5, 1.0]: - self._check_alpha(getattr(ImageEnhance, op)(original).enhance(amount), - original, op, amount) + self._check_alpha( + getattr(ImageEnhance, op)(original).enhance(amount), + original, op, amount) if __name__ == '__main__': diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 4b750af0dc4..837e81d309b 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -215,12 +215,16 @@ def test_oversize(self): buf = BytesIO(b'\x00'*255) im = MockImageFile(buf) - im.tile = [("MOCK", (xoff, yoff, xoff+xsize + 100, yoff+ysize), 32, None)] + im.tile = [ + ("MOCK", (xoff, yoff, xoff+xsize + 100, yoff+ysize), 32, None) + ] d = self.get_decoder() self.assertRaises(ValueError, im.load) - im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] + im.tile = [ + ("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None) + ] self.assertRaises(ValueError, im.load) def test_no_format(self): diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index e333346e97b..f2116bdc46a 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -67,8 +67,11 @@ class TestImageFont(PillowTestCase): } def setUp(self): - freetype_version = tuple(ImageFont.core.freetype2_version.split('.'))[:2] - self.metrics = self.METRICS.get(freetype_version, self.METRICS['Default']) + freetype_version = tuple( + ImageFont.core.freetype2_version.split('.') + )[:2] + self.metrics = self.METRICS.get(freetype_version, + self.METRICS['Default']) def get_font(self): return ImageFont.truetype(FONT_PATH, FONT_SIZE, @@ -202,7 +205,8 @@ def test_render_multiline_text(self): target_img = Image.open(target) # Epsilon ~.5 fails with FreeType 2.7 - self.assert_image_similar(im, target_img, self.metrics['multiline']) + self.assert_image_similar(im, target_img, + self.metrics['multiline']) def test_unknown_align(self): im = Image.new(mode='RGB', size=(300, 100)) @@ -427,7 +431,8 @@ def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) with SimplePatcher(ImageFont, '_FreeTypeFont', free_type_font): - def loadable_font(filepath, size, index, encoding, *args, **kwargs): + def loadable_font(filepath, size, index, encoding, + *args, **kwargs): if filepath == path_to_fake: return ImageFont._FreeTypeFont(FONT_PATH, size, index, encoding, *args, **kwargs) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index bee415fd7e9..8376728a24f 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -19,7 +19,8 @@ def test_similar(self): font='Tests/fonts/DejaVuSans-bitmap.ttf', size=24) size_outline = font_outline.getsize(text) size_bitmap = font_bitmap.getsize(text) - size_final = max(size_outline[0], size_bitmap[0]), max(size_outline[1], size_bitmap[1]) + size_final = (max(size_outline[0], size_bitmap[0]), + max(size_outline[1], size_bitmap[1])) im_bitmap = Image.new('RGB', size_final, (255, 255, 255)) im_outline = im_bitmap.copy() draw_bitmap = ImageDraw.Draw(im_bitmap) diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 489ed40b501..04432b14f34 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -30,7 +30,8 @@ def test_complex_text(self): self.assert_image_similar(im, target_img, .5) def test_y_offset(self): - ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", FONT_SIZE) + ttf = ImageFont.truetype("Tests/fonts/NotoNastaliqUrdu-Regular.ttf", + FONT_SIZE) im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) @@ -70,7 +71,8 @@ def test_text_direction_ltr(self): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'سلطنة عمان Oman', font=ttf, fill=500, direction='ltr') + draw.text((0, 0), 'سلطنة عمان Oman', + font=ttf, fill=500, direction='ltr') target = 'Tests/images/test_direction_ltr.png' target_img = Image.open(target) @@ -82,7 +84,8 @@ def test_text_direction_rtl2(self): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'Oman سلطنة عمان', font=ttf, fill=500, direction='rtl') + draw.text((0, 0), 'Oman سلطنة عمان', + font=ttf, fill=500, direction='rtl') target = 'Tests/images/test_direction_ltr.png' target_img = Image.open(target) @@ -120,7 +123,8 @@ def test_arabictext_features(self): im = Image.new(mode='RGB', size=(300, 100)) draw = ImageDraw.Draw(im) - draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, features=['-fina', '-init', '-medi']) + draw.text((0, 0), 'اللغة العربية', font=ttf, fill=500, + features=['-fina', '-init', '-medi']) target = 'Tests/images/test_arabictext_features.png' target_img = Image.open(target) diff --git a/Tests/test_imagemorph.py b/Tests/test_imagemorph.py index 83fa0b5a913..dceadebf49c 100644 --- a/Tests/test_imagemorph.py +++ b/Tests/test_imagemorph.py @@ -265,8 +265,9 @@ def test_pattern_syntax_error(self): # Act / Assert with self.assertRaises(Exception) as e: lb.build_lut() - self.assertEqual(str(e.exception), - 'Syntax error in pattern "a pattern with a syntax error"') + self.assertEqual( + str(e.exception), + 'Syntax error in pattern "a pattern with a syntax error"') def test_load_invalid_mrl(self): # Arrange diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 89c8e297f96..e0fcf264adb 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -34,7 +34,8 @@ def test_1(self): self.assert_pack("1", "1;R", b'\xaa', 0, X, 0, X, 0, X, 0, X) self.assert_pack("1", "1;IR", b'\xaa', X, 0, X, 0, X, 0, X, 0) - self.assert_pack("1", "L", b'\xff\x00\x00\xff\x00\x00', X, 0, 0, X, 0, 0) + self.assert_pack( + "1", "L", b'\xff\x00\x00\xff\x00\x00', X, 0, 0, X, 0, 0) def test_L(self): self.assert_pack("L", "L", 1, 1, 2, 3, 4) @@ -80,8 +81,10 @@ def test_RGBA(self): "RGBA", "RGBA", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack( "RGBA", "RGBA;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) - self.assert_pack("RGBA", "RGB", 3, (1, 2, 3, 14), (4, 5, 6, 15), (7, 8, 9, 16)) - self.assert_pack("RGBA", "BGR", 3, (3, 2, 1, 14), (6, 5, 4, 15), (9, 8, 7, 16)) + self.assert_pack( + "RGBA", "RGB", 3, (1, 2, 3, 14), (4, 5, 6, 15), (7, 8, 9, 16)) + self.assert_pack( + "RGBA", "BGR", 3, (3, 2, 1, 14), (6, 5, 4, 15), (9, 8, 7, 16)) self.assert_pack( "RGBA", "BGRA", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) @@ -90,10 +93,14 @@ def test_RGBA(self): self.assert_pack( "RGBA", "BGRa", 4, (191, 127, 63, 4), (223, 191, 159, 8), (233, 212, 191, 12)) - self.assert_pack("RGBA", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) - self.assert_pack("RGBA", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) - self.assert_pack("RGBA", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) - self.assert_pack("RGBA", "A", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) + self.assert_pack( + "RGBA", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack( + "RGBA", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack( + "RGBA", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) + self.assert_pack( + "RGBA", "A", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_RGBa(self): self.assert_pack( @@ -104,10 +111,14 @@ def test_RGBa(self): "RGBa", "aBGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): - self.assert_pack("RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_pack("RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) - self.assert_pack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) - self.assert_pack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) + self.assert_pack( + "RGBX", "RGBX", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_pack( + "RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) + self.assert_pack( + "RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) + self.assert_pack( + "RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) self.assert_pack( "RGBX", "BGRX", b'\x01\x02\x03\x00\x05\x06\x07\x00\t\n\x0b\x00', @@ -116,23 +127,30 @@ def test_RGBX(self): "RGBX", "XBGR", b'\x00\x02\x03\x04\x00\x06\x07\x08\x00\n\x0b\x0c', (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) - self.assert_pack("RGBX", "R", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) - self.assert_pack("RGBX", "G", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) - self.assert_pack("RGBX", "B", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) - self.assert_pack("RGBX", "X", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) + self.assert_pack("RGBX", "R", 1, + (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack("RGBX", "G", 1, + (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack("RGBX", "B", 1, + (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) + self.assert_pack("RGBX", "X", 1, + (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_CMYK(self): - self.assert_pack("CMYK", "CMYK", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_pack("CMYK", "CMYK", 4, + (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) self.assert_pack( "CMYK", "CMYK;I", 4, (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) self.assert_pack( "CMYK", "CMYK;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) - self.assert_pack("CMYK", "K", 1, (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) + self.assert_pack("CMYK", "K", 1, + (6, 7, 0, 1), (6, 7, 0, 2), (0, 7, 0, 3)) def test_YCbCr(self): self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) - self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_pack("YCbCr", "YCbCr;L", 3, + (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_pack( "YCbCr", "YCbCrX", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', @@ -141,9 +159,12 @@ def test_YCbCr(self): "YCbCr", "YCbCrK", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_pack("YCbCr", "Y", 1, (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) - self.assert_pack("YCbCr", "Cb", 1, (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) - self.assert_pack("YCbCr", "Cr", 1, (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) + self.assert_pack("YCbCr", "Y", 1, + (1, 0, 8, 9), (2, 0, 8, 9), (3, 0, 8, 0)) + self.assert_pack("YCbCr", "Cb", 1, + (6, 1, 8, 9), (6, 2, 8, 9), (6, 3, 8, 9)) + self.assert_pack("YCbCr", "Cr", 1, + (6, 7, 1, 9), (6, 7, 2, 0), (6, 7, 3, 9)) def test_LAB(self): self.assert_pack( @@ -269,8 +290,10 @@ def test_RGB(self): self.assert_unpack("RGB", "RGBX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) self.assert_unpack("RGB", "RGBX;L", 4, (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_unpack("RGB", "BGRX", 4, (3, 2, 1), (7, 6, 5), (11, 10, 9)) - self.assert_unpack("RGB", "XRGB", 4, (2, 3, 4), (6, 7, 8), (10, 11, 12)) - self.assert_unpack("RGB", "XBGR", 4, (4, 3, 2), (8, 7, 6), (12, 11, 10)) + self.assert_unpack( + "RGB", "XRGB", 4, (2, 3, 4), (6, 7, 8), (10, 11, 12)) + self.assert_unpack( + "RGB", "XBGR", 4, (4, 3, 2), (8, 7, 6), (12, 11, 10)) self.assert_unpack( "RGB", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data @@ -280,7 +303,8 @@ def test_RGB(self): self.assert_unpack("RGB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) 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( + "RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6)) self.assert_unpack( "RGBA", "LA;16B", 4, (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) self.assert_unpack( @@ -322,9 +346,12 @@ def test_RGBA(self): "RGBA", "RGBA;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) self.assert_unpack("RGBA", "RGBA;15", 2, (8, 131, 0, 0), (24, 0, 8, 0)) self.assert_unpack("RGBA", "BGRA;15", 2, (0, 131, 8, 0), (8, 0, 24, 0)) - self.assert_unpack("RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0)) - self.assert_unpack("RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) - self.assert_unpack("RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) + self.assert_unpack( + "RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0)) + self.assert_unpack( + "RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) + self.assert_unpack( + "RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) self.assert_unpack( "RGBA", "BGRA", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)) self.assert_unpack( @@ -335,10 +362,14 @@ def test_RGBA(self): "RGBA", "YCCA;P", b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data (0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17)) - self.assert_unpack("RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) - self.assert_unpack("RGBA", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) - 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", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack( + "RGBA", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + 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)) def test_RGBa(self): self.assert_unpack( @@ -351,10 +382,13 @@ def test_RGBa(self): "RGBa", "aBGR", 4, (4, 3, 2, 1), (8, 7, 6, 5), (12, 11, 10, 9)) def test_RGBX(self): - self.assert_unpack("RGBX", "RGB", 3, (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) - self.assert_unpack("RGBX", "RGB;L", 3, (1, 4, 7, X), (2, 5, 8, X), (3, 6, 9, X)) + self.assert_unpack("RGBX", "RGB", 3, + (1, 2, 3, X), (4, 5, 6, X), (7, 8, 9, X)) + self.assert_unpack("RGBX", "RGB;L", 3, + (1, 4, 7, X), (2, 5, 8, X), (3, 6, 9, X)) self.assert_unpack("RGBX", "RGB;16B", 6, (1, 3, 5, X), (7, 9, 11, X)) - self.assert_unpack("RGBX", "BGR", 3, (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) + self.assert_unpack("RGBX", "BGR", 3, + (3, 2, 1, X), (6, 5, 4, X), (9, 8, 7, X)) self.assert_unpack("RGBX", "RGB;15", 2, (8, 131, 0, X), (24, 0, 8, X)) self.assert_unpack("RGBX", "BGR;15", 2, (0, 131, 8, X), (8, 0, 24, X)) self.assert_unpack("RGBX", "RGB;4B", 2, (17, 0, 34, X), (51, 0, 68, X)) @@ -366,19 +400,28 @@ def test_RGBX(self): "RGBX", "RGBXXX", 6, (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) self.assert_unpack( "RGBX", "RGBX;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) - self.assert_unpack("RGBX", "RGBX;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16)) - self.assert_unpack("RGBX", "RGBX;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15)) - self.assert_unpack("RGBX", "BGRX", 4, (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) - self.assert_unpack("RGBX", "XRGB", 4, (2, 3, 4, X), (6, 7, 8, X), (10, 11, 12, X)) - self.assert_unpack("RGBX", "XBGR", 4, (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) + self.assert_unpack("RGBX", "RGBX;16L", 8, + (2, 4, 6, 8), (10, 12, 14, 16)) + self.assert_unpack("RGBX", "RGBX;16B", 8, + (1, 3, 5, 7), (9, 11, 13, 15)) + self.assert_unpack("RGBX", "BGRX", 4, + (3, 2, 1, X), (7, 6, 5, X), (11, 10, 9, X)) + self.assert_unpack("RGBX", "XRGB", 4, + (2, 3, 4, X), (6, 7, 8, X), (10, 11, 12, X)) + self.assert_unpack("RGBX", "XBGR", 4, + (4, 3, 2, X), (8, 7, 6, X), (12, 11, 10, X)) self.assert_unpack( "RGBX", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data (127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X)) - self.assert_unpack("RGBX", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) - self.assert_unpack("RGBX", "G", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) - self.assert_unpack("RGBX", "B", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) - self.assert_unpack("RGBX", "X", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) + self.assert_unpack("RGBX", "R", 1, + (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack("RGBX", "G", 1, + (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + self.assert_unpack("RGBX", "B", 1, + (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) + self.assert_unpack("RGBX", "X", 1, + (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) def test_CMYK(self): self.assert_unpack( @@ -392,10 +435,14 @@ def test_CMYK(self): (254, 253, 252, 251), (250, 249, 248, 247), (246, 245, 244, 243)) self.assert_unpack( "CMYK", "CMYK;L", 4, (1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)) - self.assert_unpack("CMYK", "C", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) - self.assert_unpack("CMYK", "M", 1, (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) - self.assert_unpack("CMYK", "Y", 1, (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) - self.assert_unpack("CMYK", "K", 1, (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) + self.assert_unpack("CMYK", "C", 1, + (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) + self.assert_unpack("CMYK", "M", 1, + (0, 1, 0, 0), (0, 2, 0, 0), (0, 3, 0, 0)) + self.assert_unpack("CMYK", "Y", 1, + (0, 0, 1, 0), (0, 0, 2, 0), (0, 0, 3, 0)) + self.assert_unpack("CMYK", "K", 1, + (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)) self.assert_unpack( "CMYK", "C;I", 1, (254, 0, 0, 0), (253, 0, 0, 0), (252, 0, 0, 0)) self.assert_unpack( @@ -451,7 +498,8 @@ def test_I(self): if sys.byteorder == 'little': self.assert_unpack("I", "I", 4, 0x04030201, 0x08070605) self.assert_unpack("I", "I;16N", 2, 0x0201, 0x0403) - self.assert_unpack("I", "I;16NS", b'\x83\x01\x01\x83', 0x0183, -31999) + self.assert_unpack("I", "I;16NS", + b'\x83\x01\x01\x83', 0x0183, -31999) self.assert_unpack("I", "I;32N", 4, 0x04030201, 0x08070605) self.assert_unpack( "I", "I;32NS", @@ -459,7 +507,8 @@ def test_I(self): else: self.assert_unpack("I", "I", 4, 0x01020304, 0x05060708) self.assert_unpack("I", "I;16N", 2, 0x0102, 0x0304) - self.assert_unpack("I", "I;16NS", b'\x83\x01\x01\x83', -31999, 0x0183) + self.assert_unpack("I", "I;16NS", + b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("I", "I;32N", 4, 0x01020304, 0x05060708) self.assert_unpack( "I", "I;32NS", @@ -483,14 +532,18 @@ def test_F_int(self): if sys.byteorder == 'little': self.assert_unpack("F", "F;16N", 2, 0x0201, 0x0403) - self.assert_unpack("F", "F;16NS", b'\x83\x01\x01\x83', 0x0183, -31999) + self.assert_unpack( + "F", "F;16NS", + b'\x83\x01\x01\x83', 0x0183, -31999) self.assert_unpack("F", "F;32N", 4, 67305984, 134678016) self.assert_unpack( "F", "F;32NS", b'\x83\x00\x00\x01\x01\x00\x00\x83', 16777348, -2097152000) else: self.assert_unpack("F", "F;16N", 2, 0x0102, 0x0304) - self.assert_unpack("F", "F;16NS", b'\x83\x01\x01\x83', -31999, 0x0183) + self.assert_unpack( + "F", "F;16NS", + b'\x83\x01\x01\x83', -31999, 0x0183) self.assert_unpack("F", "F;32N", 4, 0x01020304, 0x05060708) self.assert_unpack( "F", "F;32NS", diff --git a/Tests/test_map.py b/Tests/test_map.py index 14bd835a209..8e3916d273c 100644 --- a/Tests/test_map.py +++ b/Tests/test_map.py @@ -4,7 +4,8 @@ from PIL import Image -@unittest.skipIf(sys.platform.startswith('win32'), "Win32 does not call map_buffer") +@unittest.skipIf(sys.platform.startswith('win32'), + "Win32 does not call map_buffer") class TestMap(PillowTestCase): def test_overflow(self): # There is the potential to overflow comparisons in map.c diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 1501e54bbc3..4efcd2c51f4 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -124,7 +124,9 @@ def test_1bit(self): def test_save_tiff_uint16(self): # Tests that we're getting the pixel value in the right byte order. pixel_value = 0x1234 - a = numpy.array([pixel_value] * TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1], dtype=numpy.uint16) + a = numpy.array( + [pixel_value] * TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1], + dtype=numpy.uint16) a.shape = TEST_IMAGE_SIZE img = Image.fromarray(a) diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index db97c97dda4..42c8135205a 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase -from PIL.PdfParser import IndirectObjectDef, IndirectReference, PdfBinary, PdfDict, PdfFormatError, PdfName, PdfParser, PdfStream, decode_text, encode_text, pdf_repr +from PIL.PdfParser import IndirectObjectDef, IndirectReference, PdfBinary, \ + PdfDict, PdfFormatError, PdfName, PdfParser, \ + PdfStream, decode_text, encode_text, pdf_repr class TestPdfParser(PillowTestCase): @@ -22,23 +24,35 @@ def test_indirect_refs(self): self.assertNotEqual(IndirectObjectDef(1, 2), (1, 2)) def test_parsing(self): - self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"), b"Name#Hash") + self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"), + b"Name#Hash") self.assertEqual(PdfParser.interpret_name(b"Name#23Hash", as_text=True), "Name#Hash") - self.assertEqual(PdfParser.get_value(b"1 2 R ", 0), (IndirectReference(1, 2), 5)) + self.assertEqual(PdfParser.get_value(b"1 2 R ", 0), + (IndirectReference(1, 2), 5)) self.assertEqual(PdfParser.get_value(b"true[", 0), (True, 4)) self.assertEqual(PdfParser.get_value(b"false%", 0), (False, 5)) self.assertEqual(PdfParser.get_value(b"null<", 0), (None, 4)) - self.assertEqual(PdfParser.get_value(b"%cmt\n %cmt\n 123\n", 0), (123, 15)) - self.assertEqual(PdfParser.get_value(b"<901FA3>", 0), (b"\x90\x1F\xA3", 8)) - self.assertEqual(PdfParser.get_value(b"asd < 9 0 1 f A > qwe", 3), (b"\x90\x1F\xA0", 17)) + self.assertEqual(PdfParser.get_value(b"%cmt\n %cmt\n 123\n", 0), + (123, 15)) + self.assertEqual(PdfParser.get_value(b"<901FA3>", 0), + (b"\x90\x1F\xA3", 8)) + self.assertEqual(PdfParser.get_value(b"asd < 9 0 1 f A > qwe", 3), + (b"\x90\x1F\xA0", 17)) self.assertEqual(PdfParser.get_value(b"(asd)", 0), (b"asd", 5)) - self.assertEqual(PdfParser.get_value(b"(asd(qwe)zxc)zzz(aaa)", 0), (b"asd(qwe)zxc", 13)) - self.assertEqual(PdfParser.get_value(b"(Two \\\nwords.)", 0), (b"Two words.", 14)) - self.assertEqual(PdfParser.get_value(b"(Two\nlines.)", 0), (b"Two\nlines.", 12)) - self.assertEqual(PdfParser.get_value(b"(Two\r\nlines.)", 0), (b"Two\nlines.", 13)) - self.assertEqual(PdfParser.get_value(b"(Two\\nlines.)", 0), (b"Two\nlines.", 13)) - self.assertEqual(PdfParser.get_value(b"(One\\(paren).", 0), (b"One(paren", 12)) - self.assertEqual(PdfParser.get_value(b"(One\\)paren).", 0), (b"One)paren", 12)) + self.assertEqual(PdfParser.get_value(b"(asd(qwe)zxc)zzz(aaa)", 0), + (b"asd(qwe)zxc", 13)) + self.assertEqual(PdfParser.get_value(b"(Two \\\nwords.)", 0), + (b"Two words.", 14)) + self.assertEqual(PdfParser.get_value(b"(Two\nlines.)", 0), + (b"Two\nlines.", 12)) + self.assertEqual(PdfParser.get_value(b"(Two\r\nlines.)", 0), + (b"Two\nlines.", 13)) + self.assertEqual(PdfParser.get_value(b"(Two\\nlines.)", 0), + (b"Two\nlines.", 13)) + self.assertEqual(PdfParser.get_value(b"(One\\(paren).", 0), + (b"One(paren", 12)) + self.assertEqual(PdfParser.get_value(b"(One\\)paren).", 0), + (b"One)paren", 12)) self.assertEqual(PdfParser.get_value(b"(\\0053)", 0), (b"\x053", 7)) self.assertEqual(PdfParser.get_value(b"(\\053)", 0), (b"\x2B", 6)) self.assertEqual(PdfParser.get_value(b"(\\53)", 0), (b"\x2B", 5)) @@ -65,23 +79,30 @@ def test_parsing(self): def test_pdf_repr(self): self.assertEqual(bytes(IndirectReference(1, 2)), b"1 2 R") - self.assertEqual(bytes(IndirectObjectDef(*IndirectReference(1, 2))), b"1 2 obj") + self.assertEqual(bytes(IndirectObjectDef(*IndirectReference(1, 2))), + b"1 2 obj") self.assertEqual(bytes(PdfName(b"Name#Hash")), b"/Name#23Hash") self.assertEqual(bytes(PdfName("Name#Hash")), b"/Name#23Hash") - self.assertEqual(bytes(PdfDict({b"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") - self.assertEqual(bytes(PdfDict({"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(bytes(PdfDict({b"Name": IndirectReference(1, 2)})), + b"<<\n/Name 1 2 R\n>>") + self.assertEqual(bytes(PdfDict({"Name": IndirectReference(1, 2)})), + b"<<\n/Name 1 2 R\n>>") self.assertEqual(pdf_repr(IndirectReference(1, 2)), b"1 2 R") - self.assertEqual(pdf_repr(IndirectObjectDef(*IndirectReference(1, 2))), b"1 2 obj") + self.assertEqual(pdf_repr(IndirectObjectDef(*IndirectReference(1, 2))), + b"1 2 obj") self.assertEqual(pdf_repr(PdfName(b"Name#Hash")), b"/Name#23Hash") self.assertEqual(pdf_repr(PdfName("Name#Hash")), b"/Name#23Hash") - self.assertEqual(pdf_repr(PdfDict({b"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") - self.assertEqual(pdf_repr(PdfDict({"Name": IndirectReference(1, 2)})), b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(PdfDict({b"Name": IndirectReference(1, 2)})), + b"<<\n/Name 1 2 R\n>>") + self.assertEqual(pdf_repr(PdfDict({"Name": IndirectReference(1, 2)})), + b"<<\n/Name 1 2 R\n>>") self.assertEqual(pdf_repr(123), b"123") self.assertEqual(pdf_repr(True), b"true") self.assertEqual(pdf_repr(False), b"false") self.assertEqual(pdf_repr(None), b"null") self.assertEqual(pdf_repr(b"a)/b\\(c"), br"(a\)/b\\\(c)") - self.assertEqual(pdf_repr([123, True, {"a": PdfName(b"b")}]), b"[ 123 true <<\n/a /b\n>> ]") + self.assertEqual(pdf_repr([123, True, {"a": PdfName(b"b")}]), + b"[ 123 true <<\n/a /b\n>> ]") self.assertEqual(pdf_repr(PdfBinary(b"\x90\x1F\xA0")), b"<901FA0>") diff --git a/setup.py b/setup.py index 761d552cccf..9529787f92b 100755 --- a/setup.py +++ b/setup.py @@ -424,7 +424,8 @@ def build_extensions(self): best_path = None for name in os.listdir(program_files): if name.startswith('OpenJPEG '): - version = tuple(int(x) for x in name[9:].strip().split('.')) + version = tuple(int(x) for x in + name[9:].strip().split('.')) if version > best_version: best_version = version best_path = os.path.join(program_files, name) @@ -501,7 +502,8 @@ def build_extensions(self): # possible. _add_directory(self.compiler.include_dirs, best_path, 0) feature.jpeg2000 = 'openjp2' - feature.openjpeg_version = '.'.join(str(x) for x in best_version) + feature.openjpeg_version = '.'.join(str(x) for x in + best_version) if feature.want('imagequant'): _dbg('Looking for imagequant') @@ -516,7 +518,8 @@ def build_extensions(self): if _find_include_file(self, 'tiff.h'): if _find_library_file(self, "tiff"): feature.tiff = "tiff" - if sys.platform == "win32" and _find_library_file(self, "libtiff"): + if (sys.platform == "win32" and + _find_library_file(self, "libtiff")): feature.tiff = "libtiff" if (sys.platform == "darwin" and _find_library_file(self, "libtiff")): @@ -528,14 +531,16 @@ def build_extensions(self): # look for freetype2 include files freetype_version = 0 for subdir in self.compiler.include_dirs: - _dbg('Checking for include file %s in %s', ("ft2build.h", subdir)) + _dbg('Checking for include file %s in %s', + ("ft2build.h", subdir)) if os.path.isfile(os.path.join(subdir, "ft2build.h")): _dbg('Found %s in %s', ("ft2build.h", subdir)) freetype_version = 21 subdir = os.path.join(subdir, "freetype2") break subdir = os.path.join(subdir, "freetype2") - _dbg('Checking for include file %s in %s', ("ft2build.h", subdir)) + _dbg('Checking for include file %s in %s', + ("ft2build.h", subdir)) if os.path.isfile(os.path.join(subdir, "ft2build.h")): _dbg('Found %s in %s', ("ft2build.h", subdir)) freetype_version = 21 diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index f9e5ee5c84a..8b86f9a0081 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -60,7 +60,14 @@ class BmpImageFile(ImageFile.ImageFile): format_description = "Windows Bitmap" format = "BMP" # --------------------------------------------------- BMP Compression values - COMPRESSIONS = {'RAW': 0, 'RLE8': 1, 'RLE4': 2, 'BITFIELDS': 3, 'JPEG': 4, 'PNG': 5} + COMPRESSIONS = { + 'RAW': 0, + 'RLE8': 1, + 'RLE4': 2, + 'BITFIELDS': 3, + 'JPEG': 4, + 'PNG': 5 + } RAW, RLE8, RLE4, BITFIELDS, JPEG, PNG = 0, 1, 2, 3, 4, 5 def _bitmap(self, header=0, offset=0): @@ -69,10 +76,13 @@ def _bitmap(self, header=0, offset=0): if header: seek(header) file_info = {} - file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + # read bmp header size @offset 14 (this is part of the header size) + file_info['header_size'] = i32(read(4)) file_info['direction'] = -1 # --------------------- If requested, read header at a specific position - header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + # read the rest of the bmp header, without its size + header_data = ImageFile._safe_read(self.fp, + file_info['header_size'] - 4) # --------------------------------------------------- IBM OS/2 Bitmap v1 # ------ This format has different offsets because of width/height types if file_info['header_size'] == 12: @@ -88,12 +98,16 @@ def _bitmap(self, header=0, offset=0): file_info['y_flip'] = i8(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'] = i32(header_data[4:8]) if not file_info['y_flip'] else 2**32 - i32(header_data[4:8]) + file_info['height'] = (i32(header_data[4:8]) + if not file_info['y_flip'] + else 2**32 - i32(header_data[4:8])) 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['data_size'] = i32(header_data[16:20]) # byte size of pixel data - file_info['pixels_per_meter'] = (i32(header_data[20:24]), i32(header_data[24:28])) + # byte size of pixel data + file_info['data_size'] = i32(header_data[16:20]) + file_info['pixels_per_meter'] = (i32(header_data[20:24]), + i32(header_data[24:28])) file_info['colors'] = i32(header_data[28:32]) file_info['palette_padding'] = 4 self.info["dpi"] = tuple( @@ -101,21 +115,32 @@ def _bitmap(self, header=0, offset=0): file_info['pixels_per_meter'])) if file_info['compression'] == self.BITFIELDS: if len(header_data) >= 52: - for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): + 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]) else: - # 40 byte headers only have the three components in the bitfields masks, + # 40 byte headers only have the three components in the + # bitfields masks, # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx # See also https://github.com/python-pillow/Pillow/issues/1293 - # There is a 4th component in the RGBQuad, in the alpha location, but it - # is listed as a reserved component, and it is not generally an alpha channel + # There is a 4th component in the RGBQuad, in the alpha + # location, but it is listed as a reserved component, + # and it is not generally an alpha channel file_info['a_mask'] = 0x0 for mask in ['r_mask', 'g_mask', 'b_mask']: file_info[mask] = i32(read(4)) - file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) - file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) + file_info['rgb_mask'] = (file_info['r_mask'], + file_info['g_mask'], + file_info['b_mask']) + file_info['rgba_mask'] = (file_info['r_mask'], + file_info['g_mask'], + file_info['b_mask'], + file_info['a_mask']) else: - raise IOError("Unsupported BMP header type (%d)" % file_info['header_size']) + raise IOError("Unsupported BMP header type (%d)" % + file_info['header_size']) # ------------------ Special case : header is reported 40, which # ---------------------- is shorter than real size for bpp >= 16 self.size = file_info['width'], file_info['height'] @@ -127,11 +152,15 @@ def _bitmap(self, header=0, offset=0): # ----------------------- Check bit depth for unusual unsupported values self.mode, raw_mode = BIT2MODE.get(file_info['bits'], (None, None)) if self.mode is None: - raise IOError("Unsupported BMP pixel depth (%d)" % file_info['bits']) + raise IOError("Unsupported BMP pixel depth (%d)" + % file_info['bits']) # ----------------- Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: SUPPORTED = { - 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0)], + 32: [(0xff0000, 0xff00, 0xff, 0x0), + (0xff0000, 0xff00, 0xff, 0xff000000), + (0x0, 0x0, 0x0, 0x0), + (0xff000000, 0xff0000, 0xff00, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] } @@ -145,11 +174,15 @@ def _bitmap(self, header=0, offset=0): (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15" } if file_info['bits'] in SUPPORTED: - if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: + if file_info['bits'] == 32 and \ + file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode - elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: - raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] + elif (file_info['bits'] in (24, 16) and + file_info['rgb_mask'] in SUPPORTED[file_info['bits']]): + raw_mode = MASK_MODES[ + (file_info['bits'], file_info['rgb_mask']) + ] else: raise IOError("Unsupported BMP bitfields layout") else: @@ -158,17 +191,20 @@ def _bitmap(self, header=0, offset=0): if file_info['bits'] == 32 and header == 22: # 32-bit .cur offset raw_mode, self.mode = "BGRA", "RGBA" else: - raise IOError("Unsupported BMP compression (%d)" % file_info['compression']) + raise IOError("Unsupported BMP compression (%d)" % + file_info['compression']) # ---------------- Once the header is processed, process the palette/LUT if self.mode == "P": # Paletted for 1, 4 and 8 bit images # ----------------------------------------------------- 1-bit images if not (0 < file_info['colors'] <= 65536): - raise IOError("Unsupported BMP Palette size (%d)" % file_info['colors']) + raise IOError("Unsupported BMP Palette size (%d)" % + file_info['colors']) else: padding = file_info['palette_padding'] palette = read(padding * file_info['colors']) greyscale = True - indices = (0, 255) if file_info['colors'] == 2 else list(range(file_info['colors'])) + indices = (0, 255) if file_info['colors'] == 2 else \ + list(range(file_info['colors'])) # ------------------ Check if greyscale and ignore palette if so for ind, val in enumerate(indices): rgb = palette[ind*padding:ind*padding + 3] @@ -180,13 +216,19 @@ def _bitmap(self, header=0, offset=0): raw_mode = self.mode else: self.mode = "P" - self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", palette) + self.palette = ImagePalette.raw( + "BGRX" if padding == 4 else "BGR", palette) # ----------------------------- Finally set the tile data for the plugin self.info['compression'] = file_info['compression'] - self.tile = [('raw', (0, 0, file_info['width'], file_info['height']), offset or self.fp.tell(), - (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) - )] + self.tile = [ + ('raw', + (0, 0, file_info['width'], file_info['height']), + offset or self.fp.tell(), + (raw_mode, + ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), + file_info['direction'])) + ] def _open(self): """ Open file, check magic number and read header """ diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index e755f94b9d9..3bd65c93db5 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -142,7 +142,8 @@ def _open(self): # ignoring flags which pertain to volume textures and cubemaps dxt10 = BytesIO(self.fp.read(20)) dxgi_format, dimension = struct.unpack("= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) + return len(prefix) >= 8 and \ + i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) ## @@ -54,7 +55,8 @@ def _open(self): if width <= 0 or height <= 0: raise SyntaxError("not a GIMP brush") if color_depth not in (1, 4): - raise SyntaxError("Unsupported GIMP brush color depth: %s" % color_depth) + raise SyntaxError( + "Unsupported GIMP brush color depth: %s" % color_depth) if version == 1: comment_length = header_size-20 diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index e0da0112966..fec2f76633c 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -397,7 +397,8 @@ def _write_multiple_frames(im, fp, palette): im_frames = [] frame_count = 0 - for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for imSequence in itertools.chain([im], + im.encoderinfo.get("append_images", [])): for im_frame in ImageSequence.Iterator(imSequence): # a copy is required here since seek can still mutate the image im_frame = _normalize_mode(im_frame.copy()) @@ -413,17 +414,19 @@ def _write_multiple_frames(im, fp, palette): if im_frames: # delta frame previous = im_frames[-1] - if _get_palette_bytes(im_frame) == _get_palette_bytes(previous['im']): + if _get_palette_bytes(im_frame) == \ + _get_palette_bytes(previous['im']): delta = ImageChops.subtract_modulo(im_frame, previous['im']) else: - delta = ImageChops.subtract_modulo(im_frame.convert('RGB'), - previous['im'].convert('RGB')) + delta = ImageChops.subtract_modulo( + im_frame.convert('RGB'), previous['im'].convert('RGB')) bbox = delta.getbbox() if not bbox: # This frame is identical to the previous frame if duration: - previous['encoderinfo']['duration'] += encoderinfo['duration'] + previous['encoderinfo']['duration'] += \ + encoderinfo['duration'] continue else: bbox = None @@ -525,7 +528,8 @@ def _write_local_header(fp, im, offset, flags): o8(transparency) + # transparency index o8(0)) - if "comment" in im.encoderinfo and 1 <= len(im.encoderinfo["comment"]) <= 255: + if "comment" in im.encoderinfo and \ + 1 <= len(im.encoderinfo["comment"]) <= 255: fp.write(b"!" + o8(254) + # extension intro o8(len(im.encoderinfo["comment"])) + @@ -691,7 +695,8 @@ def _get_global_header(im, info): for extensionKey in ["transparency", "duration", "loop", "comment"]: if info and extensionKey in info: if ((extensionKey == "duration" and info[extensionKey] == 0) or - (extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255))): + (extensionKey == "comment" and + not (1 <= len(info[extensionKey]) <= 255))): continue version = b"89a" break diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index d82e30efc46..4b6281f1312 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -305,10 +305,10 @@ def profileToProfile( :param renderingIntent: Integer (0-3) specifying the rendering intent you wish to use for the transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. @@ -424,10 +424,10 @@ def buildTransform( :param renderingIntent: Integer (0-3) specifying the rendering intent you wish to use for the transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. @@ -512,20 +512,20 @@ def buildProofTransform( :param renderingIntent: Integer (0-3) specifying the rendering intent you wish to use for the input->proof (simulated) transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. - :param proofRenderingIntent: Integer (0-3) specifying the rendering intent you - wish to use for proof->output transform + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent + you wish to use for proof->output transform - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. @@ -875,10 +875,10 @@ def getDefaultIntent(profile): :returns: Integer 0-3 specifying the default rendering intent for this profile. - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. @@ -913,15 +913,15 @@ def isIntentSupported(profile, intent, direction): :param intent: Integer (0-3) specifying the rendering intent you wish to use with this profile - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 see the pyCMS documentation for details on rendering intents and what they do. - :param direction: Integer specifying if the profile is to be used for input, - output, or proof + :param direction: Integer specifying if the profile is to be used for + input, output, or proof INPUT = 0 (or use ImageCms.DIRECTION_INPUT) OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 920b977f40a..bc8c0cf3888 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -217,7 +217,8 @@ def text(self, xy, text, fill=None, font=None, anchor=None, ink = fill if ink is not None: try: - mask, offset = font.getmask2(text, self.fontmode, *args, **kwargs) + mask, offset = font.getmask2(text, self.fontmode, + *args, **kwargs) xy = xy[0] + offset[0], xy[1] + offset[1] except AttributeError: try: diff --git a/src/PIL/ImageEnhance.py b/src/PIL/ImageEnhance.py index 11c9c3a06ac..1b78bfd9b25 100644 --- a/src/PIL/ImageEnhance.py +++ b/src/PIL/ImageEnhance.py @@ -51,7 +51,8 @@ def __init__(self, image): if 'A' in image.getbands(): self.intermediate_mode = 'LA' - self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + self.degenerate = image.convert( + self.intermediate_mode).convert(image.mode) class Contrast(_Enhance): diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 681dee5240a..bdcc43d1faa 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -166,8 +166,9 @@ def load(self): if use_mmap: # try memory mapping decoder_name, extents, offset, args = self.tile[0] - if decoder_name == "raw" and len(args) >= 3 and args[0] == self.mode \ - and args[0] in Image._MAPMODES: + if decoder_name == "raw" and len(args) >= 3 and \ + args[0] == self.mode and \ + args[0] in Image._MAPMODES: try: if hasattr(Image.core, "map"): # use built-in mapper WIN32 only @@ -180,12 +181,14 @@ def load(self): # use mmap, if possible import mmap with open(self.filename, "r") as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + self.map = mmap.mmap(fp.fileno(), 0, + access=mmap.ACCESS_READ) self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, extents, offset, args - ) + self.map, self.size, decoder_name, extents, + offset, args) readonly = 1 - # After trashing self.im, we might need to reload the palette data. + # After trashing self.im, + # we might need to reload the palette data. if self.palette: self.palette.dirty = 1 except (AttributeError, EnvironmentError, ImportError): @@ -217,7 +220,8 @@ def load(self): while True: try: s = read(self.decodermaxblock) - except (IndexError, struct.error): # truncated png/gif + except (IndexError, struct.error): + # truncated png/gif if LOAD_TRUNCATED_IMAGES: break else: @@ -229,7 +233,8 @@ def load(self): else: self.tile = [] raise IOError("image file is truncated " - "(%d bytes not processed)" % len(b)) + "(%d bytes not processed)" % + len(b)) b = b + s n, err_code = decoder.decode(b) @@ -588,10 +593,12 @@ def decode(self, buffer): """ Override to perform the decoding process. - :param buffer: A bytes object with the data to be decoded. If `handles_eof` - is set, then `buffer` will be empty and `self.fd` will be set. - :returns: A tuple of (bytes consumed, errcode). If finished with decoding - return <0 for the bytes consumed. Err codes are from `ERRORS` + :param buffer: A bytes object with the data to be decoded. + If `handles_eof` is set, then `buffer` will be empty and `self.fd` + will be set. + :returns: A tuple of (bytes consumed, errcode). + If finished with decoding return <0 for the bytes consumed. + Err codes are from `ERRORS` """ raise NotImplementedError() @@ -650,8 +657,8 @@ def set_as_raw(self, data, rawmode=None): Convenience method to set the internal image from a stream of raw data :param data: Bytes to be set - :param rawmode: The rawmode to be used for the decoder. If not specified, - it will default to the mode of the image + :param rawmode: The rawmode to be used for the decoder. + If not specified, it will default to the mode of the image :returns: None """ diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 3ac29e8f6f9..099ccc4ff97 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -141,7 +141,8 @@ def __init__(self, font=None, size=10, index=0, encoding="", self.layout_engine = layout_engine if isPath(font): - self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine) + self.font = core.getfont(font, size, index, encoding, + layout_engine=layout_engine) else: self.font_bytes = font.read() self.font = core.getfont( @@ -175,9 +176,11 @@ def getoffset(self, text): return self.font.getsize(text)[1] def getmask(self, text, mode="", direction=None, features=None): - return self.getmask2(text, mode, direction=direction, features=features)[0] + return self.getmask2(text, mode, direction=direction, + features=features)[0] - def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None, *args, **kwargs): + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, + features=None, *args, **kwargs): size, offset = self.font.getsize(text, direction, features) im = fill("L", size, 0) self.font.render(text, im.id, mode == "1", direction, features) @@ -194,12 +197,13 @@ def font_variant(self, font=None, size=None, index=None, encoding=None, :return: A FreeTypeFont object. """ - return FreeTypeFont(font=self.path if font is None else font, - size=self.size if size is None else size, - index=self.index if index is None else index, - encoding=self.encoding if encoding is None else encoding, - layout_engine=self.layout_engine if layout_engine is None else layout_engine - ) + return FreeTypeFont( + font=self.path if font is None else font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=self.layout_engine if layout_engine is None else layout_engine + ) class TransposedFont(object): @@ -303,12 +307,16 @@ def truetype(font=None, size=10, index=0, encoding="", for walkfilename in walkfilenames: if ext and walkfilename == ttf_filename: fontpath = os.path.join(walkroot, walkfilename) - return FreeTypeFont(fontpath, size, index, encoding, layout_engine) - elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + return FreeTypeFont(fontpath, size, index, + encoding, layout_engine) + elif (not ext and + os.path.splitext(walkfilename)[0] == ttf_filename): fontpath = os.path.join(walkroot, walkfilename) if os.path.splitext(fontpath)[1] == '.ttf': - return FreeTypeFont(fontpath, size, index, encoding, layout_engine) - if not ext and first_font_with_a_different_extension is None: + return FreeTypeFont(fontpath, size, index, + encoding, layout_engine) + if not ext \ + and first_font_with_a_different_extension is None: first_font_with_a_different_extension = fontpath if first_font_with_a_different_extension: return FreeTypeFont(first_font_with_a_different_extension, size, diff --git a/src/PIL/ImageMode.py b/src/PIL/ImageMode.py index b227f212775..2b3377a14f3 100644 --- a/src/PIL/ImageMode.py +++ b/src/PIL/ImageMode.py @@ -42,7 +42,8 @@ def getmode(mode): for m, (basemode, basetype, bands) in Image._MODEINFO.items(): modes[m] = ModeDescriptor(m, bands, basemode, basetype) # extra experimental modes - modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") + 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") diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index c9dc363128b..2930c1d9cff 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -119,7 +119,8 @@ def align8to32(bytes, width, mode): new_data = [] for i in range(len(bytes) // bytes_per_line): - new_data.append(bytes[i*bytes_per_line:(i+1)*bytes_per_line] + b'\x00' * extra_padding) + new_data.append(bytes[i*bytes_per_line:(i+1)*bytes_per_line] + + b'\x00' * extra_padding) return b''.join(new_data) diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index b5ad53df7a4..17bf32f628a 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -195,7 +195,8 @@ def paste(self, im, box=None): # Pypy is using a ffi cdata element # (Pdb) self.tk.interp # - _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) + _imagingtk.tkinit( + int(ffi.cast("uintptr_t", tk.interp)), 1) else: _imagingtk.tkinit(tk.interpaddr(), 1) except AttributeError: diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 25fbefbca58..7b170fe16ed 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -270,7 +270,8 @@ def _save(im, fp, filename): Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) Image.register_save(Jpeg2KImageFile.format, _save) -Image.register_extensions(Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"]) +Image.register_extensions(Jpeg2KImageFile.format, + [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"]) Image.register_mime(Jpeg2KImageFile.format, 'image/jp2') Image.register_mime(Jpeg2KImageFile.format, 'image/jpx') diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 97ef834d3d4..98c27010ce6 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -799,6 +799,7 @@ def jpeg_factory(fp=None, filename=None): Image.register_open(JpegImageFile.format, jpeg_factory, _accept) Image.register_save(JpegImageFile.format, _save) -Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) +Image.register_extensions(JpegImageFile.format, + [".jfif", ".jpe", ".jpg", ".jpeg"]) Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/src/PIL/MspImagePlugin.py b/src/PIL/MspImagePlugin.py index 9692d116241..b2c7a3d79ea 100644 --- a/src/PIL/MspImagePlugin.py +++ b/src/PIL/MspImagePlugin.py @@ -126,8 +126,9 @@ def decode(self, buffer): continue row = self.fd.read(rowlen) if len(row) != rowlen: - raise IOError("Truncated MSP file, expected %d bytes on row %s", - (rowlen, x)) + raise IOError( + "Truncated MSP file, expected %d bytes on row %s", + (rowlen, x)) idx = 0 while idx < rowlen: runtype = i8(row[idx]) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 8538bcd4915..d411bfc4139 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -98,7 +98,8 @@ def _save(im, fp, filename, save_all=False): try: im_numberOfPages = im.n_frames except AttributeError: - # Image format does not have n_frames. It is a single frame image + # Image format does not have n_frames. + # It is a single frame image pass numberOfPages += im_numberOfPages for i in range(im_numberOfPages): @@ -115,9 +116,9 @@ def _save(im, fp, filename, save_all=False): for imSequence in ims: im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence] for im in im_pages: - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) - # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports - # Flatedecode (zip compression). + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). bits = 8 params = None @@ -135,7 +136,12 @@ def _save(im, fp, filename, save_all=False): elif im.mode == "P": filter = "ASCIIHexDecode" palette = im.im.getpalette("RGB") - colorspace = [PdfParser.PdfName("Indexed"), PdfParser.PdfName("DeviceRGB"), 255, PdfParser.PdfBinary(palette)] + colorspace = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + 255, + PdfParser.PdfBinary(palette) + ] procset = "ImageI" # indexed color elif im.mode == "RGB": filter = "DCTDecode" @@ -166,7 +172,8 @@ def _save(im, fp, filename, save_all=False): elif filter == "FlateDecode": ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) elif filter == "RunLengthDecode": - ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) + ImageFile._save(im, op, + [("packbits", (0, 0)+im.size, 0, im.mode)]) else: raise ValueError("unsupported PDF filter (%s)" % filter) @@ -175,26 +182,37 @@ def _save(im, fp, filename, save_all=False): width, height = im.size - existing_pdf.write_obj(image_refs[pageNumber], stream=op.getvalue(), - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / resolution, - Height=height, # * 72.0 / resolution, - Filter=PdfParser.PdfName(filter), - BitsPerComponent=bits, - DecodeParams=params, - ColorSpace=colorspace) + existing_pdf.write_obj(image_refs[pageNumber], + stream=op.getvalue(), + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / resolution, + Height=height, # * 72.0 / resolution, + Filter=PdfParser.PdfName(filter), + BitsPerComponent=bits, + DecodeParams=params, + ColorSpace=colorspace) # # page existing_pdf.write_page(page_refs[pageNumber], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_refs[pageNumber])), - MediaBox=[0, 0, int(width * 72.0 / resolution), int(height * 72.0 / resolution)], - Contents=contents_refs[pageNumber] - ) + Resources=PdfParser.PdfDict( + ProcSet=[ + PdfParser.PdfName("PDF"), + PdfParser.PdfName(procset) + ], + XObject=PdfParser.PdfDict( + image=image_refs[pageNumber] + ) + ), + MediaBox=[ + 0, + 0, + int(width * 72.0 / resolution), + int(height * 72.0 / resolution) + ], + Contents=contents_refs[pageNumber]) # # page contents @@ -204,7 +222,8 @@ def _save(im, fp, filename, save_all=False): int(width * 72.0 / resolution), int(height * 72.0 / resolution))) - existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) + existing_pdf.write_obj(contents_refs[pageNumber], + stream=page_contents) pageNumber += 1 diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 9031330da8f..971f4451436 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -20,7 +20,8 @@ def make_bytes(s): # pragma: no cover return s # pragma: no cover -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set on page 656 +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 def encode_text(s): return codecs.BOM_UTF16_BE + s.encode("utf_16_be") @@ -80,7 +81,8 @@ def decode_text(b): class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the PDF file structure""" + """An error that probably indicates a syntactic or semantic error in the + PDF file structure""" pass @@ -89,7 +91,8 @@ def check_format_condition(condition, error_message): raise PdfFormatError(error_message) -class IndirectReference(collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"])): +class IndirectReference(collections.namedtuple("IndirectReferenceTuple", + ["object_id", "generation"])): def __str__(self): return "%s %s R" % self @@ -97,7 +100,9 @@ def __bytes__(self): return self.__str__().encode("us-ascii") def __eq__(self, other): - return other.__class__ is self.__class__ and other.object_id == self.object_id and other.generation == self.generation + return other.__class__ is self.__class__ and \ + other.object_id == self.object_id and \ + other.generation == self.generation def __ne__(self, other): return not (self == other) @@ -143,19 +148,26 @@ def __delitem__(self, key): elif key in self.deleted_entries: generation = self.deleted_entries[key] else: - raise IndexError("object ID " + str(key) + " cannot be deleted because it doesn't exist") + raise IndexError("object ID " + str(key) + + " cannot be deleted because it doesn't exist") def __contains__(self, key): return key in self.existing_entries or key in self.new_entries def __len__(self): - return len(set(self.existing_entries.keys()) | set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + return len(set(self.existing_entries.keys()) | + set(self.new_entries.keys()) | + set(self.deleted_entries.keys())) def keys(self): - return (set(self.existing_entries.keys()) - set(self.deleted_entries.keys())) | set(self.new_entries.keys()) + return ( + set(self.existing_entries.keys()) - + set(self.deleted_entries.keys()) + ) | set(self.new_entries.keys()) def write(self, f): - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + keys = sorted(set(self.new_entries.keys()) | + set(self.deleted_entries.keys())) deleted_keys = sorted(set(self.deleted_entries.keys())) startxref = f.tell() f.write(b"xref\n") @@ -172,10 +184,12 @@ def write(self, f): else: contiguous_keys = keys keys = None - f.write(make_bytes("%d %d\n" % (contiguous_keys[0], len(contiguous_keys)))) + f.write(make_bytes("%d %d\n" % + (contiguous_keys[0], len(contiguous_keys)))) for object_id in contiguous_keys: if object_id in self.new_entries: - f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id])) + f.write(make_bytes("%010d %05d n \n" % + self.new_entries[object_id])) else: this_deleted_object_id = deleted_keys.pop(0) check_format_condition(object_id == this_deleted_object_id, @@ -186,7 +200,9 @@ def write(self, f): next_in_linked_list = deleted_keys[0] except IndexError: next_in_linked_list = 0 - f.write(make_bytes("%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id]))) + f.write(make_bytes("%010d %05d f \n" % + (next_in_linked_list, + self.deleted_entries[object_id]))) return startxref @@ -203,7 +219,8 @@ def name_as_str(self): return self.name.decode("us-ascii") def __eq__(self, other): - return (isinstance(other, PdfName) and other.name == self.name) or other == self.name + return (isinstance(other, PdfName) and other.name == self.name) or \ + other == self.name def __hash__(self): return hash(self.name) @@ -313,7 +330,9 @@ def decode(self): expected_length = self.dictionary.Length return zlib.decompress(self.buf, bufsize=int(expected_length)) else: - raise NotImplementedError("stream filter %s unknown/unsupported" % repr(self.dictionary.Filter)) + raise NotImplementedError( + "stream filter %s unknown/unsupported" % + repr(self.dictionary.Filter)) def pdf_repr(x): @@ -323,7 +342,8 @@ def pdf_repr(x): return b"false" elif x is None: return b"null" - elif isinstance(x, PdfName) or isinstance(x, PdfDict) or isinstance(x, PdfArray) or isinstance(x, PdfBinary): + elif (isinstance(x, PdfName) or isinstance(x, PdfDict) or + isinstance(x, PdfArray) or isinstance(x, PdfBinary)): return bytes(x) elif isinstance(x, int): return str(x).encode("us-ascii") @@ -331,10 +351,15 @@ def pdf_repr(x): return bytes(PdfDict(x)) elif isinstance(x, list): return bytes(PdfArray(x)) - elif (py3 and isinstance(x, str)) or (not py3 and isinstance(x, unicode)): + elif ((py3 and isinstance(x, str)) or + (not py3 and isinstance(x, unicode))): return pdf_repr(encode_text(x)) elif isinstance(x, bytes): - return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage + # XXX escape more chars? handle binary garbage + x = x.replace(b"\\", b"\\\\") + x = x.replace(b"(", b"\\(") + x = x.replace(b")", b"\\)") + return b"(" + x + b")" else: return bytes(x) @@ -344,10 +369,13 @@ class PdfParser: Supports PDF up to 1.4 """ - def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): - # type: (PdfParser, str, file, Union[bytes, bytearray], int, str) -> None + def __init__(self, filename=None, f=None, + buf=None, start_offset=0, mode="rb"): + # type: (PdfParser, str, file, Union[bytes, bytearray], int, str) + # -> None if buf and f: - raise RuntimeError("specify buf or f or filename, but not both buf and f") + raise RuntimeError( + "specify buf or f or filename, but not both buf and f") self.filename = filename self.buf = buf self.f = f @@ -473,7 +501,8 @@ def write_xref_and_trailer(self, new_root_ref=None): if self.info: trailer_dict[b"Info"] = self.info_ref self.last_xref_section_offset = start_xref - self.f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) + self.f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) def write_page(self, ref, *objs, **dict_obj): if isinstance(ref, int): @@ -535,13 +564,18 @@ def read_pdf_info(self): else: self.info = PdfDict(self.read_indirect(self.info_ref)) check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition(self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog") + check_format_condition(self.root[b"Type"] == b"Catalog", + "/Type in Root is not /Catalog") check_format_condition(b"Pages" in self.root, "/Pages missing in Root") - check_format_condition(isinstance(self.root[b"Pages"], IndirectReference), "/Pages in Root is not an indirect reference") + check_format_condition(isinstance(self.root[b"Pages"], + IndirectReference), + "/Pages in Root is not an indirect reference") self.pages_ref = self.root[b"Pages"] self.page_tree_root = self.read_indirect(self.pages_ref) self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references in case the user modifies, adds or deletes some pages and we need to rewrite the pages and their list + # save the original list of page references + # in case the user modifies, adds or deletes some pages + # and we need to rewrite the pages and their list self.orig_pages = self.pages[:] def next_object_id(self, offset=None): @@ -562,10 +596,14 @@ def next_object_id(self, offset=None): whitespace_mandatory = whitespace + b"+" newline_only = br"[\r\n]+" newline = whitespace_optional + newline_only + whitespace_optional - re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_optional + br"\<\<(.*\>\>)" + newline - + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) - re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_optional + br"\<\<(.*?\>\>)" + newline - + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) + re_trailer_end = re.compile( + whitespace_mandatory + br"trailer" + whitespace_optional + + br"\<\<(.*\>\>)" + newline + br"startxref" + newline + br"([0-9]+)" + + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) + re_trailer_prev = re.compile( + whitespace_optional + br"trailer" + whitespace_optional + + br"\<\<(.*?\>\>)" + newline + br"startxref" + newline + br"([0-9]+)" + + newline + br"%%EOF" + whitespace_optional, re.DOTALL) def read_trailer(self): search_start_offset = len(self.buf) - 16384 @@ -589,19 +627,26 @@ def read_trailer(self): self.read_prev_trailer(self.trailer_dict[b"Prev"]) def read_prev_trailer(self, xref_section_offset): - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search(self.buf[trailer_offset:trailer_offset+16384]) + trailer_offset = self.read_xref_table( + xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search( + self.buf[trailer_offset:trailer_offset+16384]) check_format_condition(m, "previous trailer not found") trailer_data = m.group(1) - check_format_condition(int(m.group(2)) == xref_section_offset, "xref section offset in previous trailer doesn't match what was expected") + check_format_condition(int(m.group(2)) == xref_section_offset, + "xref section offset in previous trailer " + "doesn't match what was expected") trailer_dict = self.interpret_trailer(trailer_data) if b"Prev" in trailer_dict: self.read_prev_trailer(trailer_dict[b"Prev"]) re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile(whitespace_optional + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + delimiter_or_ws + br")") + re_name = re.compile( + whitespace_optional + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + + delimiter_or_ws + br")") re_dict_start = re.compile(whitespace_optional + br"\<\<") - re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) + re_dict_end = re.compile( + whitespace_optional + br"\>\>" + whitespace_optional) @classmethod def interpret_trailer(cls, trailer_data): @@ -611,13 +656,21 @@ def interpret_trailer(cls, trailer_data): m = cls.re_name.match(trailer_data, offset) if not m: m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition(m and m.end() == len(trailer_data), "name not found in trailer, remaining data: " + repr(trailer_data[offset:])) + check_format_condition( + m and m.end() == len(trailer_data), + "name not found in trailer, remaining data: " + + repr(trailer_data[offset:])) break key = cls.interpret_name(m.group(1)) value, offset = cls.get_value(trailer_data, m.end()) trailer[key] = value - check_format_condition(b"Size" in trailer and isinstance(trailer[b"Size"], int), "/Size not in trailer or not an integer") - check_format_condition(b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), "/Root not in trailer or not an indirect reference") + check_format_condition( + b"Size" in trailer and isinstance(trailer[b"Size"], int), + "/Size not in trailer or not an integer") + check_format_condition( + b"Root" in trailer and + isinstance(trailer[b"Root"], IndirectReference), + "/Root not in trailer or not an indirect reference") return trailer re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") @@ -627,7 +680,8 @@ def interpret_name(cls, raw, as_text=False): name = b"" for m in cls.re_hashes_in_name.finditer(raw): if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + name += m.group(1) + \ + bytearray.fromhex(m.group(3).decode("us-ascii")) else: name += m.group(1) if as_text: @@ -635,21 +689,37 @@ def interpret_name(cls, raw, as_text=False): else: return bytes(name) - re_null = re.compile(whitespace_optional + br"null(?=" + delimiter_or_ws + br")") - re_true = re.compile(whitespace_optional + br"true(?=" + delimiter_or_ws + br")") - re_false = re.compile(whitespace_optional + br"false(?=" + delimiter_or_ws + br")") - re_int = re.compile(whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")") - re_real = re.compile(whitespace_optional + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + delimiter_or_ws + br")") + re_null = re.compile( + whitespace_optional + br"null(?=" + delimiter_or_ws + br")") + re_true = re.compile( + whitespace_optional + br"true(?=" + delimiter_or_ws + br")") + re_false = re.compile( + whitespace_optional + br"false(?=" + delimiter_or_ws + br")") + re_int = re.compile( + whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")") + re_real = re.compile( + whitespace_optional + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + + delimiter_or_ws + br")") re_array_start = re.compile(whitespace_optional + br"\[") re_array_end = re.compile(whitespace_optional + br"]") - re_string_hex = re.compile(whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>") + re_string_hex = re.compile( + whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>") re_string_lit = re.compile(whitespace_optional + br"\(") - re_indirect_reference = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"R(?=" + delimiter_or_ws + br")") - re_indirect_def_start = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"obj(?=" + delimiter_or_ws + br")") - re_indirect_def_end = re.compile(whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")") - re_comment = re.compile(br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") + re_indirect_reference = re.compile( + whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + + br"([-+]?[0-9]+)" + whitespace_mandatory + br"R(?=" + delimiter_or_ws + + br")") + re_indirect_def_start = re.compile( + whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + + br"([-+]?[0-9]+)" + whitespace_mandatory + br"obj(?=" + + delimiter_or_ws + br")") + re_indirect_def_end = re.compile( + whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")") + re_comment = re.compile( + br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") re_stream_start = re.compile(whitespace_optional + br"stream\r?\n") - re_stream_end = re.compile(whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") + re_stream_end = re.compile( + whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") @classmethod def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): @@ -660,21 +730,34 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): offset = m.end() m = cls.re_indirect_def_start.match(data, offset) if m: - check_format_condition(int(m.group(1)) > 0, "indirect object definition: object ID must be greater than 0") - check_format_condition(int(m.group(2)) >= 0, "indirect object definition: generation must be non-negative") - check_format_condition(expect_indirect is None or expect_indirect == IndirectReference(int(m.group(1)), int(m.group(2))), + check_format_condition( + int(m.group(1)) > 0, + "indirect object definition: object ID must be greater than 0") + check_format_condition( + int(m.group(2)) >= 0, + "indirect object definition: generation must be non-negative") + check_format_condition( + expect_indirect is None or expect_indirect == + IndirectReference(int(m.group(1)), int(m.group(2))), "indirect object definition different than expected") - object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting-1) + object, offset = cls.get_value( + data, m.end(), max_nesting=max_nesting-1) if offset is None: return object, None m = cls.re_indirect_def_end.match(data, offset) - check_format_condition(m, "indirect object definition end not found") + check_format_condition( + m, "indirect object definition end not found") return object, m.end() - check_format_condition(not expect_indirect, "indirect object definition not found") + check_format_condition( + not expect_indirect, "indirect object definition not found") m = cls.re_indirect_reference.match(data, offset) if m: - check_format_condition(int(m.group(1)) > 0, "indirect object reference: object ID must be greater than 0") - check_format_condition(int(m.group(2)) >= 0, "indirect object reference: generation must be non-negative") + check_format_condition( + int(m.group(1)) > 0, + "indirect object reference: object ID must be greater than 0") + check_format_condition( + int(m.group(2)) >= 0, + "indirect object reference: generation must be non-negative") return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() m = cls.re_dict_start.match(data, offset) if m: @@ -682,10 +765,12 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): result = {} m = cls.re_dict_end.match(data, offset) while not m: - key, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + key, offset = cls.get_value( + data, offset, max_nesting=max_nesting-1) if offset is None: return result, None - value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + value, offset = cls.get_value( + data, offset, max_nesting=max_nesting-1) result[key] = value if offset is None: return result, None @@ -696,7 +781,9 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): try: stream_len = int(result[b"Length"]) except (TypeError, KeyError, ValueError): - raise PdfFormatError("bad or missing Length in stream dict (%r)" % result.get(b"Length", None)) + raise PdfFormatError( + "bad or missing Length in stream dict (%r)" % + result.get(b"Length", None)) stream_data = data[m.end():m.end() + stream_len] m = cls.re_stream_end.match(data, m.end() + stream_len) check_format_condition(m, "stream end not found") @@ -711,7 +798,8 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): result = [] m = cls.re_array_end.match(data, offset) while not m: - value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + value, offset = cls.get_value( + data, offset, max_nesting=max_nesting-1) result.append(value) if offset is None: return result, None @@ -734,18 +822,25 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): return int(m.group(1)), m.end() m = cls.re_real.match(data, offset) if m: - return float(m.group(1)), m.end() # XXX Decimal instead of float??? + # XXX Decimal instead of float??? + return float(m.group(1)), m.end() m = cls.re_string_hex.match(data, offset) if m: - hex_string = bytearray([b for b in m.group(1) if b in b"0123456789abcdefABCDEF"]) # filter out whitespace + # filter out whitespace + hex_string = bytearray([ + b for b in m.group(1) + if b in b"0123456789abcdefABCDEF" + ]) if len(hex_string) % 2 == 1: - hex_string.append(ord(b"0")) # append a 0 if the length is not even - yes, at the end + # append a 0 if the length is not even - yes, at the end + hex_string.append(ord(b"0")) return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() m = cls.re_string_lit.match(data, offset) if m: return cls.get_literal_string(data, m.end()) # return None, offset # fallback (only for debugging) - raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) + raise PdfFormatError( + "unrecognized object: " + repr(data[offset:offset+32])) re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") escaped_chars = { @@ -792,19 +887,24 @@ def get_literal_string(cls, data, offset): offset = m.end() raise PdfFormatError("unfinished literal string") - re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline) - re_xref_subsection_start = re.compile(whitespace_optional + br"([0-9]+)" + whitespace_mandatory + br"([0-9]+)" + whitespace_optional + newline_only) + re_xref_section_start = re.compile( + whitespace_optional + br"xref" + newline) + re_xref_subsection_start = re.compile( + whitespace_optional + br"([0-9]+)" + whitespace_mandatory + + br"([0-9]+)" + whitespace_optional + newline_only) re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") def read_xref_table(self, xref_section_offset): subsection_found = False - m = self.re_xref_section_start.match(self.buf, xref_section_offset + self.start_offset) + m = self.re_xref_section_start.match( + self.buf, xref_section_offset + self.start_offset) check_format_condition(m, "xref section start not found") offset = m.end() while True: m = self.re_xref_subsection_start.match(self.buf, offset) if not m: - check_format_condition(subsection_found, "xref subsection start not found") + check_format_condition( + subsection_found, "xref subsection start not found") break subsection_found = True offset = m.end() @@ -818,22 +918,31 @@ def read_xref_table(self, xref_section_offset): generation = int(m.group(2)) if not is_free: new_entry = (int(m.group(1)), generation) - check_format_condition(i not in self.xref_table or self.xref_table[i] == new_entry, "xref entry duplicated (and not identical)") + check_format_condition( + i not in self.xref_table or + self.xref_table[i] == new_entry, + "xref entry duplicated (and not identical)") self.xref_table[i] = new_entry return offset def read_indirect(self, ref, max_nesting=-1): offset, generation = self.xref_table[ref[0]] - check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" + check_format_condition( + generation == ref[1], + "expected to find generation %s for object ID %s in xref table, " + "instead found generation %s at offset %s" % (ref[1], ref[0], generation, offset)) - value = self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] + value = self.get_value(self.buf, offset + self.start_offset, + expect_indirect=IndirectReference(*ref), + max_nesting=max_nesting)[0] self.cached_objects[ref] = value return value def linearize_page_tree(self, node=None): if node is None: node = self.page_tree_root - check_format_condition(node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages") + check_format_condition( + node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages") pages = [] for kid in node[b"Kids"]: kid_object = self.read_indirect(kid) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 82606199074..4f1f0f9cfbf 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -142,7 +142,8 @@ def call(self, cid, pos, length): def crc(self, cid, data): "Read and verify checksum" - # Skip CRC checks for ancillary chunks if allowed to load truncated images + # 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): self.crc_skip(cid, data) @@ -301,8 +302,8 @@ def __init__(self, fp): def check_text_memory(self, chunklen): self.text_memory += chunklen if self.text_memory > MAX_TEXT_MEMORY: - raise ValueError("Too much memory used in text chunks: %s>MAX_TEXT_MEMORY" % - self.text_memory) + raise ValueError("Too much memory used in text chunks: " + "%s>MAX_TEXT_MEMORY" % self.text_memory) def chunk_iCCP(self, pos, length): diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index c599ba8d53e..9866c9040fe 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -83,7 +83,8 @@ def _open(self): if s not in b_whitespace: break if s == b"": - raise ValueError("File does not extend beyond magic number") + raise ValueError( + "File does not extend beyond magic number") if s != b"#": break s = self.fp.readline() diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index ef0f40ebd62..113d44faccd 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -222,6 +222,7 @@ def decode(self, buffer): Image.register_mime(SgiImageFile.format, "image/sgi") Image.register_mime(SgiImageFile.format, "image/rgb") -Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) +Image.register_extensions(SgiImageFile.format, + [".bw", ".rgb", ".rgba", ".sgi"]) # End of file diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index 03b266bc4fd..3126bd9d6e7 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -94,7 +94,8 @@ def _open(self): raise SyntaxError("Unsupported Palette Type") offset = offset + palette_length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + self.palette = ImagePalette.raw("RGB;L", + self.fp.read(palette_length)) if self.mode == "L": self.mode = "P" rawmode = rawmode.replace('L', 'P') diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 14b66a1b9b3..94a028afa26 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -431,7 +431,8 @@ class ImageFileDirectory_v2(MutableMapping): * self.tagtype = {} * Key: numerical tiff tag number - * Value: integer corresponding to the data type from `~PIL.TiffTags.TYPES` + * Value: integer corresponding to the data type from + ~PIL.TiffTags.TYPES` .. versionadded:: 3.0.0 """ diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index 427f3a48940..ef19ee66ea7 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -23,7 +23,8 @@ class TagInfo(namedtuple("_TagInfo", "value name type length enum")): __slots__ = [] - def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): + def __new__(cls, value=None, name="unknown", + type=None, length=None, enum=None): return super(TagInfo, cls).__new__( cls, value, name, type, length, enum or {}) @@ -72,8 +73,8 @@ def lookup(tag): 257: ("ImageLength", LONG, 1), 258: ("BitsPerSample", SHORT, 0), 259: ("Compression", SHORT, 1, - {"Uncompressed": 1, "CCITT 1d": 2, "Group 3 Fax": 3, "Group 4 Fax": 4, - "LZW": 5, "JPEG": 6, "PackBits": 32773}), + {"Uncompressed": 1, "CCITT 1d": 2, "Group 3 Fax": 3, + "Group 4 Fax": 4, "LZW": 5, "JPEG": 6, "PackBits": 32773}), 262: ("PhotometricInterpretation", SHORT, 1, {"WhiteIsZero": 0, "BlackIsZero": 1, "RGB": 2, "RGB Palette": 3, diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index 213584497a5..aeb19374dc3 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -22,7 +22,8 @@ from __future__ import print_function from . import Image, ImageFile -from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long +from ._binary import i16le as word, si16le as short, \ + i32le as dword, si32le as _long from ._util import py3 From 2630054266a3c2f069c6b1d8a4ce93dc777cc78b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Jul 2018 19:26:07 +1000 Subject: [PATCH 0371/1393] Removed unused import --- src/PIL/TiffImagePlugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 94a028afa26..66b211cbfec 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -45,7 +45,6 @@ from ._binary import i8, o8 from ._util import py3 -import collections from fractions import Fraction from numbers import Number, Rational From 4407cb65079a7d1150277e3b9a144996f56357c9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 2 Jul 2018 22:41:16 +0300 Subject: [PATCH 0372/1393] Update CHANGES.rst --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0c31eb3c7d3..a6018ffb66d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,21 @@ Changelog (Pillow) ================== +5.3.0 (unreleased) +------------------ + +- Tests: Add LA to TGA test modes #3222 + [danpla] + +- Skip outline if the draw operation fills with the same colour #2922 + [radarhere] + +- Flake8 fixes #3173 + [radarhere] + +- Avoid deprecated 'U' mode when opening files #2187 + [jdufresne] + 5.2.0 (2018-07-01) ------------------ From 3b74a4c8ce112251fca255da345040931dd4c00f Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 11:55:58 +0300 Subject: [PATCH 0373/1393] Test ImageChops --- Tests/test_imagechops.py | 204 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/Tests/test_imagechops.py b/Tests/test_imagechops.py index 4e30dc1752c..ad8a43a446e 100644 --- a/Tests/test_imagechops.py +++ b/Tests/test_imagechops.py @@ -3,6 +3,16 @@ from PIL import Image from PIL import ImageChops +BLACK = (0, 0, 0) +BROWN = (127, 64, 0) +CYAN = (0, 255, 255) +DARK_GREEN = (0, 128, 0) +GREEN = (0, 255, 0) +ORANGE = (255, 128, 0) +WHITE = (255, 255, 255) + +GREY = 128 + class TestImageChops(PillowTestCase): @@ -35,6 +45,200 @@ def test_sanity(self): ImageChops.offset(im, 10) ImageChops.offset(im, 10, 20) + def test_add(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + im2 = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.add(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), ORANGE) + + def test_add_modulo(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + im2 = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.add_modulo(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), ORANGE) + + def test_blend(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + im2 = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.blend(im1, im2, 0.5) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), BROWN) + + def test_constant(self): + # Arrange + im = Image.new("RGB", (20, 10)) + + # Act + new = ImageChops.constant(im, GREY) + + # Assert + self.assertEqual(new.size, im.size) + self.assertEqual(new.getpixel((0, 0)), GREY) + self.assertEqual(new.getpixel((19, 9)), GREY) + + def test_darker(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") + im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") + + # Act + new = ImageChops.darker(im1, im2) + + # Assert + self.assert_image_equal(new, im2) + + def test_difference(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_arc_end_le_start.png") + im2 = Image.open("Tests/images/imagedraw_arc_no_loops.png") + + # Act + new = ImageChops.difference(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + + def test_duplicate(self): + # Arrange + im = hopper() + + # Act + new = ImageChops.duplicate(im) + + # Assert + self.assert_image_equal(new, im) + + def test_invert(self): + # Arrange + im = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.invert(im) + + # Assert + self.assertEqual(new.getbbox(), (0, 0, 100, 100)) + self.assertEqual(new.getpixel((0, 0)), WHITE) + self.assertEqual(new.getpixel((50, 50)), CYAN) + + def test_lighter(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") + im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") + + # Act + new = ImageChops.darker(im1, im2) + + # Assert + self.assert_image_equal(new, im2) + + def test_multiply_black(self): + """If you multiply an image with a solid black image, + the result is black.""" + # Arrange + im1 = hopper() + black = Image.new("RGB", im1.size, "black") + + # Act + new = ImageChops.multiply(im1, black) + + # Assert + self.assert_image_equal(new, black) + + def test_multiply_green(self): + # Arrange + im = Image.open("Tests/images/imagedraw_floodfill.png") + green = Image.new("RGB", im.size, "green") + + # Act + new = ImageChops.multiply(im, green) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + self.assertEqual(new.getpixel((25, 25)), DARK_GREEN) + self.assertEqual(new.getpixel((50, 50)), BLACK) + + def test_multiply_white(self): + """If you multiply with a solid white image, + the image is unaffected.""" + # Arrange + im1 = hopper() + white = Image.new("RGB", im1.size, "white") + + # Act + new = ImageChops.multiply(im1, white) + + # Assert + self.assert_image_equal(new, im1) + + def test_offset(self): + # Arrange + im = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + xoffset = 45 + yoffset = 20 + + # Act + new = ImageChops.offset(im, xoffset, yoffset) + + # Assert + self.assertEqual(new.getbbox(), (0, 45, 100, 96)) + self.assertEqual(new.getpixel((50, 50)), BLACK) + self.assertEqual(new.getpixel((50+xoffset, 50+yoffset)), DARK_GREEN) + + def test_screen(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + im2 = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.screen(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), ORANGE) + + def test_subtract(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") + im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") + + # Act + new = ImageChops.subtract(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 50, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), GREEN) + self.assertEqual(new.getpixel((50, 51)), BLACK) + + def test_subtract_modulo(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") + im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") + + # Act + new = ImageChops.subtract_modulo(im1, im2) + + # Assert + self.assertEqual(new.getbbox(), (25, 50, 76, 76)) + self.assertEqual(new.getpixel((50, 50)), GREEN) + self.assertEqual(new.getpixel((50, 51)), BLACK) + def test_logical(self): def table(op, a, b): From b565f45d7787bcd0823c6885e3f5cf17d7db770c Mon Sep 17 00:00:00 2001 From: Rolf Eike Beer Date: Sun, 1 Jul 2018 12:50:33 +0200 Subject: [PATCH 0374/1393] avoid invalid free if out of memory The surrounding code suggests this should only be freed if it was allocated locally. --- src/_imaging.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 5004becee9d..0cb2f56b9e9 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -448,7 +448,7 @@ float16tofloat32(const FLOAT16 in) { 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 @@ -778,7 +778,8 @@ _prepare_lut_table(PyObject* table, Py_ssize_t table_size) /* malloc check ok, max is 2 * 4 * 65**3 = 2197000 */ prepared = (INT16*) malloc(sizeof(INT16) * table_size); if ( ! prepared) { - free(table_data); + if (free_table_data) + free(table_data); return (INT16*) PyErr_NoMemory(); } From 937443f2a64564335b6e7439160742bc5939fd0c Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Thu, 5 Jul 2018 18:27:01 -0400 Subject: [PATCH 0375/1393] =?UTF-8?q?Update=20examples=20=E2=80=A6=20[ci?= =?UTF-8?q?=20skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update examples and remove "hide old releases" step, N/A on pypi.org. --- RELEASING.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 6541d69d54c..77c866cd46b 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -4,7 +4,7 @@ Released quarterly on the first day of January, April, July, October. -* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/1174 +* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in ``master`` branch. * [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) and [AppVeyor CI](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 TravisCI. @@ -13,8 +13,8 @@ Released quarterly on the first day of January, April, July, October. * [ ] Run pre-release check via `make release-test` in a freshly cloned repo. * [ ] Create branch and tag for release e.g.: ``` - $ git branch 2.9.x - $ git tag 2.9.0 + $ git branch 5.2.x + $ git tag 5.2.0 $ git push --all $ git push --tags ``` @@ -23,8 +23,7 @@ Released quarterly on the first day of January, April, July, October. $ make sdist ``` * [ ] Create [binary distributions](#binary-distributions) -* [ ] Upload all binaries and source distributions with ``twine upload dist/Pillow-4.1.0-*`` -* [ ] Manually hide old versions on PyPI such that only the latest major release is visible when viewing https://pypi.org/project/Pillow/ (https://pypi.org/manage/project/Pillow/releases/) +* [ ] Upload all binaries and source distributions e.g. ``twine upload dist/Pillow-5.2.0-*`` ## Point Release @@ -32,17 +31,17 @@ Released as needed for security, installation or critical bug fixes. * [ ] Make necessary changes in ``master`` branch. * [ ] Update `CHANGES.rst`. -* [ ] Cherry pick individual commits from ``master`` branch to release branch e.g. ``2.9.x``. -* [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in release branch e.g. ``2.9.x``. +* [ ] Cherry pick individual commits from ``master`` branch to release branch e.g. ``5.2.x``. +* [ ] Check [Travis CI](https://travis-ci.org/python-pillow/Pillow) to confirm passing tests in release branch e.g. ``5.2.x``. * [ ] Checkout release branch e.g.: ``` - git checkout -t remotes/origin/2.9.x + git checkout -t remotes/origin/5.2.x ``` * [ ] In compliance with 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.: ``` - $ git tag 2.9.1 + $ git tag 5.2.1 $ git push --tags ``` * [ ] Create source distributions e.g.: @@ -99,8 +98,8 @@ Released as needed privately to individual vendors for critical security-related ## Publicize Release -* [ ] Announce release availability via [Twitter](https://twitter.com/pythonpillow) e.g. https://twitter.com/aclark4life/status/583366798302691328. +* [ ] Announce release availability via [Twitter](https://twitter.com/pythonpillow) e.g. https://twitter.com/PythonPillow/status/1013789184354603010 ## Documentation -* [ ] Make sure the default version for Read the Docs is the latest release version, e.g. ``3.1.x`` rather than ``latest``: https://readthedocs.org/projects/pillow/versions/ +* [ ] Make sure the default version for Read the Docs is the latest release version, i.e. ``5.2.0`` rather than ``latest`` e.g. https://pillow.readthedocs.io/en/5.2.x/ From 63d8637bb8cbd90ce0372a221b2acdae505b053c Mon Sep 17 00:00:00 2001 From: tsennott Date: Fri, 6 Jul 2018 18:18:06 -0700 Subject: [PATCH 0376/1393] adding three-color feature to ImageOps.colorize --- src/PIL/ImageOps.py | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 25d491affa4..33196d5ede5 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -136,28 +136,50 @@ def autocontrast(image, cutoff=0, ignore=None): return _lut(image, lut) -def colorize(image, black, white): +def colorize(image, black, white, mid=None, midpoint=128): """ - Colorize grayscale image. The **black** and **white** - arguments should be RGB tuples; this function calculates a color - wedge mapping all black pixels in the source image to the first - color, and all white pixels to the second color. + Colorize grayscale image. + This function calculates a color wedge mapping all + black pixels in the source image to the first + color, and all white pixels to the second color. If + mid is specified, it uses three color mapping. + The **black** and **white** + arguments should be RGB tuples; optionally you can use + three color mapping by also specifying **mid**, and + optionally, **midpoint** (which is the integer value + in [0, 255] corresponding to the midpoint color, + default 128). :param image: The image to colorize. :param black: The color to use for black input pixels. :param white: The color to use for white input pixels. + :param mid: The color to use for midtone input pixels. + :param midpoint: the int value [0, 255] for the mid color. :return: An image. """ assert image.mode == "L" black = _color(black, "RGB") + if mid is not None: + mid = _color(mid, "RGB") white = _color(white, "RGB") red = [] green = [] blue = [] - for i in range(256): - red.append(black[0]+i*(white[0]-black[0])//255) - green.append(black[1]+i*(white[1]-black[1])//255) - blue.append(black[2]+i*(white[2]-black[2])//255) + if mid is None: + for i in range(256): + red.append(black[0] + i * (white[0] - black[0]) // 255) + green.append(black[1] + i * (white[1] - black[1]) // 255) + blue.append(black[2] + i * (white[2] - black[2]) // 255) + else: + for i in range(0, midpoint): + red.append(black[0] + i * (mid[0] - black[0]) // 255) + green.append(black[1] + i * (mid[1] - black[1]) // 255) + blue.append(black[2] + i * (mid[2] - black[2]) // 255) + for i in range(0, 256 - midpoint): + red.append(mid[0] + i * (white[0] - mid[0]) // 255) + green.append(mid[1] + i * (white[1] - mid[1]) // 255) + blue.append(mid[2] + i * (white[2] - mid[2]) // 255) + image = image.convert("RGB") return _lut(image, red + green + blue) From adf570a77ea802d86a59199a165aef6c053b852b Mon Sep 17 00:00:00 2001 From: tsennott Date: Fri, 6 Jul 2018 18:42:16 -0700 Subject: [PATCH 0377/1393] adding tests, updated docstring and comments --- Tests/test_imageops.py | 16 ++++++++++++++++ src/PIL/ImageOps.py | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 11cf3619d3e..63ec0d2e4cd 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -94,6 +94,22 @@ def test_scale(self): newimg = ImageOps.scale(i, 0.5) self.assertEqual(newimg.size, (25, 25)) + def test_colorize(self): + # Test the colorizing function + + # Grab test image + i = hopper("L").resize((15, 16)) + + # Test original 2-color functionality + ImageOps.colorize(i, 'green', 'red') + + # Test new three color functionality (cyanotype colors) + ImageOps.colorize(i, + (32, 37, 79), + (255, 255, 255), + (35, 52, 121), + 40) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 33196d5ede5..29dec124d1e 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -147,8 +147,8 @@ def colorize(image, black, white, mid=None, midpoint=128): arguments should be RGB tuples; optionally you can use three color mapping by also specifying **mid**, and optionally, **midpoint** (which is the integer value - in [0, 255] corresponding to the midpoint color, - default 128). + in [1, 254] corresponding to where the midpoint color + should be mapped (0 being black and 255 being white). :param image: The image to colorize. :param black: The color to use for black input pixels. @@ -158,10 +158,14 @@ def colorize(image, black, white, mid=None, midpoint=128): :return: An image. """ assert image.mode == "L" + + # Define colors from arguments black = _color(black, "RGB") if mid is not None: mid = _color(mid, "RGB") white = _color(white, "RGB") + + # Create the mapping red = [] green = [] blue = [] From 3c6fd275c8965d85ee89dfff608420e638feec21 Mon Sep 17 00:00:00 2001 From: tsennott Date: Fri, 6 Jul 2018 19:09:57 -0700 Subject: [PATCH 0378/1393] added assert for midpoint range --- src/PIL/ImageOps.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 29dec124d1e..133f9a8b8a5 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -154,10 +154,11 @@ def colorize(image, black, white, mid=None, midpoint=128): :param black: The color to use for black input pixels. :param white: The color to use for white input pixels. :param mid: The color to use for midtone input pixels. - :param midpoint: the int value [0, 255] for the mid color. + :param midpoint: the int value in [1, 254] for the mid color. :return: An image. """ assert image.mode == "L" + assert 1 <= midpoint <= 254 # Define colors from arguments black = _color(black, "RGB") From b19c460568675268145ce9f8ea2cfb42c357a5f0 Mon Sep 17 00:00:00 2001 From: tsennott Date: Fri, 6 Jul 2018 19:49:07 -0700 Subject: [PATCH 0379/1393] fixed mapping function, now smooth --- src/PIL/ImageOps.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 133f9a8b8a5..e5ce71060e7 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -136,7 +136,7 @@ def autocontrast(image, cutoff=0, ignore=None): return _lut(image, lut) -def colorize(image, black, white, mid=None, midpoint=128): +def colorize(image, black, white, mid=None, midpoint=127): """ Colorize grayscale image. This function calculates a color wedge mapping all @@ -176,14 +176,16 @@ def colorize(image, black, white, mid=None, midpoint=128): green.append(black[1] + i * (white[1] - black[1]) // 255) blue.append(black[2] + i * (white[2] - black[2]) // 255) else: - for i in range(0, midpoint): - red.append(black[0] + i * (mid[0] - black[0]) // 255) - green.append(black[1] + i * (mid[1] - black[1]) // 255) - blue.append(black[2] + i * (mid[2] - black[2]) // 255) - for i in range(0, 256 - midpoint): - red.append(mid[0] + i * (white[0] - mid[0]) // 255) - green.append(mid[1] + i * (white[1] - mid[1]) // 255) - blue.append(mid[2] + i * (white[2] - mid[2]) // 255) + range1 = range(0, midpoint) + range2 = range(0, 256 - midpoint) + for i in range1: + red.append(black[0] + i * (mid[0] - black[0]) // len(range1)) + green.append(black[1] + i * (mid[1] - black[1]) // len(range1)) + blue.append(black[2] + i * (mid[2] - black[2]) // len(range1)) + for i in range2: + red.append(mid[0] + i * (white[0] - mid[0]) // len(range2)) + green.append(mid[1] + i * (white[1] - mid[1]) // len(range2)) + blue.append(mid[2] + i * (white[2] - mid[2]) // len(range2)) image = image.convert("RGB") return _lut(image, red + green + blue) From 837d8683332a14cdd5234cfebe026235417d1a6a Mon Sep 17 00:00:00 2001 From: tsennott Date: Sat, 7 Jul 2018 02:40:25 -0700 Subject: [PATCH 0380/1393] updated test to assert equality with reference images --- Tests/images/bw_gradient.png | Bin 0 -> 1926 bytes Tests/images/bw_gradient_2color.png | Bin 0 -> 179 bytes Tests/images/bw_gradient_3color.png | Bin 0 -> 246 bytes Tests/test_imageops.py | 26 ++++++++++++++++---------- 4 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 Tests/images/bw_gradient.png create mode 100644 Tests/images/bw_gradient_2color.png create mode 100644 Tests/images/bw_gradient_3color.png diff --git a/Tests/images/bw_gradient.png b/Tests/images/bw_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7275dc19cb188d0b1c65334593fe5adc948476 GIT binary patch literal 1926 zcmb_dU5MO798WEN9aa&2Qjm~?Qqf6fl592^ZauEqv%AvVo!g~7-#R-pyBlwlNt4{| z-aUx=B2^#zAmWqagCHXKpwb76S_Sb%DiqN-K@cp0FQS4t*^gN3T|Ew$-RxxM_y79+ ze=~D_ZRNy~xd-MHMLE)J)LV*j=zck#yWM?EcF?C^trGtp)L>)zgIK!iwHuj6_M*$cAdw(~$%13VKvEA*vd%Vn7E#grSQ~q)tDYjFz%4Zq*;3#*%L}t)J%!HjLqL zs1Ge&q&)+9o@YSQFijv4Alr^}G6HcnKl4!M8BN0^4@ImN9!W=R<~2=bIw>JaO1E(~ zrAZQIj7VZ29Tp{xfsB^8WHTL%gEMOI0grf`XA+A_tYj$&O8BmBqo_n@`SO;`Xj`_O#Tvn4{KjkDBX&+J#zP;MhK zIJlp(P1qL$kp_ZEmMu;Fd%o%WYpLjl1G$j3P8?U8%f5p=#{s5}3bl__hZ|ugTf05o zKd1P)>1YtDW1(R}i@i|OXdwbFDVR)$yHL143MTf$K9^2!qKgSE6Wx4BQohuabnj1m z#$FXk@OR65VY&xrdxBM$6uE3d851jv$VA>~f zkIN(0&< zi|41OKRzult$wq<)b2lb?Fzd4l6sf_)zM!U^Q&`>cTaxv=Y!g7Z@UjI)!XmA_{kp^ zzx%BF+e=@5z4~o%-{mXU-hbxRH$HfB<%J8Yt;;{G>fggh-nwx6rI&wEj(&0Ym1Fmu ieSP8C^Vh%pcAY} zZ+$AZ@2z(&tK_?Kool@2KC}~K_+Z|`uE6<_ l(Zi{NVUmDcg9;iq{@%pDQw3)GKLC1!!PC{xWt~$(698i!XOaK_ literal 0 HcmV?d00001 diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 63ec0d2e4cd..c63e75574f2 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase, hopper from PIL import ImageOps +from PIL import Image class TestImageOps(PillowTestCase): @@ -97,18 +98,23 @@ def test_scale(self): def test_colorize(self): # Test the colorizing function - # Grab test image - i = hopper("L").resize((15, 16)) + # Grab test image (10px black, 256px gradient, 10px white) + im = Image.open("Tests/images/bw_gradient.png") + im = im.convert("L") # Test original 2-color functionality - ImageOps.colorize(i, 'green', 'red') - - # Test new three color functionality (cyanotype colors) - ImageOps.colorize(i, - (32, 37, 79), - (255, 255, 255), - (35, 52, 121), - 40) + out_2color = ImageOps.colorize(im, 'red', 'green') + + # Test new three color functionality, with midpoint offset + out_3color = ImageOps.colorize(im, 'red', 'green', 'yellow', 100) + + # Assert 2-color + ref_2color = Image.open("Tests/images/bw_gradient_2color.png") + self.assert_image_equal(out_2color, ref_2color) + + # Assert 3-color + ref_3color = Image.open("Tests/images/bw_gradient_3color.png") + self.assert_image_equal(out_3color, ref_3color) if __name__ == '__main__': From 4a6ec5ca72ed832578aeff7b80a5254dc6214801 Mon Sep 17 00:00:00 2001 From: tsennott Date: Sat, 7 Jul 2018 18:19:26 -0700 Subject: [PATCH 0381/1393] updated colorize to allow optional black/white positions; enhanced tests --- Tests/images/bw_gradient.png | Bin 1926 -> 102 bytes Tests/images/bw_gradient_2color.png | Bin 179 -> 0 bytes Tests/images/bw_gradient_3color.png | Bin 246 -> 0 bytes Tests/test_imageops.py | 90 ++++++++++++++++++++---- src/PIL/ImageOps.py | 102 ++++++++++++++++++++-------- 5 files changed, 149 insertions(+), 43 deletions(-) delete mode 100644 Tests/images/bw_gradient_2color.png delete mode 100644 Tests/images/bw_gradient_3color.png diff --git a/Tests/images/bw_gradient.png b/Tests/images/bw_gradient.png index 0b7275dc19cb188d0b1c65334593fe5adc948476..79c921486f8dc91f7c6f6bab36ba8ba302ed9b6f 100644 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5xHv#$-PijWKuXus#WAE}&f5!)f(#5i%^S-8 px%#v93$e=hZjU`?*}%5|8QZ?gVHD1NS6l`%z|+;wWt~$(69Dsx9MAv& literal 1926 zcmb_dU5MO798WEN9aa&2Qjm~?Qqf6fl592^ZauEqv%AvVo!g~7-#R-pyBlwlNt4{| z-aUx=B2^#zAmWqagCHXKpwb76S_Sb%DiqN-K@cp0FQS4t*^gN3T|Ew$-RxxM_y79+ ze=~D_ZRNy~xd-MHMLE)J)LV*j=zck#yWM?EcF?C^trGtp)L>)zgIK!iwHuj6_M*$cAdw(~$%13VKvEA*vd%Vn7E#grSQ~q)tDYjFz%4Zq*;3#*%L}t)J%!HjLqL zs1Ge&q&)+9o@YSQFijv4Alr^}G6HcnKl4!M8BN0^4@ImN9!W=R<~2=bIw>JaO1E(~ zrAZQIj7VZ29Tp{xfsB^8WHTL%gEMOI0grf`XA+A_tYj$&O8BmBqo_n@`SO;`Xj`_O#Tvn4{KjkDBX&+J#zP;MhK zIJlp(P1qL$kp_ZEmMu;Fd%o%WYpLjl1G$j3P8?U8%f5p=#{s5}3bl__hZ|ugTf05o zKd1P)>1YtDW1(R}i@i|OXdwbFDVR)$yHL143MTf$K9^2!qKgSE6Wx4BQohuabnj1m z#$FXk@OR65VY&xrdxBM$6uE3d851jv$VA>~f zkIN(0&< zi|41OKRzult$wq<)b2lb?Fzd4l6sf_)zM!U^Q&`>cTaxv=Y!g7Z@UjI)!XmA_{kp^ zzx%BF+e=@5z4~o%-{mXU-hbxRH$HfB<%J8Yt;;{G>fggh-nwx6rI&wEj(&0Ym1Fmu ieSP8C^Vh%pcAY} zZ+$AZ@2z(&tK_?Kool@2KC}~K_+Z|`uE6<_ l(Zi{NVUmDcg9;iq{@%pDQw3)GKLC1!!PC{xWt~$(698i!XOaK_ diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index c63e75574f2..d1be040461f 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -98,23 +98,85 @@ def test_scale(self): def test_colorize(self): # Test the colorizing function - # Grab test image (10px black, 256px gradient, 10px white) + # Open test image (256px by 10px, black to white) im = Image.open("Tests/images/bw_gradient.png") im = im.convert("L") - # Test original 2-color functionality - out_2color = ImageOps.colorize(im, 'red', 'green') - - # Test new three color functionality, with midpoint offset - out_3color = ImageOps.colorize(im, 'red', 'green', 'yellow', 100) - - # Assert 2-color - ref_2color = Image.open("Tests/images/bw_gradient_2color.png") - self.assert_image_equal(out_2color, ref_2color) - - # Assert 3-color - ref_3color = Image.open("Tests/images/bw_gradient_3color.png") - self.assert_image_equal(out_3color, ref_3color) + # Create image with original 2-color functionality + im_2c = ImageOps.colorize(im, 'red', 'green') + + # Create image with original 2-color functionality with offsets + im_2c_offset = ImageOps.colorize(im, + black='red', + white='green', + blackpoint=50, + whitepoint=200) + + # Create image with new three color functionality with offsets + im_3c_offset = ImageOps.colorize(im, + black='red', + white='green', + mid='blue', + blackpoint=50, + whitepoint=200, + midpoint=100) + + # Define function for approximate equality of tuples + def tuple_approx_equal(actual, target, thresh): + value = True + for i, target in enumerate(target): + value *= (target - thresh <= actual[i] <= target + thresh) + return value + + # Test output image (2-color) + left = (0, 1) + middle = (127, 1) + right = (255, 1) + self.assertTrue(tuple_approx_equal(im_2c.getpixel(left), + (255, 0, 0), thresh=1), + '2-color image black incorrect') + self.assertTrue(tuple_approx_equal(im_2c.getpixel(middle), + (127, 63, 0), thresh=1), + '2-color image mid incorrect') + self.assertTrue(tuple_approx_equal(im_2c.getpixel(right), + (0, 127, 0), thresh=1), + '2-color image white incorrect') + + # Test output image (2-color) with offsets + left = (25, 1) + middle = (125, 1) + right = (225, 1) + self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(left), + (255, 0, 0), thresh=1), + '2-color image (with offset) black incorrect') + self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(middle), + (127, 63, 0), thresh=1), + '2-color image (with offset) mid incorrect') + self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(right), + (0, 127, 0), thresh=1), + '2-color image (with offset) white incorrect') + + # Test output image (3-color) with offsets + left = (25, 1) + left_middle = (75, 1) + middle = (100, 1) + right_middle = (150, 1) + right = (225, 1) + self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(left), + (255, 0, 0), thresh=1), + '3-color image (with offset) black incorrect') + self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(left_middle), + (127, 0, 127), thresh=1), + '3-color image (with offset) low-mid incorrect') + self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(middle), + (0, 0, 255), thresh=1), + '3-color image (with offset) mid incorrect') + self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(right_middle), + (0, 63, 127), thresh=1), + '3-color image (with offset) high-mid incorrect') + self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(right), + (0, 127, 0), thresh=1), + '3-color image (with offset) white incorrect') if __name__ == '__main__': diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index e5ce71060e7..4e6baf8c9f2 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -136,57 +136,101 @@ def autocontrast(image, cutoff=0, ignore=None): return _lut(image, lut) -def colorize(image, black, white, mid=None, midpoint=127): +def colorize(image, black, white, mid=None, blackpoint=0, + whitepoint=255, midpoint=127): """ Colorize grayscale image. - This function calculates a color wedge mapping all - black pixels in the source image to the first - color, and all white pixels to the second color. If - mid is specified, it uses three color mapping. - The **black** and **white** - arguments should be RGB tuples; optionally you can use - three color mapping by also specifying **mid**, and - optionally, **midpoint** (which is the integer value - in [1, 254] corresponding to where the midpoint color - should be mapped (0 being black and 255 being white). + This function calculates a color wedge which maps all black pixels in + the source image to the first color and all white pixels to the + second color. If **mid** is specified, it uses three-color mapping. + The **black** and **white** arguments should be RGB tuples or color names; + optionally you can use three-color mapping by also specifying **mid**. + Mapping positions for any of the colors can be specified + (e.g. **blackpoint**), where these parameters are the integer + value in [0, 255] corresponding to where the corresponding color + should be mapped. :param image: The image to colorize. :param black: The color to use for black input pixels. :param white: The color to use for white input pixels. :param mid: The color to use for midtone input pixels. - :param midpoint: the int value in [1, 254] for the mid color. + :param blackpoint: an int value [0, 255] for the black mapping. + :param whitepoint: an int value [0, 255] for the white mapping. + :param midpoint: an int value [0, 255] for the midtone mapping. :return: An image. """ + + # Initial asserts assert image.mode == "L" - assert 1 <= midpoint <= 254 + assert 0 <= whitepoint <= 255 + assert 0 <= blackpoint <= 255 + assert 0 <= midpoint <= 255 + assert blackpoint <= whitepoint + if mid is not None: + assert blackpoint <= midpoint + assert whitepoint >= midpoint # Define colors from arguments black = _color(black, "RGB") + white = _color(white, "RGB") if mid is not None: mid = _color(mid, "RGB") - white = _color(white, "RGB") - # Create the mapping + # Empty lists for the mapping red = [] green = [] blue = [] + + # Create the mapping (2-color) if mid is None: - for i in range(256): - red.append(black[0] + i * (white[0] - black[0]) // 255) - green.append(black[1] + i * (white[1] - black[1]) // 255) - blue.append(black[2] + i * (white[2] - black[2]) // 255) + + # Define ranges + range_low = range(0, blackpoint) + range_map = range(0, whitepoint - blackpoint) + range_high = range(0, 256 - whitepoint) + + # Map + for i in range_low: + red.append(black[0]) + green.append(black[1]) + blue.append(black[2]) + for i in range_map: + red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) + green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) + blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) + for i in range_high: + red.append(white[0]) + green.append(white[1]) + blue.append(white[2]) + + # Create the mapping (3-color) else: - range1 = range(0, midpoint) - range2 = range(0, 256 - midpoint) - for i in range1: - red.append(black[0] + i * (mid[0] - black[0]) // len(range1)) - green.append(black[1] + i * (mid[1] - black[1]) // len(range1)) - blue.append(black[2] + i * (mid[2] - black[2]) // len(range1)) - for i in range2: - red.append(mid[0] + i * (white[0] - mid[0]) // len(range2)) - green.append(mid[1] + i * (white[1] - mid[1]) // len(range2)) - blue.append(mid[2] + i * (white[2] - mid[2]) // len(range2)) + # Define ranges + range_low = range(0, blackpoint) + range_map1 = range(0, midpoint - blackpoint) + range_map2 = range(0, whitepoint - midpoint) + range_high = range(0, 256 - whitepoint) + + # Map + for i in range_low: + red.append(black[0]) + green.append(black[1]) + blue.append(black[2]) + for i in range_map1: + red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) + green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) + blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1)) + for i in range_map2: + red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) + green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) + blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) + for i in range_high: + red.append(white[0]) + green.append(white[1]) + blue.append(white[2]) + + # Return converted image image = image.convert("RGB") return _lut(image, red + green + blue) From 1eed17c70e4a37039e30c78dfb472af7bc47c667 Mon Sep 17 00:00:00 2001 From: tsennott Date: Sun, 8 Jul 2018 20:09:39 -0700 Subject: [PATCH 0382/1393] tightened up colorize(); split tests; moved tuple comparison fcn to helper.py --- Tests/helper.py | 9 ++++ Tests/test_imageops.py | 109 ++++++++++++++++++++++------------------- src/PIL/ImageOps.py | 47 ++++++------------ 3 files changed, 83 insertions(+), 82 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 207f497d276..83458972358 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -307,6 +307,15 @@ def hopper(mode=None, cache={}): return im.copy() +def tuple_approx_equal(actual, target, threshold): + """Tests if tuple actual has values within threshold from tuple target""" + + value = True + for i, target in enumerate(target): + value *= (target - threshold <= actual[i] <= target + threshold) + return value + + def command_succeeds(cmd): """ Runs the command, which must be a list of strings. Returns True if the diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index d1be040461f..07e4dd34339 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper +from helper import unittest, PillowTestCase, hopper, tuple_approx_equal from PIL import ImageOps from PIL import Image @@ -95,87 +95,94 @@ def test_scale(self): newimg = ImageOps.scale(i, 0.5) self.assertEqual(newimg.size, (25, 25)) - def test_colorize(self): - # Test the colorizing function + def test_colorize_2color(self): + # Test the colorizing function with 2-color functionality # Open test image (256px by 10px, black to white) im = Image.open("Tests/images/bw_gradient.png") im = im.convert("L") # Create image with original 2-color functionality - im_2c = ImageOps.colorize(im, 'red', 'green') - - # Create image with original 2-color functionality with offsets - im_2c_offset = ImageOps.colorize(im, - black='red', - white='green', - blackpoint=50, - whitepoint=200) - - # Create image with new three color functionality with offsets - im_3c_offset = ImageOps.colorize(im, - black='red', - white='green', - mid='blue', - blackpoint=50, - whitepoint=200, - midpoint=100) - - # Define function for approximate equality of tuples - def tuple_approx_equal(actual, target, thresh): - value = True - for i, target in enumerate(target): - value *= (target - thresh <= actual[i] <= target + thresh) - return value + im_test = ImageOps.colorize(im, 'red', 'green') # Test output image (2-color) left = (0, 1) middle = (127, 1) right = (255, 1) - self.assertTrue(tuple_approx_equal(im_2c.getpixel(left), - (255, 0, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), threshold=1), '2-color image black incorrect') - self.assertTrue(tuple_approx_equal(im_2c.getpixel(middle), - (127, 63, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), + (127, 63, 0), threshold=1), '2-color image mid incorrect') - self.assertTrue(tuple_approx_equal(im_2c.getpixel(right), - (0, 127, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), threshold=1), '2-color image white incorrect') + def test_colorize_2color_offset(self): + # Test the colorizing function with 2-color functionality and offset + + # Open test image (256px by 10px, black to white) + im = Image.open("Tests/images/bw_gradient.png") + im = im.convert("L") + + # Create image with original 2-color functionality with offsets + im_test = ImageOps.colorize(im, + black='red', + white='green', + blackpoint=50, + whitepoint=100) + # Test output image (2-color) with offsets left = (25, 1) - middle = (125, 1) - right = (225, 1) - self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(left), - (255, 0, 0), thresh=1), + middle = (75, 1) + right = (125, 1) + self.assertTrue(tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), threshold=1), '2-color image (with offset) black incorrect') - self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(middle), - (127, 63, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), + (127, 63, 0), threshold=1), '2-color image (with offset) mid incorrect') - self.assertTrue(tuple_approx_equal(im_2c_offset.getpixel(right), - (0, 127, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), threshold=1), '2-color image (with offset) white incorrect') + def test_colorize_3color_offset(self): + # Test the colorizing function with 3-color functionality and offset + + # Open test image (256px by 10px, black to white) + im = Image.open("Tests/images/bw_gradient.png") + im = im.convert("L") + + # Create image with new three color functionality with offsets + im_test = ImageOps.colorize(im, + black='red', + white='green', + mid='blue', + blackpoint=50, + whitepoint=200, + midpoint=100) + # Test output image (3-color) with offsets left = (25, 1) left_middle = (75, 1) middle = (100, 1) right_middle = (150, 1) right = (225, 1) - self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(left), - (255, 0, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), threshold=1), '3-color image (with offset) black incorrect') - self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(left_middle), - (127, 0, 127), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(left_middle), + (127, 0, 127), threshold=1), '3-color image (with offset) low-mid incorrect') - self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(middle), - (0, 0, 255), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), + (0, 0, 255), threshold=1), '3-color image (with offset) mid incorrect') - self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(right_middle), - (0, 63, 127), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(right_middle), + (0, 63, 127), threshold=1), '3-color image (with offset) high-mid incorrect') - self.assertTrue(tuple_approx_equal(im_3c_offset.getpixel(right), - (0, 127, 0), thresh=1), + self.assertTrue(tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), threshold=1), '3-color image (with offset) white incorrect') diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 4e6baf8c9f2..0ba7ce06923 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -162,13 +162,10 @@ def colorize(image, black, white, mid=None, blackpoint=0, # Initial asserts assert image.mode == "L" - assert 0 <= whitepoint <= 255 - assert 0 <= blackpoint <= 255 - assert 0 <= midpoint <= 255 - assert blackpoint <= whitepoint - if mid is not None: - assert blackpoint <= midpoint - assert whitepoint >= midpoint + if mid is None: + assert 0 <= blackpoint <= whitepoint <= 255 + else: + assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 # Define colors from arguments black = _color(black, "RGB") @@ -181,42 +178,28 @@ def colorize(image, black, white, mid=None, blackpoint=0, green = [] blue = [] + # Create the low-end values + for i in range(0, blackpoint): + red.append(black[0]) + green.append(black[1]) + blue.append(black[2]) + # Create the mapping (2-color) if mid is None: - # Define ranges - range_low = range(0, blackpoint) range_map = range(0, whitepoint - blackpoint) - range_high = range(0, 256 - whitepoint) - # Map - for i in range_low: - red.append(black[0]) - green.append(black[1]) - blue.append(black[2]) for i in range_map: red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) - for i in range_high: - red.append(white[0]) - green.append(white[1]) - blue.append(white[2]) # Create the mapping (3-color) else: - # Define ranges - range_low = range(0, blackpoint) range_map1 = range(0, midpoint - blackpoint) range_map2 = range(0, whitepoint - midpoint) - range_high = range(0, 256 - whitepoint) - # Map - for i in range_low: - red.append(black[0]) - green.append(black[1]) - blue.append(black[2]) for i in range_map1: red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) @@ -225,10 +208,12 @@ def colorize(image, black, white, mid=None, blackpoint=0, red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) - for i in range_high: - red.append(white[0]) - green.append(white[1]) - blue.append(white[2]) + + # Create the high-end values + for i in range(0, 256 - whitepoint): + red.append(white[0]) + green.append(white[1]) + blue.append(white[2]) # Return converted image image = image.convert("RGB") From 50d6611587424394be1fdd93255b32f96ea7e34f Mon Sep 17 00:00:00 2001 From: tsennott Date: Mon, 9 Jul 2018 07:04:48 -0700 Subject: [PATCH 0383/1393] moved tuple test to assert method in PillowTestCase; added docs --- Tests/helper.py | 19 ++++----- Tests/test_imageops.py | 79 +++++++++++++++++++++---------------- docs/releasenotes/5.3.0.rst | 39 ++++++++++++++++++ docs/releasenotes/index.rst | 1 + src/PIL/ImageOps.py | 5 ++- 5 files changed, 98 insertions(+), 45 deletions(-) create mode 100644 docs/releasenotes/5.3.0.rst diff --git a/Tests/helper.py b/Tests/helper.py index 83458972358..b6ef6dc133d 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -192,6 +192,16 @@ def assert_all_same(self, items, msg=None): def assert_not_all_same(self, items, msg=None): self.assertFalse(items.count(items[0]) == len(items), msg) + def assert_tuple_approx_equal(self, actuals, targets, threshold, msg): + """Tests if actuals has values within threshold from targets""" + + value = True + for i, target in enumerate(targets): + value *= (target - threshold <= actuals[i] <= target + threshold) + + self.assertTrue(value, + msg + ': ' + repr(actuals) + ' != ' + repr(targets)) + def skipKnownBadTest(self, msg=None, platform=None, travis=None, interpreter=None): # Skip if platform/travis matches, and @@ -307,15 +317,6 @@ def hopper(mode=None, cache={}): return im.copy() -def tuple_approx_equal(actual, target, threshold): - """Tests if tuple actual has values within threshold from tuple target""" - - value = True - for i, target in enumerate(target): - value *= (target - threshold <= actual[i] <= target + threshold) - return value - - def command_succeeds(cmd): """ Runs the command, which must be a list of strings. Returns True if the diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 07e4dd34339..9c4da246365 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, hopper, tuple_approx_equal +from helper import unittest, PillowTestCase, hopper from PIL import ImageOps from PIL import Image @@ -109,15 +109,18 @@ def test_colorize_2color(self): left = (0, 1) middle = (127, 1) right = (255, 1) - self.assertTrue(tuple_approx_equal(im_test.getpixel(left), - (255, 0, 0), threshold=1), - '2-color image black incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), - (127, 63, 0), threshold=1), - '2-color image mid incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(right), - (0, 127, 0), threshold=1), - '2-color image white incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), + threshold=1, + msg='black test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(middle), + (127, 63, 0), + threshold=1, + msg='mid test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), + threshold=1, + msg='white test pixel incorrect') def test_colorize_2color_offset(self): # Test the colorizing function with 2-color functionality and offset @@ -137,15 +140,18 @@ def test_colorize_2color_offset(self): left = (25, 1) middle = (75, 1) right = (125, 1) - self.assertTrue(tuple_approx_equal(im_test.getpixel(left), - (255, 0, 0), threshold=1), - '2-color image (with offset) black incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), - (127, 63, 0), threshold=1), - '2-color image (with offset) mid incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(right), - (0, 127, 0), threshold=1), - '2-color image (with offset) white incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), + threshold=1, + msg='black test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(middle), + (127, 63, 0), + threshold=1, + msg='mid test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), + threshold=1, + msg='white test pixel incorrect') def test_colorize_3color_offset(self): # Test the colorizing function with 3-color functionality and offset @@ -169,21 +175,26 @@ def test_colorize_3color_offset(self): middle = (100, 1) right_middle = (150, 1) right = (225, 1) - self.assertTrue(tuple_approx_equal(im_test.getpixel(left), - (255, 0, 0), threshold=1), - '3-color image (with offset) black incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(left_middle), - (127, 0, 127), threshold=1), - '3-color image (with offset) low-mid incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(middle), - (0, 0, 255), threshold=1), - '3-color image (with offset) mid incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(right_middle), - (0, 63, 127), threshold=1), - '3-color image (with offset) high-mid incorrect') - self.assertTrue(tuple_approx_equal(im_test.getpixel(right), - (0, 127, 0), threshold=1), - '3-color image (with offset) white incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(left), + (255, 0, 0), + threshold=1, + msg='black test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(left_middle), + (127, 0, 127), + threshold=1, + msg='low-mid test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(middle), + (0, 0, 255), + threshold=1, + msg='mid incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(right_middle), + (0, 63, 127), + threshold=1, + msg='high-mid test pixel incorrect') + self.assert_tuple_approx_equal(im_test.getpixel(right), + (0, 127, 0), + threshold=1, + msg='white test pixel incorrect') if __name__ == '__main__': diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst new file mode 100644 index 00000000000..9869b6a7a1c --- /dev/null +++ b/docs/releasenotes/5.3.0.rst @@ -0,0 +1,39 @@ +5.3.0 +----- + +API Changes +=========== + +Deprecations +^^^^^^^^^^^^ + +These version constants have been deprecated. ``VERSION`` will be removed in +Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed after that. + +* ``PIL.VERSION`` (old PIL version 1.1.7) +* ``PIL.PILLOW_VERSION`` +* ``PIL.Image.VERSION`` +* ``PIL.Image.PILLOW_VERSION`` + +Use ``PIL.__version__`` instead. + +API Additions +============= + +ImageOps.colorize +^^^^^^^^^^^^^^^^^ + +Previously ``ImageOps.colorize`` only supported two-color mapping with +``black`` and ``white`` arguments being mapped to 0 and 255 respectively. +Now it supports three-color mapping with the optional ``mid`` parameter, and +the positions for all three color arguments can each be optionally specified +(``blackpoint``, ``whitepoint`` and ``midpoint``). +For example, with all optional arguments:: + ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), + blackpoint=15, whitepoint=240, midpoint=100) + + + +Other Changes +============= + diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 16e5c1d85c9..fc8d686eb00 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 5.3.0 5.2.0 5.1.0 5.0.0 diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 0ba7ce06923..9b470062a5a 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -147,8 +147,9 @@ def colorize(image, black, white, mid=None, blackpoint=0, optionally you can use three-color mapping by also specifying **mid**. Mapping positions for any of the colors can be specified (e.g. **blackpoint**), where these parameters are the integer - value in [0, 255] corresponding to where the corresponding color - should be mapped. + value corresponding to where the corresponding color should be mapped. + These parameters must have logical order, such that + **blackpoint** <= **midpoint** <= **whitepoint** (if **mid** is specified). :param image: The image to colorize. :param black: The color to use for black input pixels. From 87f042626f91c344efd669c76a243b74e76fe7c9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 11 Jul 2018 20:28:23 +0300 Subject: [PATCH 0384/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a6018ffb66d..b4bbfbb60d3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Add three-color support to ImageOps.colorize #3242 + [tsennott] + - Tests: Add LA to TGA test modes #3222 [danpla] From 8253c2cc269f7f7d79c0fafa9d71cbd0b4692445 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 12 Jul 2018 06:05:08 +1000 Subject: [PATCH 0385/1393] Removed 5.2.0 changes [ci skip] --- docs/releasenotes/5.3.0.rst | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 9869b6a7a1c..a5591b98d3e 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -1,33 +1,17 @@ 5.3.0 ----- -API Changes -=========== - -Deprecations -^^^^^^^^^^^^ - -These version constants have been deprecated. ``VERSION`` will be removed in -Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed after that. - -* ``PIL.VERSION`` (old PIL version 1.1.7) -* ``PIL.PILLOW_VERSION`` -* ``PIL.Image.VERSION`` -* ``PIL.Image.PILLOW_VERSION`` - -Use ``PIL.__version__`` instead. - API Additions ============= ImageOps.colorize ^^^^^^^^^^^^^^^^^ -Previously ``ImageOps.colorize`` only supported two-color mapping with -``black`` and ``white`` arguments being mapped to 0 and 255 respectively. -Now it supports three-color mapping with the optional ``mid`` parameter, and -the positions for all three color arguments can each be optionally specified -(``blackpoint``, ``whitepoint`` and ``midpoint``). +Previously ``ImageOps.colorize`` only supported two-color mapping with +``black`` and ``white`` arguments being mapped to 0 and 255 respectively. +Now it supports three-color mapping with the optional ``mid`` parameter, and +the positions for all three color arguments can each be optionally specified +(``blackpoint``, ``whitepoint`` and ``midpoint``). For example, with all optional arguments:: ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) From 448beaa9aac674ec06c15a81ad6582ca34e623e9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 12 Jul 2018 19:48:59 +1000 Subject: [PATCH 0386/1393] Improved wording [ci skip] --- src/libImaging/Draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 7b7c5fac05c..a3bb92309f1 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -434,7 +434,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, } for (i = 0; i < n; i++) { - /* This causes that the pixels of horizontal edges are drawn twice :( + /* This causes the pixels of horizontal edges to be drawn twice :( * but without it there are inconsistencies in ellipses */ if (e[i].ymin == e[i].ymax) { (*hline)(im, e[i].xmin, e[i].ymin, e[i].xmax, ink); From 9f6c708aa3961f9bc768d3bd5b95c1821d5ec6d1 Mon Sep 17 00:00:00 2001 From: Pedro Lacerda Date: Mon, 9 Jul 2018 04:33:00 -0300 Subject: [PATCH 0387/1393] Simplify library dirs search with ldconfig --- setup.py | 144 +++++++++++++++++++++++-------------------------------- 1 file changed, 61 insertions(+), 83 deletions(-) diff --git a/setup.py b/setup.py index 9529787f92b..dd31e874d59 100755 --- a/setup.py +++ b/setup.py @@ -74,6 +74,57 @@ def _dbg(s, tp=None): print(s) +def _find_library_dirs_ldconfig(): + # Based on ctypes.util from Python 2 + + if sys.platform.startswith("linux") or sys.platform.startswith("gnu"): + if struct.calcsize('l') == 4: + machine = os.uname()[4] + '-32' + else: + machine = os.uname()[4] + '-64' + mach_map = { + 'x86_64-64': 'libc6,x86-64', + 'ppc64-64': 'libc6,64bit', + 'sparc64-64': 'libc6,64bit', + 's390x-64': 'libc6,64bit', + 'ia64-64': 'libc6,IA-64', + } + abi_type = mach_map.get(machine, 'libc6') + + # XXX assuming GLIBC's ldconfig (with option -p) + # XXX Alpine Linux uses musl that can't print cache + args = ['/sbin/ldconfig', '-p'] + expr = r'.*\(%s.*\) => (.*)' % abi_type + env = dict(os.environ) + env['LC_ALL'] = 'C' + env['LANG'] = 'C' + + elif sys.platform.startswith("freebsd"): + args = ['/sbin/ldconfig', '-r'] + expr = r'.* => (.*)' + env = {} + + null = open(os.devnull, 'wb') + try: + with null: + p = subprocess.Popen(args, + stderr=null, + stdout=subprocess.PIPE, + env=env) + except OSError: # E.g. command not found + return None + [data, _] = p.communicate() + if isinstance(data, bytes): + data = data.decode() + + dirs = [] + for dll in re.findall(expr, data): + dir = os.path.dirname(dll) + if dir not in dirs: + dirs.append(dir) + return dirs + + def _add_directory(path, subdir, where=None): if subdir is None: return @@ -333,68 +384,20 @@ def build_extensions(self): _add_directory(library_dirs, "/usr/X11/lib") _add_directory(include_dirs, "/usr/X11/include") - elif sys.platform.startswith("linux"): - arch_tp = (plat.processor(), plat.architecture()[0]) - # This should be correct on debian derivatives. - if os.path.exists('/etc/debian_version'): - # If this doesn't work, don't just silently patch - # downstream because it's going to break when people - # try to build pillow from source instead of - # installing from the system packages. - self.add_multiarch_paths() - - elif arch_tp == ("x86_64", "32bit"): - # Special Case: 32-bit build on 64-bit machine. - _add_directory(library_dirs, "/usr/lib/i386-linux-gnu") - else: - libdirs = { - 'x86_64': ["/lib64", "/usr/lib64", - "/usr/lib/x86_64-linux-gnu"], - '64bit': ["/lib64", "/usr/lib64", - "/usr/lib/x86_64-linux-gnu"], - 'i386': ["/usr/lib/i386-linux-gnu"], - 'i686': ["/usr/lib/i386-linux-gnu"], - '32bit': ["/usr/lib/i386-linux-gnu"], - 'aarch64': ["/usr/lib64", "/usr/lib/aarch64-linux-gnu"], - 'arm': ["/usr/lib/arm-linux-gnueabi"], - 'armv71': ["/usr/lib/arm-linux-gnueabi"], - 'armv7l': ["/usr/lib"], - 'ppc64': ["/usr/lib64", "/usr/lib/ppc64-linux-gnu", - "/usr/lib/powerpc64-linux-gnu"], - 'ppc64le': ["/usr/lib64"], - 'ppc': ["/usr/lib/ppc-linux-gnu", - "/usr/lib/powerpc-linux-gnu"], - 's390x': ["/usr/lib64", "/usr/lib/s390x-linux-gnu"], - 's390': ["/usr/lib/s390-linux-gnu"], - } - - for platform_ in arch_tp: - dirs = libdirs.get(platform_, None) - if not dirs: - continue - for path in dirs: - _add_directory(library_dirs, path) - break - - else: - raise ValueError( - "Unable to identify Linux platform: `%s`" % platform_) - + elif sys.platform.startswith("linux") or \ + sys.platform.startswith("gnu") or \ + sys.platform.startswith("freebsd"): + for dirname in _find_library_dirs_ldconfig(): + _add_directory(library_dirs, dirname) + if sys.platform.startswith("linux") and \ + os.environ.get('ANDROID_ROOT', None): # termux support for android. # system libraries (zlib) are installed in /system/lib # headers are at $PREFIX/include # user libs are at $PREFIX/lib - if os.environ.get('ANDROID_ROOT', None): - _add_directory(library_dirs, - os.path.join(os.environ['ANDROID_ROOT'], - 'lib')) - - elif sys.platform.startswith("gnu"): - self.add_multiarch_paths() - - elif sys.platform.startswith("freebsd"): - _add_directory(library_dirs, "/usr/local/lib") - _add_directory(include_dirs, "/usr/local/include") + _add_directory(library_dirs, + os.path.join(os.environ['ANDROID_ROOT'], + 'lib')) elif sys.platform.startswith("netbsd"): _add_directory(library_dirs, "/usr/pkg/lib") @@ -728,31 +731,6 @@ def summary_report(self, feature): print("To check the build, run the selftest.py script.") print("") - # https://hg.python.org/users/barry/rev/7e8deab93d5a - def add_multiarch_paths(self): - # Debian/Ubuntu multiarch support. - # https://wiki.ubuntu.com/MultiarchSpec - # self.build_temp - tmpfile = os.path.join(self.build_temp, 'multiarch') - if not os.path.exists(self.build_temp): - os.makedirs(self.build_temp) - with open(tmpfile, 'wb') as fp: - try: - ret = subprocess.call(['dpkg-architecture', - '-qDEB_HOST_MULTIARCH'], stdout=fp) - except Exception: - return - try: - if ret >> 8 == 0: - with open(tmpfile, 'r') as fp: - multiarch_path_component = fp.readline().strip() - _add_directory(self.compiler.library_dirs, - '/usr/lib/' + multiarch_path_component) - _add_directory(self.compiler.include_dirs, - '/usr/include/' + multiarch_path_component) - finally: - os.unlink(tmpfile) - def debug_build(): return hasattr(sys, 'gettotalrefcount') From 44a4219283a0c38e3eb5be7fae7c0715794c312a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jul 2018 18:55:13 +1000 Subject: [PATCH 0388/1393] Added test for converting GIF with RGBA palette to P --- Tests/test_image_convert.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index ed971e69850..1e208d80c71 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -136,6 +136,17 @@ def test_trns_RGB(self): self.assertNotIn('transparency', im_p.info) im_p.save(f) + def test_gif_with_rgba_palette_to_p(self): + # See https://github.com/python-pillow/Pillow/issues/2433 + im = Image.open('Tests/images/hopper.gif') + im.info['transparency'] = 255 + im.load() + self.assertEqual(im.palette.mode, 'RGBA') + im_p = im.convert('P') + + # Should not raise ValueError: unrecognized raw mode + im_p.load() + def test_p_la(self): im = hopper('RGBA') alpha = hopper('L') From 47c4647a9b05ac0bae9b6e3c3950685de1bec94e Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 14 Jul 2018 23:33:54 +0300 Subject: [PATCH 0389/1393] Remove redundant module skipping The skipping originally applied to ImageFileIO (#375), and ImageFileIO was later removed (#1343) but this line was missed. --- docs/PIL.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/PIL.rst b/docs/PIL.rst index 67edb990192..fe69fed620a 100644 --- a/docs/PIL.rst +++ b/docs/PIL.rst @@ -62,8 +62,6 @@ can be found here. :undoc-members: :show-inheritance: -.. intentionally skipped documenting this because it's deprecated - :mod:`ImageShow` Module ----------------------- From 1e37125a23996614f1f4fb05e2c60cd3bb1fdf16 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 19 Jul 2018 06:36:19 +1000 Subject: [PATCH 0390/1393] Added GitHub release to release checklist [ci skip] --- RELEASING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASING.md b/RELEASING.md index 3c0e5045734..5a621481055 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -24,6 +24,7 @@ Released quarterly on the first day of January, April, July, October. ``` * [ ] Create [binary distributions](#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) * [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), append `.dev0` to version identifier in `src/PIL/_version.py` ## Point Release @@ -50,6 +51,7 @@ Released as needed for security, installation or critical bug fixes. $ make sdist ``` * [ ] Create [binary distributions](#binary-distributions) +* [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) ## Embargoed Release @@ -73,6 +75,7 @@ Released as needed privately to individual vendors for critical security-related $ make sdist ``` * [ ] Create [binary distributions](#binary-distributions) +* [ ] Create a [new release on GitHub](https://github.com/python-pillow/Pillow/releases/new) ## Binary Distributions From 88fdf504b3706f9f91344c5b78fec3fb7d1577b1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Jul 2018 14:38:47 +1000 Subject: [PATCH 0391/1393] Removed duplicate test --- Tests/test_imagegrab.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index b2edffa5788..87a6956f617 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -12,11 +12,6 @@ def test_grab(self): im = ImageGrab.grab() self.assert_image(im, im.mode, im.size) - @unittest.skipIf(on_appveyor(), "Test fails on appveyor") - def test_grab2(self): - im = ImageGrab.grab() - self.assert_image(im, im.mode, im.size) - except ImportError: class TestImageGrab(PillowTestCase): def test_skip(self): From 639f7c1462110792ae6f4256cfbe4b3e4c168cd2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Jul 2018 20:40:13 +1000 Subject: [PATCH 0392/1393] Include further instructions from ISSUE_TEMPLATE [ci skip] --- .github/CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8d0d7ff453e..eef2a30bd39 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -21,7 +21,9 @@ Please send a pull request to the master branch. Please include [documentation]( ## Reporting Issues -When reporting issues, please include code that reproduces the issue and whenever possible, an image that demonstrates the issue. The best reproductions are self-contained scripts with minimal dependencies. +When reporting issues, please include code that reproduces the issue and whenever possible, an image that demonstrates the issue. Please upload images to GitHub, not to third-party file hosting sites. If necessary, add the image to a zip or tar archive. + +The best reproductions are self-contained scripts with minimal dependencies. If you are using a framework such as plone, Django, or buildout, try to replicate the issue just using Pillow. ### Provide details From d372837b08aa6b2806433fd485d2846c1ed0c670 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 19 Jun 2018 20:33:38 +1000 Subject: [PATCH 0393/1393] Revert "Temporarily use --no-cache-dir for pip on mingw32" --- winbuild/appveyor_install_msys2_deps.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/appveyor_install_msys2_deps.sh b/winbuild/appveyor_install_msys2_deps.sh index 5cbc53ac379..fbab280b3c2 100644 --- a/winbuild/appveyor_install_msys2_deps.sh +++ b/winbuild/appveyor_install_msys2_deps.sh @@ -6,7 +6,7 @@ pacman -S --noconfirm mingw32/mingw-w64-i686-python3-pip \ mingw32/mingw-w64-i686-python2-setuptools \ mingw-w64-i686-libjpeg-turbo -C:/msys64/mingw32/bin/python3 -m pip install --upgrade --no-cache-dir pip +C:/msys64/mingw32/bin/python3 -m pip install --upgrade pip -/mingw32/bin/pip install --no-cache-dir pytest pytest-cov olefile -/mingw32/bin/pip3 install --no-cache-dir pytest pytest-cov olefile +/mingw32/bin/pip install pytest pytest-cov olefile +/mingw32/bin/pip3 install pytest pytest-cov olefile From 8038e3888e5d815569a2889fa8644a0340702181 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Aug 2018 21:44:21 +1000 Subject: [PATCH 0394/1393] Changed Pillow Python support notes to table [ci skip] --- docs/installation.rst | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 1501d1de16b..782ee7e7599 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -13,15 +13,21 @@ Warnings Notes ----- -.. note:: Pillow < 2.0.0 supports Python versions 2.4, 2.5, 2.6, 2.7. - -.. note:: Pillow >= 2.0.0 < 4.0.0 supports Python versions 2.6, 2.7, 3.2, 3.3, 3.4, 3.5 - -.. note:: Pillow >= 4.0.0 < 5.0.0 supports Python versions 2.7, 3.3, 3.4, 3.5, 3.6 - -.. note:: Pillow >= 5.0.0 < 5.2.0 supports Python versions 2.7, 3.4, 3.5, 3.6 - -.. note:: Pillow >= 5.2.0 supports Python versions 2.7, 3.4, 3.5, 3.6, 3.7 +.. note:: Pillow is supported on the following Python versions + ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|**Python** |**2.4**|**2.5**|**2.6**|**2.7**|**3.2**|**3.3**|**3.4**|**3.5**|**3.6**|**3.7**| ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|Pillow < 2.0.0 | Yes | Yes | Yes | Yes | | | | | | | ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|Pillow 2.x - 3.x | | | Yes | Yes | Yes | Yes | Yes | Yes | | | ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|Pillow 4.x | | | | Yes | | Yes | Yes | Yes | Yes | | ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|Pillow 5.0.x - 5.1.x| | | | Yes | | | Yes | Yes | Yes | | ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ +|Pillow >= 5.2.0 | | | | Yes | | | Yes | Yes | Yes | Yes | ++--------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ Basic Installation ------------------ From d2c9825cf03e0c23aa4db636a72e64f43375f828 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Aug 2018 23:41:14 +1000 Subject: [PATCH 0395/1393] Removed old build flags from documentation [ci skip] --- docs/installation.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 782ee7e7599..fc3f9b32c78 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -215,17 +215,15 @@ Build Options parallel building. * Build flags: ``--disable-zlib``, ``--disable-jpeg``, - ``--disable-tiff``, ``--disable-freetype``, ``--disable-tcl``, - ``--disable-tk``, ``--disable-lcms``, ``--disable-webp``, - ``--disable-webpmux``, ``--disable-jpeg2000``, + ``--disable-tiff``, ``--disable-freetype``, ``--disable-lcms``, + ``--disable-webp``, ``--disable-webpmux``, ``--disable-jpeg2000``, ``--disable-imagequant``. Disable building the corresponding feature even if the development libraries are present on the building machine. * Build flags: ``--enable-zlib``, ``--enable-jpeg``, - ``--enable-tiff``, ``--enable-freetype``, ``--enable-tcl``, - ``--enable-tk``, ``--enable-lcms``, ``--enable-webp``, - ``--enable-webpmux``, ``--enable-jpeg2000``, + ``--enable-tiff``, ``--enable-freetype``, ``--enable-lcms``, + ``--enable-webp``, ``--enable-webpmux``, ``--enable-jpeg2000``, ``--enable-imagequant``. Require that the corresponding feature is built. The build will raise an exception if the libraries are not found. Webpmux (WebP metadata) From f5f2d850015ae04aeef0c9cd952d1c08b613eeea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 13:22:08 +1000 Subject: [PATCH 0396/1393] Added 3.7 to list of OS X CI tested Python 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 fc3f9b32c78..fd44e15d27c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -394,7 +394,7 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Fedora 26 | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ -| Mac OS X 10.10 Yosemite* | 2.7, 3.4, 3.5, 3.6 |x86-64 | +| Mac OS X 10.10 Yosemite* | 2.7, 3.4, 3.5, 3.6, 3.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 16.04 LTS | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ From 58c0e54334fc7efa5535ff34fc62a7ad500333d7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 13:28:12 +1000 Subject: [PATCH 0397/1393] Added 9c to list of tested libjpeg 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 fd44e15d27c..1093bf6ba39 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -128,8 +128,8 @@ Many of Pillow's features require external libraries: * **libjpeg** provides JPEG functionality. - * Pillow has been tested with libjpeg versions **6b**, **8**, **9**, **9a**, - and **9b** and libjpeg-turbo version **8**. + * Pillow has been tested with libjpeg versions **6b**, **8**, **9-9c** and + libjpeg-turbo version **8**. * Starting with Pillow 3.0.0, libjpeg is required by default, but may be disabled with the ``--disable-jpeg`` flag. From a91cb4b24ae300d90ece3b8419b8d4532c4a2223 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 22:35:48 +1000 Subject: [PATCH 0398/1393] Improved GIF documentation [ci skip] --- docs/handbook/image-file-formats.rst | 64 +++++++++++++++++++--------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 1b0661df196..37c6c0e72d2 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -84,7 +84,14 @@ The :py:meth:`~PIL.Image.Image.open` method sets the following of the GIF, in milliseconds. **loop** - May not be present. The number of times the GIF should loop. + May not be present. The number of times the GIF should loop. 0 means that + it will loop forever. + +**comment** + May not be present. A comment about the image. + +**extension** + May not be present. Contains application specific information. Reading sequences ~~~~~~~~~~~~~~~~~ @@ -115,25 +122,12 @@ are available:: 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. -**duration** - The display duration of each frame of the multiframe gif, in - milliseconds. Pass a single integer for a constant duration, or a - list or tuple to set the duration for each frame separately. - -**loop** - Integer number of times the GIF should loop. - -**optimize** - If present and true, attempt to compress the palette by - eliminating unused colors. This is only useful if the palette can - be compressed to the next smaller power of 2 elements. +**include_color_table** + Whether or not to include local color table. -**palette** - Use the specified palette for the saved image. The palette should - be a bytes or bytearray object containing the palette entries in - RGBRGB... form. It should be no more than 768 bytes. Alternately, - the palette can be passed in as an - :py:class:`PIL.ImagePalette.ImagePalette` object. +**interlace** + Whether or not the image is interlaced. By default, it is, unless the image + is less than 16 pixels in width or height. **disposal** Indicates the way in which the graphic is to be treated after being displayed. @@ -146,6 +140,38 @@ are available:: Pass a single integer for a constant disposal, or a list or tuple to set the disposal for each frame separately. +**palette** + Use the specified palette for the saved image. The palette should + be a bytes or bytearray object containing the palette entries in + RGBRGB... form. It should be no more than 768 bytes. Alternately, + the palette can be passed in as an + :py:class:`PIL.ImagePalette.ImagePalette` object. + +**optimize** + If present and true, attempt to compress the palette by + eliminating unused colors. This is only useful if the palette can + be compressed to the next smaller power of 2 elements. + +Note that if the image you are saving comes from an existing GIF, it may have +the following properties in its :py:attr:`~PIL.Image.Image.info` dictionary. +For these options, if you do not pass them in, they will default to +their :py:attr:`~PIL.Image.Image.info` values. + +**transparency** + Transparency color index. + +**duration** + The display duration of each frame of the multiframe gif, in + milliseconds. Pass a single integer for a constant duration, or a + list or tuple to set the duration for each frame separately. + +**loop** + Integer number of times the GIF should loop. 0 means that it will loop + forever. By default, the image will not loop. + +**comment** + A comment about the image. + Reading local images ~~~~~~~~~~~~~~~~~~~~ From de9171e6c7ac2cd1d9157858d91cda7c29a5fabb Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 4 Aug 2018 22:19:28 +0300 Subject: [PATCH 0399/1393] Temporarily pin pytest to prevent scandir non-compilation --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 95d816a9871..62964194747 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -71,7 +71,7 @@ build_script: test_script: - cd c:\pillow -- '%PYTHON%\%PIP_DIR%\pip.exe install pytest pytest-cov' +- '%PYTHON%\%PIP_DIR%\pip.exe install "pytest<3.7" pytest-cov' - '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov-report term --cov-report xml Tests' #- '%PYTHON%\%EXECUTABLE% test-installed.py -v -s %TEST_OPTIONS%' TODO TEST_OPTIONS with pytest? From d7044350d5b029e7426d481968745d24d55c77cb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 13:47:42 +1000 Subject: [PATCH 0400/1393] Updated libimagequant to 2.12.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 ce5f66d8df4..56dfabf8fdc 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.11.10 +archive=libimagequant-2.12.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 1093bf6ba39..f8a9f5e5ae1 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -165,7 +165,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.11** + * Pillow has been tested with libimagequant **2.6-2.12.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 5c2e3253534ea0bd5ec84c6c94c3bbc72042913a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 19:16:33 +1000 Subject: [PATCH 0401/1393] Changed order of tests --- Tests/{test_image_fromqpixmap.py => test_qt_image_fromqpixmap.py} | 0 Tests/{test_image_toqimage.py => test_qt_image_toqimage.py} | 0 Tests/{test_image_toqpixmap.py => test_qt_image_toqpixmap.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Tests/{test_image_fromqpixmap.py => test_qt_image_fromqpixmap.py} (100%) rename Tests/{test_image_toqimage.py => test_qt_image_toqimage.py} (100%) rename Tests/{test_image_toqpixmap.py => test_qt_image_toqpixmap.py} (100%) diff --git a/Tests/test_image_fromqpixmap.py b/Tests/test_qt_image_fromqpixmap.py similarity index 100% rename from Tests/test_image_fromqpixmap.py rename to Tests/test_qt_image_fromqpixmap.py diff --git a/Tests/test_image_toqimage.py b/Tests/test_qt_image_toqimage.py similarity index 100% rename from Tests/test_image_toqimage.py rename to Tests/test_qt_image_toqimage.py diff --git a/Tests/test_image_toqpixmap.py b/Tests/test_qt_image_toqpixmap.py similarity index 100% rename from Tests/test_image_toqpixmap.py rename to Tests/test_qt_image_toqpixmap.py From de06db637bfb91528cad8c6825c21f8626b65145 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 5 Aug 2018 10:31:33 +0300 Subject: [PATCH 0402/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index b4bbfbb60d3..972092010f3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Depends: Update libimagequant to 2.12.1 #3281 + [radarhere] + - Add three-color support to ImageOps.colorize #3242 [tsennott] From 64bce1a583ffdbf1811263ae7dce3088a669d7c7 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Thu, 26 Jul 2018 12:52:51 -0400 Subject: [PATCH 0403/1393] Fix builds with --parallel Python 3.5's distutils added support for parallel builds, which means that we don't need to monkeypatch it anymore. But more importantly, this monkeypatch made build fail (hang in fact) whenever `--parallel` was passed to `python setup.py build`. This commit fixes the problem by not applying the monkeypatch on python 3.5+ and preserve the old behavior (parallel build by default) by injecting a `parallel` option when it's not specified. --- mp_compile.py | 6 +++++- setup.py | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mp_compile.py b/mp_compile.py index 5fac2399f1a..9043e24b82b 100644 --- a/mp_compile.py +++ b/mp_compile.py @@ -1,5 +1,7 @@ # A monkey patch of the base distutils.ccompiler to use parallel builds # Tested on 2.7, looks to be identical to 3.3. +# Only applied on Python < 3.5 because otherwise, it conflicts with Python's +# own newly-added support for parallel builds. from __future__ import print_function from multiprocessing import Pool, cpu_count @@ -77,4 +79,6 @@ def install(): "%s processes" % MAX_PROCS) -install() +# We monkeypatch only versions earlier than 3.5 +if sys.version_info < (3, 5): + install() diff --git a/setup.py b/setup.py index 9529787f92b..935f3d1cc72 100755 --- a/setup.py +++ b/setup.py @@ -205,6 +205,12 @@ def finalize_options(self): if self.debug: global DEBUG DEBUG = True + if sys.version_info >= (3, 5) and not self.parallel: + # For Python < 3.5, we monkeypatch distutils to have parallel + # builds. If --parallel (or -j) wasn't specified, we want to + # reproduce the same behavior as before, that is, auto-detect the + # number of jobs. + self.parallel = mp_compile.MAX_PROCS for x in self.feature: if getattr(self, 'disable_%s' % x): setattr(self.feature, x, False) From 24388addb647dbb7599bfefa739d56c7a180e8f8 Mon Sep 17 00:00:00 2001 From: yo1995 Date: Mon, 6 Aug 2018 18:13:57 +0800 Subject: [PATCH 0404/1393] feature improvement: improved performance of ImageDraw.floodfill with Python built-in set() datatype. --- src/PIL/ImageDraw.py | 54 ++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index ca8c1d17b71..2db19af186a 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -325,22 +325,23 @@ def getdraw(im=None, hints=None): def floodfill(image, xy, value, border=None, thresh=0): """ - (experimental) Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of non- - homogeneous, but similar, colors. - """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. + """ # based on an implementation by Eric S. Raymond + # amended by yo1995 @20180806 pixel = image.load() x, y = xy try: @@ -350,12 +351,15 @@ def floodfill(image, xy, value, border=None, thresh=0): pixel[x, y] = value except (ValueError, IndexError): return # seed point outside image - edge = [(x, y)] + edge = {(x, y)} + full_edge = set() # use a set to record each unique pixel processed if border is None: while edge: - newedge = [] - for (x, y) in edge: + new_edge = set() + for (x, y) in edge: # 4 adjacent method for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + if (s, t) in full_edge: + continue # if already processed, skip try: p = pixel[s, t] except IndexError: @@ -363,13 +367,17 @@ def floodfill(image, xy, value, border=None, thresh=0): else: if _color_diff(p, background) <= thresh: pixel[s, t] = value - newedge.append((s, t)) - edge = newedge + new_edge.add((s, t)) + full_edge.add((s, t)) + full_edge = edge # do not record useless pixels to reduce memory consumption + edge = new_edge else: while edge: - newedge = [] + new_edge = set() for (x, y) in edge: for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + if (s, t) in full_edge: + continue try: p = pixel[s, t] except IndexError: @@ -377,7 +385,9 @@ def floodfill(image, xy, value, border=None, thresh=0): else: if p != value and p != border: pixel[s, t] = value - newedge.append((s, t)) + new_edge.add((s, t)) + full_edge.add((s, t)) + full_edge = edge edge = newedge From 8676044a272f7d716892440429a5e45b4ca7960f Mon Sep 17 00:00:00 2001 From: yo1995 Date: Mon, 6 Aug 2018 18:47:49 +0800 Subject: [PATCH 0405/1393] fix docstring tab --- src/PIL/ImageDraw.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 2db19af186a..4f0144d3507 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -325,21 +325,21 @@ def getdraw(im=None, hints=None): def floodfill(image, xy, value, border=None, thresh=0): """ - (experimental) Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :param value: Fill color. - :param border: Optional border value. If given, the region consists of - pixels with a color different from the border color. If not given, - the region consists of pixels having the same color as the seed - pixel. - :param thresh: Optional threshold value which specifies a maximum - tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of non- - homogeneous, but similar, colors. - """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. + """ # based on an implementation by Eric S. Raymond # amended by yo1995 @20180806 pixel = image.load() From a221420ec399851f674761129648f4075c4ef8e4 Mon Sep 17 00:00:00 2001 From: yo1995 Date: Mon, 6 Aug 2018 19:36:18 +0800 Subject: [PATCH 0406/1393] fixe typo --- src/PIL/ImageDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 4f0144d3507..87ee4de0a34 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -388,7 +388,7 @@ def floodfill(image, xy, value, border=None, thresh=0): new_edge.add((s, t)) full_edge.add((s, t)) full_edge = edge - edge = newedge + edge = new_edge def _color_diff(rgb1, rgb2): From 164867643507f4334b80b8747321c76373a50a52 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 9 Aug 2018 20:54:16 +1000 Subject: [PATCH 0407/1393] Fixed typo [ci skip] --- src/PIL/JpegImagePlugin.py | 2 +- src/PIL/MpoImagePlugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 98c27010ce6..a75e3d428bc 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -793,7 +793,7 @@ def jpeg_factory(fp=None, filename=None): return im -# -------------------------------------------------------------------q- +# --------------------------------------------------------------------- # Registry stuff Image.register_open(JpegImageFile.format, jpeg_factory, _accept) diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index 460ccec27f7..a1a8d655a64 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -85,7 +85,7 @@ def tell(self): return self.__frame -# -------------------------------------------------------------------q- +# --------------------------------------------------------------------- # Registry stuff # Note that since MPO shares a factory with JPEG, we do not need to do a From 84b32a03885ed3fe5c15d8ab02b7089f45cd003e Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Fri, 3 Aug 2018 14:21:47 -0700 Subject: [PATCH 0408/1393] Read/Save RGB webp as RGB (instead of RGBX) --- Tests/images/hopper_webp_bits.ppm | Bin 29024 -> 49167 bytes Tests/test_file_webp.py | 17 ++++------------- Tests/test_file_webp_lossless.py | 3 +-- src/PIL/WebPImagePlugin.py | 24 +++++++++++++++++------- src/_webp.c | 2 ++ 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Tests/images/hopper_webp_bits.ppm b/Tests/images/hopper_webp_bits.ppm index 6dce2da2eb95a3a1f95690ddd1aaf616c49268f7..f431bc7b1fc5819dd1aa732631a2f7fd3e67110e 100644 GIT binary patch literal 49167 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 mDIu6;VC@1i7^1E!suS4498>Hh(j?_W3o literal 29024 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 Xo)d}cWc5i%00000NkvXXu0mjfoQE1w diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 06e274d0a1e..305abf48163 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -16,8 +16,7 @@ def setUp(self): self.skipTest('WebP support not installed') return - # WebPAnimDecoder only returns RGBA or RGBX, never RGB - self.rgb_mode = "RGBX" if _webp.HAVE_WEBPANIM else "RGB" + self.rgb_mode = "RGB" def test_version(self): _webp.WebPDecoderVersion() @@ -29,8 +28,7 @@ def test_read_rgb(self): Does it have the bits we expect? """ - file_path = "Tests/images/hopper.webp" - image = Image.open(file_path) + image = Image.open("Tests/images/hopper.webp") self.assertEqual(image.mode, self.rgb_mode) self.assertEqual(image.size, (128, 128)) @@ -40,9 +38,7 @@ def test_read_rgb(self): # generated with: # dwebp -ppm ../../Tests/images/hopper.webp -o hopper_webp_bits.ppm - target = Image.open('Tests/images/hopper_webp_bits.ppm') - target = target.convert(self.rgb_mode) - self.assert_image_similar(image, target, 20.0) + self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_bits.ppm', 1.0) def test_write_rgb(self): """ @@ -61,13 +57,8 @@ def test_write_rgb(self): image.load() image.getdata() - # If we're using the exact same version of WebP, this test should pass. - # but it doesn't if the WebP is generated on Ubuntu and tested on - # Fedora. - # generated with: dwebp -ppm temp.webp -o hopper_webp_write.ppm - # target = Image.open('Tests/images/hopper_webp_write.ppm') - # self.assert_image_equal(image, target) + self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_write.ppm', 12.0) # This test asserts that the images are similar. If the average pixel # difference between the two images is less than the epsilon value, diff --git a/Tests/test_file_webp_lossless.py b/Tests/test_file_webp_lossless.py index 10354c55fcd..4c35dad73ea 100644 --- a/Tests/test_file_webp_lossless.py +++ b/Tests/test_file_webp_lossless.py @@ -19,8 +19,7 @@ def setUp(self): if (_webp.WebPDecoderVersion() < 0x0200): self.skipTest('lossless not included') - # WebPAnimDecoder only returns RGBA or RGBX, never RGB - self.rgb_mode = "RGBX" if _webp.HAVE_WEBPANIM else "RGB" + self.rgb_mode = "RGB" def test_write_lossless_rgb(self): temp_file = self.tempfile("temp.webp") diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 39a8f2e35dd..1d8a0c10bd9 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -5,6 +5,7 @@ _VALID_WEBP_MODES = { "RGBX": True, "RGBA": True, + "RGB": True, } _VALID_WEBP_LEGACY_MODES = { @@ -63,7 +64,8 @@ def _open(self): bgcolor & 0xFF self.info["background"] = (bg_r, bg_g, bg_b, bg_a) self._n_frames = frame_count - self.mode = mode + self.mode = 'RGB' if mode == 'RGBX' else mode + self.rawmode = mode self.tile = [] # Attempt to read ICC / EXIF / XMP chunks from file @@ -154,7 +156,7 @@ def load(self): # Set tile self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] return super(WebPImageFile, self).load() @@ -240,16 +242,23 @@ def _save_all(im, fp, filename): # Make sure image mode is supported frame = ims + rawmode = ims.mode if ims.mode not in _VALID_WEBP_MODES: - alpha = ims.mode == 'P' and 'A' in ims.im.getpalettemode() - frame = ims.convert('RGBA' if alpha else 'RGBX') + alpha = 'A' in ims.mode or 'a' in ims.mode \ + or ims.mode == 'P' and 'A' in ims.im.getpalettemode() + rawmode = 'RGBA' if alpha else 'RGBX' + frame = ims.convert(rawmode) + + if rawmode == 'RGB': + # For faster conversion, use RGBX + rawmode = 'RGBX' # Append the frame to the animation encoder enc.add( - frame.tobytes(), + frame.tobytes('raw', rawmode), timestamp, frame.size[0], frame.size[1], - frame.mode, + rawmode, lossless, quality, method @@ -288,7 +297,8 @@ def _save(im, fp, filename): xmp = im.encoderinfo.get("xmp", "") if im.mode not in _VALID_WEBP_LEGACY_MODES: - alpha = im.mode == 'P' and 'A' in im.im.getpalettemode() + alpha = 'A' in im.mode or 'a' in im.mode \ + or im.mode == 'P' and 'A' in im.im.getpalettemode() im = im.convert('RGBA' if alpha else 'RGB') data = _webp.WebPEncode( diff --git a/src/_webp.c b/src/_webp.c index f23d950f771..66b6d3268ac 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -216,6 +216,8 @@ PyObject* _anim_encoder_add(PyObject* self, PyObject* args) WebPPictureImportRGBA(frame, rgb, 4 * width); } else if (strcmp(mode, "RGBX")==0) { WebPPictureImportRGBX(frame, rgb, 4 * width); + } else { + WebPPictureImportRGB(frame, rgb, 3 * width); } // Add the frame to the encoder From 9fcfdb4d4ee39afba500a7f507fcd6e2b85fd4c7 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 10 Aug 2018 20:15:21 +0300 Subject: [PATCH 0409/1393] Revert "CI: Temporarily pin pytest to prevent scandir non-compilation" --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 62964194747..95d816a9871 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -71,7 +71,7 @@ build_script: test_script: - cd c:\pillow -- '%PYTHON%\%PIP_DIR%\pip.exe install "pytest<3.7" pytest-cov' +- '%PYTHON%\%PIP_DIR%\pip.exe install pytest pytest-cov' - '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov-report term --cov-report xml Tests' #- '%PYTHON%\%EXECUTABLE% test-installed.py -v -s %TEST_OPTIONS%' TODO TEST_OPTIONS with pytest? From 046df78448972b9a619aef63b18531d356c35712 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 11 Aug 2018 16:39:49 +1000 Subject: [PATCH 0410/1393] Fixed typos --- Tests/test_file_jpeg2k.py | 4 ++-- src/PIL/ImagePalette.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 71f15f7b83a..be49c99bf4b 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -146,13 +146,13 @@ def test_16bit_monochrome_has_correct_mode(self): self.assertEqual(j2k.mode, 'I;16') self.assertEqual(jp2.mode, 'I;16') - def test_16bit_monchrome_jp2_like_tiff(self): + def test_16bit_monochrome_jp2_like_tiff(self): tiff_16bit = Image.open('Tests/images/16bit.cropped.tif') jp2 = Image.open('Tests/images/16bit.cropped.jp2') self.assert_image_similar(jp2, tiff_16bit, 1e-3) - def test_16bit_monchrome_j2k_like_tiff(self): + def test_16bit_monochrome_j2k_like_tiff(self): tiff_16bit = Image.open('Tests/images/16bit.cropped.tif') j2k = Image.open('Tests/images/16bit.cropped.j2k') diff --git a/src/PIL/ImagePalette.py b/src/PIL/ImagePalette.py index cecc6458387..81e99abbf4f 100644 --- a/src/PIL/ImagePalette.py +++ b/src/PIL/ImagePalette.py @@ -59,7 +59,7 @@ def copy(self): def getdata(self): """ - Get palette contents in format suitable # for the low-level + Get palette contents in format suitable for the low-level ``im.putpalette`` primitive. .. warning:: This method is experimental. From e3aaa80c0690676286b408759449c9219fd54146 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 12 Aug 2018 13:58:26 +1000 Subject: [PATCH 0411/1393] Added NumPy to documentation --- src/PIL/Image.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c589526577b..f13a98276bb 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2440,9 +2440,20 @@ def fromarray(obj, mode=None): Creates an image memory from an object exporting the array interface (using the buffer protocol). - If obj is not contiguous, then the tobytes method is called + If **obj** is not contiguous, then the tobytes method is called and :py:func:`~PIL.Image.frombuffer` is used. + If you have an image in NumPy:: + + from PIL import Image + import numpy as np + im = Image.open('hopper.jpg') + a = numpy.asarray(im) + + Then this can be used to convert it to a Pillow image:: + + im = Image.fromarray(a) + :param obj: Object with array interface :param mode: Mode to use (will be determined from type if None) See: :ref:`concept-modes`. From 070436795244acd220f73cb8a0c5cf4dcb821647 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Sun, 12 Aug 2018 21:44:25 -0700 Subject: [PATCH 0412/1393] Add more parenthesis to make statement clearer --- src/PIL/WebPImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 1d8a0c10bd9..011570862c4 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -245,7 +245,7 @@ def _save_all(im, fp, filename): rawmode = ims.mode if ims.mode not in _VALID_WEBP_MODES: alpha = 'A' in ims.mode or 'a' in ims.mode \ - or ims.mode == 'P' and 'A' in ims.im.getpalettemode() + or (ims.mode == 'P' and 'A' in ims.im.getpalettemode()) rawmode = 'RGBA' if alpha else 'RGBX' frame = ims.convert(rawmode) @@ -298,7 +298,7 @@ def _save(im, fp, filename): if im.mode not in _VALID_WEBP_LEGACY_MODES: alpha = 'A' in im.mode or 'a' in im.mode \ - or im.mode == 'P' and 'A' in im.im.getpalettemode() + or (im.mode == 'P' and 'A' in im.im.getpalettemode()) im = im.convert('RGBA' if alpha else 'RGB') data = _webp.WebPEncode( From 26d1eb4b058c6485acb87bf2aaee613c334236f6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 14 Aug 2018 19:37:16 +1000 Subject: [PATCH 0413/1393] Updated StackOverflow links [ci skip] --- docs/_templates/sidebarhelp.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_templates/sidebarhelp.html b/docs/_templates/sidebarhelp.html index 36b7c5e9599..8a33f18dcb4 100644 --- a/docs/_templates/sidebarhelp.html +++ b/docs/_templates/sidebarhelp.html @@ -1,4 +1,4 @@

Need help?

- You can get help via IRC at irc://irc.freenode.net#pil, Gitter or Stack Overflow here and here. Please report issues on GitHub. + You can get help via IRC at irc://irc.freenode.net#pil, Gitter or Stack Overflow. Please report issues on GitHub.

From 4d1cebd9a889c662217e8a0e2275fa1d45c39674 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 28 Jun 2018 17:26:00 +0300 Subject: [PATCH 0414/1393] Use Ubuntu 16.04 LTS (Xenial Xerus) as CI base --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 30c32cb7685..a79b8dc5378 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ matrix: - env: DOCKER="fedora-26-amd64" DOCKER_TAG="pytest" - env: DOCKER="fedora-27-amd64" DOCKER_TAG="pytest" -dist: trusty +dist: xenial sudo: required From 825817efe58ff6f10add0dd6609a3f0783d42aa4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 28 Jun 2018 17:53:18 +0300 Subject: [PATCH 0415/1393] Use Ubuntu 14.04 LTS (Trusty Tahr) for PyPy2/3 and Py3.4, not available on Xenial --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a79b8dc5378..ad385a507f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: xenial language: python cache: pip @@ -12,13 +13,16 @@ matrix: fast_finish: true include: - python: "pypy" + dist: trusty - python: "pypy3" + dist: trusty - python: '3.7-dev' - python: '2.7' - python: "2.7_with_system_site_packages" # For PyQt4 - python: '3.6' - python: '3.5' - python: '3.4' + dist: trusty - env: DOCKER="alpine" DOCKER_TAG="pytest" - env: DOCKER="arch" DOCKER_TAG="pytest" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" DOCKER_TAG="pytest" @@ -31,8 +35,6 @@ matrix: - env: DOCKER="fedora-26-amd64" DOCKER_TAG="pytest" - env: DOCKER="fedora-27-amd64" DOCKER_TAG="pytest" -dist: xenial - sudo: required services: From b2599042a27a76327dead2f3c29c4c3e5401c59f Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 3 Jul 2018 16:40:18 +0300 Subject: [PATCH 0416/1393] Add Ubuntu 14.04 LTS (Trusty Tahr) jobs for those that can use it --- .travis.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad385a507f5..23225dbbb8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ dist: xenial +sudo: required language: python cache: pip @@ -16,11 +17,19 @@ matrix: dist: trusty - python: "pypy3" dist: trusty - - python: '3.7-dev' + - python: '3.7' + - python: '2.7' - python: '2.7' + dist: trusty - python: "2.7_with_system_site_packages" # For PyQt4 + - python: "2.7_with_system_site_packages" # For PyQt4 + dist: trusty + - python: '3.6' - python: '3.6' + dist: trusty + - python: '3.5' - python: '3.5' + dist: trusty - python: '3.4' dist: trusty - env: DOCKER="alpine" DOCKER_TAG="pytest" @@ -35,8 +44,6 @@ matrix: - env: DOCKER="fedora-26-amd64" DOCKER_TAG="pytest" - env: DOCKER="fedora-27-amd64" DOCKER_TAG="pytest" -sudo: required - services: - docker From 6a7c7783eb97761c64a5464775085011e342538f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 17 Aug 2018 19:40:13 +1000 Subject: [PATCH 0417/1393] Corrected wording --- Tests/test_file_tar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index 3dd075042cc..9e02ab1a58e 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -12,7 +12,7 @@ class TestFileTar(PillowTestCase): def setUp(self): if "zip_decoder" not in codecs and "jpeg_decoder" not in codecs: - self.skipTest("neither jpeg nor zip support not available") + self.skipTest("neither jpeg nor zip support available") def test_sanity(self): if "zip_decoder" in codecs: From e5e5cb11432ddff2e52748317cc260b2e2c3493f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 18 Aug 2018 19:13:37 +1000 Subject: [PATCH 0418/1393] Update example [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 5a621481055..7794612fa62 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -94,7 +94,7 @@ Released as needed privately to individual vendors for critical security-related $ git fetch --all $ git checkout [[release tag]] $ cd .. - $ git commit -m "Pillow -> 2.9.0" Pillow + $ git commit -m "Pillow -> 5.2.0" Pillow $ git push ``` * [ ] Download distributions from the [Pillow Wheel Builder container](http://a365fff413fe338398b6-1c8a9b3114517dc5fe17b7c3f8c63a43.r19.cf2.rackcdn.com/). From de7b43397afe6b44b56622b2300ccdb4b6e7636e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 23 Aug 2018 20:36:05 +1000 Subject: [PATCH 0419/1393] Added links to installation documentation [ci skip] --- docs/handbook/image-file-formats.rst | 4 ++-- docs/releasenotes/4.2.0.rst | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 37c6c0e72d2..b48788e8b5d 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -529,8 +529,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 for details. + library before building the Python Imaging Library. See the `installation + documentation <../installation.rst>`_ for details. PPM ^^^ diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 1b41580a71c..9919a5db1c1 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -6,9 +6,10 @@ 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 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 `install +documentation <../installation.rst>`_ 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 af817c83ad1a3d5504afd742d02d26e7b9ea726f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 23 Aug 2018 21:07:25 +1000 Subject: [PATCH 0420/1393] Corrected links for Read The Docs [ci skip] --- docs/handbook/image-file-formats.rst | 2 +- docs/releasenotes/4.2.0.rst | 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 b48788e8b5d..eb50ff23dcb 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -530,7 +530,7 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: 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.rst>`_ for details. + documentation <../installation.html>`_ for details. PPM ^^^ diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index 9919a5db1c1..e07fd90716d 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -7,7 +7,7 @@ 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.rst>`_ for further details. This feature is +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. From a6a3a21f476fe9cfb98dcc328ac314c6c10a73ba Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 23 Aug 2018 21:15:16 +1000 Subject: [PATCH 0421/1393] Improved wording [ci skip] --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index f8a9f5e5ae1..9f0393563f8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -178,7 +178,7 @@ Many of Pillow's features require external libraries: shaping (using HarfBuzz), and proper script itemization. As a result, Raqm can support most writing systems covered by Unicode. * libraqm depends on the following libraries: FreeType, HarfBuzz, - FriBiDi, make sure that you install them before install libraqm + 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. From fb4d762a2f91c69f7fa9e7b9dc8ac0e4480fe2a6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 24 Aug 2018 20:12:12 +1000 Subject: [PATCH 0422/1393] Download lib if not present in pillow-depends --- winbuild/build_dep.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index a059b1ee8b1..6ac3baa473f 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -2,6 +2,7 @@ from untar import untar import os +from fetch import fetch from config import compilers, compiler_from_env, libs @@ -44,6 +45,8 @@ def extract(src, dest): def extract_libs(): for name, lib in libs.items(): filename = lib['filename'] + if not os.path.exists(filename): + filename = fetch(lib['url']) if name == 'openjpeg': for compiler in compilers.values(): if not os.path.exists(os.path.join( From df328a89a40b2384d471bff72d7eb9f3cb82264b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 3 Aug 2018 23:07:19 +1000 Subject: [PATCH 0423/1393] Added PySide2 --- Tests/test_imageqt.py | 4 ++++ Tests/test_qt_image_toqimage.py | 20 ++++++++++++++------ docs/reference/ImageQt.rst | 4 ++-- src/PIL/ImageQt.py | 4 ++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index cf9712aceeb..cecb1b5ee9e 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -33,6 +33,8 @@ def setUp(self): from PyQt4.QtGui import QGuiApplication elif ImageQt.qt_version == 'side': from PySide.QtGui import QGuiApplication + elif ImageQt.qt_version == 'side2': + from PySide2.QtGui import QGuiApplication except ImportError: self.skipTest('QGuiApplication not installed') @@ -56,6 +58,8 @@ def test_rgb(self): from PyQt4.QtGui import qRgb elif ImageQt.qt_version == 'side': from PySide.QtGui import qRgb + elif ImageQt.qt_version == 'side2': + from PySide2.QtGui import qRgb self.assertEqual(qRgb(0, 0, 0), qRgba(0, 0, 0, 255)) diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index c9971cf736e..95ff4747cdc 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -13,13 +13,21 @@ QT_VERSION = 5 except (ImportError, RuntimeError): try: - from PyQt4 import QtGui - from PyQt4.QtGui import QWidget, QHBoxLayout, QLabel, QApplication - QT_VERSION = 4 + from PySide2 import QtGui + from PySide2.QtWidgets import QWidget, QHBoxLayout, QLabel, \ + QApplication + QT_VERSION = 5 except (ImportError, RuntimeError): - from PySide import QtGui - from PySide.QtGui import QWidget, QHBoxLayout, QLabel, QApplication - QT_VERSION = 4 + try: + from PyQt4 import QtGui + from PyQt4.QtGui import QWidget, QHBoxLayout, QLabel, \ + QApplication + QT_VERSION = 4 + except (ImportError, RuntimeError): + from PySide import QtGui + from PySide.QtGui import QWidget, QHBoxLayout, QLabel, \ + QApplication + QT_VERSION = 4 class TestToQImage(PillowQtTestCase, PillowTestCase): diff --git a/docs/reference/ImageQt.rst b/docs/reference/ImageQt.rst index 7bc426eec95..3864010754d 100644 --- a/docs/reference/ImageQt.rst +++ b/docs/reference/ImageQt.rst @@ -4,8 +4,8 @@ :py:mod:`ImageQt` Module ======================== -The :py:mod:`ImageQt` module contains support for creating PyQt4, PyQt5 or -PySide QImage objects from PIL images. +The :py:mod:`ImageQt` module contains support for creating PyQt4, PyQt5, PySide or +PySide2 QImage objects from PIL images. .. versionadded:: 1.1.6 diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 2930c1d9cff..5ce68591683 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -23,6 +23,7 @@ qt_versions = [ ['5', 'PyQt5'], + ['side2', 'PySide2'], ['4', 'PyQt4'], ['side', 'PySide'] ] @@ -33,6 +34,9 @@ if qt_module == 'PyQt5': from PyQt5.QtGui import QImage, qRgba, QPixmap from PyQt5.QtCore import QBuffer, QIODevice + elif qt_module == 'PySide2': + from PySide2.QtGui import QImage, qRgba, QPixmap + from PySide2.QtCore import QBuffer, QIODevice elif qt_module == 'PyQt4': from PyQt4.QtGui import QImage, qRgba, QPixmap from PyQt4.QtCore import QBuffer, QIODevice From c8e00203ece19ae73d797a089bf935dda5eed6a4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 4 Aug 2018 20:18:36 +1000 Subject: [PATCH 0424/1393] Removed unnecessary setUp calls --- Tests/test_qt_image_fromqpixmap.py | 3 +-- Tests/test_qt_image_toqimage.py | 3 --- Tests/test_qt_image_toqpixmap.py | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Tests/test_qt_image_fromqpixmap.py b/Tests/test_qt_image_fromqpixmap.py index 543b74bbf24..0127f77e20d 100644 --- a/Tests/test_qt_image_fromqpixmap.py +++ b/Tests/test_qt_image_fromqpixmap.py @@ -1,5 +1,5 @@ from helper import unittest, PillowTestCase, hopper -from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase +from test_imageqt import PillowQPixmapTestCase from PIL import ImageQt @@ -7,7 +7,6 @@ class TestFromQPixmap(PillowQPixmapTestCase, PillowTestCase): def roundtrip(self, expected): - PillowQtTestCase.setUp(self) result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected)) # Qt saves all pixmaps as rgb self.assert_image_equal(result, expected.convert('RGB')) diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index c9971cf736e..896cf13fbf1 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -25,7 +25,6 @@ class TestToQImage(PillowQtTestCase, PillowTestCase): def test_sanity(self): - PillowQtTestCase.setUp(self) for mode in ('RGB', 'RGBA', 'L', 'P', '1'): src = hopper(mode) data = ImageQt.toqimage(src) @@ -61,8 +60,6 @@ def test_sanity(self): self.assert_image_equal(reloaded, src) def test_segfault(self): - PillowQtTestCase.setUp(self) - app = QApplication([]) ex = Example() assert(app) # Silence warning diff --git a/Tests/test_qt_image_toqpixmap.py b/Tests/test_qt_image_toqpixmap.py index c6555d7ff4a..5de7810f5c7 100644 --- a/Tests/test_qt_image_toqpixmap.py +++ b/Tests/test_qt_image_toqpixmap.py @@ -1,5 +1,5 @@ from helper import unittest, PillowTestCase, hopper -from test_imageqt import PillowQtTestCase, PillowQPixmapTestCase +from test_imageqt import PillowQPixmapTestCase from PIL import ImageQt @@ -10,8 +10,6 @@ class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase): def test_sanity(self): - PillowQtTestCase.setUp(self) - for mode in ('1', 'RGB', 'RGBA', 'L', 'P'): data = ImageQt.toqpixmap(hopper(mode)) From f0a5946c6e265d0101577ab3cfabefb2ad021899 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jul 2018 11:41:02 +1000 Subject: [PATCH 0425/1393] Fixed implicit conversion warnings --- src/_imaging.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 0cb2f56b9e9..5353e61c2ec 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -552,7 +552,7 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } - ink[0] = CLIP8(r); + ink[0] = (char) CLIP8(r); ink[1] = ink[2] = ink[3] = 0; } else { a = 255; @@ -572,10 +572,10 @@ getink(PyObject* color, Imaging im, char* ink) return NULL; } } - ink[0] = CLIP8(r); - ink[1] = CLIP8(g); - ink[2] = CLIP8(b); - ink[3] = 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: From e98469ecf6ad2b93afc1481e1ebb90bb5af3acc3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 25 Jun 2018 21:08:41 +1000 Subject: [PATCH 0426/1393] Added transparency to matrix conversion --- Tests/test_image_convert.py | 3 +++ src/PIL/Image.py | 21 ++++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 1e208d80c71..84c1cc82ec6 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -187,6 +187,7 @@ def test_matrix_xyz(self): def matrix_convert(mode): # Arrange im = hopper('RGB') + im.info['transparency'] = (255, 0, 0) matrix = ( 0.412453, 0.357580, 0.180423, 0, 0.212671, 0.715160, 0.072169, 0, @@ -203,9 +204,11 @@ def matrix_convert(mode): target = Image.open('Tests/images/hopper-XYZ.png') if converted_im.mode == 'RGB': self.assert_image_similar(converted_im, target, 3) + self.assertEqual(converted_im.info['transparency'], (105, 54, 4)) else: self.assert_image_similar(converted_im, target.getchannel(0), 1) + self.assertEqual(converted_im.info['transparency'], 105) matrix_convert('RGB') matrix_convert('L') diff --git a/src/PIL/Image.py b/src/PIL/Image.py index f13a98276bb..e31d9002d81 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -900,12 +900,28 @@ def convert(self, mode=None, matrix=None, dither=None, if not mode or (mode == self.mode and not matrix): return self.copy() + has_transparency = self.info.get('transparency') is not None if matrix: # matrix conversion if mode not in ("L", "RGB"): raise ValueError("illegal conversion") im = self.im.convert_matrix(mode, matrix) - return self._new(im) + new = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new.info['transparency'] + + def convert_transparency(m, v): + v = m[0]*v[0] + m[1]*v[1] + m[2]*v[2] + m[3]*0.5 + return max(0, min(255, int(v))) + if mode == "L": + transparency = convert_transparency(matrix, transparency) + elif len(mode) == 3: + transparency = tuple([ + convert_transparency(matrix[i*4:i*4+4], transparency) + for i in range(0, len(transparency)) + ]) + new.info['transparency'] = transparency + return new if mode == "P" and self.mode == "RGBA": return self.quantize(colors) @@ -913,8 +929,7 @@ def convert(self, mode=None, matrix=None, dither=None, trns = None delete_trns = False # transparency handling - if "transparency" in self.info and \ - self.info['transparency'] is not None: + if has_transparency: if self.mode in ('L', 'RGB') and mode == 'RGBA': # Use transparent conversion to promote from transparent # color to an alpha channel. From de2fbc9dffedb69ebb8045dbfcb1614c2711a114 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 16 Jun 2018 19:47:57 +1000 Subject: [PATCH 0427/1393] Wait until mode is normalized to copy im.info into encoderinfo --- Tests/test_file_gif.py | 21 +++++++++++++++++++++ src/PIL/GifImagePlugin.py | 17 ++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 086a0f5d0f7..75b0c974629 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -491,6 +491,27 @@ def test_transparent_optimize(self): self.assertEqual(reloaded.info['transparency'], 253) + def test_rgb_transparency(self): + out = self.tempfile('temp.gif') + + # Single frame + im = Image.new('RGB', (1, 1)) + im.info['transparency'] = (255, 0, 0) + self.assert_warning(UserWarning, im.save, out) + + reloaded = Image.open(out) + self.assertNotIn('transparency', reloaded.info) + + # Multiple frames + im = Image.new('RGB', (1, 1)) + im.info['transparency'] = b"" + ims = [Image.new('RGB', (1, 1))] + self.assert_warning(UserWarning, + im.save, out, save_all=True, append_images=ims) + + reloaded = Image.open(out) + self.assertNotIn('transparency', reloaded.info) + def test_bbox(self): out = self.tempfile('temp.gif') diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index fec2f76633c..425cc18996d 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -372,6 +372,8 @@ def _normalize_palette(im, palette, info): def _write_single_frame(im, fp, palette): im_out = _normalize_mode(im, True) + for k, v in im_out.info.items(): + im.encoderinfo.setdefault(k, v) im_out = _normalize_palette(im_out, palette, im.encoderinfo) for s in _get_global_header(im_out, im.encoderinfo): @@ -392,8 +394,8 @@ def _write_single_frame(im, fp, palette): def _write_multiple_frames(im, fp, palette): - duration = im.encoderinfo.get("duration", None) - disposal = im.encoderinfo.get('disposal', None) + duration = im.encoderinfo.get("duration", im.info.get("duration")) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) im_frames = [] frame_count = 0 @@ -402,6 +404,9 @@ def _write_multiple_frames(im, fp, palette): for im_frame in ImageSequence.Iterator(imSequence): # a copy is required here since seek can still mutate the image im_frame = _normalize_mode(im_frame.copy()) + if frame_count == 0: + for k, v in im_frame.info.items(): + im.encoderinfo.setdefault(k, v) im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) encoderinfo = im.encoderinfo.copy() @@ -460,12 +465,10 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): - for k, v in im.info.items(): - im.encoderinfo.setdefault(k, v) # header - try: - palette = im.encoderinfo["palette"] - except KeyError: + if "palette" in im.encoderinfo or "palette" in im.info: + palette = im.encoderinfo.get("palette", im.info.get("palette")) + else: palette = None im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) From f5740dc305bb1f951a27ecdc9184e9cbf97c3f3a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 29 Jul 2018 14:49:58 +1000 Subject: [PATCH 0428/1393] Set PDF title to filename by default --- src/PIL/PdfImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index d411bfc4139..d90e06a72a4 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -22,6 +22,7 @@ from . import Image, ImageFile, ImageSequence, PdfParser import io +import os __version__ = "0.5" @@ -47,7 +48,7 @@ def _save_all(im, fp, filename): def _save(im, fp, filename, save_all=False): resolution = im.encoderinfo.get("resolution", 72.0) is_appending = im.encoderinfo.get("append", False) - title = im.encoderinfo.get("title", None) + title = None if is_appending else im.encoderinfo.get("title", os.path.splitext(filename)[0]) author = im.encoderinfo.get("author", None) subject = im.encoderinfo.get("subject", None) keywords = im.encoderinfo.get("keywords", None) From fc57658635cae5cb40c72025a950b6287450b8b8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 29 Jul 2018 22:33:59 +1000 Subject: [PATCH 0429/1393] Added PDF creation and modification date info --- Tests/test_file_pdf.py | 25 ++++++++++++++---- Tests/test_pdfparser.py | 14 ++++++++++ docs/handbook/image-file-formats.rst | 15 ++++++++++- src/PIL/PdfImagePlugin.py | 39 ++++++++++++++-------------- src/PIL/PdfParser.py | 27 ++++++++++++++++--- 5 files changed, 91 insertions(+), 29 deletions(-) diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index f012fb9d824..57f1c211866 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -4,6 +4,7 @@ import os import os.path import tempfile +import time class TestFilePdf(PillowTestCase): @@ -187,8 +188,13 @@ def test_pdf_append(self): # open it, check pages and info with PdfParser.PdfParser(pdf_filename, mode="r+b") as pdf: self.assertEqual(len(pdf.pages), 1) - self.assertEqual(len(pdf.info), 1) + self.assertEqual(len(pdf.info), 4) + self.assertEqual(pdf.info.Title, os.path.splitext( + os.path.basename(pdf_filename) + )[0]) self.assertEqual(pdf.info.Producer, "PdfParser") + self.assertIn(b"CreationDate", pdf.info) + self.assertIn(b"ModDate", pdf.info) self.check_pdf_pages_consistency(pdf) # append some info @@ -203,8 +209,10 @@ def test_pdf_append(self): # open it again, check pages and info again with PdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 1) - self.assertEqual(len(pdf.info), 6) + self.assertEqual(len(pdf.info), 8) self.assertEqual(pdf.info.Title, "abc") + self.assertIn(b"CreationDate", pdf.info) + self.assertIn(b"ModDate", pdf.info) self.check_pdf_pages_consistency(pdf) # append two images @@ -216,29 +224,36 @@ def test_pdf_append(self): # open the PDF again, check pages and info again with PdfParser.PdfParser(pdf_filename) as pdf: self.assertEqual(len(pdf.pages), 3) - self.assertEqual(len(pdf.info), 6) + self.assertEqual(len(pdf.info), 8) self.assertEqual(PdfParser.decode_text(pdf.info[b"Title"]), "abc") self.assertEqual(pdf.info.Title, "abc") self.assertEqual(pdf.info.Producer, "PdfParser") self.assertEqual(pdf.info.Keywords, "qw)e\\r(ty") self.assertEqual(pdf.info.Subject, u"ghi\uABCD") + self.assertIn(b"CreationDate", pdf.info) + self.assertIn(b"ModDate", pdf.info) self.check_pdf_pages_consistency(pdf) def test_pdf_info(self): # make a PDF file pdf_filename = self.helper_save_as_pdf( "RGB", title="title", author="author", subject="subject", - keywords="keywords", creator="creator", producer="producer") + keywords="keywords", creator="creator", producer="producer", + creationDate=time.strptime("2000", "%Y"), + modDate=time.strptime("2001", "%Y")) # open it, check pages and info with PdfParser.PdfParser(pdf_filename) as pdf: - self.assertEqual(len(pdf.info), 6) + self.assertEqual(len(pdf.info), 8) self.assertEqual(pdf.info.Title, "title") self.assertEqual(pdf.info.Author, "author") self.assertEqual(pdf.info.Subject, "subject") self.assertEqual(pdf.info.Keywords, "keywords") self.assertEqual(pdf.info.Creator, "creator") self.assertEqual(pdf.info.Producer, "producer") + self.assertEqual(pdf.info.CreationDate, + time.strptime("2000", "%Y")) + self.assertEqual(pdf.info.ModDate, time.strptime("2001", "%Y")) self.check_pdf_pages_consistency(pdf) def test_pdf_append_to_bytesio(self): diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index 42c8135205a..660405635db 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -3,6 +3,7 @@ from PIL.PdfParser import IndirectObjectDef, IndirectReference, PdfBinary, \ PdfDict, PdfFormatError, PdfName, PdfParser, \ PdfStream, decode_text, encode_text, pdf_repr +import time class TestPdfParser(PillowTestCase): @@ -76,6 +77,19 @@ def test_parsing(self): self.assertIsInstance(s, PdfStream) self.assertEqual(s.dictionary.Name, "value") self.assertEqual(s.decode(), b"abcde") + for name in ["CreationDate", "ModDate"]: + for date, value in { + b"20180729214124": "20180729214124", + b"D:20180729214124": "20180729214124", + b"D:2018072921": "20180729210000", + b"D:20180729214124Z": "20180729214124", + b"D:20180729214124+08'00'": "20180729134124", + b"D:20180729214124-05'00'": "20180730024124" + }.items(): + d = PdfParser.get_value( + b"<>", 0)[0] + self.assertEqual( + time.strftime("%Y%m%d%H%M%S", getattr(d, name)), value) def test_pdf_repr(self): self.assertEqual(bytes(IndirectReference(1, 2)), b"1 2 R") diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index eb50ff23dcb..e1138726f7e 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1029,7 +1029,8 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum saved in the PDF. **title** - The document’s title. + The document’s title. If not appending to an existing PDF file, this will + default to the filename. .. versionadded:: 5.1.0 @@ -1061,6 +1062,18 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 5.1.0 +**creationDate** + The creation date of the document. If not appending to an existing PDF + file, this will default to the current time. + + .. versionadded:: 5.3.0 + +**modDate** + The modification date of the document. If not appending to an existing PDF + file, this will default to the current time. + + .. versionadded:: 5.3.0 + XV Thumbnails ^^^^^^^^^^^^^ diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index d90e06a72a4..b4250276218 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -23,6 +23,7 @@ from . import Image, ImageFile, ImageSequence, PdfParser import io import os +import time __version__ = "0.5" @@ -46,32 +47,30 @@ def _save_all(im, fp, filename): # (Internal) Image save plugin for the PDF format. def _save(im, fp, filename, save_all=False): - resolution = im.encoderinfo.get("resolution", 72.0) is_appending = im.encoderinfo.get("append", False) - title = None if is_appending else im.encoderinfo.get("title", os.path.splitext(filename)[0]) - author = im.encoderinfo.get("author", None) - subject = im.encoderinfo.get("subject", None) - keywords = im.encoderinfo.get("keywords", None) - creator = im.encoderinfo.get("creator", None) - producer = im.encoderinfo.get("producer", None) - if is_appending: existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") else: existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") - if title: - existing_pdf.info.Title = title - if author: - existing_pdf.info.Author = author - if subject: - existing_pdf.info.Subject = subject - if keywords: - existing_pdf.info.Keywords = keywords - if creator: - existing_pdf.info.Creator = creator - if producer: - existing_pdf.info.Producer = producer + resolution = im.encoderinfo.get("resolution", 72.0) + + info = { + "title": None if is_appending else os.path.splitext( + os.path.basename(filename) + )[0], + "author": None, + "subject": None, + "keywords": None, + "creator": None, + "producer": None, + "creationDate": None if is_appending else time.gmtime(), + "modDate": None if is_appending else time.gmtime() + } + for k, default in info.items(): + v = im.encoderinfo.get(k) if k in im.encoderinfo else default + if v: + existing_pdf.info[k[0].upper() + k[1:]] = v # # make sure image data is available diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 971f4451436..ad6d9f3fea5 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -1,8 +1,10 @@ +import calendar import codecs import collections import mmap import os import re +import time import zlib from ._util import py3 @@ -280,9 +282,26 @@ def __getattr__(self, key): except KeyError: raise AttributeError(key) if isinstance(value, bytes): - return decode_text(value) - else: - return value + value = decode_text(value) + if key.endswith("Date"): + if value.startswith("D:"): + value = value[2:] + + relationship = 'Z' + if len(value) > 17: + relationship = value[14] + offset = int(value[15:17]) * 60 + if len(value) > 20: + offset += int(value[18:20]) + + format = '%Y%m%d%H%M%S'[:len(value) - 2] + value = time.strptime(value[:len(format)+2], format) + if relationship in ['+', '-']: + offset *= 60 + if relationship == '+': + offset *= -1 + value = time.gmtime(calendar.timegm(value) + offset) + return value def __bytes__(self): out = bytearray(b"<<") @@ -347,6 +366,8 @@ def pdf_repr(x): return bytes(x) elif isinstance(x, int): 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): return bytes(PdfDict(x)) elif isinstance(x, list): From 36b1afff26f6b01cd1e7373528dfc0e90f568d77 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 08:21:43 +1000 Subject: [PATCH 0430/1393] Fixed None as TIFF compression argument --- Tests/test_file_libtiff.py | 2 +- src/PIL/TiffImagePlugin.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 77caa0b9dcd..855ec1e632f 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -486,7 +486,7 @@ def save_bytesio(compression=None): pilim_load = Image.open(buffer_io) self.assert_image_similar(pilim, pilim_load, 0) - # save_bytesio() + save_bytesio() save_bytesio('raw') save_bytesio("packbits") save_bytesio("tiff_lzw") diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 66b211cbfec..6663ea5f159 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1396,8 +1396,9 @@ def _save(im, fp, filename): ifd = ImageFileDirectory_v2(prefix=prefix) - compression = im.encoderinfo.get('compression', - im.info.get('compression', 'raw')) + compression = im.encoderinfo.get('compression', im.info.get('compression')) + if compression is None: + compression = 'raw' libtiff = WRITE_LIBTIFF or compression != 'raw' From 0a1fae8c2dc08aebbccd9c57d75ead681d23ed14 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 08:56:41 +1000 Subject: [PATCH 0431/1393] Added tests --- Tests/test_image_filter.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 3636a73f77a..75665d20aa0 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -94,6 +94,15 @@ def test_rankfilter_properties(self): self.assertEqual(rankfilter.size, 1) self.assertEqual(rankfilter.rank, 2) + def test_kernel_not_enough_coefficients(self): + self.assertRaises(ValueError, + lambda: ImageFilter.Kernel((3, 3), (0, 0))) + + def test_kernel_filter_p(self): + kernel = ImageFilter.Kernel((2, 2), (0, 0, 0, 0)) + + self.assertRaises(ValueError, kernel.filter, hopper("P")) + def test_consistency_3x3(self): source = Image.open("Tests/images/hopper.bmp") reference = Image.open("Tests/images/hopper_emboss.bmp") From 9c5c66cc8fe6c807520a523994996e8ff0a51b97 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 11:59:27 +1000 Subject: [PATCH 0432/1393] Improved ImageChops tests --- Tests/test_imagechops.py | 111 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 4 deletions(-) diff --git a/Tests/test_imagechops.py b/Tests/test_imagechops.py index ad8a43a446e..3714675cffd 100644 --- a/Tests/test_imagechops.py +++ b/Tests/test_imagechops.py @@ -57,6 +57,28 @@ def test_add(self): self.assertEqual(new.getbbox(), (25, 25, 76, 76)) self.assertEqual(new.getpixel((50, 50)), ORANGE) + def test_add_scale_offset(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") + im2 = Image.open("Tests/images/imagedraw_floodfill.png") + + # Act + new = ImageChops.add(im1, im2, scale=2.5, offset=100) + + # Assert + self.assertEqual(new.getbbox(), (0, 0, 100, 100)) + self.assertEqual(new.getpixel((50, 50)), (202, 151, 100)) + + def test_add_clip(self): + # Arrange + im = hopper() + + # Act + new = ImageChops.add(im, im) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (255, 255, 254)) + def test_add_modulo(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") @@ -69,6 +91,16 @@ def test_add_modulo(self): self.assertEqual(new.getbbox(), (25, 25, 76, 76)) self.assertEqual(new.getpixel((50, 50)), ORANGE) + def test_add_modulo_no_clip(self): + # Arrange + im = hopper() + + # Act + new = ImageChops.add_modulo(im, im) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (224, 76, 254)) + def test_blend(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") @@ -93,7 +125,7 @@ def test_constant(self): self.assertEqual(new.getpixel((0, 0)), GREY) self.assertEqual(new.getpixel((19, 9)), GREY) - def test_darker(self): + def test_darker_image(self): # Arrange im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") @@ -104,6 +136,17 @@ def test_darker(self): # Assert self.assert_image_equal(new, im2) + def test_darker_pixel(self): + # Arrange + im1 = hopper() + im2 = Image.open("Tests/images/imagedraw_chord_RGB.png") + + # Act + new = ImageChops.darker(im1, im2) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (240, 166, 0)) + def test_difference(self): # Arrange im1 = Image.open("Tests/images/imagedraw_arc_end_le_start.png") @@ -115,6 +158,17 @@ def test_difference(self): # Assert self.assertEqual(new.getbbox(), (25, 25, 76, 76)) + def test_difference_pixel(self): + # Arrange + im1 = hopper() + im2 = Image.open("Tests/images/imagedraw_polygon_kite_RGB.png") + + # Act + new = ImageChops.difference(im1, im2) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (240, 166, 128)) + def test_duplicate(self): # Arrange im = hopper() @@ -137,16 +191,27 @@ def test_invert(self): self.assertEqual(new.getpixel((0, 0)), WHITE) self.assertEqual(new.getpixel((50, 50)), CYAN) - def test_lighter(self): + def test_lighter_image(self): # Arrange im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") # Act - new = ImageChops.darker(im1, im2) + new = ImageChops.lighter(im1, im2) # Assert - self.assert_image_equal(new, im2) + self.assert_image_equal(new, im1) + + def test_lighter_pixel(self): + # Arrange + im1 = hopper() + im2 = Image.open("Tests/images/imagedraw_chord_RGB.png") + + # Act + new = ImageChops.lighter(im1, im2) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (255, 255, 127)) def test_multiply_black(self): """If you multiply an image with a solid black image, @@ -201,6 +266,10 @@ def test_offset(self): self.assertEqual(new.getpixel((50, 50)), BLACK) self.assertEqual(new.getpixel((50+xoffset, 50+yoffset)), DARK_GREEN) + # Test no yoffset + self.assertEqual(ImageChops.offset(im, xoffset), + ImageChops.offset(im, xoffset, xoffset)) + def test_screen(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") @@ -226,6 +295,29 @@ def test_subtract(self): self.assertEqual(new.getpixel((50, 50)), GREEN) self.assertEqual(new.getpixel((50, 51)), BLACK) + def test_subtract_scale_offset(self): + # Arrange + im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") + im2 = Image.open("Tests/images/imagedraw_outline_chord_RGB.png") + + # Act + new = ImageChops.subtract(im1, im2, scale=2.5, offset=100) + + # Assert + self.assertEqual(new.getbbox(), (0, 0, 100, 100)) + self.assertEqual(new.getpixel((50, 50)), (100, 202, 100)) + + def test_subtract_clip(self): + # Arrange + im1 = hopper() + im2 = Image.open("Tests/images/imagedraw_chord_RGB.png") + + # Act + new = ImageChops.subtract(im1, im2) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (0, 0, 127)) + def test_subtract_modulo(self): # Arrange im1 = Image.open("Tests/images/imagedraw_chord_RGB.png") @@ -239,6 +331,17 @@ def test_subtract_modulo(self): self.assertEqual(new.getpixel((50, 50)), GREEN) self.assertEqual(new.getpixel((50, 51)), BLACK) + def test_subtract_modulo_no_clip(self): + # Arrange + im1 = hopper() + im2 = Image.open("Tests/images/imagedraw_chord_RGB.png") + + # Act + new = ImageChops.subtract_modulo(im1, im2) + + # Assert + self.assertEqual(new.getpixel((50, 50)), (241, 167, 127)) + def test_logical(self): def table(op, a, b): From 9d5db408c5f8093c048a3336c174c4a703d6970e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 13:57:24 +1000 Subject: [PATCH 0433/1393] Changed rm command to use force --- depends/install_extra_test_images.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_extra_test_images.sh b/depends/install_extra_test_images.sh index 667c74e6d72..089a5e4d732 100755 --- a/depends/install_extra_test_images.sh +++ b/depends/install_extra_test_images.sh @@ -1,7 +1,7 @@ #!/bin/bash # install extra test images -rm -r test_images +rm -rf test_images # Use SVN to just fetch a single git subdirectory svn checkout https://github.com/python-pillow/pillow-depends/trunk/test_images From f115546b56a54b6458f189df0348806cfdf569bd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 14:57:15 +1000 Subject: [PATCH 0434/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 972092010f3..1daa5070308 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,18 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Tests: Added ImageChops tests #3230 + [hugovk, radarhere] + +- AppVeyor: Download lib if not present in pillow-depends #3316 + [radarhere] + +- Travis CI: Add Python 3.7 and Xenial #3234 + [hugovk] + +- Docs: Added documentation for NumPy conversion #3301 + [radarhere] + - Depends: Update libimagequant to 2.12.1 #3281 [radarhere] From 3ae5f054107f640383ec5ebb219dbf76f5b14b21 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 23:30:47 +1000 Subject: [PATCH 0435/1393] Changed Kernel to subclass BuiltinFilter, instead of the other way around --- Tests/test_image_filter.py | 10 +++++----- src/PIL/ImageFilter.py | 19 ++++++++----------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 75665d20aa0..6936a84f00f 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -94,15 +94,15 @@ def test_rankfilter_properties(self): self.assertEqual(rankfilter.size, 1) self.assertEqual(rankfilter.rank, 2) + def test_builtinfilter_p(self): + builtinFilter = ImageFilter.BuiltinFilter() + + self.assertRaises(ValueError, builtinFilter.filter, hopper("P")) + def test_kernel_not_enough_coefficients(self): self.assertRaises(ValueError, lambda: ImageFilter.Kernel((3, 3), (0, 0))) - def test_kernel_filter_p(self): - kernel = ImageFilter.Kernel((2, 2), (0, 0, 0, 0)) - - self.assertRaises(ValueError, kernel.filter, hopper("P")) - def test_consistency_3x3(self): source = Image.open("Tests/images/hopper.bmp") reference = Image.open("Tests/images/hopper_emboss.bmp") diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index e77349df08d..de99e641045 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -33,7 +33,14 @@ class MultibandFilter(Filter): pass -class Kernel(MultibandFilter): +class BuiltinFilter(MultibandFilter): + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): """ Create a convolution kernel. The current version only supports 3x3 and 5x5 integer and floating point kernels. @@ -60,16 +67,6 @@ def __init__(self, size, kernel, scale=None, offset=0): raise ValueError("not enough coefficients in kernel") self.filterargs = size, scale, offset, kernel - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - return image.filter(*self.filterargs) - - -class BuiltinFilter(Kernel): - def __init__(self): - pass - class RankFilter(Filter): """ From f4d39c95573cf5e25a87221e9a63c8a2987a1588 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 25 Aug 2018 23:33:12 +1000 Subject: [PATCH 0436/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 1daa5070308..f77b4137b89 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Tests: Added ImageFilter tests #3295 + [radarhere] + - Tests: Added ImageChops tests #3230 [hugovk, radarhere] From bdf2705cd3a76f03d0530d1b90b552d42cd16114 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 12:15:06 +0300 Subject: [PATCH 0437/1393] Remove ununsed draw_line. Only draw_lines is used by ImageDraw.py --- src/_imaging.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 0cb2f56b9e9..4ff277b0c6b 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2697,22 +2697,6 @@ _draw_ellipse(ImagingDrawObject* self, PyObject* args) return Py_None; } -static PyObject* -_draw_line(ImagingDrawObject* self, PyObject* args) -{ - int x0, y0, x1, y1; - int ink; - if (!PyArg_ParseTuple(args, "(ii)(ii)i", &x0, &y0, &x1, &y1, &ink)) - return NULL; - - if (ImagingDrawLine(self->image->image, x0, y0, x1, y1, - &ink, self->blend) < 0) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - static PyObject* _draw_lines(ImagingDrawObject* self, PyObject* args) { @@ -2961,7 +2945,6 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args) static struct PyMethodDef _draw_methods[] = { #ifdef WITH_IMAGEDRAW /* Graphics (ImageDraw) */ - {"draw_line", (PyCFunction)_draw_line, 1}, {"draw_lines", (PyCFunction)_draw_lines, 1}, #ifdef WITH_ARROW {"draw_outline", (PyCFunction)_draw_outline, 1}, From 6fc1e79e9601ff0990d93c22caf413d0fd51b11b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 12:19:32 +0300 Subject: [PATCH 0438/1393] Remove ununsed draw_point. Only draw_points is used by ImageDraw.py --- src/_imaging.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 4ff277b0c6b..3acbdb01c8d 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2750,21 +2750,6 @@ _draw_lines(ImagingDrawObject* self, PyObject* args) return Py_None; } -static PyObject* -_draw_point(ImagingDrawObject* self, PyObject* args) -{ - int x, y; - int ink; - if (!PyArg_ParseTuple(args, "(ii)i", &x, &y, &ink)) - return NULL; - - if (ImagingDrawPoint(self->image->image, x, y, &ink, self->blend) < 0) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - static PyObject* _draw_points(ImagingDrawObject* self, PyObject* args) { @@ -2951,7 +2936,6 @@ static struct PyMethodDef _draw_methods[] = { #endif {"draw_polygon", (PyCFunction)_draw_polygon, 1}, {"draw_rectangle", (PyCFunction)_draw_rectangle, 1}, - {"draw_point", (PyCFunction)_draw_point, 1}, {"draw_points", (PyCFunction)_draw_points, 1}, {"draw_arc", (PyCFunction)_draw_arc, 1}, {"draw_bitmap", (PyCFunction)_draw_bitmap, 1}, From 3cf6ad1895ce6a77245d3bc96c8d19c440ad6132 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 5 Jul 2018 00:54:52 +0300 Subject: [PATCH 0439/1393] Remove ununsed font_getabc --- src/_imagingft.c | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/src/_imagingft.c b/src/_imagingft.c index 86e0fe45b8b..f94e5580320 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -674,47 +674,6 @@ font_getsize(FontObject* self, PyObject* args) ); } -static PyObject* -font_getabc(FontObject* self, PyObject* args) -{ - FT_ULong ch; - FT_Face face; - double a, b, c; - - /* calculate ABC values for a given string */ - - PyObject* string; - if (!PyArg_ParseTuple(args, "O:getabc", &string)) - return NULL; - -#if PY_VERSION_HEX >= 0x03000000 - if (!PyUnicode_Check(string)) { -#else - if (!PyUnicode_Check(string) && !PyString_Check(string)) { -#endif - PyErr_SetString(PyExc_TypeError, "expected string"); - return NULL; - } - - if (font_getchar(string, 0, &ch)) { - int index, error; - face = self->face; - index = FT_Get_Char_Index(face, ch); - /* Note: bitmap fonts within ttf fonts do not work, see #891/pr#960 */ - error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP); - if (error) - return geterror(error); - a = face->glyph->metrics.horiBearingX / 64.0; - b = face->glyph->metrics.width / 64.0; - c = (face->glyph->metrics.horiAdvance - - face->glyph->metrics.horiBearingX - - face->glyph->metrics.width) / 64.0; - } else - a = b = c = 0.0; - - return Py_BuildValue("ddd", a, b, c); -} - static PyObject* font_render(FontObject* self, PyObject* args) { @@ -854,7 +813,6 @@ font_dealloc(FontObject* self) static PyMethodDef font_methods[] = { {"render", (PyCFunction) font_render, METH_VARARGS}, {"getsize", (PyCFunction) font_getsize, METH_VARARGS}, - {"getabc", (PyCFunction) font_getabc, METH_VARARGS}, {NULL, NULL} }; From 970ea7d3c42cce231494e5a5fe35e370f38b1601 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 16:23:38 +0300 Subject: [PATCH 0440/1393] Test two arbitrarily chosen jobs with PYTHONOPTIMIZE --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 23225dbbb8f..b5adc2da7c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,8 +30,10 @@ matrix: - python: '3.5' - python: '3.5' dist: trusty + env: PYTHONOPTIMIZE=1 - python: '3.4' dist: trusty + env: PYTHONOPTIMIZE=2 - env: DOCKER="alpine" DOCKER_TAG="pytest" - env: DOCKER="arch" DOCKER_TAG="pytest" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" DOCKER_TAG="pytest" From fc8717fb040a135b91be58af3c4faf86d9765516 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 16:28:02 +0300 Subject: [PATCH 0441/1393] Remove docstring formatting for when PYTHONOPTIMIZE=2 --- src/PIL/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index a07280e3142..bc8cfed8c7b 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -1,4 +1,4 @@ -"""Pillow {} (Fork of the Python Imaging Library) +"""Pillow (Fork of the Python Imaging Library) Pillow is the friendly PIL fork by Alex Clark and Contributors. https://github.com/python-pillow/Pillow/ @@ -24,8 +24,6 @@ del _version -__doc__ = __doc__.format(__version__) # include version in docstring - _plugins = ['BlpImagePlugin', 'BmpImagePlugin', From d7e4d3db3fd73995639b72dfd55c4fcce1938c90 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 16:47:48 +0300 Subject: [PATCH 0442/1393] Convert assert into exception --- Tests/test_imagefont.py | 2 +- src/PIL/ImageDraw.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index f2116bdc46a..82108638cf7 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -215,7 +215,7 @@ def test_unknown_align(self): # Act/Assert self.assertRaises( - AssertionError, + ValueError, draw.multiline_text, (0, 0), TEST_TEXT, font=ttf, align="unknown") def test_draw_align(self): diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index ca8c1d17b71..a427e327d7d 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -246,7 +246,7 @@ def multiline_text(self, xy, text, fill=None, font=None, anchor=None, elif align == "right": left += (max_width - widths[idx]) else: - assert False, 'align must be "left", "center" or "right"' + raise ValueError('align must be "left", "center" or "right"') self.text((left, top), line, fill, font, anchor, direction=direction, features=features) top += line_spacing From 4218a769d79c0f07a9ef1b67d7ace52bad88a835 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 18:01:24 +0300 Subject: [PATCH 0443/1393] Refactor cffi import and skipping --- Tests/test_image_access.py | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 7a9378bbde1..cdce3fd49b1 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -2,8 +2,9 @@ try: from PIL import PyAccess + import cffi except ImportError: - # Skip in setUp() + cffi = None pass from PIL import Image @@ -113,38 +114,20 @@ def test_signedness(self): self.check(mode, 2**16-1) +@unittest.skipIf(cffi is None, "No cffi") class TestCffiPutPixel(TestImagePutPixel): _need_cffi_access = True - def setUp(self): - try: - import cffi - assert cffi # silence warning - except ImportError: - self.skipTest("No cffi") - +@unittest.skipIf(cffi is None, "No cffi") class TestCffiGetPixel(TestImageGetPixel): _need_cffi_access = True - def setUp(self): - try: - import cffi - assert cffi # silence warning - except ImportError: - self.skipTest("No cffi") - +@unittest.skipIf(cffi is None, "No cffi") class TestCffi(AccessTest): _need_cffi_access = True - def setUp(self): - try: - import cffi - assert cffi # silence warning - except ImportError: - self.skipTest("No cffi") - def _test_get_access(self, im): """Do we get the same thing as the old pixel access From 663b06e223bfa445d0c81b2d3e5923a66887d1a9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 18:26:09 +0300 Subject: [PATCH 0444/1393] Skip: CFFI imports pycparser which doesn't support PYTHONOPTIMIZE=2 --- Tests/test_image_access.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index cdce3fd49b1..f87e750711c 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -1,16 +1,21 @@ from helper import unittest, PillowTestCase, hopper, on_appveyor -try: - from PIL import PyAccess - import cffi -except ImportError: - cffi = None - pass - from PIL import Image import sys import os +# CFFI imports pycparser which doesn't support PYTHONOPTIMIZE=2 +# https://github.com/eliben/pycparser/pull/198#issuecomment-317001670 +if os.environ.get("PYTHONOPTIMIZE") == "2": + cffi = None +else: + try: + from PIL import PyAccess + import cffi + except ImportError: + cffi = None + pass + class AccessTest(PillowTestCase): # initial value From 29b2c6e23dc98cd941ae7cca9f65041855143b09 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 4 Jul 2018 18:43:39 +0300 Subject: [PATCH 0445/1393] Only import cffi where needed, to avoid problems with PYTHONOPTIMIZE=2 --- src/PIL/ImageTk.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index 17bf32f628a..d58ee852835 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -32,13 +32,6 @@ else: import Tkinter as tkinter -# required for pypy, which always has cffi installed -try: - from cffi import FFI - ffi = FFI() -except ImportError: - pass - from . import Image from io import BytesIO @@ -192,7 +185,11 @@ def paste(self, im, box=None): from . import _imagingtk try: if hasattr(tk, 'interp'): - # Pypy is using a ffi cdata element + # Required for PyPy, which always has CFFI installed + from cffi import FFI + ffi = FFI() + + # Pypy is using an FFI cdata element # (Pdb) self.tk.interp # _imagingtk.tkinit( From 847581f7dd752231e8ca9e72189fa4506d2041ac Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 14 Jul 2018 09:35:42 +0300 Subject: [PATCH 0446/1393] Remove redundant 'pass' --- Tests/test_image_access.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index f87e750711c..a7e39a499a0 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -14,7 +14,6 @@ import cffi except ImportError: cffi = None - pass class AccessTest(PillowTestCase): From 2d6f0f77dafacba1f20b2a309476c3d5c11fe22e Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 14 Aug 2018 12:34:40 +0300 Subject: [PATCH 0447/1393] Fix typo --- src/PIL/ImageTk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index d58ee852835..c56f5560a5e 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -189,7 +189,7 @@ def paste(self, im, box=None): from cffi import FFI ffi = FFI() - # Pypy is using an FFI cdata element + # PyPy is using an FFI CDATA element # (Pdb) self.tk.interp # _imagingtk.tkinit( From 9c4370e5ef0631e201f5a61e35e2a2181bd95ebf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 27 Aug 2018 20:16:41 +1000 Subject: [PATCH 0448/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f77b4137b89..785d41f6a9f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Remove unused draw.draw_line, draw.draw_point and font.getabc methods #3232 + [hugovk] + - Tests: Added ImageFilter tests #3295 [radarhere] From 353159c74f94e15b68ee141677f84a2c5e5b5d52 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 28 Aug 2018 20:41:47 +1000 Subject: [PATCH 0449/1393] Only update the Pillow submodule of pillow-wheels [ci skip] --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 7794612fa62..b5e548e0635 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -89,7 +89,7 @@ Released as needed privately to individual vendors for critical security-related $ git clone https://github.com/python-pillow/pillow-wheels $ cd pillow-wheels $ git submodule init - $ git submodule update + $ git submodule update Pillow $ cd Pillow $ git fetch --all $ git checkout [[release tag]] From c6ea6a1cc2fd6a13357d09776dd878bfb0a84444 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 28 Aug 2018 20:42:29 +1000 Subject: [PATCH 0450/1393] Add updated submodule in pillow-wheels [ci skip] --- RELEASING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASING.md b/RELEASING.md index b5e548e0635..8812318fc57 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -94,6 +94,7 @@ Released as needed privately to individual vendors for critical security-related $ git fetch --all $ git checkout [[release tag]] $ cd .. + $ git add Pillow $ git commit -m "Pillow -> 5.2.0" Pillow $ git push ``` From 63fb52219cf2d7011b520ad6e0d99013bc486ba2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 30 Aug 2018 19:21:00 +1000 Subject: [PATCH 0451/1393] Revert "Add updated submodule in pillow-wheels [ci skip]" This reverts commit c6ea6a1cc2fd6a13357d09776dd878bfb0a84444. --- RELEASING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index 8812318fc57..b5e548e0635 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -94,7 +94,6 @@ Released as needed privately to individual vendors for critical security-related $ git fetch --all $ git checkout [[release tag]] $ cd .. - $ git add Pillow $ git commit -m "Pillow -> 5.2.0" Pillow $ git push ``` From fbc121d6785dfdc566d19d75e250c2b8d9de8542 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Sep 2018 09:28:22 +1000 Subject: [PATCH 0452/1393] Changed GIF seek to remove previous info items --- Tests/test_file_gif.py | 13 ++++++++++++- src/PIL/GifImagePlugin.py | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 086a0f5d0f7..917b36905fd 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -134,13 +134,15 @@ def test_headers_saving_for_animated_gifs(self): # Multiframe image im = Image.open("Tests/images/dispose_bgnd.gif") + info = im.info.copy() + out = self.tempfile('temp.gif') im.save(out, save_all=True) reread = Image.open(out) for header in important_headers: self.assertEqual( - im.info[header], + info[header], reread.info[header] ) @@ -207,6 +209,15 @@ def test_seek(self): except EOFError: self.assertEqual(framecount, 5) + def test_seek_info(self): + im = Image.open("Tests/images/iss634.gif") + info = im.info.copy() + + im.seek(1) + im.seek(0) + + self.assertEqual(im.info, info) + def test_n_frames(self): for path, n_frames in [ [TEST_GIF, 1], diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index fec2f76633c..645bb26bf02 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -166,6 +166,7 @@ def _seek(self, frame): from copy import copy self.palette = copy(self.global_palette) + info = {} while True: s = self.fp.read(1) @@ -184,8 +185,8 @@ def _seek(self, frame): # flags = i8(block[0]) if flags & 1: - self.info["transparency"] = i8(block[3]) - self.info["duration"] = i16(block[1:3]) * 10 + info["transparency"] = i8(block[3]) + info["duration"] = i16(block[1:3]) * 10 # disposal method - find the value of bits 4 - 6 dispose_bits = 0b00011100 & flags @@ -200,16 +201,16 @@ def _seek(self, frame): # # comment extension # - self.info["comment"] = block + info["comment"] = block elif i8(s) == 255: # # application extension # - self.info["extension"] = block, self.fp.tell() + info["extension"] = block, self.fp.tell() if block[:11] == b"NETSCAPE2.0": block = self.data() if len(block) >= 3 and i8(block[0]) == 1: - self.info["loop"] = i16(block[1:3]) + info["loop"] = i16(block[1:3]) while self.data(): pass @@ -268,6 +269,12 @@ def _seek(self, frame): # self.__fp = None raise EOFError + for k in ["transparency", "duration", "comment", "extension", "loop"]: + if k in info: + self.info[k] = info[k] + elif k in self.info: + del self.info[k] + self.mode = "L" if self.palette: self.mode = "P" From 4ec322aa7d35f632db5da102c5f7ceb1cbc9609f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Sep 2018 09:50:49 +1000 Subject: [PATCH 0453/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 785d41f6a9f..7efb178af23 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Changed ImageFilter.Kernel to subclass ImageFilter.BuiltinFilter, instead of the other way around #3273 + [radarhere] + - Remove unused draw.draw_line, draw.draw_point and font.getabc methods #3232 [hugovk] From 0411caba67b8127694be4dabbdedd1dc65d12576 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Sep 2018 17:18:13 +1000 Subject: [PATCH 0454/1393] Catch ValueError when processing the edge of an image --- Tests/test_imagedraw.py | 5 +++++ src/PIL/ImageDraw.py | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 33e7f847795..5f9649a7800 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -366,6 +366,11 @@ def test_floodfill(self): ImageDraw.floodfill(im, (W, H), red) self.assert_image_equal(im, im_floodfill) + # Test filling at the edge of an image + im = Image.new("RGB", (1, 1)) + ImageDraw.floodfill(im, (0, 0), red) + self.assert_image_equal(im, Image.new("RGB", (1, 1), red)) + def test_floodfill_border(self): # floodfill() is experimental diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index ca8c1d17b71..428174784bf 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -358,7 +358,7 @@ def floodfill(image, xy, value, border=None, thresh=0): for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): try: p = pixel[s, t] - except IndexError: + except (ValueError, IndexError): pass else: if _color_diff(p, background) <= thresh: @@ -372,7 +372,7 @@ def floodfill(image, xy, value, border=None, thresh=0): for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): try: p = pixel[s, t] - except IndexError: + except (ValueError, IndexError): pass else: if p != value and p != border: From 4a34116be5e800d05bed62ef7c2e588f7e686a07 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Sep 2018 18:30:04 +1000 Subject: [PATCH 0455/1393] Removed duplicate code --- src/PIL/ImageDraw.py | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 428174784bf..02fa865aa2e 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -351,34 +351,23 @@ def floodfill(image, xy, value, border=None, thresh=0): except (ValueError, IndexError): return # seed point outside image edge = [(x, y)] - if border is None: - while edge: - newedge = [] - for (x, y) in edge: - for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - if _color_diff(p, background) <= thresh: - pixel[s, t] = value - newedge.append((s, t)) - edge = newedge - else: - while edge: - newedge = [] - for (x, y) in edge: - for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass + while edge: + newedge = [] + for (x, y) in edge: + for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + try: + p = pixel[s, t] + except (ValueError, IndexError): + pass + else: + if border is None: + fill = _color_diff(p, background) <= thresh else: - if p != value and p != border: - pixel[s, t] = value - newedge.append((s, t)) - edge = newedge + fill = p != value and p != border + if fill: + pixel[s, t] = value + newedge.append((s, t)) + edge = newedge def _color_diff(rgb1, rgb2): From fbe5bdb6b605e06132d82b1347c9185299904a7c Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 1 Sep 2018 14:40:36 +0300 Subject: [PATCH 0456/1393] Also apply width to pieslice's inner lines --- Tests/images/imagedraw_pieslice_width.png | Bin 488 -> 496 bytes Tests/images/imagedraw_pieslice_width_fill.png | Bin 500 -> 523 bytes docs/reference/ImageDraw.rst | 2 +- src/libImaging/Draw.c | 9 +++++++-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Tests/images/imagedraw_pieslice_width.png b/Tests/images/imagedraw_pieslice_width.png index a83c4ab7b3469f0d2171148d31a4c7836311b50c..3bd69222cf3ff22977e358bcb0fcc2c84c98e284 100644 GIT binary patch delta 470 zcmV;{0V)3I1MmZoB!9O_L_t(|obB7&Zi6roMNy~9|Nk<1sDcQg2E$y=(7m2oDUHox zdwQuj%twkzTDmvpX>DzeGk>Sd}uG{bV#+GN~3mI~$MksrP=NPp_*YUj(pgDa4S!1})ttlHEUSY_DXs>7 zVO>c|ROB%1CsiOvr?9@usz4UIJi@wXQY~pUtSTU^(`6;MAex6IcZG($D{H8%)TcJ) ztO2%R-FXZ)=gLwaR-?p+p;oD?g(Y2#>0gEIS{7Gwl=@*UC4Z2zZOrhCmaWJlnrZjd4CeiqHI_z-=&cdpX;1u{{BNvFWGd%{9+Ui4|&})wN0r9vm53eR{YH3 z*rIt@YM)mu`;&Xtp;%l0Va_t+5mwfo$bIADR9W$PMQrizaq=%{TJ#HR^Tv8yRon@b z_-F98d4-3;bruq<>m+Sch#jOv-oV$_r~Q zDQn7UcqS?9G?T*mY%A*&PRa=Do=LT$yWy$?VNJA^=?yVFEYtH0k=Hdi zhsDNX&AK2Xtk2HZG*|jpaI((I&P#DUlEON?q; zHVH!VQWsyoqcV|NSy%xTvV=S^skN?Py7Vqtx?>Z(ueS7*~ z$j2P#x%%5v1Jz%@i{M`M>#?=!za=Lp{r+SU>Qv^e9nYA)=U0~E8~MF!vxLH)6qjU$ zwN3eXC${6~w{WR2t!q|R=N3=c@_&QGp_N?|UdK77uKUct(`?JC3%@YrzRHj lP2YNX%e3@WC^7S4=N|?GRln@au;X4J2~Sr)mvv4FO#ndA=xqQ1 delta 474 zcmV<00VV#61oQ)tB!9a}L_t(|obB4na)U4sL{X8-|Nk;sq)f#;1)1&{CHHK-KwKoS zgD%=GQUd$`L|rBga%l@8Iv zvkcEN&94uq$uX4QFbwdp)V%p*nwn)u52771RvNmv(&vj*FzL*?<&jA$M$1eH?vH=oZAx8Whn1u z-oQzC8b_{OV0#Et)yb~?=@JR{H5>H4>FkE_|FJyRX$RKBQkQmtdfjki;JNwnK! zI*XLwy|KxBr;xQt5Yo#%`1Bo>2i4NXoE~d&S*^}c0RR9100000008`7Ux?&SW9tNn QIRF3v07*qoM6N<$f&m`!LI3~& diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 014075a0b7d..3bd46081488 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -207,7 +207,7 @@ Methods :param end: Ending angle, in degrees. :param fill: Color to use for the fill. :param outline: Color to use for the outline. - :param width: The outer line width, in pixels. + :param width: The line width, in pixels. .. versionadded:: 5.2.0 diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index ea44e3605f7..eded2371660 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -855,8 +855,13 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, if (i != start) { if (mode == PIESLICE) { if (x != cx || y != cy) { - draw->line(im, x, y, cx, cy, ink); - draw->line(im, cx, cy, sx, sy, ink); + if (width <= 1) { + draw->line(im, x, y, cx, cy, ink); + draw->line(im, cx, cy, sx, sy, ink); + } else { + ImagingDrawWideLine(im, x, y, cx, cy, &ink, width, op); + ImagingDrawWideLine(im, cx, cy, sx, sy, &ink, width, op); + } } } else if (mode == CHORD) { if (x != sx || y != sy) From 3cf1a4ea87b8f17b59c623ccac4a62a16825464d Mon Sep 17 00:00:00 2001 From: yo1995 Date: Tue, 4 Sep 2018 12:03:20 -0400 Subject: [PATCH 0457/1393] improved comments and one logic according to PR 3294 discussion --- src/PIL/ImageDraw.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 3335760f430..517135a44e8 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -352,7 +352,7 @@ def floodfill(image, xy, value, border=None, thresh=0): except (ValueError, IndexError): return # seed point outside image edge = {(x, y)} - full_edge = set() # use a set to record each unique pixel processed + full_edge = set() # use a set to keep record of current and previous edge pixels to reduce memory consumption while edge: new_edge = set() for (x, y) in edge: # 4 adjacent method @@ -364,6 +364,7 @@ def floodfill(image, xy, value, border=None, thresh=0): except (ValueError, IndexError): pass else: + full_edge.add((s, t)) if border is None: fill = _color_diff(p, background) <= thresh else: @@ -371,8 +372,7 @@ def floodfill(image, xy, value, border=None, thresh=0): if fill: pixel[s, t] = value new_edge.add((s, t)) - full_edge.add((s, t)) - full_edge = edge # do not record useless pixels to reduce memory consumption + full_edge = edge # discard pixels proceeded edge = new_edge From f3edf52900d973ae6129e0c900d5e98911c1e6af Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 4 Sep 2018 11:00:29 -0700 Subject: [PATCH 0458/1393] Convert unsupported WebP mode to RGB as .convert supports more src modes --- src/PIL/WebPImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 011570862c4..1334f8d4d77 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -246,7 +246,7 @@ def _save_all(im, fp, filename): if ims.mode not in _VALID_WEBP_MODES: alpha = 'A' in ims.mode or 'a' in ims.mode \ or (ims.mode == 'P' and 'A' in ims.im.getpalettemode()) - rawmode = 'RGBA' if alpha else 'RGBX' + rawmode = 'RGBA' if alpha else 'RGB' frame = ims.convert(rawmode) if rawmode == 'RGB': From bb77f62586d31193f22388182ac2420ffcdcd440 Mon Sep 17 00:00:00 2001 From: yo1995 Date: Tue, 4 Sep 2018 21:15:25 -0400 Subject: [PATCH 0459/1393] fix typo: proceeded -> processed --- src/PIL/ImageDraw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 517135a44e8..ab328fe532a 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -372,7 +372,7 @@ def floodfill(image, xy, value, border=None, thresh=0): if fill: pixel[s, t] = value new_edge.add((s, t)) - full_edge = edge # discard pixels proceeded + full_edge = edge # discard pixels processed edge = new_edge From 7e67b9c58f8966ba6f91bb3de0f33ee744756e35 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Fri, 11 Nov 2016 11:18:27 -0800 Subject: [PATCH 0460/1393] Use TextIOWrapper.detach() instead of NoCloseStream Usage and this pattern is discussed in Python bug: https://bugs.python.org/issue21363 --- src/PIL/EpsImagePlugin.py | 79 ++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index cb2c00d20fb..29fae1ed29d 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -357,54 +357,49 @@ def _save(im, fp, filename, eps=1): else: raise ValueError("image mode is not supported") - class NoCloseStream(object): - def __init__(self, fp): - self.fp = fp - - def __getattr__(self, name): - return getattr(self.fp, name) - - def close(self): - pass - base_fp = fp + wrapped_fp = False if fp != sys.stdout: - fp = NoCloseStream(fp) if sys.version_info.major > 2: fp = io.TextIOWrapper(fp, encoding='latin-1') + wrapped_fp = True - 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) + 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) - # - # image header - fp.write("gsave\n") - fp.write("10 dict begin\n") - fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write("%d %d scale\n" % im.size) - fp.write("%d %d 8\n" % im.size) # <= bits - fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write("{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + "\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, base_fp, [("eps", (0, 0)+im.size, 0, None)]) - - fp.write("\n%%%%EndBinary\n") - fp.write("grestore end\n") - if hasattr(fp, "flush"): - fp.flush() + # + # image header + fp.write("gsave\n") + fp.write("10 dict begin\n") + fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write("%d %d scale\n" % im.size) + fp.write("%d %d 8\n" % im.size) # <= bits + fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write("{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + "\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, base_fp, [("eps", (0, 0)+im.size, 0, None)]) + + fp.write("\n%%%%EndBinary\n") + fp.write("grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + finally: + if wrapped_fp: + fp.detach() # # -------------------------------------------------------------------- From 875e8c4bda09332c016f609f1a96c5a4868ec2ff Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sun, 6 Nov 2016 08:58:45 -0800 Subject: [PATCH 0461/1393] Avoid catching unexpected exceptions in tests Instead, allow exceptions to bubble up to the unittest exception handler. Prevents replacing the exception trace with a less informative message. As the exceptions are always unexpected, should not need to catch them explicitly in tests. --- Tests/test_file_jpeg.py | 8 +++----- Tests/test_file_libtiff.py | 6 ++---- Tests/test_file_tiff.py | 7 ++----- Tests/test_file_tiff_metadata.py | 18 ++++++------------ 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index c42d67885a0..1485651c768 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -141,11 +141,9 @@ def test_large_icc_meta(self): im = Image.open('Tests/images/icc_profile_big.jpg') f = self.tempfile("temp.jpg") icc_profile = im.info["icc_profile"] - try: - im.save(f, format='JPEG', progressive=True, quality=95, - icc_profile=icc_profile, optimize=True) - except IOError: - self.fail("Failed saving image with icc larger than image size") + # Should not raise IOError for image with icc larger than image size. + im.save(f, format='JPEG', progressive=True, quality=95, + icc_profile=icc_profile, optimize=True) def test_optimize(self): im1 = self.roundtrip(hopper()) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 77caa0b9dcd..8b1d4570866 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -529,10 +529,8 @@ def test_fd_duplication(self): im = Image.open(tmpfile) im.n_frames im.close() - try: - os.remove(tmpfile) # Windows PermissionError here! - except: - self.fail("Should not get permission error here") + # Should not raise PermissionError. + os.remove(tmpfile) def test_read_icc(self): with Image.open("Tests/images/hopper.iccprofile.tif") as img: diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 79630c77340..68429f24939 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -133,11 +133,8 @@ def test_invalid_file(self): def test_bad_exif(self): i = Image.open('Tests/images/hopper_bad_exif.jpg') - try: - self.assert_warning(UserWarning, i._getexif) - except struct.error: - self.fail( - "Bad EXIF data passed incorrect values to _binary unpack") + # Should not raise struct.error. + self.assert_warning(UserWarning, i._getexif) def test_save_rgba(self): im = hopper("RGBA") diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index aabedd6c8e7..0a958454c56 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -169,10 +169,8 @@ def test_empty_metadata(self): f = io.BytesIO(b'II*\x00\x08\x00\x00\x00') head = f.read(8) info = TiffImagePlugin.ImageFileDirectory(head) - try: - self.assert_warning(UserWarning, info.load, f) - except struct.error: - self.fail("Should not be struct errors there.") + # Should not raise struct.error. + self.assert_warning(UserWarning, info.load, f) def test_iccprofile(self): # https://github.com/python-pillow/Pillow/issues/1462 @@ -223,10 +221,8 @@ def test_expty_values(self): head = data.read(8) info = TiffImagePlugin.ImageFileDirectory_v2(head) info.load(data) - try: - info = dict(info) - except ValueError: - self.fail("Should not be struct value error there.") + # Should not raise ValueError. + info = dict(info) self.assertIn(33432, info) def test_PhotoshopInfo(self): @@ -245,10 +241,8 @@ def test_too_many_entries(self): ifd._tagdata[277] = struct.pack('hh', 4, 4) ifd.tagtype[277] = TiffTags.SHORT - try: - self.assert_warning(UserWarning, lambda: ifd[277]) - except ValueError: - self.fail("Invalid Metadata count should not cause a Value Error.") + # Should not raise ValueError. + self.assert_warning(UserWarning, lambda: ifd[277]) if __name__ == '__main__': From 37f10651bdd97df4ea907b772ead24d1c8efcea6 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 4 Sep 2018 20:02:42 -0700 Subject: [PATCH 0462/1393] Clean up commented out debug print statements --- Tests/make_hash.py | 5 ----- Tests/test_bmp_reference.py | 2 -- Tests/test_format_hsv.py | 32 -------------------------------- Tests/test_image_resample.py | 3 --- Tests/test_imagewin_pointers.py | 1 - Tests/test_numpy.py | 1 - src/PIL/BdfFontFile.py | 14 -------------- src/PIL/CurImagePlugin.py | 8 -------- src/PIL/EpsImagePlugin.py | 1 - src/PIL/FontFile.py | 1 - src/PIL/FpxImagePlugin.py | 4 ---- src/PIL/Image.py | 3 --- src/PIL/ImageMorph.py | 5 ----- src/PIL/IptcImagePlugin.py | 2 -- src/PIL/JpegImagePlugin.py | 1 - src/PIL/SpiderImagePlugin.py | 1 - src/PIL/TiffImagePlugin.py | 4 ---- src/PIL/WmfImagePlugin.py | 2 -- 18 files changed, 90 deletions(-) diff --git a/Tests/make_hash.py b/Tests/make_hash.py index c5e32d6062e..c52e009eca8 100644 --- a/Tests/make_hash.py +++ b/Tests/make_hash.py @@ -52,10 +52,5 @@ def check(size, i0): print() -# print(check(min_size, min_start)) - print("#define ACCESS_TABLE_SIZE", min_size) print("#define ACCESS_TABLE_HASH", min_start) - -# for m in modes: -# print(m, "=>", hash(m, min_start) % min_size) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 8e84cc8f19d..015a9ebdfba 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -22,7 +22,6 @@ def test_bad(self): im.load() except Exception: # as msg: pass - # print("Bad Image %s: %s" %(f,msg)) def test_questionable(self): """ These shouldn't crash/dos, but it's not well defined that these @@ -47,7 +46,6 @@ def test_questionable(self): except Exception: # as msg: if os.path.basename(f) in supported: raise - # print("Bad Image %s: %s" %(f,msg)) def test_good(self): """ These should all work. There's a set of target files in the diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index 31309da6066..d7820400e24 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -47,10 +47,6 @@ def wedge(self): img = Image.merge('RGB', (r, g, b)) - # print(("%d, %d -> "% (int(1.75*px),int(.25*px))) + \ - # "(%s, %s, %s)"%img.getpixel((1.75*px, .25*px))) - # print(("%d, %d -> "% (int(.75*px),int(.25*px))) + \ - # "(%s, %s, %s)"%img.getpixel((.75*px, .25*px))) return img def to_xxx_colorsys(self, im, func, mode): @@ -95,15 +91,6 @@ def test_wedge(self): im = src.convert('HSV') comparable = self.to_hsv_colorsys(src) - # print(im.getpixel((448, 64))) - # print(comparable.getpixel((448, 64))) - - # print(im.split()[0].histogram()) - # print(comparable.split()[0].histogram()) - - # im.split()[0].show() - # comparable.split()[0].show() - self.assert_image_similar(im.getchannel(0), comparable.getchannel(0), 1, "Hue conversion is wrong") self.assert_image_similar(im.getchannel(1), comparable.getchannel(1), @@ -111,16 +98,9 @@ def test_wedge(self): self.assert_image_similar(im.getchannel(2), comparable.getchannel(2), 1, "Value conversion is wrong") - # print(im.getpixel((192, 64))) - comparable = src im = im.convert('RGB') - # im.split()[0].show() - # comparable.split()[0].show() - # print(im.getpixel((192, 64))) - # print(comparable.getpixel((192, 64))) - self.assert_image_similar(im.getchannel(0), comparable.getchannel(0), 3, "R conversion is wrong") self.assert_image_similar(im.getchannel(1), comparable.getchannel(1), @@ -132,12 +112,6 @@ def test_convert(self): im = hopper('RGB').convert('HSV') comparable = self.to_hsv_colorsys(hopper('RGB')) -# print([ord(x) for x in im.split()[0].tobytes()[:80]]) -# print([ord(x) for x in comparable.split()[0].tobytes()[:80]]) - -# print(im.split()[0].histogram()) -# print(comparable.split()[0].histogram()) - self.assert_image_similar(im.getchannel(0), comparable.getchannel(0), 1, "Hue conversion is wrong") self.assert_image_similar(im.getchannel(1), comparable.getchannel(1), @@ -150,12 +124,6 @@ def test_hsv_to_rgb(self): converted = comparable.convert('RGB') comparable = self.to_rgb_colorsys(comparable) - # print(converted.split()[1].histogram()) - # print(target.split()[1].histogram()) - - # print([ord(x) for x in target.split()[1].tobytes()[:80]]) - # print([ord(x) for x in converted.split()[1].tobytes()[:80]]) - self.assert_image_similar(converted.getchannel(0), comparable.getchannel(0), 3, "R conversion is wrong") diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 3687a1a2c4b..1b7081d55d0 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -352,10 +352,8 @@ def test_box_vertical(self): class CoreResampleCoefficientsTest(PillowTestCase): def test_reduce(self): test_color = 254 - # print() for size in range(400000, 400010, 2): - # print(size) i = Image.new('L', (size, 1), 0) draw = ImageDraw.Draw(i) draw.rectangle((0, 0, i.size[0] // 2 - 1, 0), test_color) @@ -363,7 +361,6 @@ def test_reduce(self): px = i.resize((5, i.size[1]), Image.BICUBIC).load() if px[2, 0] != test_color // 2: self.assertEqual(test_color // 2, px[2, 0]) - # print('>', size, test_color // 2, px[2, 0]) def test_nonzero_coefficients(self): # regression test for the wrong coefficients calculation diff --git a/Tests/test_imagewin_pointers.py b/Tests/test_imagewin_pointers.py index 7178d8cb8a0..dc78b655cb9 100644 --- a/Tests/test_imagewin_pointers.py +++ b/Tests/test_imagewin_pointers.py @@ -96,7 +96,6 @@ def test_pointer(self): hdr.biClrImportant = 0 hdc = CreateCompatibleDC(None) - # print('hdc:',hex(hdc)) pixels = ctypes.c_void_p() dib = CreateDIBSection(hdc, ctypes.byref(hdr), DIB_RGB_COLORS, ctypes.byref(pixels), None, 0) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 4efcd2c51f4..03643ac1e06 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -34,7 +34,6 @@ def to_image(dtype, bands=1, boolean=0): i = Image.fromarray(a) if list(i.getchannel(0).getdata()) != list(range(100)): print("data mismatch for", dtype) - # print(dtype, list(i.getdata())) return i # Check supported 1-bit integer formats diff --git a/src/PIL/BdfFontFile.py b/src/PIL/BdfFontFile.py index c8bc604610a..eac19bde192 100644 --- a/src/PIL/BdfFontFile.py +++ b/src/PIL/BdfFontFile.py @@ -110,20 +110,6 @@ def __init__(self, fp): if s.find(b"LogicalFontDescription") < 0: comments.append(s[i+1:-1].decode('ascii')) - # font = props["FONT"].split("-") - - # font[4] = bdf_slant[font[4].upper()] - # font[11] = bdf_spacing[font[11].upper()] - - # ascent = int(props["FONT_ASCENT"]) - # descent = int(props["FONT_DESCENT"]) - - # fontname = ";".join(font[1:]) - - # print("#", fontname) - # for i in comments: - # print("#", i) - while True: c = bdf_char(fp) if not c: diff --git a/src/PIL/CurImagePlugin.py b/src/PIL/CurImagePlugin.py index e4257cd5a47..db9ea9874df 100644 --- a/src/PIL/CurImagePlugin.py +++ b/src/PIL/CurImagePlugin.py @@ -56,14 +56,6 @@ def _open(self): m = s elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): m = s - # print("width", i8(s[0])) - # print("height", i8(s[1])) - # print("colors", i8(s[2])) - # print("reserved", i8(s[3])) - # print("hotspot x", i16(s[4:])) - # print("hotspot y", i16(s[6:])) - # print("bytes", i32(s[8:])) - # print("offset", i32(s[12:])) if not m: raise TypeError("No cursors were found") diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index cb2c00d20fb..0c50afe136f 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -82,7 +82,6 @@ def Ghostscript(tile, size, fp, scale=1): # resolution is dependent on bbox and size res = (float((72.0 * size[0]) / (bbox[2]-bbox[0])), float((72.0 * size[1]) / (bbox[3]-bbox[1]))) - # print("Ghostscript", scale, size, orig_size, bbox, orig_bbox, res) import subprocess import tempfile diff --git a/src/PIL/FontFile.py b/src/PIL/FontFile.py index 46e49bc4ee1..305e8afa21f 100644 --- a/src/PIL/FontFile.py +++ b/src/PIL/FontFile.py @@ -90,7 +90,6 @@ def compile(self): x = xx s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 self.bitmap.paste(im.crop(src), s) - # print(chr(i), dst, s) self.metrics[i] = d, dst, s def save(self, filename): diff --git a/src/PIL/FpxImagePlugin.py b/src/PIL/FpxImagePlugin.py index d7bba42eb52..509fd7d917b 100644 --- a/src/PIL/FpxImagePlugin.py +++ b/src/PIL/FpxImagePlugin.py @@ -114,8 +114,6 @@ def _open_index(self, index=1): if id in prop: self.jpeg[i] = prop[id] - # print(len(self.jpeg), "tables loaded") - self._open_subimage(1, self.maxid) def _open_subimage(self, index=1, subimage=0): @@ -143,8 +141,6 @@ def _open_subimage(self, index=1, subimage=0): offset = i32(s, 28) length = i32(s, 32) - # print(size, self.mode, self.rawmode) - if size != self.size: raise IOError("subimage mismatch") diff --git a/src/PIL/Image.py b/src/PIL/Image.py index f13a98276bb..76fb3be06ed 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -443,7 +443,6 @@ def _getdecoder(mode, decoder_name, args, extra=()): try: # get decoder decoder = getattr(core, decoder_name + "_decoder") - # print(decoder, mode, args + extra) return decoder(mode, *args + extra) except AttributeError: raise IOError("decoder %s not available" % decoder_name) @@ -465,7 +464,6 @@ def _getencoder(mode, encoder_name, args, extra=()): try: # get encoder encoder = getattr(core, encoder_name + "_encoder") - # print(encoder, mode, args + extra) return encoder(mode, *args + extra) except AttributeError: raise IOError("encoder %s not available" % encoder_name) @@ -2470,7 +2468,6 @@ def fromarray(obj, mode=None): typekey = (1, 1) + shape[2:], arr['typestr'] mode, rawmode = _fromarray_typemap[typekey] except KeyError: - # print(typekey) raise TypeError("Cannot handle this data type") else: rawmode = mode diff --git a/src/PIL/ImageMorph.py b/src/PIL/ImageMorph.py index 579ee4e1a2a..54ceb7905cc 100644 --- a/src/PIL/ImageMorph.py +++ b/src/PIL/ImageMorph.py @@ -151,11 +151,6 @@ def build_lut(self): patterns += self._pattern_permute(pattern, options, result) -# # Debugging -# for p, r in patterns: -# print(p, r) -# print('--') - # compile the patterns into regular expressions for speed for i, pattern in enumerate(patterns): p = pattern[0].replace('.', 'X').replace('X', '[01]') diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index f5a8de17e3f..83885e284e0 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -103,8 +103,6 @@ def _open(self): else: self.info[tag] = tagdata - # print(tag, self.info[tag]) - # mode layers = i8(self.info[(3, 60)][0]) component = i8(self.info[(3, 60)][1]) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index a75e3d428bc..e38306041a6 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -334,7 +334,6 @@ def _open(self): if i in MARKER: name, description, handler = MARKER[i] - # print(hex(i), name, description) if handler is not None: handler(self, i) if i == 0xFFDA: # start of scan diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index d502779e2a3..a0d5f17a4d4 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -74,7 +74,6 @@ def isSpiderHeader(t): labrec = int(h[13]) # no. records in file header labbyt = int(h[22]) # total no. of bytes in header lenbyt = int(h[23]) # record length in bytes - # print("labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt)) if labbyt != (labrec * lenbyt): return 0 # looks like a valid header diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 66b211cbfec..715a543d9f5 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1254,9 +1254,6 @@ def _setup(self): h = self.tag_v2.get(ROWSPERSTRIP, ysize) w = self.size[0] if READ_LIBTIFF or self._compression != 'raw': - # if DEBUG: - # print("Activating g4 compression for whole file") - # Decoder expects entire file as one tile. # There's a buffer size limit in load (64k) # so large g4 images will fail if we use that @@ -1529,7 +1526,6 @@ def _save(im, fp, filename): rawmode = 'I;16N' a = (rawmode, compression, _fp, filename, atts) - # print(im.mode, compression, a, im.encoderconfig) e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig) e.setimage(im.im, (0, 0)+im.size) while True: diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index aeb19374dc3..6811ddceccb 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -109,8 +109,6 @@ def _open(self): self.info["dpi"] = 72 - # print(self.mode, self.size, self.info) - # sanity check (standard metafile header) if s[22:26] != b"\x01\x00\t\x00": raise SyntaxError("Unsupported WMF file format") From d86fa316ca328f1d6647afb06cf89f5fddd45a33 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 5 Sep 2018 21:02:32 +1000 Subject: [PATCH 0463/1393] Fixed typo [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 aa2463bd1d3..258e9af3eec 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -204,7 +204,7 @@ table describes some commonly used **raw modes**: +-----------+-----------------------------------------------------------------+ | ``RGBX`` | 24-bit true colour, stored as (red, green, blue, pad). | +-----------+-----------------------------------------------------------------+ -| ``RGB;L`` | 24-bit true colour, line interleaved (first all red pixels, the | +| ``RGB;L`` | 24-bit true colour, line interleaved (first all red pixels, then| | | all green pixels, finally all blue pixels). | +-----------+-----------------------------------------------------------------+ From f4fd517373d5a36887d0cd20fcc16de39b85275e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 5 Sep 2018 21:05:09 +1000 Subject: [PATCH 0464/1393] Removed blank line after heading for consistency [ci skip] --- docs/handbook/writing-your-own-file-decoder.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 258e9af3eec..107e25f3612 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -171,7 +171,6 @@ The fields are used as follows: stride defaults to 0. **orientation** - Whether the first line in the image is the top line on the screen (1), or the bottom line (-1). If omitted, the orientation defaults to 1. From ad5cf0a0e24dbfa942e685ba89416b307562463f Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 5 Sep 2018 17:36:27 +0300 Subject: [PATCH 0465/1393] Add RGBAX and RGBAXX tiff modes --- Tests/test_lib_pack.py | 4 ++++ src/PIL/TiffImagePlugin.py | 4 ++++ src/libImaging/Unpack.c | 2 ++ 3 files changed, 10 insertions(+) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 002db2e19ba..921af3beaaf 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -273,6 +273,10 @@ def test_RGBA(self): (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) self.assert_unpack("RGBA", "RGBA", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack("RGBA", "RGBAX", 5, + (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) + self.assert_unpack("RGBA", "RGBAXX", 6, + (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) self.assert_unpack("RGBA", "RGBa", 4, (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12)) self.assert_unpack("RGBA", "RGBa", diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 6f032f49d19..17b133c82b1 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -210,6 +210,10 @@ (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 05b4299b068..04e05dcb316 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1301,6 +1301,8 @@ static struct { {"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", "RGBa;16L", 64, unpackRGBa16L}, {"RGBA", "RGBa;16B", 64, unpackRGBa16B}, From accc66fb5e4213c8a20edcf7a6a82f5eeb1a4515 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 5 Sep 2018 17:45:03 +0300 Subject: [PATCH 0466/1393] add support for RGBaXX and RGBaX raw tiff modes --- Tests/test_lib_pack.py | 10 +++++++-- src/PIL/TiffImagePlugin.py | 4 ++++ src/libImaging/Unpack.c | 44 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 921af3beaaf..d4e50b0ab66 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -280,8 +280,14 @@ def test_RGBA(self): self.assert_unpack("RGBA", "RGBa", 4, (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12)) self.assert_unpack("RGBA", "RGBa", - b'\x01\x02\x03\x00\x10\x20\x30\xff', - (0, 0, 0, 0), (16, 32, 48, 255)) + b'\x01\x02\x03\x00\x10\x20\x30\x7f\x10\x20\x30\xff', + (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) + self.assert_unpack("RGBA", "RGBaX", + b'\x01\x02\x03\x00-\x10\x20\x30\x7f-\x10\x20\x30\xff-', + (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) + self.assert_unpack("RGBA", "RGBaXX", + b'\x01\x02\x03\x00==\x10\x20\x30\x7f!!\x10\x20\x30\xff??', + (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) self.assert_unpack("RGBA", "RGBa;16L", 8, (63, 127, 191, 8), (159, 191, 223, 16), (191, 212, 233, 24)) self.assert_unpack("RGBA", "RGBa;16L", diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 17b133c82b1..e8ea365e882 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -208,6 +208,10 @@ (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 04e05dcb316..7bb8064ee1a 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -797,6 +797,48 @@ unpackRGBa(UINT8* _out, const UINT8* in, int pixels) } } +static void +unpackRGBaskip1(UINT8* _out, const UINT8* in, int pixels) +{ + int i; + UINT32* out = (UINT32*) _out; + /* premultiplied RGBA */ + for (i = 0; i < pixels; i++) { + int a = in[3]; + 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); + } + in += 5; + } +} + +static void +unpackRGBaskip2(UINT8* _out, const UINT8* in, int pixels) +{ + int i; + UINT32* out = (UINT32*) _out; + /* premultiplied RGBA */ + for (i = 0; i < pixels; i++) { + int a = in[3]; + 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); + } + in += 6; + } +} + static void unpackBGRa(UINT8* _out, const UINT8* in, int pixels) { @@ -1304,6 +1346,8 @@ static struct { {"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}, From 5b24987fc3035ecae065ffcfdeb6dac78a7661c3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 5 Sep 2018 17:51:41 +0300 Subject: [PATCH 0467/1393] update code style in tests --- Tests/test_lib_pack.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index d4e50b0ab66..94ea8e8ef6e 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -268,27 +268,33 @@ def test_RGB(self): self.assert_unpack("RGB", "B", 1, (0, 0, 1), (0, 0, 2), (0, 0, 3)) 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("RGBA", "LA;16B", 4, - (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) - self.assert_unpack("RGBA", "RGBA", 4, - (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) - self.assert_unpack("RGBA", "RGBAX", 5, - (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) - self.assert_unpack("RGBA", "RGBAXX", 6, - (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) - self.assert_unpack("RGBA", "RGBa", 4, + self.assert_unpack( + "RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6)) + self.assert_unpack( + "RGBA", "LA;16B", 4, (1, 1, 1, 3), (5, 5, 5, 7), (9, 9, 9, 11)) + self.assert_unpack( + "RGBA", "RGBA", 4, (1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) + self.assert_unpack( + "RGBA", "RGBAX", 5, (1, 2, 3, 4), (6, 7, 8, 9), (11, 12, 13, 14)) + self.assert_unpack( + "RGBA", "RGBAXX", 6, (1, 2, 3, 4), (7, 8, 9, 10), (13, 14, 15, 16)) + self.assert_unpack( + "RGBA", "RGBa", 4, (63, 127, 191, 4), (159, 191, 223, 8), (191, 212, 233, 12)) - self.assert_unpack("RGBA", "RGBa", + self.assert_unpack( + "RGBA", "RGBa", b'\x01\x02\x03\x00\x10\x20\x30\x7f\x10\x20\x30\xff', (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "RGBaX", + self.assert_unpack( + "RGBA", "RGBaX", b'\x01\x02\x03\x00-\x10\x20\x30\x7f-\x10\x20\x30\xff-', (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "RGBaXX", + self.assert_unpack( + "RGBA", "RGBaXX", b'\x01\x02\x03\x00==\x10\x20\x30\x7f!!\x10\x20\x30\xff??', (0, 0, 0, 0), (32, 64, 96, 127), (16, 32, 48, 255)) - self.assert_unpack("RGBA", "RGBa;16L", 8, + self.assert_unpack( + "RGBA", "RGBa;16L", 8, (63, 127, 191, 8), (159, 191, 223, 16), (191, 212, 233, 24)) self.assert_unpack("RGBA", "RGBa;16L", b'\x88\x01\x88\x02\x88\x03\x88\x00' From 66207b47bca89a4fad8f4573a239b671d66b7b90 Mon Sep 17 00:00:00 2001 From: dinko Date: Thu, 23 Aug 2018 15:40:46 +0200 Subject: [PATCH 0468/1393] fix _crop and tests --- Tests/test_decompression_bomb.py | 23 +++++++++++++++++++++++ Tests/test_image_crop.py | 1 - src/PIL/Image.py | 7 ++----- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 4e3c2637752..b0b9430d460 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -6,6 +6,7 @@ ORIGINAL_LIMIT = Image.MAX_IMAGE_PIXELS +from PIL.Image import DecompressionBombWarning, DecompressionBombError class TestDecompressionBomb(PillowTestCase): @@ -61,6 +62,28 @@ def testEnlargeCrop(self): self.assert_warning(Image.DecompressionBombWarning, self.src.crop, box) + def test_crop_decompression_checks(self): + + im = Image.new("RGB", (100, 100)) + + good_values = ((-9999, -9999, -9990, -9990), + (-999, -999, -990, -990)) + + warning_values = ((-160, -160, 99, 99), + (160, 160, -99, -99)) + + error_values = ((-99909, -99990, 99999, 99999), + (99909, 99990, -99999, -99999)) + + for value in good_values: + self.assertEqual(im.crop(value).size, (9,9)) + + for value in warning_values: + self.assert_warning(DecompressionBombWarning, im.crop, value) + + for value in error_values: + with self.assertRaises(DecompressionBombError): + im.crop(value) if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_crop.py b/Tests/test_image_crop.py index fe92dd865f0..27a7f07d14c 100644 --- a/Tests/test_image_crop.py +++ b/Tests/test_image_crop.py @@ -2,7 +2,6 @@ from PIL import Image - class TestImageCrop(PillowTestCase): def test_crop(self): diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c589526577b..9e73f901d4e 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1104,12 +1104,9 @@ def _crop(self, im, box): x0, y0, x1, y1 = map(int, map(round, box)) - if x1 < x0: - x1 = x0 - if y1 < y0: - y1 = y0 + absolute_values = (abs(x1 - x0), abs(y1 - y0)) - _decompression_bomb_check((x1, y1)) + _decompression_bomb_check(absolute_values) return im.crop((x0, y0, x1, y1)) From 41954f244705b247667f1ea228e932ca6390bcd6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 6 Sep 2018 21:10:29 +1000 Subject: [PATCH 0469/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7efb178af23..3d43539deb4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Fix code for PYTHONOPTIMIZE #3233 + [hugovk] + - Changed ImageFilter.Kernel to subclass ImageFilter.BuiltinFilter, instead of the other way around #3273 [radarhere] From 4cfcc3b010cb854f22035a8f955bdbe5dd639746 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 13 Dec 2016 12:49:47 -0800 Subject: [PATCH 0470/1393] Tests for issue #1765 --- Tests/test_file_libtiff.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 77caa0b9dcd..7735b5bea29 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -231,6 +231,16 @@ def test_additional_metadata(self): TiffImagePlugin.WRITE_LIBTIFF = False + def test_int_dpi(self): + # issue #1765 + im = hopper('RGB') + out = self.tempfile('temp.tif') + TiffImagePlugin.WRITE_LIBTIFF = True + im.save(out, dpi=(72, 72)) + TiffImagePlugin.WRITE_LIBTIFF = False + reloaded = Image.open(out) + self.assertEqual(reloaded.info['dpi'], (72.0, 72.0)) + def test_g3_compression(self): i = Image.open('Tests/images/hopper_g4_500.tif') out = self.tempfile("temp.tif") From 0a44d583149299a185754d0ac35e0eaaec60fc71 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 Sep 2018 20:35:55 +1000 Subject: [PATCH 0471/1393] Convert int values of RATIONAL TIFF tags to floats --- src/PIL/TiffImagePlugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 66b211cbfec..c1a785ef3cf 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -567,6 +567,9 @@ def _setitem(self, tag, value, legacy_api): if self.tagtype[tag] == 7 and py3: values = [value.encode("ascii", 'replace') if isinstance( value, str) else value] + elif self.tagtype[tag] == 5: + values = [float(v) if isinstance(v, int) else v + for v in values] values = tuple(info.cvt_enum(value) for value in values) From 9e4c54e10f40051011cdec4342021e4c2f202809 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Sep 2018 23:31:39 +1000 Subject: [PATCH 0472/1393] Added orientation, compression and id_section as keyword arguments --- Tests/test_file_tga.py | 84 +++++++++++++++++++++++++++++++-------- src/PIL/TgaImagePlugin.py | 20 ++++++++-- 2 files changed, 84 insertions(+), 20 deletions(-) diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 226b899dcce..1fcd62b8806 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -53,10 +53,10 @@ def test_sanity(self): # Generate a new test name every time so the # test will not fail with permission error # on Windows. - test_file = self.tempfile("temp.tga") + out = self.tempfile("temp.tga") - original_im.save(test_file, rle=rle) - saved_im = Image.open(test_file) + original_im.save(out, rle=rle) + saved_im = Image.open(out) if rle: self.assertEqual( saved_im.info["compression"], @@ -95,34 +95,86 @@ def test_save(self): test_file = "Tests/images/tga_id_field.tga" im = Image.open(test_file) - test_file = self.tempfile("temp.tga") + out = self.tempfile("temp.tga") # Save - im.save(test_file) - test_im = Image.open(test_file) + im.save(out) + test_im = Image.open(out) self.assertEqual(test_im.size, (100, 100)) + self.assertEqual(test_im.info["id_section"], im.info["id_section"]) # RGBA save - im.convert("RGBA").save(test_file) - test_im = Image.open(test_file) + im.convert("RGBA").save(out) + test_im = Image.open(out) self.assertEqual(test_im.size, (100, 100)) + def test_save_id_section(self): + test_file = "Tests/images/rgb32rle.tga" + im = Image.open(test_file) + + out = self.tempfile("temp.tga") + + # Check there is no id section + im.save(out) + test_im = Image.open(out) + self.assertNotIn("id_section", test_im.info) + + # Save with custom id section + im.save(out, id_section=b"Test content") + test_im = Image.open(out) + self.assertEqual(test_im.info["id_section"], b"Test content") + + test_file = "Tests/images/tga_id_field.tga" + im = Image.open(test_file) + + # Save with no id section + im.save(out, id_section="") + test_im = Image.open(out) + self.assertNotIn("id_section", test_im.info) + + def test_save_orientation(self): + test_file = "Tests/images/rgb32rle.tga" + im = Image.open(test_file) + self.assertEqual(im.info["orientation"], -1) + + out = self.tempfile("temp.tga") + + im.save(out, orientation=1) + test_im = Image.open(out) + self.assertEqual(test_im.info["orientation"], 1) + def test_save_rle(self): test_file = "Tests/images/rgb32rle.tga" im = Image.open(test_file) + self.assertEqual(im.info["compression"], "tga_rle") - test_file = self.tempfile("temp.tga") + out = self.tempfile("temp.tga") # Save - im.save(test_file) - test_im = Image.open(test_file) + im.save(out) + test_im = Image.open(out) self.assertEqual(test_im.size, (199, 199)) + self.assertEqual(test_im.info["compression"], "tga_rle") + + # Save without compression + im.save(out, compression=None) + test_im = Image.open(out) + self.assertNotIn("compression", test_im.info) # RGBA save - im.convert("RGBA").save(test_file) - test_im = Image.open(test_file) + im.convert("RGBA").save(out) + test_im = Image.open(out) self.assertEqual(test_im.size, (199, 199)) + test_file = "Tests/images/tga_id_field.tga" + im = Image.open(test_file) + self.assertNotIn("compression", im.info) + + # Save with compression + im.save(out, compression="tga_rle") + test_im = Image.open(out) + self.assertEqual(test_im.info["compression"], "tga_rle") + def test_save_l_transparency(self): # There are 559 transparent pixels in la.tga. num_transparent = 559 @@ -133,10 +185,10 @@ def test_save_l_transparency(self): self.assertEqual( im.getchannel("A").getcolors()[0][0], num_transparent) - test_file = self.tempfile("temp.tga") - im.save(test_file) + out = self.tempfile("temp.tga") + im.save(out) - test_im = Image.open(test_file) + test_im = Image.open(out) self.assertEqual(test_im.mode, "LA") self.assertEqual( test_im.getchannel("A").getcolors()[0][0], num_transparent) diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 57b6ae2c85b..c60cb3ef154 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -151,11 +151,19 @@ def _save(im, fp, filename): except KeyError: raise IOError("cannot write mode %s as TGA" % im.mode) - rle = im.encoderinfo.get("rle", False) - + if "rle" in im.encoderinfo: + rle = im.encoderinfo["rle"] + else: + compression = im.encoderinfo.get("compression", + im.info.get("compression")) + rle = compression == "tga_rle" if rle: imagetype += 8 + id_section = im.encoderinfo.get("id_section", + im.info.get("id_section", "")) + idlen = len(id_section) + if colormaptype: colormapfirst, colormaplength, colormapentry = 0, 256, 24 else: @@ -166,11 +174,12 @@ def _save(im, fp, filename): else: flags = 0 - orientation = im.info.get("orientation", -1) + orientation = im.encoderinfo.get("orientation", + im.info.get("orientation", -1)) if orientation > 0: flags = flags | 0x20 - fp.write(b"\000" + + fp.write(o8(idlen) + o8(colormaptype) + o8(imagetype) + o16(colormapfirst) + @@ -183,6 +192,9 @@ def _save(im, fp, filename): o8(bits) + o8(flags)) + if id_section: + fp.write(id_section) + if colormaptype: fp.write(im.im.getpalette("RGB", "BGR")) From 325ca3cede708a82ae76f294c9f8d1222d26a758 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Sep 2018 08:26:32 +1000 Subject: [PATCH 0473/1393] Trim id_section if it is greater than 255 characters --- Tests/test_file_tga.py | 7 +++++++ src/PIL/TgaImagePlugin.py | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 1fcd62b8806..77695f2d1a0 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -124,6 +124,13 @@ def test_save_id_section(self): test_im = Image.open(out) self.assertEqual(test_im.info["id_section"], b"Test content") + # Save with custom id section greater than 255 characters + id_section = b"Test content" * 25 + self.assert_warning(UserWarning, + lambda: im.save(out, id_section=id_section)) + test_im = Image.open(out) + self.assertEqual(test_im.info["id_section"], id_section[:255]) + test_file = "Tests/images/tga_id_field.tga" im = Image.open(test_file) diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index c60cb3ef154..c622f1f5e7d 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -20,6 +20,8 @@ from . import Image, ImageFile, ImagePalette from ._binary import i8, i16le as i16, o8, o16le as o16 +import warnings + __version__ = "0.3" @@ -163,6 +165,10 @@ def _save(im, fp, filename): id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) idlen = len(id_section) + if idlen > 255: + idlen = 255 + id_section = id_section[:255] + warnings.warn("id_section has been trimmed to 255 characters") if colormaptype: colormapfirst, colormaplength, colormapentry = 0, 256, 24 From 83216b96de9d262d0fc54818744657ef4ef4fbc3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Sep 2018 18:00:44 +1000 Subject: [PATCH 0474/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3d43539deb4..5f81c86187d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Convert int values of RATIONAL TIFF tags to floats #3338 + [radarhere, wiredfool] + - Fix code for PYTHONOPTIMIZE #3233 [hugovk] From a9d504e91d82a211a5ce968282e2cb8bdac65480 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Sep 2018 19:02:03 +1000 Subject: [PATCH 0475/1393] Renamed idlen variable to id_len --- src/PIL/TgaImagePlugin.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index c622f1f5e7d..02893e83737 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -55,7 +55,7 @@ def _open(self): # process header s = self.fp.read(18) - idlen = i8(s[0]) + id_len = i8(s[0]) colormaptype = i8(s[1]) imagetype = i8(s[2]) @@ -102,8 +102,8 @@ def _open(self): if imagetype & 8: self.info["compression"] = "tga_rle" - if idlen: - self.info["id_section"] = self.fp.read(idlen) + if id_len: + self.info["id_section"] = self.fp.read(id_len) if colormaptype: # read palette @@ -164,9 +164,9 @@ def _save(im, fp, filename): id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - idlen = len(id_section) - if idlen > 255: - idlen = 255 + id_len = len(id_section) + if id_len > 255: + id_len = 255 id_section = id_section[:255] warnings.warn("id_section has been trimmed to 255 characters") @@ -185,7 +185,7 @@ def _save(im, fp, filename): if orientation > 0: flags = flags | 0x20 - fp.write(o8(idlen) + + fp.write(o8(id_len) + o8(colormaptype) + o8(imagetype) + o16(colormapfirst) + From 2780f8f4a406051f1b2ed1423ed08eaeb26a2771 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 8 Sep 2018 13:13:53 +0300 Subject: [PATCH 0476/1393] Update CHANGES.rst [CI skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5f81c86187d..ae45960b6fa 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Add orientation, compression and id_section as TGA save keyword arguments #3327 + [radarhere] + - Convert int values of RATIONAL TIFF tags to floats #3338 [radarhere, wiredfool] From 9d9da79caa713cc8b6fe5a80144f963073bc8aa8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Sep 2018 23:08:17 +1000 Subject: [PATCH 0477/1393] Close existing fp before setting new fp --- Tests/test_file_webp.py | 7 +++++++ src/PIL/WebPImagePlugin.py | 2 ++ 2 files changed, 9 insertions(+) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 06e274d0a1e..202836f4cf8 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -135,6 +135,13 @@ def test_WebPDecode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimDecoder) self.assertRaises(TypeError, _webp.WebPDecode) + def test_no_resource_warning(self): + file_path = "Tests/images/hopper.webp" + image = Image.open(file_path) + + temp_file = self.tempfile("temp.webp") + self.assert_warning(None, image.save, temp_file) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 39a8f2e35dd..8c26da180bc 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -153,6 +153,8 @@ def load(self): self.__loaded = self.__logical_frame # Set tile + if self.fp: + self.fp.close() self.fp = BytesIO(data) self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] From d71eacd7694508b980b41360923ddd40177d87c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 8 Sep 2018 23:39:57 +1000 Subject: [PATCH 0478/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ae45960b6fa..6462d495d23 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Close existing WebP fp before setting new fp #3341 + [radarhere] + - Add orientation, compression and id_section as TGA save keyword arguments #3327 [radarhere] From a95e57af4632811ec8506fa88f178c332a366449 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 8 Sep 2018 18:21:02 +0300 Subject: [PATCH 0479/1393] Wrong raw mode for YCbCr with two extra channels --- src/PIL/TiffImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 349f7acbfa7..683482020c9 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -261,8 +261,8 @@ (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXX"), (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), From 558e70d8cdd9045c46019752ba1198904079dac4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 9 Sep 2018 13:57:01 +1000 Subject: [PATCH 0480/1393] Removed less than condition --- src/libImaging/Draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index eded2371660..60650c37370 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -855,7 +855,7 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, if (i != start) { if (mode == PIESLICE) { if (x != cx || y != cy) { - if (width <= 1) { + if (width == 1) { draw->line(im, x, y, cx, cy, ink); draw->line(im, cx, cy, sx, sy, ink); } else { From cb8613ad2abcb5ef2b5794fc927c7dc420449dcd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 Sep 2018 19:43:40 +1000 Subject: [PATCH 0481/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6462d495d23..f9251185e06 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Add more raw Tiff modes (RGBaX, RGBaXX, RGBAX, RGBAXX) #3335 + [homm] + - Close existing WebP fp before setting new fp #3341 [radarhere] From 37f0e9595c19ce5f8b4dd5b957b6efca71f2f037 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 10 Sep 2018 21:10:11 +1000 Subject: [PATCH 0482/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f9251185e06..d844e98d8b7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Fix builds with --parallel #3272 + [hsoft] + - Add more raw Tiff modes (RGBaX, RGBaXX, RGBAX, RGBAXX) #3335 [homm] From e5160bd3732b881437bb7f6b5d5fbfaffc6fe69c Mon Sep 17 00:00:00 2001 From: Giovanni Cavallin <37183651+mawanda-jun@users.noreply.github.com> Date: Tue, 11 Sep 2018 10:30:42 +0200 Subject: [PATCH 0483/1393] From KeyError to ValueError when saving image When saving an image, if the extension is not determined it raises a ValueError (while internally it manages a KeyError) so I propose this change --- 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 f13a98276bb..1ceabab454c 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1894,7 +1894,7 @@ def save(self, fp, format=None, **params): parameter should always be used. :param params: Extra parameters to the image writer. :returns: None - :exception KeyError: If the output format could not be determined + :exception ValueError: If the output format could not be determined from the file name. Use the format option to solve this. :exception IOError: If the file could not be written. The file may have been created, and may contain partial data. From e94878c8a8067861ebf8b667a2415a23e2a4355e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 Sep 2018 06:26:40 +1000 Subject: [PATCH 0484/1393] Simplified duplicate code --- setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 935f3d1cc72..ba1fd22195e 100755 --- a/setup.py +++ b/setup.py @@ -524,10 +524,7 @@ def build_extensions(self): if _find_include_file(self, 'tiff.h'): if _find_library_file(self, "tiff"): feature.tiff = "tiff" - if (sys.platform == "win32" and - _find_library_file(self, "libtiff")): - feature.tiff = "libtiff" - if (sys.platform == "darwin" and + if (sys.platform in ["win32", "darwin"] and _find_library_file(self, "libtiff")): feature.tiff = "libtiff" From d8dfc6fc1c2e9a486ccfc0bd5b90da01431bdd29 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 15 Sep 2018 07:29:21 +1000 Subject: [PATCH 0485/1393] Removed unnecessary line --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 935f3d1cc72..753028d0d4e 100755 --- a/setup.py +++ b/setup.py @@ -553,7 +553,6 @@ def build_extensions(self): break if freetype_version: feature.freetype = "freetype" - feature.freetype_version = freetype_version if subdir: _add_directory(self.compiler.include_dirs, subdir, 0) From 4503735df7872a4adf1f269b007738da4944a138 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 15 Sep 2018 12:28:35 -0700 Subject: [PATCH 0486/1393] Remove additional references to nose tests --- .gitignore | 1 - Tests/check_jpeg_leaks.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 57494ded8db..87ae69d978d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,6 @@ htmlcov/ .coverage .cache .pytest_cache -nosetests.xml coverage.xml # Test files diff --git a/Tests/check_jpeg_leaks.py b/Tests/check_jpeg_leaks.py index 065e9d81796..c85f6f03036 100644 --- a/Tests/check_jpeg_leaks.py +++ b/Tests/check_jpeg_leaks.py @@ -9,8 +9,7 @@ When run on a system without the jpeg leak fixes, the valgrind runs look like this. -NOSE_PROCESSES=0 NOSE_TIMEOUT=600 valgrind --tool=massif \ - python test-installed.py -s -v Tests/check_jpeg_leaks.py +valgrind --tool=massif python test-installed.py -s -v Tests/check_jpeg_leaks.py """ From b8b51f8ddf75cbc6a6032e5fd40552ef300360c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Sep 2018 12:50:33 +1000 Subject: [PATCH 0487/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d844e98d8b7..5c4195325bb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Improved performance of ImageDraw floodfill method #3294 + [yo1995] + - Fix builds with --parallel #3272 [hsoft] From f3842460ba7694e9c1c9190bd6b08357254c2808 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Sep 2018 21:29:09 +1000 Subject: [PATCH 0488/1393] Added line joints --- Tests/images/imagedraw_line_joint_curve.png | Bin 0 -> 3535 bytes Tests/test_imagedraw.py | 14 +++++ docs/reference/ImageDraw.rst | 7 ++- src/PIL/ImageDraw.py | 58 +++++++++++++++++++- 4 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 Tests/images/imagedraw_line_joint_curve.png diff --git a/Tests/images/imagedraw_line_joint_curve.png b/Tests/images/imagedraw_line_joint_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..ad729f52858daee4d20e1d3e24d4a1cdf9a2aeb4 GIT binary patch literal 3535 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 4: + for i in range(1, len(xy)-1): + point = xy[i] + angles = [ + math.degrees(math.atan2( + end[0] - start[0], start[1] - end[1] + )) % 360 + for start, end in ((xy[i-1], point), (point, xy[i+1])) + ] + if angles[0] == angles[1]: + # This is a straight line, so no joint is required + continue + + def coord_at_angle(coord, angle): + x, y = coord + angle -= 90 + distance = width/2 - 1 + return tuple([ + p + + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) + for p, p_d in + ((x, distance * math.cos(math.radians(angle))), + (y, distance * math.sin(math.radians(angle)))) + ]) + flipped = ((angles[1] > angles[0] and + angles[1] - 180 > angles[0]) or + (angles[1] < angles[0] and + angles[1] + 180 > angles[0])) + coords = [ + (point[0] - width/2 + 1, point[1] - width/2 + 1), + (point[0] + width/2 - 1, point[1] + width/2 - 1) + ] + if flipped: + start, end = (angles[1] + 90, angles[0] + 90) + else: + start, end = (angles[0] - 90, angles[1] - 90) + self.pieslice(coords, start - 90, end - 90, fill) + + if width > 8: + # Cover potential gaps between the line and the joint + if flipped: + gapCoords = [ + coord_at_angle(point, angles[0]+90), + point, + coord_at_angle(point, angles[1]+90) + ] + else: + gapCoords = [ + coord_at_angle(point, angles[0]-90), + point, + coord_at_angle(point, angles[1]-90) + ] + self.line(gapCoords, fill, width=3) def shape(self, shape, fill=None, outline=None): """(Experimental) Draw a shape.""" From 53acbfc4d512aab4fce6bc7cb83896f745ddec0c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 16 Sep 2018 22:30:11 +1000 Subject: [PATCH 0489/1393] Added versionadded [ci skip] --- docs/reference/ImageDraw.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 89d0bfa2823..c66fb59dde8 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -186,6 +186,8 @@ Methods :param joint: Joint type between a sequence of lines. It can be "curve", for rounded edges, or None. + .. versionadded:: 5.3.0 + .. py:method:: PIL.ImageDraw.ImageDraw.pieslice(xy, start, end, fill=None, outline=None) Same as arc, but also draws straight lines between the end points and the From 68717f4a28b5e6ba7627ad88998b8073fa85a531 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 16 Sep 2018 16:11:46 +0300 Subject: [PATCH 0490/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 5c4195325bb..13a2364ef10 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- ImageDraw: Add line joints #3250 + [radarhere] + - Improved performance of ImageDraw floodfill method #3294 [yo1995] From e266b033d1f528c32881b845d61b09fd9c954f27 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 16 Sep 2018 23:41:24 +0300 Subject: [PATCH 0491/1393] Update version added --- docs/reference/ImageDraw.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 3bd46081488..75ae30a327a 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -140,7 +140,7 @@ Methods :param fill: Color to use for the arc. :param width: The line width, in pixels. - .. versionadded:: 5.2.0 + .. versionadded:: 5.3.0 .. py:method:: PIL.ImageDraw.ImageDraw.bitmap(xy, bitmap, fill=None) @@ -165,7 +165,7 @@ Methods :param fill: Color to use for the fill. :param width: The line width, in pixels. - .. versionadded:: 5.2.0 + .. versionadded:: 5.3.0 .. py:method:: PIL.ImageDraw.ImageDraw.ellipse(xy, fill=None, outline=None, width=0) @@ -178,7 +178,7 @@ Methods :param fill: Color to use for the fill. :param width: The line width, in pixels. - .. versionadded:: 5.2.0 + .. versionadded:: 5.3.0 .. py:method:: PIL.ImageDraw.ImageDraw.line(xy, fill=None, width=0) @@ -209,7 +209,7 @@ Methods :param outline: Color to use for the outline. :param width: The line width, in pixels. - .. versionadded:: 5.2.0 + .. versionadded:: 5.3.0 .. py:method:: PIL.ImageDraw.ImageDraw.point(xy, fill=None) @@ -243,7 +243,7 @@ Methods :param fill: Color to use for the fill. :param width: The line width, in pixels. - .. versionadded:: 5.2.0 + .. versionadded:: 5.3.0 .. py:method:: PIL.ImageDraw.ImageDraw.shape(shape, fill=None, outline=None) From c570ee3ba1c1b659e8de208c0b89605f7acef12f Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 17 Sep 2018 12:08:08 +0300 Subject: [PATCH 0492/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 13a2364ef10..923e515c39c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Read/Save RGB webp as RGB (instead of RGBX) #3298 + [kkopachev] + - ImageDraw: Add line joints #3250 [radarhere] From dd5f370a39c67e0b6cc17691e913f0c3d6dd6c9d Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 18 Sep 2018 09:40:16 +0300 Subject: [PATCH 0493/1393] Issue template: add prompts for versions [CI skip] --- .github/ISSUE_TEMPLATE.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 6c91b6427da..01ae7a43c0d 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -4,7 +4,11 @@ ### What actually happened? -### What versions of Pillow and Python are you using? +### What versions of OS, Python and Pillow are you using? + +* OS: +* Python: +* Pillow: Please include **code** that reproduces the issue and whenever possible, an **image** that demonstrates the issue. Please upload images to GitHub, not to third-party file hosting sites. If necessary, add the image to a zip or tar archive. From 7da1cc23382961cc22bdf82078c8d5fa3a8a8d16 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 18 Sep 2018 13:10:34 +0300 Subject: [PATCH 0494/1393] Reword --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 01ae7a43c0d..6cea87df28d 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -4,7 +4,7 @@ ### What actually happened? -### What versions of OS, Python and Pillow are you using? +### What are your OS, Python and Pillow versions? * OS: * Python: From 292fa6120e1a404330d0afa98072ccf856704836 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 18 Sep 2018 13:41:55 +0300 Subject: [PATCH 0495/1393] 'btt' (bottom to top) is not supported by libraqm --- docs/reference/ImageDraw.rst | 20 ++++++++------------ docs/reference/ImageFont.rst | 5 ++--- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index c66fb59dde8..7e519249997 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -253,9 +253,8 @@ Methods :param align: If the text is passed on to multiline_text(), "left", "center" or "right". :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right), 'ttb' (top to - bottom) or 'btt' (bottom to top). Requires - libraqm. + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. .. versionadded:: 4.2.0 @@ -283,9 +282,8 @@ Methods :param spacing: The number of pixels between lines. :param align: "left", "center" or "right". :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right), 'ttb' (top to - bottom) or 'btt' (bottom to top). Requires - libraqm. + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. .. versionadded:: 4.2.0 @@ -312,9 +310,8 @@ Methods :param spacing: If the text is passed on to multiline_textsize(), the number of pixels between lines. :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right), 'ttb' (top to - bottom) or 'btt' (bottom to top). Requires - libraqm. + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. .. versionadded:: 4.2.0 @@ -339,9 +336,8 @@ Methods :param font: An :py:class:`~PIL.ImageFont.ImageFont` instance. :param spacing: The number of pixels between lines. :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right), 'ttb' (top to - bottom) or 'btt' (bottom to top). Requires - libraqm. + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. .. versionadded:: 4.2.0 diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 080e52137ca..55ce3d382a4 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -67,9 +67,8 @@ Methods .. versionadded:: 1.1.5 :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right), 'ttb' (top to - bottom) or 'btt' (bottom to top). Requires - libraqm. + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. .. versionadded:: 4.2.0 From fe236fe73289b912395fbe2e75323567e7840ce6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 18 Sep 2018 21:47:10 +1000 Subject: [PATCH 0496/1393] Create pacman package cache directory --- winbuild/appveyor_install_msys2_deps.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/winbuild/appveyor_install_msys2_deps.sh b/winbuild/appveyor_install_msys2_deps.sh index fbab280b3c2..f8cb8c641b4 100644 --- a/winbuild/appveyor_install_msys2_deps.sh +++ b/winbuild/appveyor_install_msys2_deps.sh @@ -1,5 +1,6 @@ #!/bin/sh +mkdir /var/cache/pacman/pkg pacman -S --noconfirm mingw32/mingw-w64-i686-python3-pip \ mingw32/mingw-w64-i686-python3-setuptools \ mingw32/mingw-w64-i686-python2-pip \ From 0b3036454c9b73d650fd187de457d1377bbc1b55 Mon Sep 17 00:00:00 2001 From: Martin Packman Date: Mon, 17 Sep 2018 16:30:42 +0100 Subject: [PATCH 0497/1393] Give correct extrema for I;16 format images Currently gives None for a 16 bit greyscale image rather than the true min and max values in the 0-65536 range. The internal ImagingGetProjection function already supports I;16 but the _getextrema needs to know to unpack the result. --- Tests/images/16_bit_noise.tif | Bin 0 -> 2446 bytes Tests/test_image_getextrema.py | 8 ++++++++ src/_imaging.c | 5 +++++ 3 files changed, 13 insertions(+) create mode 100644 Tests/images/16_bit_noise.tif diff --git a/Tests/images/16_bit_noise.tif b/Tests/images/16_bit_noise.tif new file mode 100644 index 0000000000000000000000000000000000000000..19180638efa88ebf827c78a7ed5e4a112815e10b GIT binary patch literal 2446 zcmbuB+f$oW6vbBx#q`D7c&WD;A07V>ANrs#>ObM5R_%-(iy)8?E+K^w8VDrNgmMe_ zON0Okgm5cRZYDsTLTP0Lt+%nxIIX|)nTNc~H|L!FeK~vYwbx$f43{pwE4y9#NxM4M zymlD7npRB1n$(QO6xB`afO-^GttQl=TMDWL+bfT5s9cr0q7!9xo99GnZD~X6ct^FW zaXhxwrCyCN2Z-Tku9u4uAVM8asjBp|lKMl1wl)2TZvqqtnj%gN1TDOGYn04AYSVRm zTU3MPQZ?CY_9_9dV5k?c0SHWLBqe5l8IaNaKTlf#*dqm}1 zR6eIQsyG3CFHe(J@D8yf2m;f^Qqb4JLYcm0zN?2kXLSD%&mAJf!8=KuSv&?o+eZf? z)>|!{do1=H9HQcVFLeEsy?NH+xU+1K4fVqK@}mm9H*DU9B_rTB9PLrQl{fZh^c8{`+9wWAR@F{!{SB@Y@8- z67vMvmw3jB(+lzlR*e3)(#w9L7}dJrun`rxIR88Jt;n{mbG8N4lxFX=brQm`)XTTPU5{X^An*^;O?iw0A$l?3?$nZ`IfD_}LZNQm!VdNBlsQn0t- z`xVxg;Qbx;vSePM6Ek!>3r}(Oc4D`(GlPmE#Oq>DtHnYMb2aQ&aQ_t9Hqq*!)%`7W zlA-bxJG+SY-?@qN>oA=+XWqYIBvYldB1@M-0 z+?+nE>jTu#0V{6&Yj`{`aG8qk;&(v(DQ0tXOw#*V@=mdPoa}={>BJ7=?*zS3juRXX zeF}ohoc#Of^o%+-snh5-P0o4Pj}vPi6k#iB5BZFK2heRJ8f*eXCH3!Ag2BgHL$rE2S<21>6thf*IXH;ny@o7S?#&VE*t^1;zNG)(srq8L~ z&H2j`VVAK@gfz82XG@TGmiptw>fq@levs9NYR&!QN4X``Qo>!b#|^fJ_c3hmf;_|C zd3qQJOA_=$RMbs1t@t^J;RHnq=cdt`UF>;;?tTEfxxeS|y2F#=G1+U;VHD4PtNUT< z@xntr_?ua;=?lH2Cn}Upxj$QhWxvgimage->mode, "I;16") == 0) { + return Py_BuildValue("HH", extrema.s[0], extrema.s[1]); + } } Py_INCREF(Py_None); From f0436a4ddc954541fa10a531e2d9ea0c5ae2065d Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 2 Jul 2018 17:15:24 -0700 Subject: [PATCH 0498/1393] Adding support to reading tiled and YcbCr jpegs tiffs through libtiff --- src/PIL/TiffImagePlugin.py | 152 +++++++++++++++++------------------- src/libImaging/TiffDecode.c | 115 ++++++++++++++++++++------- 2 files changed, 157 insertions(+), 110 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index ecfe8d890f9..d12f411fe81 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -257,14 +257,14 @@ (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), - (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), - (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), + (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), @@ -1062,6 +1062,8 @@ def _decoder(self, rawmode, layer, tile=None): compression = self._compression if compression == "raw": args = (rawmode, 0, 1) + if compression == "jpeg": + args = ("RGB", "") elif compression == "packbits": args = rawmode @@ -1187,6 +1189,7 @@ def _setup(self): print("- photometric_interpretation:", photo) print("- planar_configuration:", self._planar_configuration) print("- fill_order:", fillorder) + print("- YCbCr subsampling:", self.tag.get(530)) # size xsize = self.tag_v2.get(IMAGEWIDTH) @@ -1258,87 +1261,71 @@ def _setup(self): # build tile descriptors x = y = layer = 0 self.tile = [] - self.use_load_libtiff = False - if STRIPOFFSETS in self.tag_v2: + self.use_load_libtiff = self._compression != 'raw' + if self.use_load_libtiff: + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + key = ( + self.tag_v2.prefix, photo, sampleFormat, 1, + self.tag_v2.get(BITSPERSAMPLE, (1,)), + self.tag_v2.get(EXTRASAMPLES, ()) + ) + if DEBUG: + print("format key:", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self.mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if rawmode == 'I;16': + rawmode = 'I;16N' + if ';16B' in rawmode: + rawmode = rawmode.replace(';16B', ';16N') + if ';16L' in rawmode: + rawmode = rawmode.replace(';16L', ';16N') + + # 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.tile.append( + (self._compression, + (0, 0, xsize, ysize), + 0, a)) + + elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: # striped image - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = self.size[0] - if READ_LIBTIFF or self._compression != 'raw': - # Decoder expects entire file as one tile. - # There's a buffer size limit in load (64k) - # so large g4 images will fail if we use that - # function. - # - # Setup the one tile for the whole image, then - # use the _load_libtiff function. - - self.use_load_libtiff = True - - # libtiff handles the fillmode for us, so 1;IR should - # actually be 1;I. Including the R double reverses the - # bits, so stripes of the image are reversed. See - # https://github.com/python-pillow/Pillow/issues/279 - if fillorder == 2: - key = ( - self.tag_v2.prefix, photo, sampleFormat, 1, - self.tag_v2.get(BITSPERSAMPLE, (1,)), - self.tag_v2.get(EXTRASAMPLES, ()) - ) - if DEBUG: - print("format key:", key) - # this should always work, since all the - # fillorder==2 modes have a corresponding - # fillorder=1 mode - self.mode, rawmode = OPEN_INFO[key] - # libtiff always returns the bytes in native order. - # we're expecting image byte order. So, if the rawmode - # contains I;16, we need to convert from native to image - # byte order. - if rawmode == 'I;16': - rawmode = 'I;16N' - if ';16B' in rawmode: - rawmode = rawmode.replace(';16B', ';16N') - if ';16L' in rawmode: - rawmode = rawmode.replace(';16L', ';16N') - - # 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.tile.append( - (self._compression, - (0, 0, w, ysize), - 0, a)) - a = None - + if STRIPOFFSETS in self.tag_v2: + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = self.size[0] else: - for i, offset in enumerate(offsets): - a = self._decoder(rawmode, layer, i) - self.tile.append( - (self._compression, - (0, min(y, ysize), w, min(y+h, ysize)), - offset, a)) - if DEBUG: - print("tiles: ", self.tile) - y = y + h - if y >= self.size[1]: - x = y = 0 - layer += 1 - a = None - elif TILEOFFSETS in self.tag_v2: - # tiled image - w = self.tag_v2.get(322) - h = self.tag_v2.get(323) + # tiled image + offsets = self.tag_v2[TILEOFFSETS] + w = self.tag_v2.get(322) + h = self.tag_v2.get(323) + a = None - for o in self.tag_v2[TILEOFFSETS]: + for offset in offsets: if not a: a = self._decoder(rawmode, layer) - # FIXME: this doesn't work if the image size - # is not a multiple of the tile size... self.tile.append( (self._compression, - (x, y, x+w, y+h), - o, a)) + (min(x, xsize), min(y, ysize), min(x+w, xsize), min(y+h, ysize)), + offset, a)) x = x + w if x >= self.size[0]: x, y = 0, y + h @@ -1346,6 +1333,7 @@ def _setup(self): x = y = 0 layer += 1 a = None + self.tile_prefix = self.tag_v2.get(JPEGTABLES, b"") else: if DEBUG: print("- unsupported data organization") diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index f292da3883d..96106b6e35c 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -173,7 +173,6 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int char *filename = "tempfile.tif"; char *mode = "r"; TIFF *tiff; - tsize_t size; /* buffer is the encoded file, bytes is the length of the encoded file */ @@ -235,36 +234,96 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int } } - size = TIFFScanlineSize(tiff); - TRACE(("ScanlineSize: %d \n", size)); - if (size > state->bytes) { - TRACE(("Error, scanline size > buffer size\n")); - state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); - return -1; - } + TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); - // Have to do this row by row and shove stuff into the buffer that way, - // with shuffle. (or, just alloc a buffer myself, then figure out how to get it - // back in. Can't use read encoded stripe. + if (TIFFIsTiled(tiff)) { + state->bytes = TIFFTileSize(tiff); - // This thing pretty much requires that I have the whole image in one shot. - // Perhaps a stub version would work better??? - while(state->y < state->ysize){ - if (TIFFReadScanline(tiff, (tdata_t)state->buffer, (uint32)state->y, 0) == -1) { - TRACE(("Decode Error, row %d\n", state->y)); - state->errcode = IMAGING_CODEC_BROKEN; - TIFFClose(tiff); - return -1; - } - /* TRACE(("Decoded row %d \n", state->y)); */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, - state->buffer, - state->xsize); + /* overflow check for malloc */ + if (state->bytes > INT_MAX - 1) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } - state->y++; - } + /* realloc to fit whole tile */ + UINT8 *new = realloc (state->buffer, state->bytes); + if (!new) { + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + return -1; + } + + state->buffer = new; + + TRACE(("TIFFTileSize: %d\n", state->bytes)); + + uint32 x, y, tile_y; + uint32 tileWidth, tileLength; + + TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tileWidth); + TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tileLength); + + for (y = state->yoff; y < state->ysize; y += tileLength) { + for (x = state->xoff; x < state->xsize; x += tileWidth) { + 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; + TIFFClose(tiff); + return -1; + } + + TRACE(("Read tile at %dx%d; \n\n", x, y)); + + // iterate over each line in the tile and stuff data into image + for (tile_y = 0; tile_y < min(tileLength, state->ysize - y); tile_y++) { + + TRACE(("Writing tile data at %dx%d using tilwWidth: %d; \n", tile_y + y, x, min(tileWidth, state->xsize - x))); + + // UINT8 * bbb = state->buffer + tile_y * (state->bytes / tileLength); + // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); + + state->shuffle((UINT8*) im->image[tile_y + y] + x * im->pixelsize, + state->buffer + tile_y * (state->bytes / tileLength), + min(tileWidth, state->xsize - x) + ); + } + } + } + } else { + tsize_t size; + + size = TIFFScanlineSize(tiff); + TRACE(("ScanlineSize: %lu \n", size)); + if (size > state->bytes) { + TRACE(("Error, scanline size > buffer size\n")); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFClose(tiff); + return -1; + } + + // Have to do this row by row and shove stuff into the buffer that way, + // with shuffle. (or, just alloc a buffer myself, then figure out how to get it + // back in. Can't use read encoded stripe. + + // This thing pretty much requires that I have the whole image in one shot. + // Perhaps a stub version would work better??? + while(state->y < state->ysize){ + if (TIFFReadScanline(tiff, (tdata_t)state->buffer, (uint32)state->y, 0) == -1) { + TRACE(("Decode Error, row %d\n", state->y)); + state->errcode = IMAGING_CODEC_BROKEN; + TIFFClose(tiff); + return -1; + } + /* TRACE(("Decoded row %d \n", state->y)); */ + state->shuffle((UINT8*) im->image[state->y + state->yoff] + + state->xoff * im->pixelsize, + state->buffer, + state->xsize); + + state->y++; + } + } TIFFClose(tiff); TRACE(("Done Decoding, Returning \n")); From 1f63abdba89440f73b90da7c6e01130e360c4f06 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 16 Jul 2018 21:10:57 -0700 Subject: [PATCH 0499/1393] Fix tiled raw tiff read and add tests --- Tests/images/tiff_strip_cmyk_jpeg.tif | Bin 0 -> 23268 bytes Tests/images/tiff_strip_raw.tif | Bin 0 -> 312162 bytes .../tiff_strip_ycbcr_jpeg_1x1_sampling.tif | Bin 0 -> 44042 bytes .../tiff_strip_ycbcr_jpeg_2x2_sampling.tif | Bin 0 -> 35896 bytes Tests/images/tiff_tiled_cmyk_jpeg.tif | Bin 0 -> 31790 bytes Tests/images/tiff_tiled_raw.tif | Bin 0 -> 442674 bytes .../tiff_tiled_ycbcr_jpeg_1x1_sampling.tif | Bin 0 -> 46266 bytes .../tiff_tiled_ycbcr_jpeg_2x2_sampling.tif | Bin 0 -> 26862 bytes Tests/test_file_tiff.py | 48 ++++++++++++++++++ src/PIL/TiffImagePlugin.py | 19 ++++--- 10 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 Tests/images/tiff_strip_cmyk_jpeg.tif create mode 100644 Tests/images/tiff_strip_raw.tif create mode 100644 Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif create mode 100644 Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif create mode 100644 Tests/images/tiff_tiled_cmyk_jpeg.tif create mode 100644 Tests/images/tiff_tiled_raw.tif create mode 100644 Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif create mode 100644 Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif diff --git a/Tests/images/tiff_strip_cmyk_jpeg.tif b/Tests/images/tiff_strip_cmyk_jpeg.tif new file mode 100644 index 0000000000000000000000000000000000000000..9d53d167e05ca083a39dcfd5f87f83bb9589e3d9 GIT binary patch literal 23268 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_raw.tif b/Tests/images/tiff_strip_raw.tif new file mode 100644 index 0000000000000000000000000000000000000000..81bb42ce7dc02a631567188faa405c98cc1d558e GIT binary patch literal 312162 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�PrrA+Z0Og? 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif b/Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif new file mode 100644 index 0000000000000000000000000000000000000000..bbb969cc20f9043ee1c730b1656ce22d6ffb34e4 GIT binary patch literal 44042 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif b/Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif new file mode 100644 index 0000000000000000000000000000000000000000..86b5816668e2faf7e07d32ee047b566401f9e02b GIT binary patch literal 35896 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

95%bD#$y~0*?c0xj{4oxSdl&lk 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 S|G)V+y#E;9e*$NM{rCSW7hviD literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif b/Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif new file mode 100644 index 0000000000000000000000000000000000000000..fdee429855f0494d94aeb5da7a5a846af9ffd905 GIT binary patch literal 46266 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 {qh(K3t&FtF-ZZ?Wfkv>!ay&{aSc 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif b/Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif new file mode 100644 index 0000000000000000000000000000000000000000..49b3e1a1332258508eeb8f5592f5e1ba70586f07 GIT binary patch literal 26862 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 K#r~IGGyetmJ%j%M literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 79630c77340..99afed52b9d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -416,6 +416,54 @@ def test_roundtrip_tiff_uint16(self): self.assert_image_equal(im, reloaded) + def test_strip_raw(self): + infile = "Tests/images/tiff_strip_raw.tif" + im = Image.open(infile) + + self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + def test_strip_cmyk_jpeg(self): + infile = "Tests/images/tiff_strip_cmyk_jpeg.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3, mode='CMYK') + + def test_strip_ycbcr_jpeg_2x2_sampling(self): + infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 2) + + def test_strip_ycbcr_jpeg_1x1_sampling(self): + infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + + def test_tiled_raw(self): + infile = "Tests/images/tiff_tiled_raw.tif" + im = Image.open(infile) + + self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + def test_tiled_cmyk_jpeg(self): + infile = "Tests/images/tiff_tiled_cmyk_jpeg.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3.5, mode='CMYK') + + def test_tiled_ycbcr_jpeg_1x1_sampling(self): + infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + + def test_tiled_ycbcr_jpeg_2x2_sampling(self): + infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 1) + def test_tiff_save_all(self): import io import os diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index d12f411fe81..ed29c4aba56 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1053,15 +1053,16 @@ def tell(self): "Return the current frame number" return self.__frame - def _decoder(self, rawmode, layer, tile=None): + def _decoder(self, rawmode, layer, stride): "Setup decoder contexts" args = None if rawmode == "RGB" and self._planar_configuration == 2: rawmode = rawmode[layer] + stride /= 3 compression = self._compression if compression == "raw": - args = (rawmode, 0, 1) + args = (rawmode, int(stride), 1) if compression == "jpeg": args = ("RGB", "") elif compression == "packbits": @@ -1261,7 +1262,7 @@ def _setup(self): # build tile descriptors x = y = layer = 0 self.tile = [] - self.use_load_libtiff = self._compression != 'raw' + self.use_load_libtiff = READ_LIBTIFF or self._compression != 'raw' if self.use_load_libtiff: # Decoder expects entire file as one tile. # There's a buffer size limit in load (64k) @@ -1318,13 +1319,16 @@ def _setup(self): w = self.tag_v2.get(322) h = self.tag_v2.get(323) - a = None for offset in offsets: - if not a: - a = self._decoder(rawmode, layer) + if x + w > xsize: + stride = w * sum(bps_tuple) / 8 # bytes per line + else: + stride = 0 + + a = self._decoder(rawmode, layer, stride) self.tile.append( (self._compression, - (min(x, xsize), min(y, ysize), min(x+w, xsize), min(y+h, ysize)), + (x, y, min(x+w, xsize), min(y+h, ysize)), offset, a)) x = x + w if x >= self.size[0]: @@ -1332,7 +1336,6 @@ def _setup(self): if y >= self.size[1]: x = y = 0 layer += 1 - a = None self.tile_prefix = self.tag_v2.get(JPEGTABLES, b"") else: if DEBUG: From 52637a42680bff166688aab064b31d8ffea2f4f4 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 16 Jul 2018 21:41:32 -0700 Subject: [PATCH 0500/1393] move libtiff-related tests into libtiff test file --- Tests/test_file_libtiff.py | 37 +++++++++++++++++++++++++++++++++++++ Tests/test_file_tiff.py | 36 ------------------------------------ 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 7735b5bea29..c77c2ffb221 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -635,6 +635,43 @@ def test_lzw(self): im2 = hopper() self.assert_image_similar(im, im2, 5) + def test_strip_cmyk_jpeg(self): + infile = "Tests/images/tiff_strip_cmyk_jpeg.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3, mode='CMYK') + + def test_strip_ycbcr_jpeg_2x2_sampling(self): + infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 2) + + def test_strip_ycbcr_jpeg_1x1_sampling(self): + infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + + def test_tiled_cmyk_jpeg(self): + infile = "Tests/images/tiff_tiled_cmyk_jpeg.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3.5, mode='CMYK') + + def test_tiled_ycbcr_jpeg_1x1_sampling(self): + infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + + def test_tiled_ycbcr_jpeg_2x2_sampling(self): + infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" + im = Image.open(infile) + + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 1) + + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 99afed52b9d..a8a89388387 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -422,48 +422,12 @@ def test_strip_raw(self): self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") - def test_strip_cmyk_jpeg(self): - infile = "Tests/images/tiff_strip_cmyk_jpeg.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3, mode='CMYK') - - def test_strip_ycbcr_jpeg_2x2_sampling(self): - infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 2) - - def test_strip_ycbcr_jpeg_1x1_sampling(self): - infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) - def test_tiled_raw(self): infile = "Tests/images/tiff_tiled_raw.tif" im = Image.open(infile) self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") - def test_tiled_cmyk_jpeg(self): - infile = "Tests/images/tiff_tiled_cmyk_jpeg.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3.5, mode='CMYK') - - def test_tiled_ycbcr_jpeg_1x1_sampling(self): - infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) - - def test_tiled_ycbcr_jpeg_2x2_sampling(self): - infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" - im = Image.open(infile) - - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 1) - def test_tiff_save_all(self): import io import os From e6c510ef386758fe4b321de8990c6b155402f2b5 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 16 Jul 2018 22:39:52 -0700 Subject: [PATCH 0501/1393] Remove redundant decompression; adjust jpeg read mode to be RGBX (pad) --- src/PIL/TiffImagePlugin.py | 39 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index ed29c4aba56..3a2bd7b4cbe 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -259,12 +259,12 @@ (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), @@ -1053,23 +1053,6 @@ def tell(self): "Return the current frame number" return self.__frame - def _decoder(self, rawmode, layer, stride): - "Setup decoder contexts" - - args = None - if rawmode == "RGB" and self._planar_configuration == 2: - rawmode = rawmode[layer] - stride /= 3 - compression = self._compression - if compression == "raw": - args = (rawmode, int(stride), 1) - if compression == "jpeg": - args = ("RGB", "") - elif compression == "packbits": - args = rawmode - - return args - def load(self): if self.use_load_libtiff: return self._load_libtiff() @@ -1325,7 +1308,14 @@ def _setup(self): else: stride = 0 - a = self._decoder(rawmode, layer, stride) + tile_rawmode = rawmode + if self._planar_configuration == 2: + # each band on it's own layer + tile_rawmode = rawmode[layer] + # adjust stride width accordingly + stride /= bps_count + + a = (tile_rawmode, int(stride), 1) self.tile.append( (self._compression, (x, y, min(x+w, xsize), min(y+h, ysize)), @@ -1336,7 +1326,6 @@ def _setup(self): if y >= self.size[1]: x = y = 0 layer += 1 - self.tile_prefix = self.tag_v2.get(JPEGTABLES, b"") else: if DEBUG: print("- unsupported data organization") From 98d88fd1c63960c74237f0e7752a809403eaa861 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 17 Jul 2018 10:27:11 -0700 Subject: [PATCH 0502/1393] Add tests for uncompressed tiff with interleaved bands --- Tests/images/tiff_strip_planar_raw.tif | Bin 0 -> 312438 bytes .../tiff_strip_planar_raw_with_overviews.tif | Bin 0 -> 657366 bytes Tests/images/tiff_tiled_planar_raw.tif | Bin 0 -> 334590 bytes Tests/test_file_tiff.py | 20 ++++++++++++++++-- 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Tests/images/tiff_strip_planar_raw.tif create mode 100644 Tests/images/tiff_strip_planar_raw_with_overviews.tif create mode 100644 Tests/images/tiff_tiled_planar_raw.tif diff --git a/Tests/images/tiff_strip_planar_raw.tif b/Tests/images/tiff_strip_planar_raw.tif new file mode 100644 index 0000000000000000000000000000000000000000..ab8b3c3f329fbbc9083d6b03d5294cfa8932d9fe GIT binary patch literal 312438 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 xg60jk8!GToXq}u{#cSj>wR$m5q(HwY?om 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 literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_strip_planar_raw_with_overviews.tif b/Tests/images/tiff_strip_planar_raw_with_overviews.tif new file mode 100644 index 0000000000000000000000000000000000000000..e032c5c36f9cf24417a6ff0a882315cabc9072f2 GIT binary patch literal 657366 zcmd442XtKLmFEfB-aS2Yw!1CcqQg$__Uzf-+4gMrXx!anyKRvmNRS`^l3*qn!Aye4 zIp+)%P{_HEbIv*E3}z6_q$nmylw?`X*8c9R0s&Hh2wBpA7pTIkR|P!Oziz(wyWgfw zKi2yzJw3g@(bIeFn|iNtw2HgebjL0ne}m(1a(ey z{Ic}){>YIAT<=@mB9{Z-=h9}?D>;I46(lhw+xAeL2jx{2Wo4WyE-EZ4EXdCv5CNncLLq{CW5l?6-OOpl3t8;Sm z5rcxlLIk1+X%K-aDJ?0Tr?N8TSfmEADJ&>JZt`-W9HA`T_2gpdNF+j&oS2vp9~T>| zj){&|tt2WgYrdx*kT;o~4I=z|>1jf#FOZz##?$HPyon6Z0vpjNf{X%9kpd0qCR{1=B0MRdfqV$^ zDWs;rC|n{jL0Cl{BcQA(Dy~0>s#Q?Q(xj&*CnfMv#m1=lw4Ns(b5cjKadGhpNf;t< z$q`(%JR<_7d~4AuF2Vj(R9042l*2PxT=ID>CPy&QvZdHE1rzx+_#|}lql$`*SV>-S z|L%2I8jjXvq$Pt%H2+To-(r&?Ie_FKQl8M>MX93IvGIw?X&IRsZ~+-eu+e^N)lG3J zM!CACrlz{ON{}fnMY*6_6jeU2{uYb8Bl$b5moZ78_xj z(&EDW+-&3(9j1tlFbM=Eit&L{;L7l@l|;o|iwdeQH7PDSA~aBe!^hi8N8a9Ea_sHx z?Gq4@T3D#F#i-J9SOHFGY|>Km9JMsJw6wIgwRd#)^bZaVkBkft4-X9u4h{|s^!NAm z^>lZ4cC@uLH`dqJ)*@d>mC>mUoj!f$jOE$0R@OE)wnBEFC3|}ZM<*9oS64TPA3`od&dyGb zjt=&Awzf7l)>^W%w$jl-OLci7d=eHK8nTk8xC*ZzKUn327-1D}PXWT+owp)yNFfg0 z36nhB&IV-Wi3-VuWr|A5D$u62P+gt&yKatzhnm|ud;0nZ28Uo0xJ048-rk<>u8#KB zriR)Y5hu)(mP*U`D$P%JFi+6{3L0!BQE>qk(JC3~De*B8A%VU`i$XSs4;{01bh15t zpVfFG=0!r%{yp3ZsG%!Fxzcj*pHA3Gh`!=a_|0cE|ba zckW)l(3KZ>`j{QE;O0hf?PcpNCMFLP1FOI(7#XaLeAhQLXulgEU}^8{9T*-RpO}~! z9~~JT(GjTh_w{zQw=~w(RtqBK3W>9)qr4+QNkKt@fh&m$5+vad0t71IApt(1a`ISQ z?}I;(EBf=Fx%l4pZHFtf0zuNTIV`?~r@ zm7lY-M^HllGgPodLPH2pdqYi4Lv3AkrSM0o1e6k35*FY9%Xjp_WIThFL2MIpZw{5j`e9rS1~3ot_QUuR9sg643!T)(0|ixPSw^~ z6x2Ce?9tc%*~Z{-L1j#=^AIE!dZ53fNfVopT2@_MS)C#wk^+b}rX*StIvf?`Na{dXQd{kY2hm_5#h zv$N;^s2oA11XS!4@%iBP^qY2|q9Y3nyWRTwUhTC%Gx8h51c8c}=YFxzeSN(Rn((HU zd{tOsNl}UtOG|!+B#n^bBo}JTqdh!U7L_MTiX$yWLFH)XlP9-_a7x819i6&*0p z-P&AV99vbEm#E|&3JVnXSV4rmR9=4W!7w+s6-GtL`;bM5jS905yz%Hpe@%P;@Wh3g zn~!czT(~-`rE51I-c=tyZSM#!9y@b!<1o$YZVMExfYSYK1r^1EuQ7Ym%+8{ysjW-j zC}dPYgrm{@{$v^%#r^du)LQKB48qPD!|ocB~fwt&J#fe zwUUU#f2!}%%*Fb);Q=^heCp|kQ=^xz&Rn^2`O?LUm#;n?cHei_-oe4q^RNes1=FnV zuC_2U(|_~LzXue3EhOCQ>vQVOrnU-wvjiNLv611y$Gac*3IR%2Wo}eMV_iyOBGGX{ zfgq8e_g>R`f`()ypuDqwF3u~7ii4n%o=$==K^B70GsdHEEXB|6YLww_IW08Ye|}+rq(2V3*5Nz zu@S7XfC41lU0q%6n#BBuTIwLh6hP*%crQ1HFKtFQJLinAlj91bB56Xx`h=Ls(>*uF zhlg9Ihnfc`r>3W8es!(){4C6J`Qo{W(b0+P1MWM{*xA{;c$yIjDX3(t&4dILeI@Kw z96Lhb+WN-UJ!TPt%BVQ`eF`Rk(%IQjm=arGQ(0D0MDPG-Eq&TW3!T|*na1U6gkL?#YdlMIp5RO zGuVD}tZVw(ja#=bUK<_v{0E1gz8yd69vvI(>p$P_vg5R^t&{iO+(9Yxt9Kq5Op0w}F5O%13O1W1?e z$GO%K<}foe(I?RD>{-i|M8)bmPf`?CNsLpu4NeU7^$&L3dva~|>g6jp9zL9z4gcGK zE3rp^(K#|cGBi9j9%*#U*4Dw}fEJZ93LAZaC9AOG$* zzj|$dO|~XG zH=nppG9ucWM7>IkhrdduuB5!Cp{1j%x1Y=#>1)KMiBvzye#!P%mzTgPnK%SW(NJ5J zOcZi+)2L3J6k2&yq`(`iil|A=DQ)bXIDhW^<=N}E9zK0|=bfjI-+uJoU7Xvo&f4Ov zI?Z|u8yhmHHtAKriZyWf8JwDDBI z2RWAZPTiBejb*tl1@0v{z1@?SFJHNWOEWurO-s6HY4++I&0f2X6}x-y?fduNzIXTT zojbRoTetWYx_SNDERn<|B8iI^7SPr610rRLsI4%sNUdr(_|1R*ulsuPi)uQ@uRZ$s zPXfz>-~9g5$H%H|A6qsQC)yBM}_U$v@vuoGR?c290v>n>EZL6vA#`Okke);eJ{_~&d=%@1YCktqW zQ4w*TeiOelxu>$YzGwQ*(_e$hA0FL#|2L2C6*y$v%XCal*gx3cUR^T~8&Js$|EJJO zqGI{_V=41a2`Z&6oh42E7w^CS$)|s~G<);G(}(vSefZ?w;}0L&`tBVZ>Z<7)^^C65 zK~k5UjB}ybQ>Env#W`O{=PxGE+(0LaQa6sKN#{9=&ue-qvMY(oX;7igJN4iBFWa)G zs#}Jxy#4NPKK=dd!w)|GnA}ONUB!o={Q8W;&cTtMhRG(Iv=;5#sZY4d3+714du#7L znxhZr>4O*P;Ye)5%V1eqR31s`TS28W<5F+)$dx-!e*5X4Za)3p?>_$1pC7qY+CBO8 z?~k1@>l^9mpN;V|Lfn*({C1` zPnIG9^OHNO+NA+eo_S?Z>BzouW#Ihv2fzO9(?5Rt=RZ;=yXBG{>*sL7c#TO{@0E8$ zJPO*isI;r5eytUYr*rhIRPw&IU2^e8NnO9>dskI8FJYFIM8)#;M>KTBYI&urDet3; z6SMDp^wDpBFSWx@e|0PO_`%&fwip;EbxeHHV3p9I6QDLwnS+C$FCrqi2r6?;qtEw_ zK7Rc8{d20Sj?ZV7l|<$Aw;#o-W9LxmtZ4tkl`Hq3{`#YjKK|7Qzj}J>{)g}0y>;vQ zmFdCJk7mw>l&{OY!yPkyWJJ#@4@Lq#ht z&jF(4jK$&5)!v@=t18=;1VnjaB~dvEDzrz=q0-fo)Bov*?|=Bwhg6t9{`GHu|HnW5 z@ehCa-LF3SF|Ix?B94})zphpB8;IeKhE7hn5U=Rs>(Tt=fF8g zGyK812VGq&j!MitDxJ-_<$wCq?|%1(KmO@Ye-`=^u%KjG&iZ6E&VfRsh3ed|bdn;d z#Ook=CNj?>GLMEFy#qb%QdR0apJzB6bnEI`9sBIzN}_V?+mE877ogJB*;15z0R!|$ zK#^VzaQX9}Z>g+8@}F@E{vN1&1ROdr?BYaRHodVb?or$uZ)|$_&=%%VKd@0hkeixQ z@4Pd{shIn7^ggIGKLbE}prFFx!8ca9!8R+4%0v8d^`uU($p6h|8)+wy`2CwpD_~_@;Mk)bG4wqaa~jdEYvQZ)(it6!i3o0=SQR(VzEQ*WBYCnJT{{6d`dvkqlywn8^&)HE>Isc&! z67aAEm51Y-9ttX2F5&+EeQQ2(;Safg8%PvXv_<_zQPE0}u*^!Maza5R`Z-i6?=_TW zL9E)jRLN z9*9e&k%9$yth#q^Rm|NXqq|nocXf2<-ELLY657^n^(%o2F@E&K0=**t)Jv$NO*Q=i zDnv0ZC=V2f8jUKtmqh>XqiWsdojBIWXpw$TR)`lFwoR zBGO&Bj)20i-P*_9|(Xqum6bc~P`q90q>g1PXZdX#< zo`zQ-c%`Kv?zuet=RHVjynbIn=J-LkG@ zuzuqPgI})OxMua*4F+r1Y|vk~W<6EdU%d6!&(|8Pee0KN)~4p4~gP?Ka>C`LICp;L@>QzlSFg-ozdk#A`O}1H*Ot2EQ->oz<&XuUoxZ|1JHsYu2td&|klP{W`u3HkfSK zu+hla*u=z?+vcrX%(m~`vv>ENy?ghV?>%tf(7_`%o>6&~HFeS{Qd3pe*woS4GdMba z;rykGS1t)EbQ91{a2<7c?V3HPQ1+bsSJmyCeGlGSU`@ZC!@dVMmwBCa>(^{B++--o z7;RX)ezgIB0K%GeYuD(n{^goA25a=!tX*%oZv94M!*w9I$=J}?cr&<|ZrQSB>$V*` zcbo6qx9{M=LkIUBIDEp|);%n(w2mdS%?%B;^>s}xZ5@5|GEPlRU$}f_2D&mcd-d8? zt?OX_9VMF$Dz~opy!)KV_*x#wHI{ds4WMCYykWz-4TeS=*BR=s2aUA`t5+MWTVr7G z)>?gowQJWJfXOB#X1$S#sp)28(@n-(Hk%ron(W%XlWvIp2h8^!ICNUCQ zDrx|wwXLnWzM-bErKzoNXqa_>V^bGrW@oNmzj|5eJHe%zz3QYx<=<2{uXR6JXgj~2 zW4Xriu48Dp&S;a##*G_|HyNQZ)){Qj*I#cSeTi#-X`sJ)%^H0JgY^a*4L5Dt1W%z( zOpW0cvu$Quw`>-{*}w0=e)Ii@4qF^Pc-kX0DLuQqu8~E>O>M1hO|rbYvALZVPZlkW zPhY%37t^(wYuCU9W|^IF{mvt49hm$#)s5M%Cv(j?Oa7d$Z|LZro>}twmp&oaSjKhu zJ8;29Lqn5I8%#EvfQ!inV*_{tPFeldnso+my`^uUzjobv6XQ)Aj5Zk?Z$fO$OwD$R zKH0f@->$uT511c3w15BM6Q_sLD;&vhy-`Lk*K-FGt@&R<#b1@c5s;nl0RZ>2B#8o9Rdj@~|&`%JTN116ch ze)YzUo7cqxUA^Z1U2XOKr>bi+?TKjv0P*6>n!{g!;K&UGA5YYjT?m{K;@S||2Y;}f3^M^wC;K%1EWnwCWgGmbo=J* zW;?fS+qq-=jy-!2pF;=sA3l8S_-U6Qbz)XYbwg8o_rPF(XKO31oXvIBbc;5(cXjs; z4uQ%QP=Qmf-MA)k+U)GijF+H7r^ZiJvsc<4U0H(K$IvoEU{UsNdi88hSx3hppJsQ* z)TKp#L0x+FmPO~HPsufwzRtp5G1_QoWVCt17Gon*V`OB*`ZZ#F*1#ozVgS3WHQcZs zb!-fJ##^@T*uKqd+s>W4c43Xp%@0}}I(+<;t%qM!Qcgu}19H>W+CMzf*(L(iz$}Bt z_KvQe&hDPU@$-uG+_)|p{Qx_aW{r+=opdb#z{7+PU-RHM+9cy-OFS zo03_lJkc?Fe$ij3RiE!R>sa(DxyI7hS@u*Sf{`G=lE=E z*RIz`e%5c=fC!ly7@BO|zGXX3+wNUEcA4+qbHL)z(W4f}t=xm-)3b|;YnxhH8+tn1 z`v=GRI$K-XT58IQs+(Io5UB3%(P?RVym{lMV1m_U{leARt3ltBUZ(^>Kwa0i$0@VL$32|iPe$^Mj}4Oh{q-))2(Qg zjT>=ku|aPc7#iT=8R#2eos3O3nQS)Qy3K6+_FX%6@7=X~@1X;G4<0*p=B%x~dw5cA zX+?c)11ksGIy$<0hbISm+FRROYAZ@>o7>wvdsuvN;WB>PO|l*^%WZxlL%4C_-+P=$ z7u)pDRWlcx9@6N!D7DX?J9n-kDN!1hg_4qU6dyziu7EvwofaT0=Y&V^d>{4~ljN-u>P^d-hpa>^o{> z%Ni!nh@`xV>Lxx$nefrtE{)>D-R-SyEe*|0&CT7Ny@M=KxGH|z4VG8lMBCn0vL9#| zP>~@h)Bmoza-s3Tg4WmP4m)P26`GowoSYOqwA4N@`P|E%JveD*mh6$2fyCl{;a*b zucvQlY-V9)ZDUJ&PftfjCu_F)hK9!ax_Y`;k<-)H+c!8oaZX~N>o>05y@i@3p?de` zt?Q_lo3qy<-=JeXG3ngDt1h3fe}J4UN;*^&P@Y3&VzHOE2b#H=?eWWB>^ZrH++L2# z=1njQw%L?>V-vKkq1a@>#E^IhfQ&Zb&2Bc{VzzCE+3sC?cJ8$}X64}J<>Bh>9~>SQ zo1R@(UMCgL?yjER{@%WUA!(kMMb$&xF&Ad~5~c@ExptlA=o>e0-@SYL#?5Oyo}E>{ zp{#BIl}qR9-a$?lrH-q@DpN18%0zqr_#!WFJGsYbospTo?;_7B*O2Qh0~MobMFbT2K~BP%ELtXUU0GtB1^*6W;vnQ$xx%I^c6Rsm^bd4*4fOO64-bzGjg5^@OkTQr?ba>g<6GjxUB7Yt_FWS2I3U0> zle|h+O{FNPR4$21r-I7lq^#-h?^9M0c6LroERKp({M&Ywh~A>kN>c4I7aj3=_US2?JE^j@>(V?LA;|($3k{J18Pb9iO148k(G$ z!J3q+>ZPbXvnwm786toDT8g8Ve&Cnoa zjcjiZpK6a7p9`}yC=?N$>*Q6gUT2xc%^Rc=#9g^^HFMPyX*fUsmTF?zs3@R3?&yR$ z7n2|W`PZR@pZ#OdmqW$Gl)>$dINckkYL z*xH^sC@$Wip|Ody&Zj4)CS~Ro*EZHQurj-)skyTolT5(U+0oO{-Pu1pb@}Rz+3Pbm zkQiC7J#&S0+*Ov(&CFh5o${qinpIC^pdF};50xz~L0Vp!7M%#0LGrbbg(QYjPJ8k;-XnwlgoY-?+2X>IT5=;<98oxU_f(1ZM3 zyL$Q3<;yddSdVk@0ydM3+!a=}=YL;W`!2jPTz(f_v?z7XXdM(#q3!Fj(&N;A_ey_q zJ39Rfkz7M=%Rt3M0%iQS_3PH+xfx)6(6UDB48`5uv~h#!maSX1?cB59eD6^kkD$=t zuz(dn}B-fDJ%Td{e zCf$fxHk7P3DaiFCnSjJ#t>H#;ZkvpVeYTkG#+yBA=@F`miHMGgiC3#rGFkdpT2#ge zzqY=C0p@D4tQ>#8L)H#=@C~cLDZ=ry*Jem#gT}>k)6;yjgzg*w$y%-=Pyv=@qS7xa zMd|#~HaR^??!b-yBJ>4NF*PAIZ3tn4)*6t8G&I7O+qjO%2OdJxZXrP4wa3EJBUr@* z>!h@l)bw;sPF_x4MR^SqJs3eY3@lyUo$X!dKUVc)hHz>pFQQrzl$py{E?zu8eQpXz z3`;UGaejLG0%tB))HWh%{uHSkL5(!6p-D?xovo=Do4#c_hl!$*&j8A|enNUkBb zW$=p0W<&+ey3s&?qbQg4cyt?hxY5*XiwT%)+p%rG`R+qjE`c$LF)>LQ8rF@q@>V>KE=6_i#ru*AHpXJ}%imq7+2qm$<@FkWhOXb_D*GIo)K z#f7PJ;4wZiJ~oc4J32HxJdS5KF+Mqc{``gM${)NdE6^{3%1FuGxv6e1{_N86O7D{= zk{G%S&S+ zZF>(KwRCU`j);j)NYBbC%4c4CPF7A~WgX=n`r-SK8(g;0vGH@4&QDHEO^%EVjf{+q zox5=H93aUkyNR)}(UCD`aWQXZe2Pco<8aMbt)P;fb#bj~av7-fh)xmNQCi|?bov@m z*+4mCld0(@yf#W@8w}TPAY+NO-by~w)NC^*dC&gi)($T2K~eGXsX0Z3#RUROZee*{ zGs6u#db<1idON!NhsP(TE?kyy&A&LIcF{TQQ0uAG0 zMn@Zd_+BnU94;ArF0XX!cm-4z^2*nW3S|#dQg9LtQ9s02F z9zWyk>J<L9nf3a8qhseTUAcU2>ip!`$l&1U z#Q4zYDAR}tn-LwEUqujrXc0Az@iokV$noYMzL%#%WwhiTFI$x6BnVU%a*Cib`1~&@ zLs+t#o#3JQ-& zNXjZIm0?H)DBRqliW(|}*qzSi#)j7RuKvM^3s)|kJAYwnY?w3xhKU>cg=B&@Dq?8P zAoVg(85PGu6slp=k2fGY#wI*N@?g)QQ#PIfe!+x;$;sJFL&E&z<>llT zGkCX=Tz*$?M?+nM3{D*$nYwrZg*!bYgJAjx1_ps(XcWd7WK^civBT*a8yg;{lE@*- z2nk|hjuw^TrBM+PgnH&!1(l+7PcDuMv%!{vMXn*Ym!rZ`a4<33NPhUDaBW#{MR6y%mxRnu}nb+Dzmxv{3Mts58y$EPNz zFJ7FUVB!f=>-q!*(7?;XRt%3IJ_A@HiAaVgrUwRx2ili~N+)xRg+OJYUb%mN5mdUX zr`5<2GdrsnGKuc^87fO=vFD!Hic7L(>sAt!#&~aJD+Lpb66dyUmu%z-XP;nIv??Jj zF+De5rXMjcE3crGQcq2NLvuq@Q+-uMZKI^I2gfJRox5;hoDnhufYIBJ=#0QJ*kiQH z2pVMw?in5xrWqdwq*eu$Tt$M4mgJR@er427r@||b9xDCE(pdUgRI(AE4{j@R02CqWMc76Ik$ zlB|q0nf6{#QCmx8hQ0%)qE^&W7jJ9n#YdaK(hR^Ok~A9_lzczd2T*WeFwX+Y*f4|b z2EnbTui=O9qHME;SC;YLcGs3>DW#8RcQ2x%R%Q)mf2vkbTQFU3;oJPesF-a7mCe-N ziHA(2Y`S^-b~Cdb)O~0-IBeK+gp9vz>Up~=x?FmWgiwUS>dJ0n!p*E5H>x~it8 zzO}ifgJG#-BX9`DcxbS<7ySyih?@&4qx5Qwjt|2}K!QzzS^E0xe)uk+WL-2^7AnKN zFD`rNeSufhA23tTPOZpMclMV-g)H0VEsWnFJVvpYnQS2T*=DwLC#dY%V}97;q^+}O zPk4-NODYQ<0w455;1L4_Gy3MxfQO3>U#j&J-T;Uh03^#{{TrS$vMPsR-{f{I+@ z<=2tFxDC6!o$d>MP&q`M(8FX#s~gqzgM0QLJ!$3a>E{;^o{*Nt2u+3!C8lKM7Bbqe zs<PryV2V{pmGety_(^njuD* zXtT}e8MEy>cA;zc9l?Y1@e2qIi;9U!j89BbHo;2I%w@uCLB1xxvazYL39ZYZcQOfG zy?pm#VVLfQHO6USs9#Sn8it;p(NQ8q8Nmx6Sn*+!4L#LAl)2fN!Yj-CZ$I-!7dc_^ zsWLO|OQEvG%xp8bY^Ai$Pc6G_-?n|{?mcLggNIK$die$fhKGkoutgZVgQ?=8V^h-8 zGqc%&C8w~uskx~YecRq9g~Hyh7FJF6qfh#fqd^keos@}s`Xt2wp<~2%LvnyhnM0*R z}u~ z8=-TjY?aX4+0n@XxfW!ENV-Rvo!Y~ZNDY1+YPg@1Jo2NpdE9Y%{wzH@+qRf)-$Wb6R$RF)TQ|c!dv=*0*uVeS$+Ip2u@u9?Bf>)i z0z*QAL&GA&qM~EslG8K=g&61h`X)U7X6a|*^JhMn)SEl|Av_XP3p~+DzOrYKdOWD0 zOZpKg7=?T{9SilKB6-`js)?_VSDu0JnS(i0Vs0-8q@NvjUU_ynYO-b9cC*df(YM>T zZ{22Wwrlg2efzfWJal;faVvYzSiH96^yrxAh~Qv9|3Lqs;BZw;Y#gcE{8AQ>Ha0gZ z5h6`qut!&i^sjVvQG>@c4#{Lw;GfMe?x(;eHkZpI+*G~K#ms~MHkeFu*pwRZN2 z(d1`mCdS99WfWbYpO1eK%n}wG$A(6EMIue8vES+@qnqRwV88|zM7wM4Y`HB zy)fpPJMNm9I~p6qPa!tk3A1cA*|`IYY_@yn&Vv^FkDYSykI5}A&rM~ou*fJ?L`0y! ze{e{6WN3J-Iyo&(lV4a~Pi)xGK-Ha3zm3*(nfKTsr6AlmoLBTKiUfD1kN8fsG4pHD zHXWU`STZHEwQ=A_?`CIYXi>>s3>CmQ{>G{RS;pSP{aSg*<0*k`Re<)q950jP8gdJG z!22J`vC1FwJ9@-#EZ-_eaz68@jQVcdvKbde)aO6h4Gs`ktc{q>CSn&=_4knq-$Zb1zZQVnAX;~%Dl#fKI53n(gy?us$;>CmQcb5mO<#RtQabQfdCzU#@CJbo z(^n-_CO+=(YVCrPdNEM#ot+)c?Cv8QV>L7hudo}|IV5O0?;YvgnWy7{)6?rT)AD0l zdk;*3)50tASaV#SQEtll`Ct5;Be{m$JRd8yfZnKM`3DZC!GA_b2RMGnHtN~3)wSLWGDTcEiM`+roWe-TLgz*u)ZD)b|+746X+GG7!G=UdY1-QJXT`sjfJM^C5GV-M9&C_mcU8!V3Q+_7^P zu^_l?-EKzgV}9_!A&a9&Y`mgVHJNES*{Sid330N=8!{9Y5kaX8%N#=hoyAoAQdR;r zHB)i#=xl4nXQ69F;vU=;()whc*utp0y$h{Fr#ADY#2~k{)YaAsDh)MNeZnhgT2yjg zlpvj8pl#fev8@4um-bR*GZU z({xVmp&*M$n!0vv+rj+~JeHl?_K`d|di3Z?hk)pmw6v7;%!Gub_@u;?gv2;_hCLFa zV`5`eQPD{n_IE8{eMduMEBy$Hh;;U%S#VL1qyh5S4DbaluHN6*+1B3Hj_F}gYEv^i z5Z2YmZa+1k!tmW>;gxeaOLhw`*7x_)bN$t|8L2P6O0FR{=Q}tLy`2e`(RBw7)J0n+ z;A-~vHlLIG-rjPHv%NcZpj8Nv=`7wyNVxal;bRsjk6XI?M8?LaXR>=_T1p(-L(>Bs z7b`nQVv!R@%Kv4HDU4*i{mF8z5GIB5>nV(jsRJBaoecuEelwY9OShMsLk zTUS<9R`&exUACzdRK~wLR7SgICubXL0i}5v1v$Q>ScjLXai7U)%#L5ch zqnEL-5x#8(Xn&QcO!stN?7BU6B|rYNpeV=-ulU}UB+!f0c5(j9PKE`;CVPcd_V3$! zkmWwdt(?4>InB1VY{CjG=~*OG^6>nV6PY8cj*1|u5EGx4iPJCZP^-}stR6#!NMq^f z_&^sXml7YT!~d7Wga*oC9AvZA8AlOo zy85d?1Gh7SZoVw`cFHd<%x3Q+dWPeoB0@vL*vm97AzizPE5d*wqB((Vq_nUM_2R7I zy3!$s3)@P<1sM`lI$9dp>b0yASW1dY3iGl-C6)c>zcN%NFWi3sy*-*!r%4Z48kMkH z^D*K4(Zc9(?{3o8tXE(S;r@gBk)MMntXzB}ViMD3a6jdr+`=NZN+>Tb%%nFqF)1cA z(BCg0I5Z+6mRe$Qc@-;kYwDGj4T+ptkUG>Yh8nM~g9xypnSOrJxY(oimL?P}8x5A1 zGZ3H720_?@SR6lM>EIm{n?zzslaZN|ot|A%Q9xHAmiuuvCggyT};~oIqvShE=eBL*OZr*upvufejcgGj9Nh@ zK6VmRE@mycK4^ZekFuB6{KG|#Mtja*29)M<|DHvjm21c?rQ_Zrbnfx|$$fkG?l#|j z@GuM44_OE($1H6f`#{3*RVe1+g8=I1u zodc8Sq-5n3msA!O6c&_~7w1zu%t(r5e`mb@)U=Fr^4XQNWw#RM;KAY0OLB!hB)SNN zWGe}DZA)tlrFkB}DvgbG)$DG|-^t3POE4w5;s=lMe_|%yQjIN(S1w+B87LPoc4RCG zigJzR@Z`mdyRphh&p~X@v7<+hpRjcBr+p_wI*beQa!@Qe*?F=9QGR}5ZhBH`W)cxm zbeJkGB~7EDHKC%eg%xBi9qrw$yKJeaE<^^ZyIWdKL4^z^b_e?`&TWfWaZo8FzsKg} z=}C!Y-+vq*8xsvGhdhu7vHI{cBF~t#WKbd7(HG>BK1fERlzjgYphS#;%4N-x>zQfW{fbDgvApZxrR*0s|KRcC zXHK3zbJoT+2#-E3567aotgHYD%FfLzDQ0~~T6#(Xu!IK%hKEFjMaHM+SHLW-{bO{d z3=MTumlqZmO2-_ls0ae8i2i_wTuP(pT&YG^)>M|478ipGQ753N3s*f-Q9Ky?#Vd!( zK67S2947mA?Br2Pdz;fNJq-$pOeTF&fLDv3pDv}J;*z|y3>p$*Q7K`;!Mv52E z^0KP7A!;42hB;o9kw`VaqP?)D{ITMHZERX0kLVcdF2-s z73Ack=M^#pqAEWtJt;mi0<988sy`wsK823KijwlCA=<2wpZYR(5X>*gW1sE9GWvWf zY3E?SY}Ve9U}F36I=0?po9F_-&e5bN$HrrlvsXQgqAWS`@2atx%q6EsES&1_<&NbV z%e#)nAynV4AaYa&jq$)zp;bWu~$NY-D(FU{7JX?@@D#1uK}=4!S;%fo&bmK2lCt*Jo85b>0iO9LHqSn6btv|?gHx|=eR zT2&;q$DpxZnl|y?I(6NL2kC1&6wQ}k#yP?@Lf;cihnJv+B zGcr@s(+bLJs>+HAG|A*BBO`;uLs+k?j!()iY9J=AE~#i`T``T=EwzXT&A7Q};EJlc z+VY~Jl2V{4Ev>Gps;#c71r*_a z7O=|kBW%ZY_RMKZdIOz3y?rC&6Vlk}E;%kaH6xE5qS^8~FB_#2fk}>tjERYhPcEpY zs?$_gUe!K4HASB&xu>$Cd@OlsWo3B1oy0+f-hPtwhkMA>}p zr1o!TGS_K&*Ew+L=&_@CDyL4Kwzafzaq|cWqhmjg_nwr(+T56^m;`ldW-gJUT20zE zF_z{yB127yvi7pIp=EgT{M0B}&zh?0QZOL(U&;o`w6+)I6%-WYz_(3KCStu4hj4_S!Lz&F-0Iu?u~6xY$9}YV*ZTzj*HCpM|t% zGnoM<*LgXSIXHFV)Tz^!r_Qo%o~vhoG)$7tmxMl$M2AJh#HOWZXJsVCCnQKBH;x>4 zT3U8-HEV-x~F*i!{Y<+ckc~K#*a2mV?%jBY}DYB8wV})W-Df<#C)`wg~ViK{G zI#v}Kss7%Bkifuzp`WV8ZfM4Odh9|L^2_s&7Cs}#t5?5xX7R@-|2%(Q^X?7hI`e0i zI%0;(>62&9SXx_J**Lg*`h}??RMD|9?CeE>S*2D*ghzlwW;*#v-Vb@)_~f*7<^U9w z*Rp=Ot+iuhY=Gdexwb49rIDGMOiv-Hlho7RqQCbbC@8@Hc~nB|c*|8iA@I%WbpC4?NbrJ-v~PjOfG4j~p6uzVlE=DNDai6# zbM0%n2Nmr%$IC~>)*6@g^l58rTYF~@FaO|3b$l%A+T$txP+X3M&((>jUYTbg$%9l{ zOH)!4rJh<^Rwa|0NUgNCHdUABXJ}HB5~5X+>IAY4F^C&oFJYlk(eaeq$T8*Q(?tra zAcO?UF_DqL^1TOvo$FsJQ! zEx_1uGQ>P&?o|Sh!f$rUYvuLAE9e%5V=@?DxIArZXLb6drKP2fEuHD)V{y;m2i|#7 zGH(XXP{+i_CGj@nsgtE;z%fapEfX`cvoq2%d7s5>qh4KIUQwt?mW|4z;DD&maEw({ zP-tL4pnqs&Og#Ci^h`}&E-b{Z!*ObI5z&NG;St|`C&1s|ckq9xMsH<~qgT)*tEa263RxN z-+jm5&(CM@-&CWwGe@^75-TK+w5ZIVU;4<_$`*&#(aFQzD>yJB1~ZdN?f~sbwJ?>m zN=jC`q(YLC00*JMEXS$|=_0~V2tNLyQS@z))~2U0n$FW;_`}c3T{e65^78TY_4o7g z_YDjV3Rh8dqn1w*Kc3%@p%q5DK7!#DUtjORe^rg%(Fm`=`h3W8o7cAHqI5-#=stek z5kEw)grI|jF|@DZKp2OobT59MA2jdZQLgj+*~K1NTUy%M*g3g-dijNfMB=q3;Lm2| zQ=7=lBDTf4rfVp`C#GhQpF}|cR@T6p~I zF1tnHjUeEb7KLL3=+DHYlythBG*o-=F>(Z!EDlMG+lNCflA-KHqGb$n_tC~ zNo`N>E%Q2OtgLJu99=!UeFB5SqN3#g#w1frO-~mra8M=7UszHld&n14an8<2QLCcp zT@Mcl@b&WcMMwfE5E0M>`}qX<`J+t0#Mjf40XFWQOzre`^Yrxam9@W8T1!lfQR6TN z(Rk?Z1+Soi2L2_g_no)f@bSK0YI`bmuw`8bOza(;7}ew-fUgl2gWRj*SPg{j&B`ZM zE-1{&qZZa!-%u%$aA6@neQX$g39+%!F=2Ejd%Ao21O+H~`1l0*`uTVxSsvc5Zmuql zj*c!a&d#o`?q0s`0U_k9XdO#b$3};vQ|MFm{LX#U3aG^PPThU*;KQ$*-jmw=vaSQG z*f~4%Z~F(3dJK!iXtIkhep+&BR(^rx6LU!=P$8_Zu5YNRAfu3(o`^|_<8zM-5AyZ) z_5cG9Pap7sbNu{7+j@FRmF&??Oa8!#Aio?gt-POa>7X|F)?d9(7?txNqc5{}!=AFRA&Dq7x*DoAY z7;8hgEdB2R0e-FuD&7M>p{7_&h2Yg8M?Ob4cXvKy{~+IB8UY2BxWriE{Y06{laXCm z)zsQbSlrf7QJkNfn?q7TjZTh_j|~rt4D=5~X3(oXq^po3vBfT~Zf>p~u5gQkJ-|32 zMb6GV9f&`K87D)biU{)e_VadpU8`4q!aVlcxn<|C#7}qh0B)Cm04jk+W8u70=By;C z#pA+Ar)A}q)i5BBMvR84(gFl3FDoN4hCoQ+6&A?&`obq}?%p1L7-}!Hj5{!UxVk#K zIf-I%bOIh%Cr1|#51*h2mISDiXsrtk@%8uibOIGbXz;%iw7*(}n)DA0A|r+e8WKvg zjtcV}4V#5xCHg*;HVxNDxo z4W91Ko^CF#?qI=}v$Knfy^AZl#TA!Ggp>N1IwFj`io2)q3cenweENzJ`XnHTpoCm| z5NpN4Salhlm_#ZiEkPojwCwzn^5&M#_Qtxp3dy|U*+~W}U6YxL??%=jFxU@0;_l|@ z;p4>*HxGArH&+MP1j8d-f@OAbw6hmxVJ2a0LOdQzR8XLwFQWFkc>J#-D*nDSxluM& zDb?eMkO);gJxuwzSt$g`iOCt+Mdh_ktsU)kW##1sMRds(!L zxgtYidR$Su9^Nia1mU)r9t6k5+0oV2#R1jg<{1!5x4W85c4S~6uAaM~0xYi}uLK4K z1c&qAQU(u?93AW&9PAzK?H%D0CkNaYSN|Z|cu6FX3=S2i&*^o^#l4EC zkSSBqQ=Gt(G2Dr0{E75TNhHuaP*hw-iL8|Q@ty4rl({OIP6{qL#LtqVB_fQJRlN~m zp@Fz^F0Lq67f^9^CWgQ_w70XjcW|)bX7A+U=;H3;>K77D_9`(BB^?Bl_&R_}0NLzU zk5}U2$SK7pB+^fUmx42qB+X65;UETRamQAdPblBXUH3*CdMTsCeq(URfFDrnkNfN=(R5`Dkv%~qaD4j z9)G`4+Ab=~OUiS|)8p1gg@pzMkcE`&tk@pd1TJxQbaDU(TRTTvYddPzl$eBL>>Ql! zQ8>QAA+ZUxkj22DDCqz zRsqX;BemZt30n z^iv~+b%cewGBWr9YPxe;X3*1<7YYD!q)2INlVRSE%zMM+prS8if1hif=-Wz=I@;i<`TsT6=q2Yg^{@TU%M% z+S%EX6t=Ol<^WLK*ljs5C@ex1mz)qQivfZK6+j6bdGoaLufF6?0YVUwn-Qou-BQ4D z686ael3T#0JJ%)8zi_8}O1a8QQAy4a-y@a2+{{dJw2a4Ng$KPWrB$_6HFPQ=K`gRu zYM?n=lS0`d8goT5-xrUTjDedgnI#}Weo!n9j`pyM4aF22OfmpjTiZDxM1+XWu4IM- z0$30&WjHc9A;JE(@Cvj{RJ!Ez)}aDt+*0125kM%Y$eoig3y5{`GLD@xc+vck?kVLZ zFGD4TJPO$X@&;K*PM%cEAv!Er%E6WtH2l@o(|BHAS)xf#iX#&pO))gsKhT#_iKn}_ zD*>{2a74v8Yc7b8Eh?5wupKJJ2EG9z6pJISjHiz;BL%|4R8f&QETJJmel}kS6#+zt z3IOqjZ;AGO4i%@la~V!uM!ZD9XYNS%@@1idT45m_qm8pDm>01^rI>y={I&8%JbW3I zS5?6j&bsQ-qU0DN-pEL@lep_-@jU^=6E5-gaB+cYoW%;^nm9U&-EpvUM22jwY;3Hp z?d?!1Y{Q^Nlmj8x?1Ox~ASbm#2GraQOmL)-=Y;~vriF|h{eDNHw%$>{lR1Xvt zhM7CkJ+(|!Xy1WTn07`&QW})#=qo9s6`l1NQ4&qgPIgYXD|XHlX+_J}**KtUU640lZ(qEV0Gcy`2}b<`{Lg&* z0adQx(Pg2c2#^*PQL9>1x}NchqE{58#u@ z2P`rCA|}Yz3eBP<g**|`PzH0u`?S5#KOA62aOs;VJ%T~bj~U74qW zk1~@I6KHf|J#$!iV1QzMJh8;66g(B=$eny1sYrYL62P&y6#)VlTkH@Vg9pb;$uaPB=X} z`6Vp$$VtY5p-V^}{n7zHdPY5cZp<}NeDo9WP0Ww{(#YF@^w45`Ql=+*qC19>IXs;lT zBHi{8QM9CZyWzXJQTxIgqi4N6oIPB4NKO(~A@3$Gi{n{j$3gf+$QjR9(aU%@uDsgC zk;Ig$)+9t?{JAcOBC=_SHryfVHpJLG7kB*wiHdIf{SH)4d!b;NsfL?r_ONf&goiwDU{ z96CH*uyI9#UR6}^-Cz`?i1l-%l9H2BlG9n}L9iIh>RcHFfZN8vI0=w_L}XB}ygzxT zhyytl7bmm}Z&XS@s1?M>25Us*jFxe9Knpv&;m`0(?h;iy+kl#bJu>IvV(~W*$exFe z{eQ1kDx3cXwNg-^WZ1Gbv{I02j-!;7oSMWA4Qgs2(wD@)9!zUWAjKZ3e&OXiap&eC zlE7nN4PxQ->T_88-d=OMbg8u6(CqXzW z$WK9Gt|l{$X(Chw8GR<%eY|_N!eNaeEo>2_6mdxJjdnNsE=VfTh)pA8bR>aXcrXQIN~iD!j3Vz7X!!JdZIy&zI73dX2rH};H`(lhy53X+Tf*nHPK-CeDL}DE5oYAxB5o?UG6gfc79zA34WM_@Z z79%YZWlu%K*7~fY%~_i>;@3EV3K2x)_>W&Xy;4Npp7eEI1|6U15SIVY@<}}-oV8Ol z;t=3UV-hMw%!nuu0C8dsgg7Et9qg}-y)$Vhdq*5uvT!g9CRvz>FbMXs=ONMsD#S?y z(zc{4m5i>Plgoj>c_`*>{Krf8t^DrGk>)S_b$aZJkf7|;#Ds)c6|FiUfwYzc(<~bp zM(a(8xLE}KzHSuM!9r}Z__1P%K?eo^5zvs_EV&gMN8UJ+L`vV8Bmzh{kiO*^G%p^E z1ObEtpk>QrhrNIEki3Ly;>VgLmQz-1KKXL=m;OGLjgkU!+ENk{;usAP7)V45G)zOF zc}Yr&w9EMic$33-mmEI9AG(ynI_XF_K)8So7&1&Ywzf`=HZX%V{K0#+v9^LSY|fsg z!_10Ii#?H|BrNT$>?xtyIg#Am_t&5j9WAKP=f4P5Yd-#R^q2mAS(&ozEhk%(${bGO zVcKPV{ez^jT7U_pg_bfjC1i2a!~kJ(=+i-W2rOVC%F~84Egh=J52+?A@oR~gt%#Sc z&YV4MX=!y*p0%;HQqpq(1HU-JHoN}%5tCeECO-$2kG>pf{=#1`B@8TP=u8%=`nMOoIW6Ldh=KJKEU80I&s!*x6gb74V3#24JyZ z;;iLK){>lL-4Vn~fyu^_WE9mz!NvTqWry?FsefFWS3dZ1r1=YfopsrjOfJaD%}&cu z(HTmg9|5h8G+6ui`%u~N_wx<#mj))KCk5@|icOWW4;EL+L0XH{ARSc1tSqfgS&@^p zwL);t+MKpLbM_1?)GV!7RKl0_S!>#R;U`S9BZg_;Uq6zWYm1{Yj6_vy-v4s+m;Qcb zO>GsCGV7Vr;v%X3(gf+_;q6a{n~$HLWJ3Ob=H9|D?lemu-G88Wf4}>?cXy;`cDHwS z(&-pl6otFHyH!!R1b26LcL?qfEV#Q9oIoHD;_f~7c`M04GCjEiy`P(WJAo>yzWH=L zocEmbKIb{-g)9Zs0a1BDzJvt?uYxG+ihvB}02X3H=p`Tn`+$*P$=IQ%6R22PTUl76 zL(P)Ow6X&>7B<#cXD}H;S=!qWx%MR`pK<%bt9a?-Vb{O> zuCz0_nt$oF+WN*?bZZwDWT(W2K~)c?fN&o^zJ5eM>Du@gU_F{P&xeKEv|TzeQyLUXq2%!56PHlPV2gd_(RRUrkXtIG8*$ z`3vvCP_Ehv@UrPiF%hWw27*-$fT6Hf5|Mop0?iK`5vdV^)rZGL3V+$r&WX57tRZMH z;Z^J$Sk_@@i#Tk9)*36~bIE$a56msBY^<=7Y=8;z%n0G6>Waiy>pOC~Y{uN*pwdUY z2@925U%Kj5ZY8UH=?%AXzxXP-`Ir9zjQFcA$${`90qP0JDE&~h0fXoh;OB*gCST~> zd{O7{4}xeEyc_%r=q2Q*NKu^J>>XU;OB`*nfbbu&4&r8QEFDR~!-kj(u(4*^;4c&F z$O3MMbWCFpNwPRcd-d<`;271+zd?m{0@)!8m7}3Tzwk&o@#g56(O-DsuRqHD>!V+K zkVyPW;xD~|Hn7S( zh7fIOZb?Elk~k+Mxg?U4fMrKe$-%YoDJoq%?=KcATVJ^1$gld0;uqermHVX^x8lgX zj*h?Zo?486D9DUYgtk67ASe(>1O)hc`S`=bpaF^~3DMw!EY}}t4B0YY1|m-QK7Odz zpxXg|Q5M6L?C|ga6qd1uK&_A+4xt8s%w<-hLTrK<0D>;b-0To`5tVGQUnH23m#m0` zLDVKm4Hg^jvav-TY-6kP-Q9d>?><4LW9{R`LgnL=U-({rhV?^x`(JqN@pdv1r7$ZY20|{BIZ2@tEj~Wj2?d4X9P_AXuye7XT+rR&1BnVU74o4SLDP~w zFbT83!Uie64dO8@0}F{{Er0|G3=GKD!VVD$c?<3$`5qtvP(;pwP^1b}0L$XB71Vx2 zr?F7M@wC6@%01=HXxh(#*cvC>Lun9<=1EKrL^DeeXqHF}6d{U7Twz#RD6kWn1Z%{> z4cwzGK0JJ`qdlUFm6a`sBlJaES}`qv5wQ#Gh>*kBSO6(&{2XD)+72oXfP_$l_rNK^ zRxpI4VCfhtfa2IymwN=#sUDs7{^G)H%q1dajmQu%D{!n~0e->Z5x@i^MbPbnL+?Rm zWBnk1!{!Cv0{@ZiAhJ08&JlmDu>(X(Z^mHKt(Z)6mtQ29H=%Rl<#zen8sf8AePfZ9fMINV2AL=a#J4u@bM43u0H z_*)DW0ks_)1qBW?!`Sw)943?(@U?_9z^7w3@gC{W2Ll(1 zdEwAzg-1ep6BPlmBWXRx82$i%PizZWtQ+7UoC+2aJSSn5Ebvk3OiPBT2?NNWk)CP6 zz+$qpWCAI&sw~M*@eNrE;4w!|?_Ie>nei*GnN!{i#Xefw z5ot&nh>UeWRSck@Au57!*#Ha&2L(b&?FGKp5u78zgk&n<3w8D7Ge7YleD{6nlvPYbAkAzl6UP$@?fYBt2y z7^RV#41sohIF7uBq>1H#F|{>}2y4+t=Rr~x!U7;DgM_sPal*7BV@hBY#-?;rLlaXo zW4fsk@h-+VCxp&0V$h9@42&39La-KdO!sG%Zsab#nPXf|uG2r59ZmPo9gXxIwEHN;vVR!}+ySxv;V5M0~XTVeGejmO$y znlZ>^CVKr+% z{XMs`oBQ$Oo$~u>QGs5+q!c-SZeC$tCUpGBWFuk`fG`*vJ^rYVVP6PQlM{)=B&#P& z2Yvwy0o!4OA9xHVK%wgc41GfkR5mfh@Hv2CLY`p~H>RN)ni}IB=B8$Jcok9z!RkXg zY_0X(19TbIt$%x{VBR^#QWfWAL%Nchl#&=jJT8iek?4*=5`(lZz}F4TH4=Pm{E(8` zlJwomnn5T>pn_F{)nlxW32T_9tdA2h42=y9O-)R64Gna3_4SP~0FUF)A8HsIPgj>^~>tD>3d5v!Edf zBx6Jg9vF^+flg5f$`DKj2ZFW*B?*^;y)ia|z{JLmgdb~jh6RHTpMrBijPU7=4D?_e zhJe8Yr(&2G>*^YkAHiabO^u9A3{6ZBhk%N?tsMp?;UBQD();I!O_(~kaqb8QC*{P` zq4J?)L7Iq@p{pbc%M+pU>HUS6f{>q&`RSNHl$0Esl!VoTj<0BhpZASo=s?958M{Di z0I{<}Bqoqp+cV8fnXnUM14ARaiGiMxp)Q<=fi6}JMhKgbMPzKE4}-z%Pb1ilv9XDn zIr3TyrVSIW#R0jVh5kQ3Y{s>D43*v8Q=$SH=|`<7ORfxXwoYU#pWF|n6SOPYC>^2` z2GdtCs46lZ9bY(i3#fqcC!0bPJFufe{Q}8`B?^HSwiXD+4ER$sq$vQv5Tk>Q4Rkb& zjbR){aI(M#OG($*6xO0|V5*M+)N~5~!LT4%KLWIs4a36lpC4gV^3|>XVN~8rjhzWd zCs;v8sNnwm!h9U!k(Y~OJTP_#WAiZeFCIsOB5{ccN9zy5j~mLSphU3MgDXM7i=bj@ z0pE!f1TMqK2y@7FbdAgmb#;-n7-Fp$8R+XH4w)DmnHm@w7|`Ks4KXSfzL}2UbOah3 z3npFP=${{v;}ZXeQDNE4hn)B{sF3?HI6W8rFKIZzBbf;G6UjMbIOvhgctEo7~pLJWlES54qm02YpxF*72;#|%;0+#I8pk+%RB zGgyp;jXA?uP0r+B9(A<0x8FE_PVg55Ytqycb zTp}z5vzH)8@J0Oxg;OLd2*ZSzHa7 z0U9R6w*oOkgk!u7XkfKr4?rh7AtnyuVQ4E$(D-;6|MD0kwYzpM{Lk46X$iuGMQ}P> z`EWl5+-0R8D5sJ^Zn5|e$N0g!L_~%l&BywI;v6(A7$icQu*ebY1})9ZjqyPdbTFIU z5Z{bR0Ma+oGc_V{m;`Gq9iU@kW(wnhU#6Rq4K()FSVK%RH3>c;UMi=}|9XtWLArM? z9--nysMMp_{Ez1=A37G`Pl!v&#uu2%32f!l`;#$4G%X#2BI4s%Jy95!5u1okc<{8S z6S|?!!Aezt1adZH?4U@PX85pV-vbB`mtif&W>_goDTo{2~I5T-(~v@i=(Gs4V9Ec zz{2WdCr4n$p^pK13L3po6!P|f^qg!45r9ZwMw)>&WR6S)9~PM!BCozN3C_f&u+|H{ z046LSSQBi7!7yRau_rL58^h0ng)*iqE2wDbDhScoIBDF@|NAKpy&BwOKZ4=2M_&z< zBq*@skf9_25lnP~tso?$2;zf^yPFegK4dG0@&=+YGE+J>zT|gK+yy)?{45Sf#2P}( zfklwWjK_v%#u&#<48{xwLwpRD4g!#wj-H94u%NJv1dWHCotNtSe?7&K=fk%+Kf~ha z>DNLfnZOYn9f=_z7zltB6pishD1Z2|28WPJ7^w|nn+qz^3L76w211Yxc7&!Ta2YTe zd~PHy*!>vlVHp|d8(>F-6RY5Jkj!8|1SSe^A!Hl_sj!BOC@()RjY{RZbb%xM|2!q9 zmhN-?eRlTfprij^AK~m}=t;xDNybFsFGv;e*&$@Ukf##{rw~-&RG`kWv?jAZ&6sox zl8%{?^UvW_ak>HF;K)N`145)=F(IqNJbNQL13!cXG2m=XU@I2pX4)Du0#pHheqLTK zc6Q38@c;8{e0*$dpK@dzpFR3owt`J^bZ9uHYJjRGB7QLY;RrwhSV1l>_O4FgXTd|0 zN*KObF&GwRNLGLj*hrF@uo4r1p^KGcV4$T3ngx3veS{_h16|^biJ=&onBlx8kh;oZ z{4{nR-t(8(*)DK%UyA*|pG{6qP8{%jhQ-m-uZ0R3LqsSh)K1A%hp1=}{5XmL5(F>k z%fYFzisv>=LNoylCW9nq2(kF}!+T}lAJ%F!RN#rOT zNLi4oAkT;X5!F&FTXTH3LUG3$UK86HIvq;~pB8R|tRQTHz#w2l2xJJOf@7LUxHi!T zPzJye;F#(u%8Bt(xOk}S>|7VwDcn@f^F{yqd}elL=8*Oo7DrFN7AhDggbGj$DumH- zk*Kqy-GiLu5r|ql3g)bOIkx?*8W(KE(i#hawap``Jc&h!zkmf>WPC-O#*)I(JH)-< zq!|`FX=G+aN0z6qp{O9v!^uen9v9B@aB^_6vlsm9^Ld==c}L&~hR+^-MO30t3PO1- z3JL^p*eEcE;Y>p>Pghh;AwRcsfLs=-Er20kK)=%IOf&df{QePzunS@>A>=F|n@9?$ zkBy?Ku`Z6_0V>!%GtJF(Rpcb3Wn_3cC{!wi#>d0SMd9S);jH+#7fY!4-WB`|i=(Gs z3l-896^qOk!~vF16b3^;$P(=DOL7%58iSNh?XWR~5Q9}L1{@4i@BzrF=K$VE{? zCmSHhXt6UyS(J(Go(WtFi9sM_^%06e?(6A;(Kpi9162vHqOY%`2OndiYsNIwmlmU4 z;^yIIW9OprP+=y59NhduLe$pZz92{6+!H;5L3wO<>`d)npPvGie=d4 zk>kzu5SsOMwDARoLVkdB7j%Mwk{FGf!pX}CP$*pRE!=1R^dm)>x9hhrS8?4J`zs2p z2g-?meSUIOvYkKhw_7LWZ9nb~$&DB?gCpxO^ABDZMO3uGK>39bV->Z*(p5zzk5lPS@$LWiURAwud$V_4`UQyE-;xBFbN+qd4D5LTfj*t z;1Mt>1_QlX=lHnTxTvGQf4Pq9f#fHs94Glt zY%65q3W4LF-fJ07&Lq6Q5tFAdcoLok(@N0@6o>{PC?S;`c9!c=3VMaa3y0j2%5aDJrZ{J_MChaB-}=KHLZ{65F5%M?afYY&)PYe@33X~qVJL}tVwLKh(JAa4V+Vx)&Pq^qZ`gM=T} zf{=uWWUMMGD#R@)D8x@;W9R1P^`*O^(2 z+CP0@DNo4Tenf>3zG&vgApJnN*icB2L;Qn-aH;^*$lksIer}lTb=kwi(fKl}W0w(v zkgk}*&6=BG5fN${EWRN~Bp3~ndzQUu>FQ(u1AI_mHZ%rQ%EE#oB0{1xj`Qri99(=9 z3j4W>=P$BdfZIJk|NX12&CSh+(nrRTc-&HUPmBurWMl>5&xv_k7Ao&=?2eB`mo7^P zhn;c|w53=>WE~Nuy0-J z=)z7&;;*NT1Jl*Tgv2C;g=p-TIC!W$+!xOLnVpBq$;rdU$@SABP{DN^6++vdIrCSP zPP&3VqH=QHmW2r*g(F^0v>T)L|A?zX6Cz?Nq z-AK}6&OnG}&`nu?$hH{F0ug4wKoFKmd`8})ucM)-ry?UFDkCcd=70km!VBz(%R(Z2 z6wY&JI61C=|LVq#8=s)^S3KT7I1MTvJ|FAb$-V9SyQ2_{gWysEgNQ~Q(1gNTaIlFF zTni>4U@pRCd#EQ-c6VT9aim=iDnJBj6m^i>f}}Pj=`C?02KqQV5w!OEC=CaUBv)Bc zLI$XC(>S>RnlSR5hqk?MU=7OQnc)8C1`KJp%{O6yEU)kFF#IJlKs6ZNsgM5O~#f%C0 z!K9}fVq_d_;_rt6;l$m#V(bA#J!mQ=bs-d)k+uL4h`AVmhouSx&BlaE1r!`fauJ8t5#iHnQN%1a9ia`W<1E^x4MP#N3KwHbH?_hE zUMPH_JVZ!;1Rgzoa8afP>Ih9LTH2D55^|D!g5t>a`KUDZ^Os;LmoA+Dk^S7CDGT4T z_RM#rzd7DEG&C5vU_1nPef)=}29nwOkxopsrJ^wvl`_O3cWBj}t-;NasewrSA?|@% z1A=tO1(CskS|GJEB)Vh=faRmFr;BZYy1J^ow7jA?O%NfO!Y4vy$1dpXMc#8~FaF3* z6^Hwk*96e;09ndBR;Rd1+=~jl^7N&y21{9=5P%1#t17vixwT;x}h4^R^Vtf=7 ze=e}|334KhcA)-2BUbfUSgweT%5TI=~&Eg$`)= zA)m!SD>47NE z8XB6L>gcH|>&o$5;t&!9B?<1Dn;Y9@E*=^?g_nm%NJ3Ovdi@UvIR85Q8$<;QB>;4a zH|D>2dU|_%x_V=5AQ}vDqN=C+Wvm?>KY)WxyvQswH+M1~0d4OPRHDO&s5hYHvPJF! z<{!%l3kh2ykO$a4niy*s>Pw3Va`PbcT)N0X=^#Prf@O`xqiACH(8@_RK8a7sE2Vy>aLQ2Jm3k492RESv)vXzy-E~c@c;| zFd$3=aCL_5xWnHBbn836%8U$b$X zyGY^x>5o5g^YiiW3-gQcP=*KcN+n+`>jk&5Tsu2?GTVN=Xt#6NQrlo8|MId?JGE=h@D( zaqvk=t5Ss2q~ryK`3WlUwx9VGry~K_DQxBa%8|zS^^<9{S*AsdjK$9oe}RTvsEo<{ z0widphH8n{C>LxDF@e(^vqiCj5R_P61xDoP%o@r=T6HaL2_`J!l8%Zqc0Z)r3?Zc{ zLtlo2o12}D!o|(O$$5c;Urvzoq9CuZh=RJjx`?`-rnH!h()KSz=Hu+j=~yR1HxZvA zjm30gTlv8I;slDz&NkLiNfPxnHpDor8J2)XZgN%!JTPf^2T|$dP6mF#(K^{U*+IWS zBrVtqp)hEMgx1K+67B@a8&q-n5b|s5s*7-Pv7P7Op>bSdW8>tcNpt^~u&|`GkgU9> zikzy5xS*7-){XDUeA|%GPjlN}Sq}n9@B9~{wI!U~Nm2R8`?|Q|qoRcg8ZQh3LD3ZI z0~>Tlp%jF9t;pQSL`{4nBWp>kE}1}sfgwcA4`V_2K`#t8hRE{?!_OjFuw7PC0MEpE z={zTem+QYdxc{3|kVfI*<>XXmFhnJpOal>`qNP*N%J(?oJScGFIByHb@~i4WSP9@= ziPrWssC?vo(YZ~^J@^Z`0V;#6x+!{ioE%7$CP%w~T_N)#$i@)e4QPgejX=DPUNQt^ z2B|xv{6WY`R67iH3Dd8mCCbIdN#WtfBBF8e310jYn;;jrFrWx?(^oNarAvwGc=<$S z&iwusxGn$TW0ep1lwV^j-9UrrhzTO6jLhWTZU;MO2M0@190bLNP(t+NWYi8iF5!F0 z=r`hBiN_)OY+HMD<|3b^v$j8A`k^dFE(;Y8=q41!^tH4#b@Vh;DC}%p>>L~j%20dJ zkhAb{2KYmAX?kS3I{2rI{%((?N<+u0WMm}DQR(pH-WE=l6_no}c5&hr zM0_qmlx%4*F9e(kok@o@1qx8?YpgBNZj8|?pbf~Jbc}j~&p~ES{y?7q@CXfOjy5O+ z9BAP5bYLi`q-v{csB5Z8iF32D{rKbAOB4nQI$GLlnp!IAD(dQr+-yH`a9;fBynv{X zurN23hgU^i(Za(yJu4?8G}%p!9v%_z9^iAC+49?6GMKObSoQrILB-M>a#}0&R5DGi zpz9;*d?X)a>j!Fy4&Pw{3I#n4kU+vhh-j8>4lyyhebAbViU)dN^!0VMv@|ue zlx0=r#o3UjT;il~N}2mg7~Am6I7B)+=M)Fz$JqKtM_IXsJNTwJ`uH-8tABG76ZxF_ zL_Wjf=;_z86)4@Xm4U*Z2>(C;5Dh+QLO}Ws?*U@gjP(1P(+x=gCIuk!7D(S%qDd?p z*a#Mlx|*`8vWkk5f{LVsAg{=!^Sl&xing0ifPkE#1{9@^sl^E?nTesnkpZsuJ~sAA zF?EKQ3rc=-6WOCf&oTYV5g@EbUkep8>~INRMD!?xTqG)MY-tc|i5L*y2$Mt@HWbG2 z5;9l>8&o&oULioh!qL>!1QDsKps1jzswgWj!_UK`LgNwQy(r=n6~N>bRum9YwMi-| z$;i+0b#cG!5gr&DkFo8ga@J*q|F%Q+ncYI)9B&JH$Q0e!5DTMUW)rlG2$q^uyPs-UbWDzq#!3ND<>}t z;TszpH-%4-TS%Bk!YIJoM&Fw57o1vAQk_|vn;seI=;GsPX<)7_Z;H8$b^#fAKm|4Z zu5V8*h@vpbyFi8zTu7Bm7b;oEt%57P4m6|;b2DS6jfH^; zKx3eStf8TWMWd>ss-~=@q^zW@C?hMYC?_Q)D0 zIwLDJBRn@DI{V6%;9yLUvNQ9H_H(7nO7jaFz*dkMev7E+fE?0M)7I6~MG^*=fhA%@ zH&j)Zl`^%^$L?3p#8gj4PEkQgQ&UGvT|-+_RUPpczEwd{QC?nNPF7J`93@jR5fN?y zDpgqA(NV|E7cMnAB)$@(VS@sb$_wfn(jr1r!d=a5UCp$;W3s}%t<7|3XD+~2zR?u~ z_n@w&qNSs$rL6oK+1C z)jXpzQgdU%>{Yn`<6nOdTfxrC<{Ml=8fq#?z_fHUv~_f~l@-PLIDS0ObM8-n{Ql3p zB0RjZqBK5!9ywJxVL^zi)s)p$lvNd#6jkIErQu#>rDSBJWE3RvU4dWH%E`kouOh3Z zFFPeC*gi2gKZNd*wxjt7KyDo{^pC;pCU-BK)WCfAfc;-`pe=@TW1T z_E_8D3HCuB30rIqv5z?oZ+rYk4K-yAO;t5@tPdS&ssJz7Pv_2Ey72G6`TkEooju1Z z#&wCCn_Ey)l3!9?RY6rr74AeqUQt0_NmfQmT1HX|f5fHKO+CXSqf;|*^xc*0^z@?C z^wfmxvKR~BjN-bE#?11pG!G>+TZXo@XLVG#7mkSuwi7!0-#=ZvLb5nVhaREhx!al3 zadCe=R*A*Co`$zQej`v()l|bD?CS*BY5W&2aa`bL`^_K!boQs8xP^EwvO|M|dIg^Z zboi<;6q2pU$;!w{NlJ)IOX8ANHVlu9%}UFutFCSA&BS?zS7L%6!@$QPHEl7Okm ziAqST>3Bty7A8cb6%-Zs4m8x|CImzz`$uLcg=Q5LSC(aDW*4SLyC;{WdFe94y?i4A zE$q|EyoCPn`yVL$6~Emj=V>0_2aTQiWPHRwp7DQ>ZhhcgPtMzZdZW6shL)<9n!1{n zhQP&h=ec=kw4W|rI`gM14d^2g3FP;j5~muAzqAou;-N z_obiMDFTAL=h-h{k)%Griz7o;a% zDM(I9_6`h>4)`CWfj%h2-rp2xiZb7vh%OhBt*r>757#O zow;zH%3uH6UD6)hf23GXL}$b4RuExEa3CfaY!(mK{r>wu%&&ZQBk(}NqOPE>EKKEK zN1KWOjg5ku=LI1l5iy#Ov@kL=6#OV+lCnxlaft$jlM;)~OguBJnh z8WEcw=A>zVH(#Cl{{( zjg!X1#>X#66B3}v%82oCatZNqQ>fgMNbaTO;ZUTcWtAP`V{Qs>g0rLJFcJ%FfBd$M)y{W{1#Tl$TqOn?neT zMo@rPT1i2i!o!1Jr%MzC1tmEd1sQ2caVa_5*zDBQ-0a-?fV^m12mi!)TNf|ynEcGp zfauud!ouRB;v8RlM`sn4fJCNgXj-g0_D^&ZEqVKZsH6yA+Xf$DLkn(dJ$PFXxBnBU z5aIrZDk}MKA5R_rhgT3WwPQDGt5dmX#FbEJLNv(AInm!F$$N>HkHRM>!6PLjfGr=7 zAlJD+^GdMS8v3c2<$t5XCk#TOu zstTfFlB%{o`GZ}tdd%c-H>RmxKtZTA)4;&eSVm4lirVrFfSWTh*w%&R!CAzNQmn!C*}N~|NV#m zy1*?gEiJDgB`Kvqk1Y&!W%yxYnys0gow-|JWM*wyMzniDOj>5NzejSswYaRQn24~n zhIv3;lB4ToA6p}7afN_HFIWEvZxa(IZ4pU1{&t|^>+5rzBLiKxqqfgBJN;`x!Ca_;P(e)z95=Q#z%1;ynQ>0xPpem;S2C^&-S zwXk+hDk#b<&c9k1Q<9(UXRPfQ7o{(ztHOSfU6g4Xnjhvwx3`g2HBe%vr+PT~#09tn zW`u~MT%$?~$J>x)lPQCLVoP*6aG z_X0&sfSV2PI``+Zm-wWm?2=QQor-HSgM)nB9c`KZv1ug*sXp0Ps^bfrBdzHQu4Vp8 z;^JbQ|Nh_SI2gfY35GJ7R*F*oi6%aod1=WyORAeJhLd^1|X`3u}_&q7re~by-cIQ&3S}gukk+q+fDkep!B`4zB>eIL8@5 zTUSF7w2@J?!(zN*Fhkc=QqR)ZH>o^3BjZYzDf2xle#a}S-^dE$yLg@^BmwrBi;L|d z*F{cEb4@B$fXXFI5yhkjVKEv9pQeh4poEBwv9+Tu-O#@TBg68_OPV_?W5biOFd8>4 zGaxcFHOt*t;T1fbBKzF3ep5Fu=7A=&#!DRFTlr3rBb=&q^W`mGF)sTx;oZgm(6Xx zyh1}=!!xo9@(M}@8w$%S3bNAt17ovdiKaUw;lAbtNPWfz(knjN-&s#rU697DXcG_{X&;ZtKv~hD2C8+) z;sDDxxPoYG90DZNNb_(@^FqxhsHG!J5t9%T6;eqC>QW#f)&QXfpifWfgJir3)f98GZ`Na?&!gm)*R~ z6}f0isw$@bIdRc`W+t9a7-nLwVP8vf+ix-kaZ`Ay{Gx(Ts)^E&zVQmn%Ta!mSE9;D zs7eb-igSx98Tf?xddFvG#P}8E#%5)MypQp9OHN1%C8w1Ig~x})Mg^$w@JZWeMMdQ# zrbOwAY01+B)fl!`lHvkll2WoNl7b>;E=C#(2H|C)ap6+J3fguIx~imP4cQ0z_mt zhPgV%wRM4(td5GDM%8ckphElv71ohHM}g>MduEcdV>?9n71q^#0{zN|J3i3A z6n;^Pgp>%6sID3>4;QD16je)JM$gbxS5;R@PC-b>Ix4j!HzOk=B`vw2Jb|fcY33S{ zSQ@OMsjFib?c?g>Va}A+Fp?6h2s4E)HEK-p6f)5G=>86Qe??NkSvw>V}B&Wcwi8@qy^X zYzuxFF(DqBuCc6uI1vYni1SLDK!mTZpeQCTWs_O}Vlg8sCN)0A-`>h6G9li{jIJWD z=ja<06qcNxkP#l7aU~`sDZkj$Oq@?aMM+UaSWsM;8x6YW&tDW#Gta8d&neCBkyKXFkTX)_ z5tiYlh@qk`s30OFsO)H_Ko1G`i%ZS(cZx}HHL2yQiTxa>sET9ZwVsZv75Np7MKS(SZYB|}Et!$=w)+0X8R^BX ztw05h0-m2S3BN`yNWl0&vp`>ZLR(?oK}t#8e-Yv25oP0&S5*`h*HG10)s?)&r7SKX zFD|1gh8ntv_+?cUBsHzH zWz2MBBn32r6LYSV^xqp(`dPDJDNZIq0%aY)Wo|jfoh?+4JWq+~>iD zvvZOTT}}y`q{{M!+WPjI;(`=+x-ru$*7tH~w7Z`tCM&xJWkv_)WoEU5|HYpKl@F#uy!95CT5%4lFrPR-yN0Q?r34inPI{6umbT{F@+#62=GNXt z4HZ|5>&jbdQoJKvnfB?WIC0j)7sr)ZT81VUWv1JSQXw`L5vFp3+eC*Hl_Df&omyE} zQ(Kvqnw93}7wTxDNq4zy=Vyz_g!T!+x$f?M2DR0N)g3IgpxZH2YN0AUK0o5bwn9YN zq~t-C0j?9E!n)%l{mU&VAgaX9#lgofCMT^X&o98oB`hnaZ)Bw;q@XFrYmpTaT6wiL zH#fV!DkCsBBr(y}(A3$-IUv&CCnPC8B)~*YTtG-nNHPIo9OR!IaUukg6I9C6Wag zY~|QpfB6fCf}9k;sHB)6KjkMOtRG%61u-d2K`Mu$9m7;xGrpjtyDld+p}Y*oQ90P? zDrhnsqro^q$rKr$?yROFA;^UyEH{rwVR2lTzfWp)Rk*QLOj@jkYg=Wcvy(gB$|oo! zB_cT1%Mqu6M~C?YI(df_);BbDwDsqs&g}e6qQWjEE+;G{rNk$A=?5NhHVTilnkEEY zijrDZsyd!YMR6%tD`O&}tj!#K7)Gv+mad-OAzs>{(Qc*;XCpOX0d^EkXyOK5NlAX5 zA+aUp1sPuE!Cp8EFQd6JGXZn6qT|8>B2h4Nu<&$88*EfUZe2@LS9fz;TX(@XiwcK~ zw7iC-w30OS;tyycl~Ys~Q=oDyNXtm5s3cx%YfpBGOAK_;Q#Ci%!XOP33p3mB(91^F zuDWuLEv{&p8Fd#>N$3S#G%P`6MO6_=#_>8y}|w3@D_2>Th#G?3BM zk7?_yuP>~ript7Pursr=Gn1p+TACVLS{mq!@m!G7G?3w=D%*I)RaF-y#-|n+7nYTk zr@N=5IEMRLn=r%6Q*xk#ON&gbE>9{;bdO66ceixT?rH5F>}_vpX=$!)C?zq-4Ke7O z<89GME2C|rsKEE<3;cqjnl_e-0vG-y$SPMSeRepM~h)~0md@&kkeH~tC0$!rgj`C5HV-ONx;g`am% zjjxS^ivfD(_@P+fm(aGePfp8<3W*QabjYtQ&&$fi5$UPnE+Ki@QNh)XHRbswWp#6X zgX_K5=7!q(Hs^M4?W`=%<`y;7Wv4}!v^1C3G`2Q2_xAms@V4J#JqR@)Svg4!87T!h zVR;R03o~7Yw~xJ?RA61rl`Df24e7ZFo+(LAZcK41uc(k9O;SQwQbol!#4R{7&dDmK zzPU9e_Oee}L3(an2&6oveH}He6N581cILWPZ;mw0Ophm z&rHZ`Xlw56m>|7m0sbSO_8lHKm#=0kRBmAj31b;)6>X-AmzTXIdJ6RvBt3i*i|QMC zhnq@!uN7hoBrU|vPLtx~<>R5rE6A%jx_HJU<~l?Vt&Wx_r-el%CSz!QT4~9Zs+P8{ z$&HQW^+&gE-#=I#+gw`T-&h!%+n!t#`Iu_1WGTL&EMR`f}lT#C8U1Kwyy;t+RRcPlgaEkLok}fDF zq7#^rmQq_>-m|{H+CJEn2u8-RH00Je7|KD;MazR2WA(h zhpsJOpS`g>+npa$iCy z%JFdkzbXc?)UzkqGk>xV;-TA>(Q<2dM(O5x+Xij zCcCJxwy|?4se*A<3MVf=zeZ?E zR#BL?yiaycQcg~!PyUs%)}qYZD?=q6Z8JA-4NNZ&6c@EMXT?Sq^<DO~qGM9>>MJWM^U`xu5~482(lRbFDJ8_k zr}6fSpWi&cx3hHn+5N5U?bWr-y*&(6T-{viS=rv%-B=uG>1wR3?iwDS92@LP&{3cG zTT}>V`|DBpsGdDFDuRZ=>6tk(o^&N0BXxDFiW*~|wx+8kk$D~MZXx+?^K0W*3sPc3 zQ_4%PcDFRtU8zh<&Z+JhXugt}9G#k5kRFy0>5y63P!yFl`1tLE7k9UB9d6!zxV5x( zb8B_!#?9>;+uO_I{ku1J_xIMjNBg?kYnyteug?s3kNCYu<Y~^^_)KuLz$R(||s;=@%^+0Y&O8xblomUG}BBN5SR25g&mKE0( zh4|$*mKT*bw&evo1V+V&c}Ms-BxL6&AAU{y2hTxxt^|$IPC>uE1#mW3vYYmR({Ry@K>SYoSEt4;EJPy zt(^m%FPquN7J)qMAFfEKkFX6H7#nJA%q;Xs?rbe6EY652sLb|r4@t`i _R3iiJ2 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index a8a89388387..c9273385978 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -422,8 +422,24 @@ def test_strip_raw(self): self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") - def test_tiled_raw(self): - infile = "Tests/images/tiff_tiled_raw.tif" + def test_strip_planar_raw(self): + # gdal_translate -of GTiff -co INTERLEAVE=BAND tiff_strip_raw.tif tiff_strip_planar_raw.tiff + infile = "Tests/images/tiff_strip_planar_raw.tif" + im = Image.open(infile) + + self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + def test_strip_planar_raw_with_overviews(self): + # gdaladdo tiff_strip_planar_raw2.tif 2 4 8 16 + infile = "Tests/images/tiff_strip_planar_raw_with_overviews.tif" + im = Image.open(infile) + + self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + + def test_tiled_planar_raw(self): + # gdal_translate -of GTiff -co TILED=YES -co BLOCKXSIZE=32 -co BLOCKYSIZE=32 -co INTERLEAVE=BAND \ + # tiff_tiled_raw.tif tiff_tiled_planar_raw.tiff + infile = "Tests/images/tiff_tiled_planar_raw.tif" im = Image.open(infile) self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") From e102f4848b6ba8905dcacde84d1eb361e20510b9 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 17 Jul 2018 12:18:50 -0700 Subject: [PATCH 0503/1393] Fix libtiff build on windows --- winbuild/nmake.opt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/winbuild/nmake.opt b/winbuild/nmake.opt index 28aab347904..16acabc26de 100644 --- a/winbuild/nmake.opt +++ b/winbuild/nmake.opt @@ -55,18 +55,16 @@ LOGLUV_SUPPORT = 1 # Uncomment and edit following lines to enable JPEG support. # JPEG_SUPPORT = 1 -JPEGDIR = $(BUILD)\jpeg-9c -JPEG_INCLUDE = -I$(JPEGDIR) -JPEG_LIB = $(JPEGDIR)/libjpeg.lib +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 -ZLIBDIR = $(BUILD)\zlib-1.2.8 -ZLIB_INCLUDE = -I$(ZLIBDIR) -ZLIB_LIB = $(ZLIBDIR)/zlib.lib +ZLIB_INCLUDE = -I$(INCLIB) +ZLIB_LIB = $(INCLIB)/zlib.lib # # Uncomment and edit following lines to enable ISO JBIG support From c2ac4604bcae9c083f9e2b755fbdc48c260d8d88 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 17 Jul 2018 12:33:52 -0700 Subject: [PATCH 0504/1393] move variable declaration --- src/libImaging/TiffDecode.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 96106b6e35c..8722278da06 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -55,7 +55,7 @@ tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { to_write = min(size, state->size - (tsize_t)state->loc); if (state->flrealloc && size>to_write) { - tdata_t new; + tdata_t new_data; tsize_t newsize=state->size; while (newsize < (size + state->size)) { if (newsize > INT_MAX - 64*1024){ @@ -66,12 +66,12 @@ tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { } TRACE(("Reallocing in write to %d bytes\n", (int)newsize)); /* malloc check ok, overflow checked above */ - new = realloc(state->data, newsize); - if (!new) { + new_data = realloc(state->data, newsize); + if (!new_data) { // fail out return 0; } - state->data = new; + state->data = new_data; state->size = newsize; to_write = size; } @@ -237,6 +237,10 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); if (TIFFIsTiled(tiff)) { + uint32 x, y, tile_y; + uint32 tileWidth, tileLength; + UINT8 *new_data; + state->bytes = TIFFTileSize(tiff); /* overflow check for malloc */ @@ -247,20 +251,17 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int } /* realloc to fit whole tile */ - UINT8 *new = realloc (state->buffer, state->bytes); - if (!new) { + new_data = realloc (state->buffer, state->bytes); + if (!new_data) { state->errcode = IMAGING_CODEC_MEMORY; TIFFClose(tiff); return -1; } - state->buffer = new; + state->buffer = new_data; TRACE(("TIFFTileSize: %d\n", state->bytes)); - uint32 x, y, tile_y; - uint32 tileWidth, tileLength; - TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tileWidth); TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tileLength); From b0e5e5fb11f289da0c1e8fa0d1f29db4520b191d Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Wed, 18 Jul 2018 10:11:10 -0700 Subject: [PATCH 0505/1393] Update test files to be closer match of originals --- Tests/images/tiff_strip_cmyk_jpeg.tif | Bin 23268 -> 30274 bytes .../tiff_strip_ycbcr_jpeg_1x1_sampling.tif | Bin 44042 -> 71401 bytes .../tiff_strip_ycbcr_jpeg_2x2_sampling.tif | Bin 35896 -> 29068 bytes Tests/images/tiff_tiled_cmyk_jpeg.tif | Bin 31790 -> 35472 bytes .../tiff_tiled_ycbcr_jpeg_1x1_sampling.tif | Bin 46266 -> 72963 bytes .../tiff_tiled_ycbcr_jpeg_2x2_sampling.tif | Bin 26862 -> 29653 bytes Tests/test_file_libtiff.py | 12 ++++++------ 7 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/images/tiff_strip_cmyk_jpeg.tif b/Tests/images/tiff_strip_cmyk_jpeg.tif index 9d53d167e05ca083a39dcfd5f87f83bb9589e3d9..0207d27c74b61b0b02e78eea3e38fc8431214337 100644 GIT binary patch delta 13455 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

WT^bZp)uZTu?+hNy@LtgP7=K-~B0*MkF2SKcs| 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 +o?x?bSCLebuIi%`Zq@lf;SNI&5*Vr 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 V=p5jo61N$g85k)9n`LbT9RSnpZ~g!P delta 15005 zcmeI3cQ{<%{_nSF(SztgL`xz_h!Smx=n)d421#^+h@M~zK|~9JAc$y*-a8}85WN$9 z5WUPOlfjg`bI!Tv`JLbI{B!T`-uut}?&q1AHJ`oLd*)ed&06dA{_J_5c%}qP!mOor z6?h{D0K_R`D{%fSpbRJ{1gUX@2Ub|0SVZOt2ab{mgwPBU)JiKs7 z?L=A~ugT!|VTh(u0yiF=KnSxsLj)EB7Kp&5VIn|}#*PvJRag)aKt1sz0^L<$n~FUV zP*}r-V~6qO&QNic2()Nm|6EMK{(vqPe+{CP_J}|n=)5aF^&7cbjmpM&qV|IP)jXbf zeRG649sDYbo2NK%T}|;$Hna|nQ|XEEnEcj0zRR?AKi;>U-2XA-AV9yM-7}V_6FHee zLOs>$+C*zS!&?Ds$J-;_wvUiR;EZqZX4~5Rk-+h_-Y5J`bgLG+5<6lAUBCXwsccO& zOOSp3Dl(EVtbR42RgDD{d4q;^E>L1$>MA>7TEv1yul>L@=AzU~MXQ{7eBc>LdD2n9 zy`!f&w80uu*Sr%n*`B;fT30xv+#hf<*~#&Dxsg6clIU@4R|hiTOi?kf1+n8UO{QdK zPZD-~L>8MZbsQ!X_S_}R*?$6Ld$fizD*UOfD2*LaR0!hs3Kmo~ox~|$tBK6c!NQCi z_hnpX;Jwu@_0v;>7WpGNX}XQ!JTEkOcGL1yGW$k_Ys7TT zZq%fre$?s}Z2?FGay8gzeOm|oc(ShurM-;v3!8iA)pKs4J5`{(;m(1=mma^KGFKSs z179CZG*+Ytn}c;_;5IkiEZE|x8ZX+txi;T^6~1u;A;WWB?o;gjOuccjrLs{m@qDd$ z5tCF?*7>=$#6)#X&1Kr%sS8(wJ5VG7)J2~wL)m}Gt}KFqUT1k)!S6Ql;TP9FyjbiW-$ zlaJe4berEE1Ki^!VD8=B{F`(y#oNW-WsqaT7eNs?2Uf%+&2)I%Ch1CU?P!Vrg2YYw z?lSg{k{Q$I1#fDUIfPj(S0`Tibx2;+coLVyJCKzzZ(_@+on>04JPU)`jW=w88OMkw zZLJNwj&d!PF3&O5x@Mr`mOty)xU9S#Nfo8NQ=Lp*pkqUl(CID3t!5G6PlsOU$dGg- zfFc_M3ye~YB5sUM7<5gVbHV)24b1AuT!+U^&cr7DI|_)4TIahdmTNhTX3O7QFsl(= zw&rB6`%-x!L)|bQWHiHkV>^+5$|8S$F_FApA?n)?TpmQp~N?g;EPeb&{-}#Ui{c%@&jR{=4E({5=;Bijb z<7XMm+V(#p#u3-Al4qFiB4uc8r(4h9&>4wL{Q}_R4Zl7sTFU+b^;eU&g;?QsOH!=f z@?{)Vt_t$|t9*+&3CEOL&0U2sNa;GiE87Qzbjgj^mf`wiQtK=zhAvUAQymj*yB9tb zpM}w5a&lRN`YWJvdjTz8b?X3DzUN<(GMMQ+DqlCBRwG^`e`D39&l!QUUsbFv0r|~9 zOmt`s7y5(MG9u8LFf_R0yto&g3d6*dqP@3H8Fq+(Et)lF9>mB@69x&d9XwV+8_Q!0 z$xNl0JRkSwTYFe&_UTAxYYpj2@|kw6FId>**GrmczcZSFS=C&Uq2YgwH<{obdB(#;I|{)R9aw+n(xV0x{69cQFx^O4+#zTp&Po&YUhd+4imzoVM(IwfG-xYJhy zOG9+Q9i_1YQl6o}2b$gNe?rD-zS#zo{`Mfl_h^w;iD_&>fYH+YEh!xx_I!uj#*7_( z{FfmMbJ$*TZnwo}T;{F8c_IKP(QBYIFdE}cf>L8XFN+5<{Q?SSJ2ORhE$MO%WaU}z zpJ$HR5q;fAN=?|F-`tP}N6t$W#4OrXh>HbIel7aQrwY^`_6Ph#aUp3za=0y>aa+Qp zF0X<|CYDxClZ^Jgufjvf4HR}B-qF{y$XT=}MOsZ8w@FWAo@u(WR5iS3o$*_9Xvuk^ zGUds8(C*Il3ht}2KaMGNHuNZeZ8Cf4CPp8YyFC)Qg;3Y%17~0-;8`NT?R-V6F^=>b z$*0$GnazaXhb(A@9d4wKvtBR{8(MpVEl$rbXFaZZYx-_kH>}c{-IPB0f(mgh2k#iks3YNtO0QQ$ zK;%IZtlUg#00~^)duZ|05!CmL)8b0 zuESj`eF%fYP4_X*^8VV(j2gevv!j-UUqA~nC5{A9q zLbfGGi4$nKgl0>~n}=h<--;6^{e;$MkvY@#q_U(JsP{HG!y0>V1Z-N?oNs9dFB@3d zBq>(=JVSiEcn22^EcC=j>ex`1+^O&%}i9OQEbf(wWve<%mFM<~9+a>n)lUj`T9QxbG1KK4$d)Ie9re`NI_`Jf?5E`IWR!T9K299H@K!1|yrDS!t->wEuasH+wPag);Xj@I!C%hvBo>6y`RZ1_hVd<2> zo>eI(b4$&4x9D0_4*8RXH(K+}1`2p+lJ8ILxgYW;2_Le=q7#r4&0pty!6l9FJCvp^ ziJV+%S3DJ|?F2~JdO+coFPcY!(HAsB z5fhXOb}fq|3N8iMN{se6PHzdu;H1Pm!H@d2IDT_Sy~o^LWO)O9po?%b;h>8d;zGrJ(a0?l@f1NxAWN-rsiO^J^h zAE_v>N=~=H@li)-71&ONePwjfV;jiy+w&8@1ga*cO#0b%QeNgXYI1pJXxwIaxv5}) z7H*vvhnBH5RCvT;zn`Zl^{>*L(KTjO4rfPGjnsN|fh(su%Pq2Bm%y3~uCEH~sfxSO zyX?Z5+A*?1@0NHaq;+?J+3PQ3#z(N3OESR<=BUyx7o<3|W5ecps$jciZ~lN#n8d`s z#OtfS*pc_V6JoHXI$y6+AHG{UiVYzGR9+TFYX;*=Y`$WclYOJq)y=JTOhvCk)Qf@L z;rKqS9|9{04+Q6?FN1~+Dawl^e1Ku0`}2Y`v)aHSfT-IsM+0ynV*Rl~w8>6@Dy z6Z7ip>xV>blI*RMe7tX)MhL|FNfj@~lKF~%|MJV94@pPazJ&VLzNygg4T2Y4AtUYrv|NFN*zdWqgqN#0MWFtJRnCgX|K&E)SlgcY! z3i8=S`j9>agV1q^3z8!OgH=ru{5h~Ng}s{#)c%YD@i**!P`|S5gyXgLkEL=UNDW({ zui}#5(xqtymDoo`k953i;O~0XYeU5^Jqe4^e@ps}gWUY$s7-x++-tvIPxG&u{`ii` zaa?^tqsz~-!us^NvxYL(1NHlMWlQz20u?e{dcojz@!prp;l)s~B}n3-A<0;?A^_6y{##T6UHvqE{0%2 z6tH|ZsM@9Ee@FcJpIi>A)A*Kx(yxWvJ%2;}MRhK4e~&$IXo03lFjwr`QX!mq-AMFu zgljd7Y>Rc6(sQm2|qN;Ql*=00EgId2AO}QOEErjvd@RF3eoJ zTZzvKWSzs__05A2sl#AhjRR507Ew#g}b+xG!9p#CKgR0m` z4OHQhPmq$J-IMRnmx`V48PzDWikFhpYi@DJZFALZ)n0CE|U`c6KeyNP2h+i1}q zOO>ujaTCMMr~)cJer1b))DeDnVD-P-Kfc>*aWx2j@6Fpi`6rW~u#L+^pk17LL)8GS zwh-Z|BlO`;tr?gcBK684^1Y_+zS--#pnH-TbRG`^e_B;~Izfl?k!mGQtr&&Lf zM#aUQ#;B|C>N^hya`+pf#5-Ul7TCe>W*yT5vDO0Rx}a!Fy2t8q+-GmKAcUazbZ@Ak zUis~LdFuzEfA##v_`G#hA=T#cS!x7**(>2LBYr4V4 z0Iq;`w|JmE>ulTR+{7Ok#_)C`-> zcHjBU>(8)<(a;q@JGUX)*a5f#+=(0PIO%Ey=~}AYmJ8pmRgTyv7>-}7mdv-%o}f03 zUv*K}@q+;Kmy7jNA6z?K1_>w2vBY#txQz=WTc&;i}AOexCL><>% zwAEp%U|v2ZQTg@a?_;$G^$$Tt7cbh}t35>MZU?-so3)ZF=CB4AXM2=iw!CH(yh!bdNKvkW1CwuTcZB>(;1Mk*e zxz5D&`F5z``Dm54jh}wT-eD6Ykepxt zIXssLkSciCqD7Ew;W)4S&XvyMDKKY;e*0MBMTJJjsg3cYQ)8(BQuDbVq%ZE5XPUJ) zzWx3JedC8gkn>^qVsdm*3qMY1$lvV=TOw52kT3C4O7`2Eij)7E7`WP7l zvpKN{-=RmUd@-7jlus>8{T|St<$tg4P}4QNG)uyTP}%DjY*8BKQCA1i?_YWq!dNXg zVWELS@ja{N=840uea!8A(MzBprlIVYrtHNSb&&&mOeLD~om6H}3wwamLYL2tMbKUd9CNX$sZ0Fa z_}VTi=^p}+--d#PDe>Yip>r%rMjoTOTSnc)e%@@F5isUaeSOX8&Dp6Zes`^%mf2a( z3|{;FJS|LO=P^m3@1S;sUA*(hrd9DU($zJ7#jT2Q95b?%1SgFC5J)!i8MW9vTC$r0 z-t3#n@!?S=x#skdv6iOCn#-8IwRB)%T2Jj1w*3>yZGKAGeNZ*W0#?Dw6-s3Yg1ueS z@N(qBXg=o6oYF?ukD-mybnS-+l3`$Sp!>l~H`vM9;xyL&?MQg`jhV*${*5|l^}YmG zA_5NmyxsUuIN<^!@WfBaJ3YH}h6n=X{(n@rx~9R3OOWc!>c;PTN_tM z6+6Z@JXYwRvQ)_AB={0(Iv^pTWKH-<1co%Qd#2jDvv0XI zX;)~Y@O!`EpG*7prsdm`CNjws#Fr9B#4lwWXbtl_PgecSOF%$gg4loX5;jVwwielN zf?y@Ic~vC>G=<9)5tvgMaC?WX6SS+S?I@{xCw_V7f<4EkUa{TgZ;)V=dkuVA6;K>K zNN<9kUH!UgoMCYofid^_&MVm!?^~J!+UULJMSURj6V5|3D)I%+d^m8q;c%odnm0lrUE+ucRQaoY4XD8A4mY|udY32< z09|J)`{uoHFZ@9F&ZPS_Qf)^Cc6!nqR!@cbf2p;Wf+1}nD%789!jl23<*&9RF09)O z?l7FQ!k6sp4%fG9RllHkP9e*3Oa#!8$lnqEIw;CEJ){-j)KGoca4(u)C(qYR%QpT- z{%6s(t}h4+4~V|_s2ctAd4-PBJKU}MR|g6jKRw9>z<|Bm&>&Y~DR+?&T*1Kmlm_WSgIg^V5gFLYuUIUakuul$B z79QecjVSi@AW%_)*}mbL@DVQ&3kH4WpH?#p%$*GcJB#5uT4+|X@x1uEfPOTc?hez&Zd5B#EW zihVO5V?VvOC>7Yrzhk+2>$&=QH+EcPCOAZ0lfZSkcUIsdf^C(zyB-geo}0i?zB)2QbZMaXgFI6`IvN{y{!-sE5=GIV=VIWrqFP zzFc9I6a3&^UP*g1RHL6Ctm?0iZRA`l$$J%QDamyRY)^8tkOX)C0=ZD#{x;yB?1eI zzOZmX>&tq~sAC2jgyvC><-vDB^m@02N-Gg~|EB%(41$0C+P|ZIbLsy~{l{o@W@{in z#MFaS@K798fzxD#!?Z}%v|E@>lIc0e;b4F4;Ty5fi(nTn`;YJ`Kj!k-MU=*N^kT7O zS1lvf>V9o?gBE!0Xo6J|!L(^v-di0sQ?(NFhUX}{_)3~l%4Z&@`0K;C_Roh!bGmmM zqVgD5f7VMaqsukcDuS2>cgD%sF-0!{KMag?24WVd?R48iBwG&72^$@!|rW=}#gV zDdPx%=sM(8@}bNL5e$Fw$SF|%dD%0d<~Jd57q*AY-Z8d1IFP~PZh~!zSQ#R4C%F}l z)tv^>4O{-VzBtVDj}P^B>C_O2~K5r2kACkI}ue zJ-(~U{7`&3+=SfRp%qNENYX(i29zKTDe__Dxh+AgiY zT*vL(#zbw|toaY;n?BdCMG8m&0udo+sILPO8T1q$%61Q^%OB9IP}b!d+1@g`81g9w zQLve6m-cN2s_BTSeLv_XST#I*yW-mWZXjNo_Uz?Wpa=Ao6AGh}-`UHP;O4cMy*5^ExPV!V|s-XK+ll{92TZkv4mD zUB#Qj`+Cw%{Ss=F4{2PNc8uwoAFD>Hy6tIEpBAs`UB5hg`h9tcL%|4sba63hYYWv- zmB#a%+EngS~sCTC$q{tqNY8d9Bi84n5ImspYDo!e8L;vq69hxBI5la zqx_9Q&;GWnD-kFMt7`3g>U_PA3Hn==-u^9;Q9RWa+umDe+WQClDDW-Wijw+@d2>43 z8TQX*tjFy0oQD)(=$TVJjAFuaDels|Q7>0y>9*Sr_s{(j9_|(}Np5>C{geHLqf$i> zyLM`4iBqboZH!&ih+e6b5qFW!EmrsJr4m3GY*!w?h!}6{ZhilzAeiLG%+p>?)2WaE z;F--;?tW~{4FfaBFV?Zuou6#3`uFd}%~U^!alxO7ERdL~c=5LGacbGQT28xYm_}{X zNN7?RY>)n{+#dAHBvbIphYVw#&)B`Yp`U9fwv#}40>lC@!gW zu6jIKmILuz#2&$!?GVT`E|pu$Mwd6$@5v|ejOpW0&D@kc=n-X4$rF~sw3o;%JKJhM zlES$gXDmCbJed2;x7NUgtt~a9qKqbNv?#CsT#7UmHJ?jknfoVeS=mFW1C0(MFr!Lf zbd-%RUVi$+e~QWaP`~H)$%-8DLkAB$#uy-t`%pS;p5Vw zB~4yjPTT>H$JcKTN_fZa-1pCkqBjqT(I5hrEpFJvQ){qI7`3N`7RFsEW$(r3JKMTr z3Uf}S-v?sv%ad>i#3NsYPDpmr}sb}-jd>Dt&pB+^39^qk+?y^7QoRk(dhIgQI)NYpY1 z_#IlIEeIno#i5<4-Qd~Hg()SC^t|;#d=@_9mmeH0W~nrekEJK1!>WY-FvGnxUH{Do zr752zag7JDX`|3BKtpP7CN*w07I==Bxj7{_-L5}7t>ffVbq9jR_8L;r_>|_yLDdd- z-~vAKkEFPz(kMQTm5{EqAOq?(xbFurqV@>-gD`y1kvLv<(DXO&zHIDoXd9}+at}P_ zfGt}8DIPLF@Nld;3mNpJW8fiD(Kmc2KT9yY{l}3IYUw9e`V;T@Oa>b3TW&Y%>ImPf z7v575f!K{&>sx7i<8wT^lO+CqNIAchF61gNo-B~X`EI}{3ApOowlA}GI1eWJ*6t)^ z<;J!jSF@r}l`?V-JI!*GKbw~3t=--6p)T-?%#gQVv5W8!UnnhtEhd)F=Wn}YrIjsR z5#LLl^wAUlCs2rV%HONNB5s!iLR5BS6bKLb)^cOWe!uh^lweIRpBLT+zi@qCl4)sn z1})}j17FcA)`sIeERkq=f>!NYaGTkS2z*KXW=;gU`oO)|wTBm>L7BNnjVX<=+P?># zJSBewAzEH(@528=3Nmlh);i#t`6Ts#dtBTBFJ_Ps32R7r$ z1MLHc=g-$vVfm2Y`I0!l^S@K?MQ~X*=k(HsoJ!vaeZS$3(Ce17()NXk>u2f)c3A;% zqzFD$L2!u|YhlHHQ?K@CBN4E7Xc0M;N^BAI>bUQx;jk<__#nVp#u&a|eZ~5eC41+Y ztM7}h7;sHW<3ZE@UXEVHOv~Bh426Ww0RGcU{!ni8O+LmAl?Uw}Xp)!aBQaYL-r%`9 zdF?78yt#2c&~#dMK*CR`B{ZZBh6=%*nZPOjaf06Bv{p8fOYzxDqN+Q|6|T`U&N~0# zhzz@f(&dESm}?c$X?+TbbUE#9kQDu z+BX=wm&7ODHF|(kxA47W5Oik(v~)*VF*NBcSp_LEfz(*ihvTKWBc6_&7LsivI@jW& z6-nHb6j>#5w927VZI-8Y7lEc%I z24P@`lDIErM<73z0jZ9H2Oa4eVRVHx<8nv+ZwSP92Y)9K@;&tJEqM-GCOjF1gq4DZ zs&t*(Gf|rIc&-jPHA2ESv-Ouj89jubiy5Mm2NJu{t+qX7{QOyz&H6rC3TCBTBHz5e z8@vy^Z|^srBc zKd3kHVpNO@MU%KWiX#0~!}rUK2G(i`Mx8S}`@`$2=1tRyKje_)96#KMgrJ92AAhP_A_WlF;nzWe+Tc35Z&>Z3t~@3jEmaeT8thPF z)3UCM-z2DH_f_n?I8&8izMk~!Y_E-;yY!OAfTq~O7m(VYH`kXG*%GAEFUi?QO@qI4o~0r(j8g3qPs#@rMGo1JZf~mKBsjU@ChqJj ztY)B8s`;J1>m%os?A-#^eW6h-SxA2~tp?Dp@H~3|yp73EyC9PYdC=$2f zqV8(VzPT7!&46$Yt-`{V8uL!e9E>Y2oSeNt1hjEm*q@N8(9t4JBe;C9?`NdDJ##op8Vh_#-a#>7(xI- z)gl+iyVF(uz=2_0SnMh{Wv<<(lkJ%8_1No7^oI7;0pKae<~d(+%srHA+VZ#2cDc~z z;vOx>;&X&FTHf!acNG3m&6scglHThkD^zCJAd-Q3BXxh>jHTB~>+e~^k&0NU z7g3r9zqPvj-S2n0D1b8he#19k&AQB9*HcQo@LZRrL&@e@+AK-k<0J0ETr{l1jm)Mq(U^IGj?!mNqfZo08=CGxC9nW~gaJSn`m8^PCiM7oJ@lGT zs6}Vb%m@H&3;-}n`}fCL=o}Xmo4W`AWukxk2k8u;3Xq*4B_%yW20f8M2RRi5IdssR zJxf7FM?*(PM?*_Xf9^aZJp(fXEiDr}6Eh1d8yg!vBL^1;E9ZGuHr7f|n^F0H0M55` AF8}}l diff --git a/Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif b/Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif index fdee429855f0494d94aeb5da7a5a846af9ffd905..75ce833a19a4d3074404f49fcf3c3e8d2d2a6c00 100644 GIT binary patch literal 72963 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 literal 46266 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 {qh(K3t&FtF-ZZ?Wfkv>!ay&{aSc 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 diff --git a/Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif b/Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif index 49b3e1a1332258508eeb8f5592f5e1ba70586f07..ff8b4a409cac7e9220c74e1143405598dd54d769 100644 GIT binary patch delta 25052 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

NP0WjGqvYQKPwx)7{vt?n*{`CdSiPp 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 diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c77c2ffb221..f85af5888e2 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -639,37 +639,37 @@ def test_strip_cmyk_jpeg(self): infile = "Tests/images/tiff_strip_cmyk_jpeg.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3, mode='CMYK') + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) def test_strip_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 2) + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) def test_strip_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + self.assert_image_equal_tofile(im, "Tests/images/flower2.jpg") def test_tiled_cmyk_jpeg(self): infile = "Tests/images/tiff_tiled_cmyk_jpeg.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 3.5, mode='CMYK') + self.assert_image_similar_tofile(im, "Tests/images/pil_sample_cmyk.jpg", 0.5) def test_tiled_ycbcr_jpeg_1x1_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 5) + self.assert_image_equal_tofile(im, "Tests/images/flower2.jpg") def test_tiled_ycbcr_jpeg_2x2_sampling(self): infile = "Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif" im = Image.open(infile) - self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 1) + self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) From 1e4b3177ed11237d8ed39fbc46d305bf37d81924 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Fri, 7 Sep 2018 12:37:17 -0700 Subject: [PATCH 0506/1393] Change comment wording to reflect ability to read tiled tiffs [ci skip] --- src/PIL/TiffTags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index ef19ee66ea7..be75ee10dc4 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -438,7 +438,7 @@ def _populate(): 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 tiled images in libtiff +LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff LIBTIFF_CORE.remove(323) # Tiled images LIBTIFF_CORE.remove(333) # Ink Names either From f874e6f058031cb863d34ca2b75b0d772ee3c087 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Mon, 10 Sep 2018 10:40:49 -0700 Subject: [PATCH 0507/1393] Fix typo and add explanatory comment --- src/PIL/TiffImagePlugin.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 3a2bd7b4cbe..977d1da140c 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -257,14 +257,15 @@ (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + # JPEG compressed images handled by LibTiff and auto-converted to RGB (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGB"), + (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGB"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGB"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGB"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGB"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGB"), (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), From 187782470bca65784143b994cae855dce6becf62 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 11 Sep 2018 09:26:25 -0700 Subject: [PATCH 0508/1393] Drop YCbCrX(XX) modes, as TIFF does not have to support that --- Tests/test_lib_pack.py | 10 ---------- src/PIL/TiffImagePlugin.py | 7 +------ src/libImaging/Pack.c | 1 - src/libImaging/Unpack.c | 3 --- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 635b5679a25..0b1a43880d2 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -151,10 +151,6 @@ def test_YCbCr(self): self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) - self.assert_pack( - "YCbCr", "YCbCrX", - b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', - (1, 2, 3), (5, 6, 7), (9, 10, 11)) self.assert_pack( "YCbCr", "YCbCrK", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', @@ -471,12 +467,6 @@ def test_YCbCr(self): "YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_unpack( "YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_unpack( - "YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) - self.assert_unpack( - "YCbCr", "YCbCrXX", 5, (1, 2, 3), (6, 7, 8), (11, 12, 13)) - self.assert_unpack( - "YCbCr", "YCbCrXXX", 6, (1, 2, 3), (7, 8, 9), (13, 14, 15)) def test_LAB(self): self.assert_unpack( diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 977d1da140c..fa8f984f437 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -258,14 +258,9 @@ (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), # JPEG compressed images handled by LibTiff and auto-converted to RGB + # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), - (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGB"), - (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGB"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGB"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGB"), - (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGB"), - (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGB"), (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index 5c298c6c50f..6d42d849143 100644 --- a/src/libImaging/Pack.c +++ b/src/libImaging/Pack.c @@ -608,7 +608,6 @@ static struct { /* 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}, diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 7bb8064ee1a..56be12e07cc 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1428,9 +1428,6 @@ static struct { /* video (YCbCr) */ {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, {"YCbCr", "YCbCr;L", 24, unpackRGBL}, - {"YCbCr", "YCbCrX", 32, copy4}, - {"YCbCr", "YCbCrXX", 40, copy4skip1}, - {"YCbCr", "YCbCrXXX", 48, copy4skip2}, {"YCbCr", "YCbCrK", 32, copy4}, /* LAB Color */ From 2666fa00984fbcf83e98a80d62fe7d149dfd8daf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 20 Sep 2018 19:52:56 +1000 Subject: [PATCH 0509/1393] Retry svn checkout on failure up to 3 times --- depends/install_extra_test_images.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/depends/install_extra_test_images.sh b/depends/install_extra_test_images.sh index 089a5e4d732..0a98fc9d93d 100755 --- a/depends/install_extra_test_images.sh +++ b/depends/install_extra_test_images.sh @@ -3,7 +3,17 @@ rm -rf test_images -# Use SVN to just fetch a single git subdirectory -svn checkout https://github.com/python-pillow/pillow-depends/trunk/test_images +# Use SVN to just fetch a single Git subdirectory +svn_checkout() +{ + if [ ! -z $1 ]; then + echo "" + echo "Retrying svn checkout..." + echo "" + fi + + svn checkout https://github.com/python-pillow/pillow-depends/trunk/test_images +} +svn_checkout || svn_checkout retry || svn_checkout retry || svn_checkout retry cp -r test_images/* ../Tests/images From ed4de6cb62f90c2a7ea3f3ac40f4d3f7f5abdfa3 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 20 Sep 2018 15:27:30 +0300 Subject: [PATCH 0510/1393] Fix docstring typo If we `import numpy as np`, use `np` not `numpy` --- 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 64bb39b3444..9f23793377b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2446,7 +2446,7 @@ def fromarray(obj, mode=None): from PIL import Image import numpy as np im = Image.open('hopper.jpg') - a = numpy.asarray(im) + a = np.asarray(im) Then this can be used to convert it to a Pillow image:: From b5ca36902f7563c6561c737a17bef1babcdaf66c Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 21 Sep 2018 12:43:49 +0300 Subject: [PATCH 0511/1393] Install CFFI without any PYTHONOPTIMIZE --- .travis/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis/install.sh b/.travis/install.sh index f18aff07974..b123fd302de 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -7,7 +7,7 @@ sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk\ python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake imagemagick\ libharfbuzz-dev libfribidi-dev -pip install cffi +PYTHONOPTIMIZE=0 pip install cffi pip install check-manifest pip install coverage pip install olefile From 3775aad9f1030af254e3d96a64a3229695c92ca1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 21 Sep 2018 13:31:16 +0300 Subject: [PATCH 0512/1393] Move PYTHONOPTIMIZE to Python versions which have two jobs --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b5adc2da7c2..36a956e9502 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,13 +27,13 @@ matrix: - python: '3.6' - python: '3.6' dist: trusty + env: PYTHONOPTIMIZE=1 - python: '3.5' - python: '3.5' dist: trusty - env: PYTHONOPTIMIZE=1 + env: PYTHONOPTIMIZE=2 - python: '3.4' dist: trusty - env: PYTHONOPTIMIZE=2 - env: DOCKER="alpine" DOCKER_TAG="pytest" - env: DOCKER="arch" DOCKER_TAG="pytest" # contains PyQt5 - env: DOCKER="ubuntu-trusty-x86" DOCKER_TAG="pytest" From 0c374912012c691fe2d77b64f774d21c7a0dd60e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 20 Sep 2018 20:15:49 +1000 Subject: [PATCH 0513/1393] Corrected tags --- src/PIL/TiffTags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index ef19ee66ea7..bb15a64ee50 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -122,7 +122,7 @@ def lookup(tag): 316: ("HostComputer", ASCII, 1), 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), 318: ("WhitePoint", RATIONAL, 2), - 319: ("PrimaryChromaticities", SHORT, 6), + 319: ("PrimaryChromaticities", RATIONAL, 6), 320: ("ColorMap", SHORT, 0), 321: ("HalftoneHints", SHORT, 2), @@ -159,7 +159,7 @@ def lookup(tag): 529: ("YCbCrCoefficients", RATIONAL, 3), 530: ("YCbCrSubSampling", SHORT, 2), 531: ("YCbCrPositioning", SHORT, 1), - 532: ("ReferenceBlackWhite", LONG, 0), + 532: ("ReferenceBlackWhite", RATIONAL, 6), 700: ('XMP', BYTE, 1), From b535d78fd8ec03e4ac02ed741732019f4de08f0f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 23 Sep 2018 17:25:21 +1000 Subject: [PATCH 0514/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 923e515c39c..26339670b51 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- CI: Install CFFI and pycparser without any PYTHONOPTIMIZE #3374 + [hugovk] + - Read/Save RGB webp as RGB (instead of RGBX) #3298 [kkopachev] From 6d52cd2db8ced7c2ff415e69568f73cd524d4b08 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 25 Sep 2018 06:16:52 +1000 Subject: [PATCH 0515/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 26339670b51..f87005d03ae 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Corrected TIFF tags #3369 + [radarhere] + - CI: Install CFFI and pycparser without any PYTHONOPTIMIZE #3374 [hugovk] From 300bdaad9e3bb2b79bc91e68da11c4b9535637ca Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Tue, 25 Sep 2018 11:46:32 -0700 Subject: [PATCH 0516/1393] Bring back YCbCrX in pack and unpack --- Tests/test_lib_pack.py | 6 ++++++ src/libImaging/Pack.c | 1 + src/libImaging/Unpack.c | 1 + 3 files changed, 8 insertions(+) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 0b1a43880d2..3479013d983 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -151,6 +151,10 @@ def test_YCbCr(self): self.assert_pack("YCbCr", "YCbCr", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) self.assert_pack("YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) + self.assert_pack( + "YCbCr", "YCbCrX", + b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', + (1, 2, 3), (5, 6, 7), (9, 10, 11)) self.assert_pack( "YCbCr", "YCbCrK", b'\x01\x02\x03\xff\x05\x06\x07\xff\t\n\x0b\xff', @@ -467,6 +471,8 @@ def test_YCbCr(self): "YCbCr", "YCbCr;L", 3, (1, 4, 7), (2, 5, 8), (3, 6, 9)) self.assert_unpack( "YCbCr", "YCbCrK", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) + self.assert_unpack( + "YCbCr", "YCbCrX", 4, (1, 2, 3), (5, 6, 7), (9, 10, 11)) def test_LAB(self): self.assert_unpack( diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index 6d42d849143..5c298c6c50f 100644 --- a/src/libImaging/Pack.c +++ b/src/libImaging/Pack.c @@ -608,6 +608,7 @@ static struct { /* 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}, diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 56be12e07cc..e9921d2ca9f 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1428,6 +1428,7 @@ static struct { /* video (YCbCr) */ {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, {"YCbCr", "YCbCr;L", 24, unpackRGBL}, + {"YCbCr", "YCbCrX", 32, copy4}, {"YCbCr", "YCbCrK", 32, copy4}, /* LAB Color */ From b09b43d8b2a9a3b78ff831968df5358174015256 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 26 Sep 2018 20:07:46 +1000 Subject: [PATCH 0517/1393] Added ImageOps pad method --- Tests/images/imageops_pad_h_0.jpg | Bin 0 -> 12784 bytes Tests/images/imageops_pad_h_1.jpg | Bin 0 -> 12785 bytes Tests/images/imageops_pad_h_2.jpg | Bin 0 -> 12783 bytes Tests/images/imageops_pad_v_0.jpg | Bin 0 -> 12766 bytes Tests/images/imageops_pad_v_1.jpg | Bin 0 -> 12771 bytes Tests/images/imageops_pad_v_2.jpg | Bin 0 -> 12768 bytes Tests/test_imageops.py | 24 ++++++++++++++++ src/PIL/ImageOps.py | 44 ++++++++++++++++++++++++++++++ 8 files changed, 68 insertions(+) create mode 100644 Tests/images/imageops_pad_h_0.jpg create mode 100644 Tests/images/imageops_pad_h_1.jpg create mode 100644 Tests/images/imageops_pad_h_2.jpg create mode 100644 Tests/images/imageops_pad_v_0.jpg create mode 100644 Tests/images/imageops_pad_v_1.jpg create mode 100644 Tests/images/imageops_pad_v_2.jpg diff --git a/Tests/images/imageops_pad_h_0.jpg b/Tests/images/imageops_pad_h_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9fcb1cdb40eda48500dc9a804c631d69cc36735 GIT binary patch literal 12784 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�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 Pxybh8|8j;CTu=Qs`IF3W literal 0 HcmV?d00001 diff --git a/Tests/images/imageops_pad_h_2.jpg b/Tests/images/imageops_pad_h_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c822489253bce80100f07d2789a5a138411992f GIT binary patch literal 12783 zcmbt)byQUC*Y+SHB_INV)F_CQfOHNcC@ml@Eez5%bPbItH39~2nYZGf}0C)Jp*_N zAh~mg_zn>XF)=YIDGAwKT8g{mB|MLoy?~(e2wet6?|K0k^4% z?mrfkyF;U8LCglF6$**ZAz_!V?4Z;Bwf{ue(k+yf>;XN)Lq?9LoLt;IBBEmA5|UCc zUnwXmDXXaJ=<4Ykyfrj}SiQHlv9+^z_we-c_VM)#3y=5^`SDX!LgJUCXE30eke>XM{4v&tpC#Sfx z^M7y=+~E9Q@;`w6U%04maNW9noA5UAKez~PdEY1@^=+cZf_LuAX%SmMY1o89NNDBb zb1FMX*@dO-Ky@1J3YK zT;Fc}2TBoGg;-V-Jo^H(jd?$jpmT&+Hj6>V{(PE|`8}nS%(0M%dyYYWf#yfVmqZr% z3{iFdSE8mWc{6U*!Ut?&eJooe0g_AR+d*Wo(2;9Eo(c9E5ZnOjU?D}w1UM1+vLd|| zU2v&08JD?U;Jrjc%Uqu{Z5!WZ0oqL?>o%xWwe{G}ptQk7iQh6v!(lj|=Vy;%H}DWG zdF4=u3njkf@CFOa&%_1&R$X0PkJ%+GIj(qp%Upl0_V47qJ>xYmGqz42dc`;5#Yb0d zt3@TPbO#fqiy3^)Syr4SPFh#Ht16r0F1_JTLvnKYSpt9c2F)0)IPqCGCRs$LS`8Dk zH0^uwY-Gx7@SETU|MK&%mG^uZmiNh zdwfx~7L@XY2K8`Q&`dSHBiDhH%%0ULJaxu>C220A@64C|_A<62is7Q~LOoz`(}D)) zA?hleHMY|f2swlgH*Q@601jdfYhA!>lD!7{(edhuhEHrh@433{SQ;mDHOhEI{tR>L zxXwm8t4lK!F4KNMzA~{hvM}=GWA6NIE%<`=5>n1EBp8z$ui;2$yB5q6EJSQhFFWV6lekeQVF)f**nhf6 zuMSn+Vfutd`m?4kN(LzHCl5=@H6Dm>KO`($2Pw1APQF*oLTfY1_;&o3XlE%Y`K;)E zY=kAh27EZcIdoOo8*SGoL2GARG&2O|6~Xhw`MzOSf2ihx-qUc$bh=L&P!xNM2}YSQ z{Jjq$_~-bJS{G*H{7z;GC8Y5P295|lzc|--&hA;FX@7`UOi~(*B+SPJQ(bb@5l_0{ zqm5PzhIvbH(boWWk#KJmJ~*jgC3DE+H)&m%>KsKS&v>g%u7eT9-bbdcbNwuFleTHW z5sxnKM;^p2{+i)36nQxQfm2{heGs+|D7Dw&7?A&wfg+Aqy#3I~4o?TyZEz}aZ}_2k zP!&f!iD^c3Ujt}Gf%iA%XI{e}T?0x?5CiR;$#NMxAcx^x$r^rHNlSxiF=mnD(;mswt?6`amjP1)nJqeAq?{vh zN*l)ajflOhf6O%%A61$phscQgz0b$?Os2E#O#zb)Tn6Pp5H^OH(>6HS+UiMtaR}NMuSChDV!ghuwEIR1ir5g&!RHOo7(WEK>BX z*6;Mx_S#)gzTPRex#|^81o4@{;B>#TCwVGKACvF#AH9+6Ju7kGnr!KQK5F_>)b3Ft zR2uIH!ObA0jrZrX5sDO@f%~w@0qE!tc1)`)#uGt}^K?`%pB(U9v!vn&FQO0b!Bh|$ zBY45i(R6j^$?ZwCG2e*u(4YvxQDCMMBgUv)W-ycXWUTXmIIo-_}~fm}|l9HS6;(8Rj5wx+M-033j{POek)$DYV;Pp?J-b z`%o~I)=Dcxk;rR7hq&ZkmYtH(Yj?Hz;CtmfF>knq!(LGKatlUj3o8ReNTW4qN9^@z zJ6Jhx=sd_;|1YWh&k;aybN&zu#IOn?DRGJmNvJ$GT{9tEY{{nhsVfSK55IWcME^r) z(%CO+xu!*RSuIWaEATX9@dpUy3bW7echqQLt*Zo(L(aqfoDu|WlGh$uy?>zZAYx`eyih$tLTU`i5OPDjI={F3f2p~#0UGn zv6o<}7*Dh|i1$0I*!X+QlTn1T>@T~gVDCyD2B$gs^$O`pNl3Z5oeptLI)pOPJ_Cy- z9ve;Y*q9=$Nj(<7Wc#7Ee?Fix4jCx82BdJt3^bKw7y2FSJ+No=8ONYh;r+I_Od;P{uIrSSch@6%hShYeERWS6kl03;@^*4PF zA6<5}as{}lu3u$b1B`-bV-VJGt>~qUy2;PvD~In)=RFK5)}V)nH0-wtQAS(G+0lL; zbvmdb)K$83x|dRNdY~MdCzV0sa%+8m-P=SQ5~amYf42dpi^i65gohw%Y-(}YC|1(3 z3H?OX3*&*9w&|zv0%<4K?0nzy?ncMz?jOLXvToVJ5V(%XH6Se&+zytKIh30{go!mAWCIlh!JPOe$1E zWm}?55+TF4G(#R{gNK)*>xNQJ5p{OUVG&@Sc+^qF9rTh$Oa8R47|m5?`d)1}3@6D< zC(*0!c1oXUs%rIl7u-Edl`r4bL$_l98THWoD1>{;R4zr@RLs~ys7+k8T`%Uh%|d?eR|eTB_lX*7 zXio?Vvo_$Z%Oe1jBi!y!e6{sIcanY!(;-lavk!lzz-5%;^mO{&qg!9dyoesLeGUgO z`Y`1E(dnglE+ZDjg-8Xtevje;{7WVDla0n;9(B_w12)ehDyu0KcH4Pg5NssWlpc4;=F61#hF2k;iUv7=gjJC27eoT zVm|?2oX?DV+{!VZK2Yyz$}o=K^!6miIVg zzQrv?=ZkB=u~_+MKrionKJOD>Pua&Ic4WFUc7jItl&WblNN!r4TWntlq7t2$>_TX? zw4HMFgJt+{+$Rn6?q9mjKQ2c&-R!czb~xERQjkcMPBFj71M2YFRzN?SU0E-83l!SN z;0)hYCoc~-pEZw7)!EFkXMA>JLc(rXZ(L`r3J$ zga-Waf;dO;-tUk zG#bS4cVbG%A8CM3mAnQ_IgrjfubVJpIL!o}H&y zUPL3V0VWsz`a4yskoSR9i#jkb#*Y)NuOht`QbtA7!5_nk`(wokW+d=Qlyw4AA2ip` z46@ATO*XxKE2DP=uI4(V{jzf|iwj{NzL>z4M|vyj`c)O+I!%a;o!424k}C9eAm1TZ zG5yBhM2kUOCnoHEr=s?T%~p=qO|h-N99S1556B>#F%!hM#3s^NWJBgjYa+ zN!G6@oPjBWhLBT+US2_h_@(p%G?g*GpUX91WXOS_Z#~L7+kWC)SI}vrsqI3s3=-Vr zdp&QneD3GwOWV5CmJp?`V3m?{Q;6yb%ZVaZe7YrdG$Cs=Xgg)I0a z>a>iuc0k3`o!g*ZCCi^R<+8q4<;rUXj^=15e|WR_(z625^&t6FpP@0#PhoVOz1T&w zv*G0_NFV9paz6-C^ii%w(>$BC6*YnEeY#YpE>>oEQ20@?q3D@c8(+=C!^sM9BJ>l& zF@t9rF>#@F%_{tvMP~V{k^PwULG!Q60D``A#?E1-me)F32Bac>#4$OB=IZD{_}al} z!SwV6;otLjwV#CMQ?CIIvUp_5lAS(N3k&`jGQ3=9Ve}xHKR3v2J2e^9Y~>BSvfsA| zvbYVm)6p*FW`?bZi{D3a%Njmx|Fec{7I(QFs5iIeo5GhZ5Gv+LTu97LH)$8Iz%iOP z@ZmKiu~+W6Y)(x%KG>)68bH4hht;U6`nV|9Fxx*V<5XnYBqFr)2|7Fuf^OCf(R3R{ zoc!G-p5E~}lYM*TACi@OT%JkQwLipzTwY}Y!5z!nbI*xY!1zzky#yU0CAMFmp;(dMKt( zdpp?Dd3t05S~(V&h-MD*Elr#BXHs#?P0E^IT3Vd;=pA%g@n$}*urbZn9#eauzVH1| zYt7?Qk>t{0)OjgxLHjNZx%+84c#btmRsH!(flM~vc-Dk_o{>by-@vF)m1!uJRoh$fqbm9#^NiB zbT1#OPS0kN;1_rHxJ zwlB<^`B?Kic)5aj$>D|DOGucxUT|V2No~L|ghZ#D>x6wurK+HZe|lR&IrNQweve2L z0Pb{K=Rn~(18v%KA{nS6K>;yZL`xxHV>5zQ>jlxjR3_e-sP}yw5fYZ)GZL1XHf7&F zk+=G_?#WBon92&WmshZ@ea%D{cTZ2TV@PA0gpQDsLP7nl3!lP6Gh(fYFFSXY6j->l z0Vg1b(tU8ma9hzQeu?VnJz$Ze$0ICVlFH%tF&93{(l`5K^Bhi(I_FL6kLp?pj#0P6 z#vMx4nK#@QgvGEy0zwcL;sVWbhnII<=ZzH@&M5a*HCj@E+6lLwOU#`Snv2s1$Y|}# zn;_G7-Sov$?is6iaVKA3DZ`Z*R0vtfP%n-dA4%9Jo z$+2(rN`F_SF1D5GUcX~8k}Vhap^3>f@YgcWlWPD<6Q>imq9LZ=P*^k_oo=8F63f<5 zcyDL+sIF1I?84ftG!&X~0m&CT>Yk|GY8a++ZpJ6|EZ`zln_KIWz&=mrn)dGgx$9LR z1#Og`LDgjtX|=Rb>pDjpcLUT*u|ozmqsIdl>+N6B8pa#5qt1*fA)gvqlQQB>lHV)1 z)R^)hW?5jk67oXX#Pa?>Ym$N?TM_5kMlCcwF1#`*dx1a=Fi)ij-;JfVDSLJ2$m8~o zwX_kflx~|Z%6%kl<${U?lBh*ZJU?X+*&VOLhD(PX*W;^95qM0u?n%;-R6&mD4@Mw$Gu$r_*VFP#H z8L-&RG3gX;uNTwWNJX^O?yc$xSj8=99lc!+I;L~JPjsn1lf7!P7psQikz#g2;|I*d zSj-ZXa>e%+DqF51h`N6s@$WQD^#RR3R0pD0%w_D|a+&dTnZQqo4+(p>109Ru={zmQ zv-$?1NEIvzt90Sf6B8E(!eU1c*3R_E#;Il-8|QU>L#Me&NQ}RM)L~HP%i=Th!%iSJ z>+B(GWKl)5cCCLjsg(w4FRXzsK4<1>x^q+GQQJZyd|m5-$4jSJ-W|#=Z3~W}+QSyG zPgezq3JKYirIIz2@@TUG?(QAqk6;c;cp4^>Jkrxz>_r#i@=nEDp8*X|E9;rjYM}Xv zgO*zZC`Qfv?n@W?6yJ+=mu6q{!k5Q|_Kjp_c8VC$!|ovO4D372Ap2k0y?&1272@2R zffm<*sxjWBOrgclXX$bqhn4s*6|!bJsUz5iWHDs@!+5Df>6H_@DdT~}1{`NTWGD|+ zWdD3lUZ~JJ6t>9MO#QDmEYlZGk|7uWER-S(O#CXj2wy#S1y1}C~1 zQJLxzly<@Q>}C_q%^mUrN`F-DIQ&!|;B;M}eHAPQrY`;wY+exiNA znNtJ$r@y}KYU83mW3U+WJ#h%GQ6Cc;qk0l&-CF0wkz5XH&hDrKMulBD2upf$?lD&T z7O4mBh}>k(H{{#+?XTyyAnCkR6Bo~>PYoZ48_%_Z64%`X;}Zc6>)>RmiJCWO&mH%! z0h1Lbdg{;oQk}RZFO({`@l?(9)AIeYr$HARZJmt(*SF_O&2{aKl{KvwkHOF8zyK7c zMR;(IS`;VlX^^7fGIhjmX24VD&k8I1Yg8UypeJ393i{$lWr7t2hq+)_R7Mf0@DWjOUg2AY ziUbv!Z;{HLADu5-3fIo+Y;Z3&^dfuu5xWHrGWTPy@~B?_sDD;Q+P6%8Hu3D-v}Lxc zcO&y_d*2=o^O9G7Gx)M^ycOxk&{?b)H1F*gq-u5m6@H949(YF_A1v+Sa!@MVwYWx* zZxVkgnRqrnN}~Y~cGkHxhUzOtI5OPQ@dqvqP;D9YYBp%R9;|J_Jl0opX}DU*J|F+0 zB^AnkxO~2rC;Oo4z8E^GjpoW;EB9-#LAKkuBMMuTQ9=1iUsji1bBcyZQ^txJV`|3F zP^T3`rHX)hGQX;ZfALyR8*DSQs?1Pyy9V%6F(2|2cVelN6f=dz)vp1{V_B>9!-8kj zrhKzoBI$2n=q*Dr{pEq!bBJW=pZfsN*59g2UU=J^vodGS^f{&&t*As=i0HO?y3U}{ zMJ`ERA;vP8QN!-rdbx5Jh`S!G3Q)BxTuQSGCQ#-6{)G&1HgS_=WP@J(C;7Pn@`a+h zhL2G&Fs;#^kI2)BH177hbw2rmwRTBS5He%Z@NG(AeL0h{d3CX619Z=DytI!HK_2S) zJ309~wYKted))!DD4j4fll38KppM2DJDpYI2Yjoxf^4uwOpARl&Yn>sQ*-bNe24wq z0RB`JAeEIgi!(Z9mx&9ZXAI(2l5cSW&!=7`Y)XhMmNpo->Oi6=NSbdT@DCspUGowQLIn}~DN zt-zS0RKT5czaOR_@v=RDNB(r6W{Ua`7iC*GF_gdL<+B^!)ri)?ZeMkzv5A>%hR>Z z3Nq6IAIx@u;>_=VfLn>{|Jt43$w>aRcDt+Z((oAVI2y<%-_`+j326N7K<|C z4#o(oXwwZnk9l*8(L$6%-03-!g49jg-2b0@v{r+@4yMA^NXH>+x0F)-sPdlNslRDTQ)Q#?!2StA(V#x8=-T;i?9&vl zk!9}Rc)(2{ccPMWWJxv~e_G1aI}MB9pPi)VtDJNm4GoG_f|z+Erh#H8IkYn2Ofea5 z?l@hVEFbfU5|t9jl@Y$}%08cOwhFd}`opE0F15Ah!A@y>#Kb-L4$F$n&-Y1~RE=6S zIqOw#c54ydhB?I9cs+4OFRHJ=ze4D~cNIYOhJ1?;<;A2;jh7S)gWjLm<{s*7md^rr zFARX9gLTgsRm6d(FN#t^eohBTY5UA%V`?JEbX#eLGJVldl5K~nR)WvY$e$P4?7%O` zW%f{Ev+RBC!?!YOA}SbI!^R~yhwas}L=jdjfJ3qYlQs8YlvR5Dp|wcen`G$TrTLZp z-vEb#!pLU%v>HN3`i3L_WlNs8ysW|>bnz0rPj^wdLD*7MSq2N-F9t!Ln=y8;={9@V zHDIEQy^#Dr*x93sZTp*o3(txTOZZeq8$Uw#^<@ zfAfR+C1aKFk=j0`gLgn@?8Msuxv_UzCu0}NteaV_(Z`pi6%y$gm>kIHzI#ky&9FE` zbifdI@%oGPVjvnZT+)YA&6RI&XHe=;9`R z6u)EkvcxA$dtzFAj6Yy5wf%71Z+V1DPO+{;rEK$5yozPbvAJiPALw9g@G zNE(tjIO})(Y3svng2N+yz5*Z4``unY+dQy4QU2Rt&ur_3zY~pXaE^#2-_I)WlqWWK zsVu49@b)8F?!zdL?Is0UG|wBJ6Q{OA+Bq4}?n8by;hvg1rflTxuAFnIi?W-FyWUWc zeBGoY{bZx zWlWm?(In|BHK{;&wf)VNmABd3@1Ol}`(4PG-U6kM7>nxi_Gz=R@zq6OAgn$9=+4g$ zz+|ansAxL_N^Zkc*Opt>J(?!U&W*Oh%lJjlFr6Q;w^ic6tRByHz&BrTWj&SMK?fr) z%!hFvM0Rt&+V}X;4TVDC&#nPYPpnSZa}Y`WF&SPJt2t{0N>Q{rzqLa&E#+LLbia+h z(90k8(<}IDFF~zD`{foFGOB*L3xXtj?eb;o^_)r*&@0W2W>uPk2}Pgm%+@L!U>Zpt z*BZU4;N9p|ZBfcCrgIkIcNrr%IY#x;?5Xjpblf&t)pU1QL_##V18iE7yck%heZp3nC z!sIm+YX~iKmDy^dFI=mY<{+QADMw`LqGl88!nhnB8NqF`Rm}A8-H7_bT+xxZHzHrY zjo9A%+VePn*p3TuC$7diA(+-OgOv7HlUOIMHN=01vl!q?08&Pzw%+qeW})hSO5V`i;}z#U*JjDRmpe z85Vrs#HLx9Z|45Nl4hxXxEPoZsr8V3gqtg!+l&)|&l*AD^$VTg7FNHt28V@D_-D=L z3-;y$7Ap!nf3wDWY+N5@2;}ofF0&{AQcLrFLazZY$0pxY)gL;KN;pN$=^|W}O&G@hO^-pQ^n%z;vNk$1z#oZkm0*!@{9{V==u--d=qY9X(1NKqH1Q zTByd)@5O*7^`}JOwAhaYx0ch$Ft@mFGrqe`7L(@7mZkuBBtaXQsOYYqcWi4)DUsSZyV#ejqC`J8gt{UbiZ2Qy#@d|>y9d}UJQdHTl{JBhvPf646`ME zDbOuu1^*{Q4_MF?P`s75L&j?A05rl<8}ygl4C^6>Mg|-q2AxHlQiEDhNy>10RcWQ@%LLy6Ksacz*~w^tHvx0tfkW} zn1w%u;ol$nKkE;Q9=aKMi_>fSfWK!>Y4=TVFcXas!2iNloJz7HpV@p}2w>SSX@8~P zBzz4}=K!HDJdXm4t)`uGI4X7qzpgWE65x?o@3`hSS**YKosSy6&xFKyzGsb`XjM(k zvJrSZ&=!<0^7Iu2xSYT?CwStCHnHf_Y4w^Bz>_rnM`R4aJh#*s-^m>3P!RbPgbV>d z#o;4%c_X*7ZXjdcw5)Y7u`;xYFx6^b_fpat0 zfE)sI8S0;O=tv_LpOhk+G*xXu6;qIgLFF%;K_`64Kl-bF(BtnjhmLbikKraUu<0#N zfzZa?bO(;XLu(Nf8hJZ&hO*4K0$Qe;3h>sF0G_9%TJr&du?8K6hU{$^ z6|Yd_JYCLS6xo*54VVK*c&6)KVJpUWF1o=#Ctf`M*tsu@L$8`^4OS9ni$C(3cKF%) z2q(!GFsF@PQ|LVyy@-;kn?&BSJxZ`6$fy0L^EghQondp%VMLaGv(nI^cMf- zS~oFj_AePZCR<*g*oy|)&E;PoL8VcXSQ3SZiAw*cMl4_9#0}(QRE73&1sR0|%V=5? zhm>Mx)M})}#w_O)k zm_&!|G(}4Ns@WsNc4-6gd6~^s4qk*m2^Ldh2*G1+8U%h)8}xTm?i$>pXlelV;C`Ku zVx&LGum7BBioZ0ECDlCBG?I{^Ew^vmrxI%%-F0G9;eUMCJ@wn0a1`-UPo;xUa>#GK zWw96;Utn8=H|?oQPYez`0gh3IP1Fyx5zQJur|?Wz@IHlH1ETV|i)yo9hHb_ny%|}L z{g{g-Wo~M>y;24?kp1(`^I44)L#=DTYg93C{-i?Vd}M0ArHMHS<>*Cxj)@r?b;yZT z6)xnwQ`UbrL`zg?S?+9kLK!K#gJ<|+;^Q@;x#x1lQrhhmS~%U}&`xtUecN^Y$}C79 zV)|9Ze@zrm*u(Wb>W}!prO!X_fi9MaMj|`wAQu;4C8Pbz6+S<7_lD|*9hEg2AO4~F zE0%RUi7w~YN54<;FM1w|+?^iX6rq(wZ8G+nQsc|A4NQ>pdV_WxdjPR?3dclzC&&wBW z<sLDrbM=m+l|V^NP&b%ALz0ONYj? zI<1*0nlH6;SsA+>$7NQQ@WTv{I7hqV3Vb5LCv-Rdlb*NMv6&`O-Pw@5A*=N@ZAK8}r-4`faM);;^o8m5dtZ4qo%FR?$6 zD>R+6q?H$5*#6+b^2RD=7o8*2e#s$FRLCSWR6yw_No-^ko z)idbAt>&{eo5%T*bd(y;QE;P9B&SwwV^)EAs!oR-hsHJ*#Co{PTNA-C^KdxujX#Z< zDNJ}M;PCa7b+69}>le(R(9ap;x`#yu#k|9Q+PNwib=iW4$)c8dg>=r#$zeUTWE*Na zgZ^Z9e6R==97G`X&bPKB^uU$cWZF95JZiU<(Zts;Vy^D;Wa^w)w3TUDsB|BAJ@sGR Co6vv& literal 0 HcmV?d00001 diff --git a/Tests/images/imageops_pad_v_0.jpg b/Tests/images/imageops_pad_v_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..caf435796cfb5c1c9fae8f3cc3afedf15f314a8c GIT binary patch literal 12766 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 XX}!MxU+ur<;JAP4u($X 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 n+N;xAP4u($X zRXPMh3xvz>ws)=f)4lK4_rK4Y4`-cOXU#LS_v~jsGdI&WOMpkJiYkf#0s;Vl;PwIB zpaE|H_lSu}i0|GbAtAYc{~qZ>YO;q99z0}tOhrM>!U$w#VPs~0@{FJB3EK;HX6EM- z+%E)$L`6k`TvD=ZIBEjl4FDLEze zXIlEN{DQ(FXmLsDpQ>s^O>JF$Lq}&bBE{-$$xMW5c=FUBFZ~=p9&E_eyvSn=}yHa z9CD9Z{zqPA`+as1okJR{&woj2pNTGW9Q_B{e@FIz1}yad6SDse?Ek?v3wTIGaJzU! zlmHN5<=?O9i^Q`>zoMT5{;U1h9Q>CL{Qu4eh@y9R@S;_~G^NR}J!bYCAZfhVDP~dv z^nf!n>sM+SsS}ikd!F84k?MCuQX-3drkDo*TQM`00`zA}kt4RSK9-%)K&cgrT`*}- z=;#fgz!ZA}_);(1&T=0v6X;Cf$BOV#bUjZ)XI|xdgANjntnz)+b?p3B1*o@;ZCl-K zs%*#i245QDO8r-5H64cwd3w7QyMUMxscT2*c__&hhYv_#0UZyXR$X7;jNKY$?whdRQv-b7=y2|#1Yfm_5 zNM1faOYq+wFxq&{na{Q%*)l54W|)Mf{$Ni#wK#y>ZX)@cHw+_JeApVZG8OnDePSGJ z2g$kt2n7c2hW&zQsUEw=(xnGsYjVJj0V!G{R(=}CYdsWPMS>0|Esv+@mXnKeJcBzQ zn&44#Dn7Q(eWOPsP`KE73+3T;c9}P7JM{)&U1{o)+9z!Hw6f#7{}&MB&q9*HuYrH& zl6*rpzALd5ZDr&h3th|dTum9rMO_6MEt}*W(_IEB_(!W99`RWy`O1yB)L}A$I`{kL zf{=1WH3-ndPyV%$PJ6BbfdeK%7peX3jUHj6kCdK}F76;08*DY>I2vRWSsdmuwyXyJ zSl2aPZEs;>!;6fe!_Ex=;3)36(Fx4CcTi6^ zHc>TM|BcP}mrD1Mex49@6jhFP$Rq9B@TT^>uOJgrS=8kDwp;y#b z)-d`Zq1gN%nogvjHomZYk)pAs?JaHQUP|6leWNfK$}Ju{PTG@wzaS(jn9kP$-OcEN z_$Y;0b7i;5%&Ozp0zmesShym@yd5J=EaqR=4!R1-na#gEPQL^$!$VZf%(`n1(ChngFn~E0~g@6Gjh1`&;-bBMNDKJJ#;9O zk`9irp5Qle$lQ0Lx^l`7!Jfc*k3ijIN?i@#YsT1nLEEXkn8W+)-|b#%86Ou9yA|ba zxEeE0v?##>Urjj|9Eum7+8xvT8A-C^jp4=cbWgL_FT~!vB)QHsvQ#Crk1fE^_OtP| zWlS3KoBa*04K2nsH-J>GJirG6BW+{TdrhMvkMMGmd#LJ&b>Aw^e7ZcWcNRwtyr|pt z1^^WQyy>bpAF6V~{^Qc1D-D{(_@l8u2Jo>?s^7`(THk#XGF<;pl}xfm@4)#{Z5eH{D>Wen&tH$~1HP(ETw;Rb zy4u!qI>u0GCetp|qYYjh(PfZ=?w9-{StGDB(Z`cB*6J@-*58d z_htj2rom$SOO>pD9sGVq2gceeFi?Nc4l%18Z{H5*O4puDWJaCk-r-fvrzTZj8YQZX zR<}xuMFGeNt;Qlm8Iu(R6@X!>Jrwk_QGx8P{i`S`9s!0x#R)GaT%C2@4M0BVr&-K2 z_fD;>g8Qs_p?l#F%OC}A*ln71wN4J9vo6kM3NbZ|-!j(7t`$O^%k6Ydp8dN#k+TWh zbw)jOo5AHo1WDwX+oz`_GtcU})NFq0d>GgTY#w>%xLTfz#;j|Z`x};kJ5*;SI^sZ@ z(OM@lBO;leGja#=(v1BGazAmMw34GgQ#v>eSQk9wX{*(8uqHc6Hk7j|p;M`4!lt{4 z)f!AOoX_Gh4pIFV6^AhL{3g1ChEyA?K<0P#dYF9P)$hb(hu`lQ&g!-AaZY#U%|c~^ zUSmbqvZTFV?QsT?-2m>DKfaRtgYtTh*=k+yTNU2lhHfo11$3uJW{Y`NqVh2?=i}N9 z+u?QHt2eS9<^x>ccB^mWc6tP6>ZfDom$_@(Gle{axSKPr>@j$1IK_B0ptP_$)(jmL zzR$9u%^ssMUi<^e38HfB$8ci&*$v=va%3k?BWzXn? z1Ny<^BcW@YIKPZ`x!G3h3~J$^l7$`f-8yUDJsV-DGEq@o_RrNB==9g6bBWo8ax_$$ zN>5l(866Ik4h)#a@36X2Z`<71}_ZaqC zxQ>vaUSi1wsFq30s=(>D{H=Jj5_HSl(Vaiz#nB6rK1e2XaC&uo3bawAbx1J`k@@Z; zr*aB=swzm8C~Mat$8qSARHPOs;yf6{b-W?#1HO01Q?g=F=R7NyqqGxBQTx`TgGSK2iwKpFWwVT6x%VKXOMi)OGKrMPk46 zFJ>?6b{+p(u$KSE`cdJ;J+??UwF|}=dV*od6Ey#QDz>Dc(F~j_u~F3jQ1WEU`qx^ z#K&DiOB1uogSPuO19H^0@8(lcXGZ_J0qpP`Ge_qx?(jI;+mQbI*QBv>-|H;yXYk6y z3l-#%wagN0ezWB_8yf|W?;;V<$I4s1xT3OLQbqD0D z#rB$t5GD_Q*1ymaOQCJjA6O$2!EYP?Ca*_GaltLv^1`s%=t>fmcVTmZ#@_**I!r>A z7qa4?w%q`NTF*;2FZ-2@+u$2AB=%d;f+}!7*T{yzgh!Ql*bSiD!0+7Bd6)_dx-tVA z#{kC-k6HPuvrk$~fXmm8b8P3XE^%jI-T!nf558L!Ar%8UWWRmW8=#{W3k@2{_FfHB z2^kYR81t3xP`F-u8HL-u9l(azNaSzfgWs+%uJ4~wWBworMjb~=Po(RRr(1!gvzyE^udQaTnfx1n?IhL@Gb8s zy5MdAC*rX0fF9n3Lf&V7UUE-E>`C>|_Cm&wl&Yvv2ySX!LbfD==tO5G`w%K^9p^lQ zFFfaq%R}q%Z+RM=Kyjw#1-*dKz3G^2qx!xPmX4N6i^ z)+8J*OOmhhAju#Z!+uuj7;Q*bs>Q5I3_Q`j{|Lh`cfcZKewPuowidwJwOW$s4mCAG z5)EcNHbYC1NbZc{#(9+Ai69FDs(dBSq01H7HCr)gSCKx`8-TxSMnapXIkxK@+QDcT z=1D_Gb)BzMH#}CE=rU<~Vg+4yScvE3Gbs^{i~=zEh-tJ=PUQNol=h0(II8~9?gJ#9T*Rnv$g3EW3x~m~~ddAKXKADypCGDm1-OQYhH^ zJE!{fTaD<*XaCKGX3p+aWw$6`PP02LUCJpcBDscWR|{s}8tdukRMI?Kb^}n)yaDVY z!Ve@oD#+}q;B+b4*B7^B4B(I;Ym1bOs||h#D)ehUixb^K3!1wCv3*g{(sA$X7c~MQ zLAP09iVa+-8k;aZp(;CKra~)!e@mGqa<5skB0yn$=<12W)D55_sJYC0hC}F2E6HI= zOC#A^M+>$$jjjV*=|eeP@JAY{-)Nsgu(pEq3ODnCk4NjXEY?Gbh5s)}#P_%I1J{#ES)C zaS^kg#ZL%`Yvy@`P-4U?+(I>Y825wwdDq0G=s#EO@URWZ_D%HSY?Frx3a#G!sb=p@ zEc52?GdTo$U}c6yhob@aRwJ`EwF)XLWMuwCH?WV5qB#?yZhggD5zECOKFovCRbj%j z#Mni_Qe`D>0RL#W=|>ay zI+9a1D>h58IZdn#V0ceGoko%q*&DagK7GK_1lQDeBVSI%UgM}ZU3ut?5P~0LP&zf z${t}g5+@@sHuTyWap9ahlG5y6$M5%q^;f;knvEw-^NNb+o;+6Ig`7dEoYfVQ9zd=& zI!XIkcH1gFx=tm3ROTaT|D{W?4Ok*ROZ-+K1uBi*tyW1n8NnHyVar>oRDaL^J2=Z{ z^8#7j$zmX+`VT3s_Dr_%Bu%Y>+4daR4~26BqU<6kyJ2xb;fZrysKT-C4QKXQ6qxq?3CYw^#gKpi+=}mx zNs^~?Kj_U#QHJlX=VZ#ZY(jW`5XQp5p)Z(^a^+LgU-v(Q6&_cGb^Q<#=!&4ys(FSFwfE)s4?j(Enr86-PD*v`Lm2|M zs0P2Dq)MXEMSdrxMHdp(`S;%*@dh}{-v!psaDme_ye`d4D&FenruJvl&&KU+%km-` zAxg7)3Mnj_n?*+G*L)?UIf6TV*s?4a=Wlve`3KB=Ba!eA$9L=7oLpQ}54Rl_a$LzG zvkwBevT7ML3InoNw|Og**>Nv_i4$4ZHXHs%M8MWMt(M(?gl&V#lg(#K=lVsTg5?{A z?EPHHhM<&vnehS4K35J;BXzpmUh2zo&M6dik+8UdsEmmcn3x$a%kO0VQ>fbTpqJ0G zSE^*~*GLxU_MWorc>6dM!Ovar?oPlbww!40FKq>Xzi_Wc3z7-SsJQ=7uYdL%`cO|d z!PGEK8`I8?QcsuJFZ|%6%Z`L8E5m5}!mKJgNQmIaAOG7%RWDgKVZXl0lvPWZk>D5hlPEzjAt77ln;D5e^oM7#lEfcN|A)A^@-!g z%0X1LY_D2MRnV|%4{GIsJ%1rR8AP)yx@9m`d~f}F10RWizhVqfc+vyvV(h5Vt+S4x z$q3R+=KqA4Ze2#-t0XVtIMvJEvu{@+bw_XJ7(>_4#A#PNGqHF^P5Cn=(6H` z0(?%3y+p_J{u~R4k@Yt>C9@!*%Z3^==)iJ+=t?{ zk$%Ua6Fx)DF(+D;qInN~AC_`ys((VGQ`U~~S(%S-bI!MJ0Hp47-+KC|M6pcT9uC_| zMPpmNY;|<`^mSO5726}KOqc&(c zlOTQ^sVSip;Cp)frBtGJg(vQ>qwkmdh~WCt)AZmpCz*39hOL31m+8)(DuO~1Z%|bU zya|KFu+x}AeOws4mFBhQCd#Yclo`n>DC^d$yJPsv7q)Kqb5G%*54mo@8Bvh4_xSqs z24K+glU`=bm{j;Y7W0kaDIK=xc^jAH756QxY9CpCHN0R5iVLb>&8aH-ar84f8&&W# zTnClTt4k@(sBSY>8K&$f3K-Ksrw8!~vUl@yPZxFz%6N|{Hq;3RA5eBeL^hc1p#FWC zDc@5hWiwd7q^APWx=bc_LZ2ToU(6qS&c2JrFa>}S^GL!>*O8(4I)*LtXAU@3`|PGX zOWi1`mlm!5N|I6}TgJ2V5fvGNh+0?i_xOu;^E!5TWx177S~3IKsG&NKd2e5y+0TlX zx=a9PnJ~@X>GvlvFgY6CSEA_R7rQw%dTF2!wYAsGLHIKTQyjjSMLihk!N5RKUl!~Z zSbkE5-t|At`AD4O^fW>SVX@RFxt0yxQA}G$H2k4Rx&e^;e|A{2@M>R=6y%Ms-j6F8 zJM|ck7Ri!dMEhV$Q~xNr7GIRRw_cLg-Y3L!?u}q7e0mC3lUc~cH*duaI1@Qsh5c{F z*}?Pzz9V$S#xK=-Zg&j=e`C~YhY`pYlhTd{lMX|=raD!8LP6qs$f0C&*gh|ByK%u~ zI0ehtMFPJ>EWvnR4i5j(L^L~rBOMhG(BmK0dC;2qWvP3Xp1MO#?(_}ft8Z}#q z1(M{v$db0Gf}HtWg8f<$`M1S!T)5619NPbSc?wTt_(J9*RQivI^VSRmjuR`cH_h(h zfJZ*9jTvaVKCWGmfsf@~>LSeU3W(<0GhSGM8i)OVbG0HqjjYOw%NsH!VL^g7fEfpx zBh56oc3O?xlZ*E^098Yv0QcZO|G5DsOrWj!uN?~=!$ z+c>z1CMr3F9Xr)ne^}96+&n6=)l;|M7pu&C#fPK4^85HC@EmwE9Wb1HW#99 z4Ey}5@MU0QTz6HkHKr7@A7ToMgss*eaTMtEA>;yU<~G-4%S1oVyEVtXVj{oCRC#5_ z+nq#h<=^smaB6a|;LilKHt}41_2?ZKW^2b^aJ_2aDs~?}UzBrg+2bGdlER_FWRq{s z;0NlNYKPE;`)svS{FB?*-ANyb3*5vYjVGgloMg9J`6YHBx}*@I%U8$+`gAIr(|#6; zQ#MjsIJhmnB+dW6yO9bh1@ce0D1ht8L8N~FDxg)WIJ)@?tiJ#Q21+o3HXuOwSct-e|m-@TP= zSa^P)*Xv)857~uk=TwJmrO@3?4v~_v1WR}4sMR*6yq_1TqGyo30Wd0m{ABhHm?m92 z34cSc|9k{Dya(A*Tj1xkkv30r0$>D5ocHizw!VQfZK7ofpeSLmbc2bh;TpK28zXX9S7vQM+@m##o9K<96R{MSa@1eCta$)BT^X>WyY4!+Z9SM zY`wa#A$p~&Aqe1B5Y-8J#Y!`q%gzav;d@0fWUio)w>57fZyiD}HSn&a{x`XXmb0DM zqyfj)KCj~B)b95C3e$i|F9*!4osOj}Z;ry^aJ__wjLE_szmk@wQl*YHk>g{9jCvOa z-7$W~50!I#J>kZcEsT-zT)M{~t@f|@<=@Lb1E_QMc&Fd zU)+0(UoT%?1U3t!6mW|md^qo2JNv;I9Mai!$ASIuvRAqYY)FHA1o&G~;K+T43#{L1hPYeE5Ah z#4D!j$J;bv%a*7sp4-TbX1AGR;yaOBm{@g3%&&%`tPg>k2(L+h2c!e5;y{orzFIHe zk%qKst<$WosTBi@v;leAxFhRMVQ@+<@tEb*Mx`MngA>I;$i6h=?STZxFTW5$445`Z z1TDJw_51Hb56yuui*9!CgGY>|suK^(YD(h&itU(L-v6@u-3yW!-`vZZTzeKpa)^Z! z)zqh>yt3(LcmDpSaPkz}nk9*M7Q5GF{1pQQ8qAO1QkW&TyFqeHluV!1FG^4FeEIl?nEa@sZiVcN8)4yBr5Z~XGF$%@%FrAp~)Dv9+?MPxy~4&6t)}U#yQGPB zW`V=umIJ}oAEjbh^CzpT;g5~Cv`x!$B>QUP4U2*xF!#azuDF>i?xr8d53Q=-dk*u| z!^Py36_Ji*fy(0tyDdZ1!Ky*}jbYb|4yzmWDeGY>oU8bMG>;FZn6x%kwU|6E4Zi28 zrgr#M!KL<}vcv^QvIsFaS(s`R201}nNn1d zR<>xb)qrw+?!RY%#gdFqxfce$iPx=q7c~GnUi1zEhYO4vWo%$P`lkA10@<`Wv;U7%y4w+2r*|n{A1Oe?6V&?>I6=+)U8lv@M$;>vpR{`Gj z3IK-}pNch<&{{1&GiJu-9;roJO2YKZ)hLs6-i@afR9h>BRx;Z)d$v*x%Q)K9FW25` zDK+Ku0V;_K6E;;DrK{L?0aQB%fmFii^O_z-JW%8Ypn&l8;uxWtR7)|17T?Z#4d9baBjsE+&-lp@M4UrDlh>~bn^l}NpdqSDWMx&1vUGWw00wtXXAq7rc|qcC^H zTSgd?Ag6iA2YBB#zxrq$lJ1Sui z^)Jk8h*j-D*YT4?Aiwf3J!=r#S*3O&SElO3iwq;W$8q}Ma?}7g+28NF;E+^MNyw^@tT-L&T=p>zt zoH_8Vsl}aMUExC5H^_d362J}O?l^uCiVs6I6p!izZqjm5qt>`hcWXjoGI>rwae?kD z&F)tUD<;hvmqS&cP@YQ)E!9h{Rf?~g-^rcKK^Q25eaNLb8p8NS7ZATh+WF*po`sX6|WLiU_x7?oS z8dtwJqeQ&Gi#dhB!1G3OI+h^1@#q83J=;zL9Vh59DfWWi8eYsA*`!|E@53^UYi>b6 zm-kdovaGoKIx2iBKr>Ig1T5!P9oMa6M8p+3-&>T;F-AfrT%BIFu?p^BvcPs={4Q01~RHl&K z`I|0cc5j_XMU{*=_-Mf>Ljirj5KH0YrK4MDlYbB>aXk%xS#y3U#4 zw(K`sd**rIVzj-uj=A~3dONK|3(EgH34m%m`XXbQBxGQ$t z-^~igl;-oCm4WW-(?ZNC>s#}MZ+oT&K7{u>E_L#=g~s3APj4{%DsUpJ;q`zQ!nr3B zISrdoJ-g${*#bQT#=`CGk_)ChXyfDK zlo-pb7f6ZC`zoYFy&KK*{XsSAgYHG~bo2*)sa)6-wlA-X0I!Pspb58{4k1yre6r2R(L4i^$!Jw%zcl!YG#@af>x3z>1<--!F|9|K0I>AI_`}unfT>DV z(=BEinzSl!rJ;l9LoEjJKrK%a=bTHzsb;fB9(xutJI73ME*lmH&NqNjg}@=Ah4R5c z?MCXlAudhCWIW|3>d=%gkJ2erJ@~onbBU;}QlbH54_*xs{(MY?q1;ia-hF8DG{7pE zfGhsJ{vJrHe*7S17A1?S@tq^F3dph62$co`eBa<7H=8Bc4V8m-6s6ZqSm;^HW}8uq zOVIFN3;{20dHPW54Io~>H4^{Gg4{k=XfSI8E`a}wtvHinMZB>4xfsZDSlag1pz(I6 z)Zmas;=GQ7OKfIc@;EB?27hkSZxi4VSfBW&ciF6e`CX3df1yKSy*{!=O}40}W!nin z9cTp?igLas1HlMB<$alarb8meIjd1U3V4=o@Pw593lE_h;|H0OJhHpKMIl1~*^=;4 z`+`xz>|4mFcg-8^Osw>+;*8f#$lUoH+R?$z$W|0W83Xz~^|by7~w^3?pAF=Mef2J+>D)Us0=b&Reln^T%|A(^@?c_s;qm zd8n2@;xJP3!|{TVcy)%iILhBI4Q_g*foVw^U1YXnq630Abo@P$)a8cU$IIs)<*B#M zZ-1LB=`IlZiOVC=maiLCSMmS3tg=#u7Cmw}DpNm~IhDgFmuA13ee5EIr_$_PR~i~S zH#9vY$jR`E~80la$bZ~V|T82Hpdp4u7l48#!t$;YlV&H z__|D0Sl!QK^*za#wQ0C~HD%zb-Z= z?pMgtht1Z(!0*D}n>o_``ItBJ^)TRj^Q%km;%)nWH&&S=g`Rr9`RWnIj^@& z?YAlX9sAAFGOy-r6Jt|$9o5(bxLss2(=F*mcR%Q`Ci6WNPiX@+$3~X0MXIb(DzR?L z67TA?JM*n&SZVD0Gl!V}fL?)G4%a57uLrYjz)k&@N~K;8gMzrlTlxwR~B)=4_WMWN&JCvjrG9p^U+(a zDG8e&)~-5vdx!-%c7(}opq?eH0AFZiMY+jJpNQ#YJ`%~Cg6%9YW*9NrMnl%;O#JF4 zNe(QpU;UGHjBPwL>#hP!8S$Ngy+P-tI_WX?Cz5i-JBIFg2TFPUiHYq6GMUze-rgXJ z3OKB5%PSdpGU)%~`oLlB07jOzgRbl|^+tXG!=4Xmh&RxW=SzQfa~OnY{(WWa%`>?n z@Zq0_`Qq|71!R=74gOYw_&eLA^ob{^Y_f>}l$EPQ4xZS=+KSDDr?yyIEQ#WunB5EH z^#-+8op`}1hUKTquQZb?Qof%$-I5_?$3BSmp1B!K-r`sPZ$DmjGl)K%Eb}0b*x|Fn zw|mddIRW>%@zx9Q_LaTQ#B&0l!8-}yBe6)8T?vZ*FZsB-EBiVA;Tqsq>2WjL+fsty z^$p<9WH^u-`y7vLIXGv8Tqo2Ch0K0m#kIm-MvN#!R+_^1f+V0|&<)^ssqsM0gSgL&|=7T3MZw9Dw4k6p4N(qU@Uw6K3H2G_NuA+;mLq z)l61R*vd@a;nrWhC9cbgthvg)t061LhVoi%^bA!}&3ty|e)~zejTHowDJ#Lz=ClTx zOfXIzvEhHC7c(Tt%jioWJvJU*FbaLLUOJJLlk1#>*#bOZVO*=fXBf8GqI+)TB}BaP%5#Hg82UKa$dV;0?eMHX(7Ed%t1s7|1Ef zxxTymlXkKnCp069amHY3h(Y#8wd9_6&8HaIp6&Tvg{FHxL9IR+oI-J#@gUae;-=R` zTQxQ2Z(Dp@j%5~8UBoHlTg|88v;k?hyr~O{Zi2+ztQ+#tjmNc;rk*3so{d!l`izN* zN|lbEO{cdX_@|l_-TDxDTaYy4#{Pi|*AvwX_eH{{iw(P{g;F%+nu17(aR-7+yQU$# z$RbU*{WXW?E>@Nmv(H-{!GUHN4!-5V=4L@6LxC9e8QUJ;Q`RKZpl~nRq?V!Bu!MKm zUngG$r6E_ukRoPP0HtwRO$qC!Cf!og9Sk5P_Qk?g&aDN~h;v(yM+UCdrqVY7m(lwz bjHZ765%aZIr!$u%Vl7Oo!exiRo0 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)) + 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)) + return out + + def crop(image, border=0): """ Remove border from image. The same amount of pixels are removed From 1c47313658a0c6c833c27e1f7c695b8949ff13ad Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 26 Sep 2018 20:26:00 +1000 Subject: [PATCH 0518/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f87005d03ae..dcd76bb8243 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Give correct extrema for I;16 format images #3359 + [bz2] + +- Added PySide2 #3279 + [radarhere] + - Corrected TIFF tags #3369 [radarhere] From 7b425a96c118916ca2df093c28752235c831ffb9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 26 Sep 2018 20:57:01 +1000 Subject: [PATCH 0519/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dcd76bb8243..453c0e27b72 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Added ImageOps pad method #3364 + [radarhere] + - Give correct extrema for I;16 format images #3359 [bz2] From 36baea18eee2f157cee5c9c6235c3797a04233a6 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 26 Sep 2018 13:58:15 +0300 Subject: [PATCH 0520/1393] flake8 --- Tests/test_image_crop.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_crop.py b/Tests/test_image_crop.py index 27a7f07d14c..fe92dd865f0 100644 --- a/Tests/test_image_crop.py +++ b/Tests/test_image_crop.py @@ -2,6 +2,7 @@ from PIL import Image + class TestImageCrop(PillowTestCase): def test_crop(self): From 2389492f96f8fc82e702a9311b3389f2fbe3a494 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 26 Sep 2018 14:09:31 +0300 Subject: [PATCH 0521/1393] flake8 --- Tests/test_decompression_bomb.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index b0b9430d460..0a30e25f1b5 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -6,7 +6,6 @@ ORIGINAL_LIMIT = Image.MAX_IMAGE_PIXELS -from PIL.Image import DecompressionBombWarning, DecompressionBombError class TestDecompressionBomb(PillowTestCase): @@ -67,7 +66,7 @@ def test_crop_decompression_checks(self): im = Image.new("RGB", (100, 100)) good_values = ((-9999, -9999, -9990, -9990), - (-999, -999, -990, -990)) + (-999, -999, -990, -990)) warning_values = ((-160, -160, 99, 99), (160, 160, -99, -99)) @@ -76,14 +75,15 @@ def test_crop_decompression_checks(self): (99909, 99990, -99999, -99999)) for value in good_values: - self.assertEqual(im.crop(value).size, (9,9)) + self.assertEqual(im.crop(value).size, (9, 9)) for value in warning_values: - self.assert_warning(DecompressionBombWarning, im.crop, value) + self.assert_warning(Image.DecompressionBombWarning, im.crop, value) for value in error_values: - with self.assertRaises(DecompressionBombError): + with self.assertRaises(Image.DecompressionBombError): im.crop(value) + if __name__ == '__main__': unittest.main() From f13c150f00ec5c8c93f57aec56b1bba906b3cd83 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 26 Sep 2018 14:38:33 +0300 Subject: [PATCH 0522/1393] Hide the Ghostscript progress dialog on Windows --- src/PIL/EpsImagePlugin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 0c50afe136f..6da3a36deb6 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -139,7 +139,12 @@ def Ghostscript(tile, size, fp, scale=1): # push data through ghostscript try: with open(os.devnull, 'w+b') as devnull: - subprocess.check_call(command, stdin=devnull, stdout=devnull) + startupinfo = None + if sys.platform.startswith('win'): + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.check_call(command, stdin=devnull, stdout=devnull, + startupinfo=startupinfo) im = Image.open(outfile) im.load() finally: From ae415907cbd94fbc9ab79592fc5fd9674654d22f Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 26 Sep 2018 14:38:44 +0300 Subject: [PATCH 0523/1393] flake8 and tidy up --- src/PIL/EpsImagePlugin.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 6da3a36deb6..7c55f7c66f9 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -41,7 +41,7 @@ if hasattr(shutil, 'which'): which = shutil.which else: - # Python < 3.3 + # Python 2 import distutils.spawn which = distutils.spawn.find_executable for binary in ('gswin32c', 'gswin64c', 'gs'): @@ -62,7 +62,7 @@ def has_ghostscript(): subprocess.check_call(['gs', '--version'], stdout=devnull) return True except OSError: - # no ghostscript + # No Ghostscript pass return False @@ -97,9 +97,9 @@ def Ghostscript(tile, size, fp, scale=1): os.close(in_fd) infile = infile_temp - # ignore length and offset! - # ghostscript can read it - # copy whole file to read in ghostscript + # Ignore length and offset! + # Ghostscript can read it + # Copy whole file to read in Ghostscript with open(infile_temp, 'wb') as f: # fetch length of fp fp.seek(0, 2) @@ -115,13 +115,13 @@ def Ghostscript(tile, size, fp, scale=1): lengthfile -= len(s) f.write(s) - # Build ghostscript command + # Build Ghostscript command command = ["gs", "-q", # quiet mode "-g%dx%d" % size, # set output geometry (pixels) "-r%fx%f" % res, # set input DPI (dots per inch) "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages, + "-dNOPAUSE", # don't pause between pages "-dSAFER", # safe mode "-sDEVICE=ppmraw", # ppm driver "-sOutputFile=%s" % outfile, # output file @@ -136,7 +136,7 @@ def Ghostscript(tile, size, fp, scale=1): raise WindowsError('Unable to locate Ghostscript on paths') command[0] = gs_windows_binary - # push data through ghostscript + # push data through Ghostscript try: with open(os.devnull, 'w+b') as devnull: startupinfo = None @@ -232,7 +232,7 @@ def _open(self): try: m = split.match(s) - except re.error as v: + except re.error: raise SyntaxError("not an EPS file") if m: @@ -247,7 +247,7 @@ def _open(self): self.size = box[2] - box[0], box[3] - box[1] self.tile = [("eps", (0, 0) + self.size, offset, (length, box))] - except: + except Exception: pass else: From b5af2837328a9f5a7ba1c4732058214814a772cd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 26 Sep 2018 22:22:17 +1000 Subject: [PATCH 0524/1393] Added support to floodfill for non-RGB colors --- Tests/images/imagedraw_floodfill_L.png | Bin 0 -> 144 bytes ...odfill.png => imagedraw_floodfill_RGB.png} | Bin Tests/images/imagedraw_floodfill_RGBA.png | Bin 0 -> 253 bytes Tests/test_imagechops.py | 14 ++++----- Tests/test_imagedraw.py | 27 +++++++++++------- src/PIL/ImageDraw.py | 9 ++++-- 6 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 Tests/images/imagedraw_floodfill_L.png rename Tests/images/{imagedraw_floodfill.png => imagedraw_floodfill_RGB.png} (100%) create mode 100644 Tests/images/imagedraw_floodfill_RGBA.png diff --git a/Tests/images/imagedraw_floodfill_L.png b/Tests/images/imagedraw_floodfill_L.png new file mode 100644 index 0000000000000000000000000000000000000000..4139e66d84e5159d161ed71025a97e987c6b32c1 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp52o_Rg}?3lo%Viqd;QLuiGs}XuS=^L_6w@G tO^|R*V(Fwgn5V0s%Q~loCIFcRNE`qF literal 0 HcmV?d00001 diff --git a/Tests/test_imagechops.py b/Tests/test_imagechops.py index 3714675cffd..06febc6d217 100644 --- a/Tests/test_imagechops.py +++ b/Tests/test_imagechops.py @@ -48,7 +48,7 @@ def test_sanity(self): def test_add(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") - im2 = Image.open("Tests/images/imagedraw_floodfill.png") + im2 = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.add(im1, im2) @@ -60,7 +60,7 @@ def test_add(self): def test_add_scale_offset(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") - im2 = Image.open("Tests/images/imagedraw_floodfill.png") + im2 = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.add(im1, im2, scale=2.5, offset=100) @@ -82,7 +82,7 @@ def test_add_clip(self): def test_add_modulo(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") - im2 = Image.open("Tests/images/imagedraw_floodfill.png") + im2 = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.add_modulo(im1, im2) @@ -104,7 +104,7 @@ def test_add_modulo_no_clip(self): def test_blend(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") - im2 = Image.open("Tests/images/imagedraw_floodfill.png") + im2 = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.blend(im1, im2, 0.5) @@ -181,7 +181,7 @@ def test_duplicate(self): def test_invert(self): # Arrange - im = Image.open("Tests/images/imagedraw_floodfill.png") + im = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.invert(im) @@ -228,7 +228,7 @@ def test_multiply_black(self): def test_multiply_green(self): # Arrange - im = Image.open("Tests/images/imagedraw_floodfill.png") + im = Image.open("Tests/images/imagedraw_floodfill_RGB.png") green = Image.new("RGB", im.size, "green") # Act @@ -273,7 +273,7 @@ def test_offset(self): def test_screen(self): # Arrange im1 = Image.open("Tests/images/imagedraw_ellipse_RGB.png") - im2 = Image.open("Tests/images/imagedraw_floodfill.png") + im2 = Image.open("Tests/images/imagedraw_floodfill_RGB.png") # Act new = ImageChops.screen(im1, im2) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 76868cbf815..ad3e8b2cbda 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -344,19 +344,26 @@ def test_big_rectangle(self): self.assert_image_similar(im, Image.open(expected), 1) def test_floodfill(self): - # Arrange - im = Image.new("RGB", (W, H)) - draw = ImageDraw.Draw(im) - draw.rectangle(BBOX2, outline="yellow", fill="green") - centre_point = (int(W/2), int(H/2)) red = ImageColor.getrgb("red") - im_floodfill = Image.open("Tests/images/imagedraw_floodfill.png") - # Act - ImageDraw.floodfill(im, centre_point, red) + for mode, value in [ + ("L", 1), + ("RGBA", (255, 0, 0, 0)), + ("RGB", red) + ]: + # Arrange + im = Image.new(mode, (W, H)) + draw = ImageDraw.Draw(im) + draw.rectangle(BBOX2, outline="yellow", fill="green") + centre_point = (int(W/2), int(H/2)) - # Assert - self.assert_image_equal(im, im_floodfill) + # Act + ImageDraw.floodfill(im, centre_point, value) + + # Assert + expected = "Tests/images/imagedraw_floodfill_"+mode+".png" + im_floodfill = Image.open(expected) + self.assert_image_equal(im, im_floodfill) # Test that using the same colour does not change the image ImageDraw.floodfill(im, centre_point, red) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 3c4cd3d230d..511bae53711 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -430,8 +430,11 @@ def floodfill(image, xy, value, border=None, thresh=0): edge = new_edge -def _color_diff(rgb1, rgb2): +def _color_diff(color1, color2): """ - Uses 1-norm distance to calculate difference between two rgb values. + Uses 1-norm distance to calculate difference between two values. """ - return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) + if isinstance(color2, tuple): + return sum([abs(color1[i]-color2[i]) for i in range(0, len(color2))]) + else: + return abs(color1-color2) From e2c17ab59b1d244b2ff21855c7b7e42b94bc3e58 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 26 Sep 2018 23:29:08 +1000 Subject: [PATCH 0525/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 453c0e27b72..fce3adca591 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,18 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Added support to ImageDraw.floodfill for non-RGB colors #3377 + [radarhere] + +- Tests: Avoid catching unexpected exceptions in tests #2203 + [jdufresne] + +- Use TextIOWrapper.detach() instead of NoCloseStream #2214 + [jdufresne] + +- Added transparency to matrix conversion #3205 + [radarhere] + - Added ImageOps pad method #3364 [radarhere] From 69f315a58551361547ecde0660d306b7a3c7b754 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Wed, 26 Sep 2018 09:44:45 -0700 Subject: [PATCH 0526/1393] PR feedback: simplified key construct for fillorder=2; indentation fixes --- src/PIL/TiffImagePlugin.py | 9 +++------ src/libImaging/TiffDecode.c | 12 ++++++------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index fa8f984f437..50746688e03 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1256,11 +1256,8 @@ def _setup(self): # bits, so stripes of the image are reversed. See # https://github.com/python-pillow/Pillow/issues/279 if fillorder == 2: - key = ( - self.tag_v2.prefix, photo, sampleFormat, 1, - self.tag_v2.get(BITSPERSAMPLE, (1,)), - self.tag_v2.get(EXTRASAMPLES, ()) - ) + # Replace fillorder with fillorder=1 + key = key[:3] + (1,) + key[4:] if DEBUG: print("format key:", key) # this should always work, since all the @@ -1315,7 +1312,7 @@ def _setup(self): self.tile.append( (self._compression, (x, y, min(x+w, xsize), min(y+h, ysize)), - offset, a)) + offset, a)) x = x + w if x >= self.size[0]: x, y = 0, y + h diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 8722278da06..98302389b4d 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -236,14 +236,14 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); - if (TIFFIsTiled(tiff)) { - uint32 x, y, tile_y; + if (TIFFIsTiled(tiff)) { + uint32 x, y, tile_y; uint32 tileWidth, tileLength; UINT8 *new_data; - state->bytes = TIFFTileSize(tiff); + state->bytes = TIFFTileSize(tiff); - /* overflow check for malloc */ + /* overflow check for malloc */ if (state->bytes > INT_MAX - 1) { state->errcode = IMAGING_CODEC_MEMORY; TIFFClose(tiff); @@ -285,8 +285,8 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int // TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1], ((UINT8 *)bbb)[2], ((UINT8 *)bbb)[3])); state->shuffle((UINT8*) im->image[tile_y + y] + x * im->pixelsize, - state->buffer + tile_y * (state->bytes / tileLength), - min(tileWidth, state->xsize - x) + state->buffer + tile_y * (state->bytes / tileLength), + min(tileWidth, state->xsize - x) ); } } From ddf85de4812932333c258a78e8fb75075a1e2cf1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 06:22:54 +1000 Subject: [PATCH 0527/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index fce3adca591..7d7856924f3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Fixed decompression bomb check in _crop #3313 + [dinkolubina, hugovk] + - Added support to ImageDraw.floodfill for non-RGB colors #3377 [radarhere] From e5491f8162ae4295417f3d757040b6914bb3b86e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 19:40:12 +1000 Subject: [PATCH 0528/1393] Expected 2 blank lines --- Tests/test_image_rotate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 17d394a029e..77c934e5d9d 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -124,5 +124,6 @@ def test_alpha_rotate_with_fill(self): corner = im.getpixel((0,0)) self.assertEqual(corner, (255, 0, 0, 255)) + if __name__ == '__main__': unittest.main() From 9ee467d84345acaadf7f274de74175c1265ea4ef Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 19:41:27 +1000 Subject: [PATCH 0529/1393] Too many blank lines --- Tests/test_imageops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index ce8a6629d38..cf6a7b0d971 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -93,7 +93,6 @@ def test_pad(self): "Tests/images/imageops_pad_"+label+"_"+str(i)+".jpg") self.assert_image_similar(new_im, target, 6) - def test_pil163(self): # Division by zero in equalize if < 255 pixels in image (@PIL163) From 6dd0e48d9a687e6aa244fe70b809558d7bdb909f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 19:43:39 +1000 Subject: [PATCH 0530/1393] Missing whitespace --- Tests/test_image_rotate.py | 4 ++-- Tests/test_imagedraw.py | 12 ++++++------ Tests/test_imageops.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 77c934e5d9d..e788e722f0c 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -114,14 +114,14 @@ def test_alpha_rotate_no_fill(self): # Alpha images are handled differently internally im = Image.new('RGBA', (10, 10), 'green') im = im.rotate(45, expand=1) - corner = im.getpixel((0,0)) + corner = im.getpixel((0, 0)) self.assertEqual(corner, (0, 0, 0, 0)) def test_alpha_rotate_with_fill(self): # Alpha images are handled differently internally im = Image.new('RGBA', (10, 10), 'green') im = im.rotate(45, expand=1, fillcolor=(255, 0, 0, 255)) - corner = im.getpixel((0,0)) + corner = im.getpixel((0, 0)) self.assertEqual(corner, (255, 0, 0, 255)) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index ad3e8b2cbda..5a945e8b222 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -622,12 +622,12 @@ def test_same_color_outline(self): ["red", "#f00"] ]: for operation, args in { - 'chord':[BBOX1, 0, 180], - 'ellipse':[BBOX1], - 'shape':[s], - 'pieslice':[BBOX1, -90, 45], - 'polygon':[[(18, 30), (85, 30), (60, 72)]], - 'rectangle':[BBOX1] + 'chord': [BBOX1, 0, 180], + 'ellipse': [BBOX1], + 'shape': [s], + 'pieslice': [BBOX1, -90, 45], + 'polygon': [[(18, 30), (85, 30), (60, 72)]], + 'rectangle': [BBOX1] }.items(): # Arrange im = Image.new(mode, (W, H)) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index cf6a7b0d971..70b1659d928 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -84,7 +84,7 @@ def test_pad(self): ("h", None, (im.width * 4, im.height * 2)), ("v", "#f00", (im.width * 2, im.height * 4)) ]: - for i, centering in enumerate([(0,0), (0.5, 0.5), (1, 1)]): + for i, centering in enumerate([(0, 0), (0.5, 0.5), (1, 1)]): new_im = ImageOps.pad(im, new_size, color=color, centering=centering) self.assertEqual(new_im.size, new_size) From 9b0d4baa8c4e2b0811d87e89c4691bca56072b8d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 20:14:22 +1000 Subject: [PATCH 0531/1393] Continuation line under-indented for visual indent --- Tests/test_color_lut.py | 12 ++++++------ Tests/test_imagecms.py | 20 ++++++++++---------- src/PIL/PdfParser.py | 10 +++++----- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 6d0b76fed24..ec370f70a09 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -335,35 +335,35 @@ def test_numpy_formats(self): g.transpose(Image.ROTATE_180)]) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.float32)[:-1] with self.assertRaisesRegex(ValueError, "should have table_channels"): im.filter(lut) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = (numpy.array(lut.table, dtype=numpy.float32) .reshape((7 * 9 * 11), 3)) with self.assertRaisesRegex(ValueError, "should have table_channels"): im.filter(lut) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.float16) self.assert_image_equal(im, im.filter(lut)) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.float32) self.assert_image_equal(im, im.filter(lut)) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.float64) self.assert_image_equal(im, im.filter(lut)) lut = ImageFilter.Color3DLUT.generate((7, 9, 11), - lambda r, g, b: (r, g, b)) + lambda r, g, b: (r, g, b)) lut.table = numpy.array(lut.table, dtype=numpy.int32) im.filter(lut) lut.table = numpy.array(lut.table, dtype=numpy.int8) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 1fdfe916dd8..dc6c85f0595 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -175,11 +175,11 @@ def test_lab_color_profile(self): def test_unsupported_color_space(self): self.assertRaises(ImageCms.PyCMSError, - ImageCms.createProfile, "unsupported") + ImageCms.createProfile, "unsupported") def test_invalid_color_temperature(self): self.assertRaises(ImageCms.PyCMSError, - ImageCms.createProfile, "LAB", "invalid") + ImageCms.createProfile, "LAB", "invalid") def test_simple_lab(self): i = Image.new('RGB', (10, 10), (128, 128, 128)) @@ -446,20 +446,20 @@ def create_test_image(): self.assert_image_equal(source_image_aux, result_image_aux) def test_preserve_auxiliary_channels_rgba(self): - self.assert_aux_channel_preserved(mode='RGBA', - transform_in_place=False, preserved_channel='A') + self.assert_aux_channel_preserved( + mode='RGBA', transform_in_place=False, preserved_channel='A') def test_preserve_auxiliary_channels_rgba_in_place(self): - self.assert_aux_channel_preserved(mode='RGBA', - transform_in_place=True, preserved_channel='A') + self.assert_aux_channel_preserved( + mode='RGBA', transform_in_place=True, preserved_channel='A') def test_preserve_auxiliary_channels_rgbx(self): - self.assert_aux_channel_preserved(mode='RGBX', - transform_in_place=False, preserved_channel='X') + self.assert_aux_channel_preserved( + mode='RGBX', transform_in_place=False, preserved_channel='X') def test_preserve_auxiliary_channels_rgbx_in_place(self): - self.assert_aux_channel_preserved(mode='RGBX', - transform_in_place=True, preserved_channel='X') + self.assert_aux_channel_preserved( + mode='RGBX', transform_in_place=True, preserved_channel='X') def test_auxiliary_channels_isolated(self): # test data in aux channels does not affect non-aux channels diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index 971f4451436..e99040bcee7 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -450,12 +450,12 @@ def write_catalog(self): self.pages_ref = self.next_object_id(0) self.rewrite_pages() self.write_obj(self.root_ref, - Type=PdfName(b"Catalog"), - Pages=self.pages_ref) + Type=PdfName(b"Catalog"), + Pages=self.pages_ref) self.write_obj(self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages) + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages) return self.root_ref def rewrite_pages(self): From 90a9e85db39745cb828e4c9ef28d36092c2d293c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 20:00:42 +1000 Subject: [PATCH 0532/1393] Local variable is assigned to but never used --- Tests/test_imagetk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 2df35c5847f..14ce74eb1e3 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -25,7 +25,7 @@ def setUp(self): self.skipTest("Tk not installed") try: # setup tk - app = tk.Frame() + tk.Frame() # root = tk.Tk() except (tk.TclError) as v: self.skipTest("TCL Error: %s" % v) From f8fbac68ded91d8371ad7f04582a0991eb220f3c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 20:15:37 +1000 Subject: [PATCH 0533/1393] Removed unused imports --- Tests/test_file_gd.py | 2 -- Tests/test_file_tiff.py | 1 - src/PIL/ImageFile.py | 1 - 3 files changed, 4 deletions(-) diff --git a/Tests/test_file_gd.py b/Tests/test_file_gd.py index 326b0c4b27d..b303369b462 100644 --- a/Tests/test_file_gd.py +++ b/Tests/test_file_gd.py @@ -2,8 +2,6 @@ from PIL import GdImageFile -import io - TEST_GD_FILE = "Tests/images/hopper.gd" diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 68429f24939..4209e39112e 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,6 +1,5 @@ import logging from io import BytesIO -import struct import sys from helper import unittest, PillowTestCase, hopper diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index bdcc43d1faa..915557a5768 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -30,7 +30,6 @@ from . import Image from ._util import isPath import io -import os import sys import struct From a8261a2e89bdcac02a601a176db856cbc32ea650 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 20:35:00 +1000 Subject: [PATCH 0534/1393] Line too long --- Tests/check_imaging_leaks.py | 5 ++--- Tests/helper.py | 4 ++-- Tests/test_bmp_reference.py | 3 ++- Tests/test_file_tiff.py | 3 ++- Tests/test_file_tiff_metadata.py | 16 ++++++++++------ Tests/test_file_webp.py | 6 ++++-- Tests/test_image_convert.py | 3 ++- Tests/test_lib_pack.py | 15 ++++++++++----- Tests/test_pdfparser.py | 8 ++++++-- src/PIL/GdImageFile.py | 3 ++- src/PIL/ImageFont.py | 3 ++- src/PIL/ImageQt.py | 3 ++- 12 files changed, 46 insertions(+), 26 deletions(-) diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index eb9426eee97..0c41b6da174 100755 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -25,9 +25,8 @@ def _test_leak(self, min_iterations, max_iterations, fn, *args, **kwargs): if i < min_iterations: mem_limit = mem + 1 continue - self.assertLessEqual(mem, mem_limit, - msg='memory usage limit exceeded after %d iterations' - % (i + 1)) + msg = 'memory usage limit exceeded after %d iterations' % (i + 1) + self.assertLessEqual(mem, mem_limit, msg) def test_leak_putdata(self): im = Image.new('RGB', (25, 25)) diff --git a/Tests/helper.py b/Tests/helper.py index b6ef6dc133d..8fb34848b6f 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -272,8 +272,8 @@ def _test_leak(self, core): for cycle in range(self.iterations): core() mem = (self._get_mem_usage() - start_mem) - self.assertLess(mem, self.mem_limit, - msg='memory usage limit exceeded in iteration %d' % cycle) + msg = 'memory usage limit exceeded in iteration %d' % cycle + self.assertLess(mem, self.mem_limit, msg) # helpers diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index 015a9ebdfba..af25f71622b 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -42,7 +42,8 @@ def test_questionable(self): im = Image.open(f) im.load() if os.path.basename(f) not in supported: - print("Please add %s to the partially supported bmp specs." % f) + print("Please add %s to the partially supported" + " bmp specs." % f) except Exception: # as msg: if os.path.basename(f) in supported: raise diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 4209e39112e..cbfc63d74a4 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -58,7 +58,8 @@ def test_wrong_bits_per_sample(self): self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (52, 53)) - self.assertEqual(im.tile, [('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))]) + self.assertEqual(im.tile, + [('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))]) im.load() def test_set_legacy_api(self): diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 0a958454c56..d1e2b577e1f 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -56,7 +56,8 @@ def test_rt_metadata(self): loaded = Image.open(f) self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (len(bindata),)) - self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (len(bindata),)) + self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], + (len(bindata),)) self.assertEqual(loaded.tag[ImageJMetaData], bindata) self.assertEqual(loaded.tag_v2[ImageJMetaData], bindata) @@ -75,8 +76,10 @@ def test_rt_metadata(self): img.save(f, tiffinfo=info) loaded = Image.open(f) - self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) - self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) + self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], + (8, len(bindata) - 8)) + self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], + (8, len(bindata) - 8)) def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') @@ -133,8 +136,8 @@ def test_write_metadata(self): if isinstance(v, IFDRational): original[k] = IFDRational(*_limit_rational(v, 2**31)) if isinstance(v, tuple) and isinstance(v[0], IFDRational): - original[k] = tuple([IFDRational( - *_limit_rational(elt, 2**31)) for elt in v]) + original[k] = tuple([IFDRational(*_limit_rational(elt, 2**31)) + for elt in v]) ignored = ['StripByteCounts', 'RowsPerStrip', 'PageNumber', 'StripOffsets'] @@ -184,7 +187,8 @@ def test_iccprofile(self): def test_iccprofile_binary(self): # https://github.com/python-pillow/Pillow/issues/1526 - # We should be able to load this, but probably won't be able to save it. + # We should be able to load this, + # but probably won't be able to save it. im = Image.open('Tests/images/hopper.iccprofile_binary.tif') self.assertEqual(im.tag_v2.tagtype[34675], 1) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 25d3cb462c5..fa01cf93e90 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -38,7 +38,8 @@ def test_read_rgb(self): # generated with: # dwebp -ppm ../../Tests/images/hopper.webp -o hopper_webp_bits.ppm - self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_bits.ppm', 1.0) + self.assert_image_similar_tofile( + image, 'Tests/images/hopper_webp_bits.ppm', 1.0) def test_write_rgb(self): """ @@ -58,7 +59,8 @@ def test_write_rgb(self): image.getdata() # generated with: dwebp -ppm temp.webp -o hopper_webp_write.ppm - self.assert_image_similar_tofile(image, 'Tests/images/hopper_webp_write.ppm', 12.0) + self.assert_image_similar_tofile( + image, 'Tests/images/hopper_webp_write.ppm', 12.0) # This test asserts that the images are similar. If the average pixel # difference between the two images is less than the epsilon value, diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 84c1cc82ec6..1b3815d8034 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -204,7 +204,8 @@ def matrix_convert(mode): target = Image.open('Tests/images/hopper-XYZ.png') if converted_im.mode == 'RGB': self.assert_image_similar(converted_im, target, 3) - self.assertEqual(converted_im.info['transparency'], (105, 54, 4)) + self.assertEqual(converted_im.info['transparency'], + (105, 54, 4)) else: self.assert_image_similar(converted_im, target.getchannel(0), 1) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 635b5679a25..2fb7da2815e 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -221,7 +221,8 @@ def assert_unpack(self, mode, rawmode, data, *pixels): data_len = data * len(pixels) data = bytes(bytearray(range(1, data_len + 1))) - im = Image.frombytes(mode, (len(pixels), 1), data, "raw", rawmode, 0, 1) + im = Image.frombytes(mode, (len(pixels), 1), data, + "raw", rawmode, 0, 1) for x, pixel in enumerate(pixels): self.assertEqual(pixel, im.getpixel((x, 0))) @@ -265,9 +266,11 @@ def test_LA(self): def test_P(self): self.assert_unpack("P", "P;1", b'\xe4', 1, 1, 1, 0, 0, 1, 0, 0) self.assert_unpack("P", "P;2", b'\xe4', 3, 2, 1, 0) - # self.assert_unpack("P", "P;2L", b'\xe4', 1, 1, 1, 0) # erroneous? + # erroneous? + # self.assert_unpack("P", "P;2L", b'\xe4', 1, 1, 1, 0) self.assert_unpack("P", "P;4", b'\x02\xef', 0, 2, 14, 15) - # self.assert_unpack("P", "P;4L", b'\x02\xef', 2, 10, 10, 0) # erroneous? + # erroneous? + # self.assert_unpack("P", "P;4L", b'\x02\xef', 2, 10, 10, 0) self.assert_unpack("P", "P", 1, 1, 2, 3, 4) self.assert_unpack("P", "P;R", 1, 128, 64, 192, 32) @@ -373,7 +376,8 @@ def test_RGBA(self): self.assert_unpack( "RGBA", "YCCA;P", b']bE\x04\xdd\xbej\xed57T\xce\xac\xce:\x11', # random data - (0, 161, 0, 4), (255, 255, 255, 237), (27, 158, 0, 206), (0, 118, 0, 17)) + (0, 161, 0, 4), (255, 255, 255, 237), + (27, 158, 0, 206), (0, 118, 0, 17)) self.assert_unpack( "RGBA", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) self.assert_unpack( @@ -425,7 +429,8 @@ def test_RGBX(self): self.assert_unpack( "RGBX", "YCC;P", b'D]\x9c\x82\x1a\x91\xfaOC\xe7J\x12', # random data - (127, 102, 0, X), (192, 227, 0, X), (213, 255, 170, X), (98, 255, 133, X)) + (127, 102, 0, X), (192, 227, 0, X), + (213, 255, 170, X), (98, 255, 133, X)) self.assert_unpack("RGBX", "R", 1, (1, 0, 0, 0), (2, 0, 0, 0), (3, 0, 0, 0)) self.assert_unpack("RGBX", "G", 1, diff --git a/Tests/test_pdfparser.py b/Tests/test_pdfparser.py index 42c8135205a..b7373842eb9 100644 --- a/Tests/test_pdfparser.py +++ b/Tests/test_pdfparser.py @@ -26,7 +26,9 @@ def test_indirect_refs(self): def test_parsing(self): self.assertEqual(PdfParser.interpret_name(b"Name#23Hash"), b"Name#Hash") - self.assertEqual(PdfParser.interpret_name(b"Name#23Hash", as_text=True), "Name#Hash") + self.assertEqual(PdfParser.interpret_name( + b"Name#23Hash", as_text=True + ), "Name#Hash") self.assertEqual(PdfParser.get_value(b"1 2 R ", 0), (IndirectReference(1, 2), 5)) self.assertEqual(PdfParser.get_value(b"true[", 0), (True, 4)) @@ -72,7 +74,9 @@ def test_parsing(self): self.assertIsInstance(a, list) self.assertEqual(len(a), 4) self.assertEqual(a[0], PdfName("Name")) - s = PdfParser.get_value(b"<>\nstream\nabcde\nendstream<<...", 0)[0] + s = PdfParser.get_value( + b"<>\nstream\nabcde\nendstream<<...", 0 + )[0] self.assertIsInstance(s, PdfStream) self.assertEqual(s.dictionary.Name, "value") self.assertEqual(s.decode(), b"abcde") diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 2ca1e821854..1a0b2c910d2 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -61,7 +61,8 @@ def _open(self): self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4]) - self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, ("L", 0, 1))] + self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, + ("L", 0, 1))] def open(fp, mode="r"): diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 099ccc4ff97..5384a725b4b 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -162,7 +162,8 @@ def getsize(self, text, direction=None, features=None): size, offset = self.font.getsize(text, direction, features) return (size[0] + offset[0], size[1] + offset[1]) - def getsize_multiline(self, text, direction=None, spacing=4, features=None): + def getsize_multiline(self, text, direction=None, + spacing=4, features=None): max_width = 0 lines = self._multiline_split(text) line_spacing = self.getsize('A')[1] + spacing diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 5ce68591683..e6026136005 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -28,7 +28,8 @@ ['side', 'PySide'] ] # 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) +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': From 2a2603ba90653acc530ee695a093c6773638db20 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 27 Sep 2018 21:01:05 +1000 Subject: [PATCH 0535/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7d7856924f3..4cb7320ea54 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -95,7 +95,7 @@ Changelog (Pillow) - Skip outline if the draw operation fills with the same colour #2922 [radarhere] -- Flake8 fixes #3173 +- Flake8 fixes #3173, #3380 [radarhere] - Avoid deprecated 'U' mode when opening files #2187 From 9bdb9d8bef23a1faa244eb0cdae26c169812d720 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 28 Sep 2018 10:40:31 +0200 Subject: [PATCH 0536/1393] Fix pkg-config call --- setup.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 761d552cccf..a9e96b8367f 100755 --- a/setup.py +++ b/setup.py @@ -147,15 +147,20 @@ def get_version(): def _pkg_config(name): try: - command = [ + command_libs = [ 'pkg-config', '--libs-only-L', name, + ] + command_cflags = [ + 'pkg-config', '--cflags-only-I', name, ] if not DEBUG: - command.append('--silence-errors') - libs = subprocess.check_output(command).decode('utf8').split(' ') - return libs[1][2:].strip(), libs[0][2:].strip() + command_libs.append('--silence-errors') + command_cflags.append('--silence-errors') + libs = subprocess.check_output(command_libs).decode('utf8').strip().replace('-L', '') + cflags = subprocess.check_output(command_cflags).decode('utf8').strip().replace('-I', '') + return (libs, cflags) except Exception: pass From 2483f6198cacd8db927fcce198a48333fb117230 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 10:48:07 +1000 Subject: [PATCH 0537/1393] Added release notes for #3250 [ci skip] --- docs/releasenotes/5.3.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index a5591b98d3e..c56b236466b 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -16,6 +16,14 @@ For example, with all optional arguments:: ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) +Curved joints for line sequences +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``ImageDraw.Draw.line`` draws a line, or lines, between points. Previously, +when multiple points are given, for a larger ``width``, the joints between +these lines looked unsightly. There is now an additional optional argument, +``joint``, defaulting to ``None``. When it is set to ``curved``, the joints +between the lines will become rounded. Other Changes From 8bb5b6887bac3c51c42208037f9654af6a9e3730 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 10:52:43 +1000 Subject: [PATCH 0538/1393] Added release notes for #3364 [ci skip] --- docs/releasenotes/5.3.0.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index c56b236466b..5a1019aaa70 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -25,6 +25,13 @@ these lines looked unsightly. There is now an additional optional argument, ``joint``, defaulting to ``None``. When it is set to ``curved``, the joints between the lines will become rounded. +ImageOps.pad +^^^^^^^^^^^^ + +While ``ImageOps.fit`` allows users to crop images to a requested aspect ratio +and size, new method ``ImageOps.pad`` pads images to fill a requested aspect +ratio and size, filling new space with a provided ``color`` and positioning the +image within the new area through a ``centering`` argument. Other Changes ============= From e8adec0af243e563334a591620320cff471d76e5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 11:12:49 +1000 Subject: [PATCH 0539/1393] Added release notes for #3298 [ci skip] --- docs/releasenotes/5.3.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 5a1019aaa70..5dade4228a7 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -36,3 +36,4 @@ image within the new area through a ``centering`` argument. Other Changes ============= +RGB WebP images are now read as RGB mode, rather than RGBX. From 09a7ac3a266cc79af7b2d3791b3095426a55c252 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 14:41:52 +1000 Subject: [PATCH 0540/1393] Added raqm scripts and install_extra_test_images script [ci skip] --- depends/README.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/depends/README.rst b/depends/README.rst index 779e956f496..069d2b81f5b 100644 --- a/depends/README.rst +++ b/depends/README.rst @@ -1,9 +1,12 @@ Depends ======= -``install_openjpeg.sh``, ``install_webp.sh`` and ``install_imagequant.sh`` can -be used to download, build & install non-packaged dependencies; useful for -testing with Travis CI. +``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. + +``install_extra_test_images.sh`` can be used to install additional test images +that are used for Travis CI and AppVeyor. The other scripts can be used to install all of the dependencies for the listed operating systems/distros. The ``ubuntu_14.04.sh`` and From 6072e2e595289361ab548f22227ea59f73132b21 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 15:07:59 +1000 Subject: [PATCH 0541/1393] Changed note to be more generic [ci skip] --- docs/handbook/tutorial.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 52d98f69487..3d4ab0c8dc2 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -41,10 +41,10 @@ example, let’s display the image we just loaded:: .. note:: The standard version of :py:meth:`~PIL.Image.Image.show` is not very - efficient, since it saves the image to a temporary file and calls the - :command:`xv` utility to display the image. If you don’t have :command:`xv` - installed, it won’t even work. When it does work though, it is very handy - for debugging and tests. + efficient, since it saves the image to a temporary file and calls a utility + to display the image. If you don’t have an appropriate utility installed, + it won’t even work. When it does work though, it is very handy for + debugging and tests. The following sections provide an overview of the different functions provided in this library. From bd600c6966001da71b09a457d253d81162e85838 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 15:31:10 +1000 Subject: [PATCH 0542/1393] Crop is no longer lazy [ci skip] --- docs/handbook/tutorial.rst | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 3d4ab0c8dc2..13a7deba6e3 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -183,20 +183,11 @@ Rolling an image part1 = image.crop((0, 0, delta, ysize)) part2 = image.crop((delta, 0, xsize, ysize)) - part1.load() - part2.load() - image.paste(part2, (0, 0, xsize-delta, ysize)) image.paste(part1, (xsize-delta, 0, xsize, ysize)) + image.paste(part2, (0, 0, xsize-delta, ysize)) return image -Note that when pasting it back from the :py:meth:`~PIL.Image.Image.crop` -operation, :py:meth:`~PIL.Image.Image.load` is called first. This is because -cropping is a lazy operation. If :py:meth:`~PIL.Image.Image.load` was not -called, then the crop operation would not be performed until the images were -used in the paste commands. This would mean that ``part1`` would be cropped from -the version of ``image`` already modified by the first paste. - For more advanced tricks, the paste method can also take a transparency mask as an optional argument. In this mask, the value 255 indicates that the pasted image is opaque in that position (that is, the pasted image should be used as From 29bc4b2df40465a5995c904f87c66b9d31a7c48b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 20:14:56 +1000 Subject: [PATCH 0543/1393] Improved convert documentation [ci skip] --- src/PIL/Image.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index e5e78cf2700..3631c78ebc0 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -873,12 +873,17 @@ def convert(self, mode=None, matrix=None, dither=None, use other thresholds, use the :py:meth:`~PIL.Image.Image.point` method. + When converting from "RGBA" to "P" without a **matrix** argument, + this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, + and **dither** and **palette** are ignored. + :param mode: The requested mode. See: :ref:`concept-modes`. :param matrix: An optional conversion matrix. If given, this should be 4- or 12-tuple containing floating point values. :param dither: Dithering method, used when converting from mode "RGB" to "P" or from "RGB" or "L" to "1". Available methods are NONE or FLOYDSTEINBERG (default). + Note that this is not used when **matrix** is supplied. :param palette: Palette to use when converting from mode "RGB" to "P". Available palettes are WEB or ADAPTIVE. :param colors: Number of colors to use for the ADAPTIVE palette. From d6d61b35dc2c867945bb3d9aa4d27400cde3a9f4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 21:44:25 +1000 Subject: [PATCH 0544/1393] Only draw pieslice's inner lines once --- src/libImaging/Draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 60650c37370..d0f374fe14a 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -854,7 +854,7 @@ ellipse(Imaging im, int x0, int y0, int x1, int y1, if (i != start) { if (mode == PIESLICE) { - if (x != cx || y != cy) { + if (j == 0 && (x != cx || y != cy)) { if (width == 1) { draw->line(im, x, y, cx, cy, ink); draw->line(im, cx, cy, sx, sy, ink); From 4404197b5646ae1ab4dedc9053ce8c19d2c31ddd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Sep 2018 23:24:17 +1000 Subject: [PATCH 0545/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4cb7320ea54..85f86aab29f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Add line width parameter to rectangle and ellipse-based shapes #3094 + [hugovk, radarhere] + - Fixed decompression bomb check in _crop #3313 [dinkolubina, hugovk] From 8c134ad8381da8f09a7c04efc97061fd9687503f Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 16:35:55 +0300 Subject: [PATCH 0546/1393] Put ImageOps additions next to each other --- docs/releasenotes/5.3.0.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 5dade4228a7..286b2f05ea5 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -4,6 +4,15 @@ API Additions ============= +Curved joints for line sequences +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``ImageDraw.Draw.line`` draws a line, or lines, between points. Previously, +when multiple points are given, for a larger ``width``, the joints between +these lines looked unsightly. There is now an additional optional argument, +``joint``, defaulting to ``None``. When it is set to ``curved``, the joints +between the lines will become rounded. + ImageOps.colorize ^^^^^^^^^^^^^^^^^ @@ -13,18 +22,9 @@ Now it supports three-color mapping with the optional ``mid`` parameter, and the positions for all three color arguments can each be optionally specified (``blackpoint``, ``whitepoint`` and ``midpoint``). For example, with all optional arguments:: - ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), + ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) -Curved joints for line sequences -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -``ImageDraw.Draw.line`` draws a line, or lines, between points. Previously, -when multiple points are given, for a larger ``width``, the joints between -these lines looked unsightly. There is now an additional optional argument, -``joint``, defaulting to ``None``. When it is set to ``curved``, the joints -between the lines will become rounded. - ImageOps.pad ^^^^^^^^^^^^ From 08274ae5aaf9784ae0564719f81e77bbef1d044d Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 16:40:11 +0300 Subject: [PATCH 0547/1393] Release notes: Add line width parameter to rectangle and ellipse-based shapes --- docs/releasenotes/5.3.0.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 286b2f05ea5..354d77e7f56 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -4,6 +4,12 @@ API Additions ============= +Add line width parameter to rectangle and ellipse-based shapes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A line ``width`` parameter has been added to ``ImageDraw.Draw.arc``, +``chord``, ``ellipse``, ``pieslice`` and ``rectangle``. + Curved joints for line sequences ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From f4c3002b979695311a06ce9964abb40ebc921d5f Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 16:41:19 +0300 Subject: [PATCH 0548/1393] Fix unexpected indentation --- docs/releasenotes/5.3.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 354d77e7f56..0bdfe299580 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -28,6 +28,7 @@ Now it supports three-color mapping with the optional ``mid`` parameter, and the positions for all three color arguments can each be optionally specified (``blackpoint``, ``whitepoint`` and ``midpoint``). For example, with all optional arguments:: + ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) From 2d3941095727f6949a9bb9cda35e2cb81ef9f941 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 16:52:07 +0300 Subject: [PATCH 0549/1393] Note parameter is optional --- docs/releasenotes/5.3.0.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 0bdfe299580..0e484e7bc44 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -7,7 +7,7 @@ API Additions Add line width parameter to rectangle and ellipse-based shapes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -A line ``width`` parameter has been added to ``ImageDraw.Draw.arc``, +An optional line ``width`` parameter has been added to ``ImageDraw.Draw.arc``, ``chord``, ``ellipse``, ``pieslice`` and ``rectangle``. Curved joints for line sequences @@ -28,7 +28,6 @@ Now it supports three-color mapping with the optional ``mid`` parameter, and the positions for all three color arguments can each be optionally specified (``blackpoint``, ``whitepoint`` and ``midpoint``). For example, with all optional arguments:: - ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) From 518b8c40afef4d896b9d3f2f5bb8f270b9d25dd9 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 30 Sep 2018 00:19:13 +1000 Subject: [PATCH 0550/1393] Changed heading to past tense [ci skip] --- docs/releasenotes/5.3.0.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 0e484e7bc44..10d6ecbd24f 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -4,8 +4,8 @@ API Additions ============= -Add line width parameter to rectangle and ellipse-based shapes -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Added line width parameter to rectangle and ellipse-based shapes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An optional line ``width`` parameter has been added to ``ImageDraw.Draw.arc``, ``chord``, ``ellipse``, ``pieslice`` and ``rectangle``. From 091bd103ce428c8be0c2fcbb22c39c1ebc18d2c8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 01:22:14 +1000 Subject: [PATCH 0551/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 85f86aab29f..aa2e9b8b55d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Improved PDF document info #3274 + [radarhere] + - Add line width parameter to rectangle and ellipse-based shapes #3094 [hugovk, radarhere] From 8b34eb644f8a72f214155d24a56de62cf7c04ecb Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Thu, 21 Jun 2018 16:16:30 +0200 Subject: [PATCH 0552/1393] Avoid undefined behaviour due to division by zero --- src/libImaging/QuantOctree.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libImaging/QuantOctree.c b/src/libImaging/QuantOctree.c index 018dfe1d990..d5af3c39ac8 100644 --- a/src/libImaging/QuantOctree.c +++ b/src/libImaging/QuantOctree.c @@ -149,10 +149,17 @@ count_used_color_buckets(const ColorCube cube) { static void avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { float count = bucket->count; - dst->c.r = (int)(bucket->r / count); - dst->c.g = (int)(bucket->g / count); - dst->c.b = (int)(bucket->b / count); - dst->c.a = (int)(bucket->a / count); + if (bucket->count != 0) { + dst->c.r = (int)(bucket->r / count); + dst->c.g = (int)(bucket->g / count); + dst->c.b = (int)(bucket->b / count); + dst->c.a = (int)(bucket->a / count); + } else { + dst->c.r = 0; + dst->c.g = 0; + dst->c.b = 0; + dst->c.a = 0; + } } static int From 9a0b9607623597fb9ebc675b99af4e79b5eb968c Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 19:23:42 +0300 Subject: [PATCH 0553/1393] Re-use count variable --- src/libImaging/QuantOctree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libImaging/QuantOctree.c b/src/libImaging/QuantOctree.c index d5af3c39ac8..6e4143d9e3a 100644 --- a/src/libImaging/QuantOctree.c +++ b/src/libImaging/QuantOctree.c @@ -149,7 +149,7 @@ count_used_color_buckets(const ColorCube cube) { static void avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { float count = bucket->count; - if (bucket->count != 0) { + if (count != 0) { dst->c.r = (int)(bucket->r / count); dst->c.g = (int)(bucket->g / count); dst->c.b = (int)(bucket->b / count); From 34426f25588698ddfbec4c098229f00b6a2dae22 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 13:35:50 +1000 Subject: [PATCH 0554/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index aa2e9b8b55d..f42b2b80ea4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,18 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Hide the Ghostscript progress dialog popup on Windows #3378 + [hugovk] + +- Adding support to reading tiled and YcbCr jpeg tiffs through libtiff #3227 + [kkopachev] + +- Fixed None as TIFF compression argument #3310 + [radarhere] + +- Changed GIF seek to remove previous info items #3324 + [radarhere] + - Improved PDF document info #3274 [radarhere] From 0adeb82e9886cdedb3917e8ddfaf46f69556a991 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 12:58:02 +1000 Subject: [PATCH 0555/1393] Changed Image size property to be read-only by default --- Tests/test_image.py | 5 ++--- Tests/test_imagefile.py | 2 +- src/PIL/BlpImagePlugin.py | 2 +- src/PIL/BmpImagePlugin.py | 2 +- src/PIL/BufrStubImagePlugin.py | 2 +- src/PIL/CurImagePlugin.py | 2 +- src/PIL/DdsImagePlugin.py | 2 +- src/PIL/EpsImagePlugin.py | 8 ++++---- src/PIL/FitsStubImagePlugin.py | 2 +- src/PIL/FliImagePlugin.py | 2 +- src/PIL/FpxImagePlugin.py | 2 +- src/PIL/FtexImagePlugin.py | 2 +- src/PIL/GbrImagePlugin.py | 2 +- src/PIL/GdImageFile.py | 2 +- src/PIL/GifImagePlugin.py | 2 +- src/PIL/GribStubImagePlugin.py | 2 +- src/PIL/Hdf5StubImagePlugin.py | 2 +- src/PIL/IcnsImagePlugin.py | 22 +++++++++++++++++++++- src/PIL/IcoImagePlugin.py | 13 ++++++++++++- src/PIL/ImImagePlugin.py | 2 +- src/PIL/Image.py | 12 ++++++++---- src/PIL/ImtImagePlugin.py | 4 ++-- src/PIL/IptcImagePlugin.py | 2 +- src/PIL/Jpeg2KImagePlugin.py | 8 ++++---- src/PIL/JpegImagePlugin.py | 6 +++--- src/PIL/McIdasImagePlugin.py | 2 +- src/PIL/MpegImagePlugin.py | 2 +- src/PIL/MspImagePlugin.py | 2 +- src/PIL/PcdImagePlugin.py | 4 ++-- src/PIL/PcxImagePlugin.py | 2 +- src/PIL/PixarImagePlugin.py | 2 +- src/PIL/PngImagePlugin.py | 2 +- src/PIL/PpmImagePlugin.py | 2 +- src/PIL/PsdImagePlugin.py | 2 +- src/PIL/SgiImagePlugin.py | 2 +- src/PIL/SpiderImagePlugin.py | 2 +- src/PIL/SunImagePlugin.py | 2 +- src/PIL/TgaImagePlugin.py | 2 +- src/PIL/TiffImagePlugin.py | 2 +- src/PIL/WebPImagePlugin.py | 4 ++-- src/PIL/WmfImagePlugin.py | 2 +- src/PIL/XVThumbImagePlugin.py | 2 +- src/PIL/XbmImagePlugin.py | 2 +- src/PIL/XpmImagePlugin.py | 2 +- 44 files changed, 94 insertions(+), 60 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 7222e389b2d..ad56a079a5f 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -56,9 +56,8 @@ def test_width_height(self): self.assertEqual(im.width, 1) self.assertEqual(im.height, 2) - im.size = (3, 4) - self.assertEqual(im.width, 3) - self.assertEqual(im.height, 4) + with self.assertRaises(AttributeError) as e: + im.size = (3, 4) def test_invalid_image(self): if py3: diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 837e81d309b..c95611b0847 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -154,7 +154,7 @@ class MockImageFile(ImageFile.ImageFile): def _open(self): self.rawmode = 'RGBA' self.mode = 'RGBA' - self.size = (200, 200) + self._size = (200, 200) self.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize), 32, None)] diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py index 9b1a99ae1b3..398e0fa0c85 100644 --- a/src/PIL/BlpImagePlugin.py +++ b/src/PIL/BlpImagePlugin.py @@ -270,7 +270,7 @@ def _read_blp_header(self): self._blp_alpha_encoding, = struct.unpack("= 16 - self.size = file_info['width'], file_info['height'] + self._size = file_info['width'], file_info['height'] # -------- If color count was not found in the header, compute from bits file_info['colors'] = file_info['colors'] if file_info.get('colors', 0) else (1 << file_info['bits']) # -------------------------------- Check abnormal values for DOS attacks diff --git a/src/PIL/BufrStubImagePlugin.py b/src/PIL/BufrStubImagePlugin.py index 16d83c74def..a1957b32a89 100644 --- a/src/PIL/BufrStubImagePlugin.py +++ b/src/PIL/BufrStubImagePlugin.py @@ -47,7 +47,7 @@ def _open(self): # make something up self.mode = "F" - self.size = 1, 1 + self._size = 1, 1 loader = self._load() if loader: diff --git a/src/PIL/CurImagePlugin.py b/src/PIL/CurImagePlugin.py index db9ea9874df..3e8f321020d 100644 --- a/src/PIL/CurImagePlugin.py +++ b/src/PIL/CurImagePlugin.py @@ -63,7 +63,7 @@ def _open(self): self._bitmap(i32(m[12:]) + offset) # patch up the bitmap height - self.size = self.size[0], self.size[1]//2 + self._size = self.size[0], self.size[1]//2 d, e, o, a = self.tile[0] self.tile[0] = d, (0, 0)+self.size, o, a diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 3bd65c93db5..7660827c5ef 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -114,7 +114,7 @@ def _open(self): header = BytesIO(header_bytes) flags, height, width = struct.unpack("<3I", header.read(12)) - self.size = (width, height) + self._size = (width, height) self.mode = "RGBA" pitch, depth, mipmaps = struct.unpack("<3I", header.read(12)) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 7932ad58c6a..b2dec78094d 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -217,7 +217,7 @@ def _open(self): box = None self.mode = "RGB" - self.size = 1, 1 # FIXME: huh? + self._size = 1, 1 # FIXME: huh? # # Load EPS header @@ -244,7 +244,7 @@ def _open(self): # fields should be integers, but some drivers # put floating point values there anyway. box = [int(float(i)) for i in v.split()] - self.size = box[2] - box[0], box[3] - box[1] + self._size = box[2] - box[0], box[3] - box[1] self.tile = [("eps", (0, 0) + self.size, offset, (length, box))] except Exception: @@ -293,7 +293,7 @@ def _open(self): except ValueError: break - self.size = int(x), int(y) + self._size = int(x), int(y) return s = fp.readline().strip('\r\n') @@ -331,7 +331,7 @@ def load(self, scale=1): return self.im = Ghostscript(self.tile, self.size, self.fp, scale) self.mode = self.im.mode - self.size = self.im.size + self._size = self.im.size self.tile = [] def load_seek(self, *args, **kwargs): diff --git a/src/PIL/FitsStubImagePlugin.py b/src/PIL/FitsStubImagePlugin.py index be926cadb84..63c195c4381 100644 --- a/src/PIL/FitsStubImagePlugin.py +++ b/src/PIL/FitsStubImagePlugin.py @@ -50,7 +50,7 @@ def _open(self): # make something up self.mode = "F" - self.size = 1, 1 + self._size = 1, 1 loader = self._load() if loader: diff --git a/src/PIL/FliImagePlugin.py b/src/PIL/FliImagePlugin.py index 2c190b6354f..c78c8c622d5 100644 --- a/src/PIL/FliImagePlugin.py +++ b/src/PIL/FliImagePlugin.py @@ -54,7 +54,7 @@ def _open(self): # image characteristics self.mode = "P" - self.size = i16(s[8:10]), i16(s[10:12]) + self._size = i16(s[8:10]), i16(s[10:12]) # animation speed duration = i32(s[16:20]) diff --git a/src/PIL/FpxImagePlugin.py b/src/PIL/FpxImagePlugin.py index 509fd7d917b..9f284fd8517 100644 --- a/src/PIL/FpxImagePlugin.py +++ b/src/PIL/FpxImagePlugin.py @@ -81,7 +81,7 @@ def _open_index(self, index=1): # size (highest resolution) - self.size = prop[0x1000002], prop[0x1000003] + self._size = prop[0x1000002], prop[0x1000003] size = max(self.size) i = 1 diff --git a/src/PIL/FtexImagePlugin.py b/src/PIL/FtexImagePlugin.py index 72378d79f62..08ce0e006f6 100644 --- a/src/PIL/FtexImagePlugin.py +++ b/src/PIL/FtexImagePlugin.py @@ -61,7 +61,7 @@ class FtexImageFile(ImageFile.ImageFile): def _open(self): magic = struct.unpack("> 1 - self.size = (int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power)) + self._size = (int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power)) if self.tile: # Update the reduce and layers settings diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index e38306041a6..f2068189f2b 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -159,7 +159,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 = i8(s[0]) if self.bits != 8: @@ -390,7 +390,7 @@ def draft(self, mode, size): if scale >= s: break e = e[0], e[1], (e[2]-e[0]+s-1)//s+e[0], (e[3]-e[1]+s-1)//s+e[1] - self.size = ((self.size[0]+s-1)//s, (self.size[1]+s-1)//s) + self._size = ((self.size[0]+s-1)//s, (self.size[1]+s-1)//s) scale = s self.tile = [(d, e, o, a)] @@ -423,7 +423,7 @@ def load_djpeg(self): pass self.mode = self.im.mode - self.size = self.im.size + self._size = self.im.size self.tile = [] diff --git a/src/PIL/McIdasImagePlugin.py b/src/PIL/McIdasImagePlugin.py index 06da33f7778..161fb5e50c1 100644 --- a/src/PIL/McIdasImagePlugin.py +++ b/src/PIL/McIdasImagePlugin.py @@ -59,7 +59,7 @@ def _open(self): raise SyntaxError("unsupported McIdas format") self.mode = mode - self.size = w[10], w[9] + self._size = w[10], w[9] offset = w[34] + w[15] stride = w[15] + w[10]*w[11]*w[14] diff --git a/src/PIL/MpegImagePlugin.py b/src/PIL/MpegImagePlugin.py index fca7f9d9fe4..15c7afccc5e 100644 --- a/src/PIL/MpegImagePlugin.py +++ b/src/PIL/MpegImagePlugin.py @@ -72,7 +72,7 @@ def _open(self): raise SyntaxError("not an MPEG file") self.mode = "RGB" - self.size = s.read(12), s.read(12) + self._size = s.read(12), s.read(12) # -------------------------------------------------------------------- diff --git a/src/PIL/MspImagePlugin.py b/src/PIL/MspImagePlugin.py index b2c7a3d79ea..74c68172a7f 100644 --- a/src/PIL/MspImagePlugin.py +++ b/src/PIL/MspImagePlugin.py @@ -63,7 +63,7 @@ def _open(self): 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/PcdImagePlugin.py b/src/PIL/PcdImagePlugin.py index fa95b5008f6..87e5792ebe7 100644 --- a/src/PIL/PcdImagePlugin.py +++ b/src/PIL/PcdImagePlugin.py @@ -48,14 +48,14 @@ def _open(self): self.tile_post_rotate = -90 self.mode = "RGB" - self.size = 768, 512 # FIXME: not correct for rotated images! + self._size = 768, 512 # FIXME: not correct for rotated images! self.tile = [("pcd", (0, 0)+self.size, 96*2048, None)] def load_end(self): if self.tile_post_rotate: # Handle rotated PCDs self.im = self.im.rotate(self.tile_post_rotate) - self.size = self.im.size + self._size = self.im.size # diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 564713a981f..daa58b3f324 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -100,7 +100,7 @@ def _open(self): raise IOError("unknown PCX mode") self.mode = mode - self.size = bbox[2]-bbox[0], bbox[3]-bbox[1] + self._size = bbox[2]-bbox[0], bbox[3]-bbox[1] bbox = (0, 0) + self.size logger.debug("size: %sx%s", *self.size) diff --git a/src/PIL/PixarImagePlugin.py b/src/PIL/PixarImagePlugin.py index 220577ccec3..d07b28d0741 100644 --- a/src/PIL/PixarImagePlugin.py +++ b/src/PIL/PixarImagePlugin.py @@ -50,7 +50,7 @@ def _open(self): # 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:420]), i16(s[416:418]) # get channel/depth descriptions mode = i16(s[424:426]), i16(s[426:428]) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 4f1f0f9cfbf..15077fceb50 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -577,7 +577,7 @@ def _open(self): # (believe me, I've tried ;-) self.mode = self.png.im_mode - self.size = self.png.im_size + self._size = self.png.im_size self.info = self.png.im_info self.text = self.png.im_text # experimental self.tile = self.png.im_tile diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index 9866c9040fe..8002678fb32 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -107,7 +107,7 @@ def _open(self): self.mode = 'I' rawmode = 'I;32B' - self.size = xsize, ysize + self._size = xsize, ysize self.tile = [("raw", (0, 0, xsize, ysize), self.fp.tell(), diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index f6e04f78b34..2d64ecd9e43 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -71,7 +71,7 @@ def _open(self): raise IOError("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 diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 113d44faccd..88df3513566 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -96,7 +96,7 @@ def _open(self): if rawmode == "": raise ValueError("Unsupported SGI image mode") - self.size = xsize, ysize + self._size = xsize, ysize self.mode = rawmode.split(";")[0] # orientation -1 : scanlines begins at the bottom-left corner diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index a0d5f17a4d4..3f579521045 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -120,7 +120,7 @@ def _open(self): if iform != 1: raise SyntaxError("not a Spider 2D image") - self.size = int(h[12]), int(h[2]) # size in pixels (width, height) + self._size = int(h[12]), int(h[2]) # size in pixels (width, height) self.istack = int(h[24]) self.imgnumber = int(h[27]) diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index 3126bd9d6e7..898350e02c5 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -59,7 +59,7 @@ def _open(self): offset = 32 - self.size = i32(s[4:8]), i32(s[8:12]) + self._size = i32(s[4:8]), i32(s[8:12]) depth = i32(s[12:16]) # data_length = i32(s[16:20]) # unreliable, ignore. diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index 02893e83737..c266d50c1be 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -64,7 +64,7 @@ def _open(self): flags = i8(s[17]) - self.size = i16(s[12:]), i16(s[14:]) + self._size = i16(s[12:]), i16(s[14:]) # validate header fields if colormaptype not in (0, 1) or\ diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9a7bbdb4870..8bd3bef10a3 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1174,7 +1174,7 @@ def _setup(self): # size xsize = self.tag_v2.get(IMAGEWIDTH) ysize = self.tag_v2.get(IMAGELENGTH) - self.size = xsize, ysize + self._size = xsize, ysize if DEBUG: print("- size:", self.size) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 08c6b26ac25..03031db8f00 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -42,7 +42,7 @@ def _open(self): self.info["icc_profile"] = icc_profile if exif: self.info["exif"] = exif - self.size = width, height + self._size = width, height self.fp = BytesIO(data) self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] self._n_frames = 1 @@ -55,7 +55,7 @@ def _open(self): # Get info from decoder width, height, loop_count, bgcolor, frame_count, mode = \ self._decoder.get_info() - self.size = width, height + self._size = width, height self.info["loop"] = loop_count bg_a, bg_r, bg_g, bg_b = \ (bgcolor >> 24) & 0xFF, \ diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index 6811ddceccb..81699bda737 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -143,7 +143,7 @@ def _open(self): raise SyntaxError("Unsupported file format") self.mode = "RGB" - self.size = size + self._size = size loader = self._load() if loader: diff --git a/src/PIL/XVThumbImagePlugin.py b/src/PIL/XVThumbImagePlugin.py index a7d39ed89d0..8cdd84817c4 100644 --- a/src/PIL/XVThumbImagePlugin.py +++ b/src/PIL/XVThumbImagePlugin.py @@ -65,7 +65,7 @@ def _open(self): s = s.strip().split() self.mode = "P" - self.size = int(s[0]), int(s[1]) + self._size = int(s[0]), int(s[1]) self.palette = ImagePalette.raw("RGB", PALETTE) diff --git a/src/PIL/XbmImagePlugin.py b/src/PIL/XbmImagePlugin.py index b43fbef5006..0cccda17c64 100644 --- a/src/PIL/XbmImagePlugin.py +++ b/src/PIL/XbmImagePlugin.py @@ -63,7 +63,7 @@ def _open(self): ) self.mode = "1" - self.size = xsize, ysize + self._size = xsize, ysize self.tile = [("xbm", (0, 0)+self.size, m.end(), None)] diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index a5cca0e2793..02bc28a17d1 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -51,7 +51,7 @@ def _open(self): if m: break - self.size = int(m.group(1)), int(m.group(2)) + self._size = int(m.group(1)), int(m.group(2)) pal = int(m.group(3)) bpp = int(m.group(4)) From cea6ecfdbb3c7cf48815b4ec758946481f78cf13 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 14:07:55 +1000 Subject: [PATCH 0556/1393] Updated example decoders [ci skip] --- docs/example/DdsImagePlugin.py | 2 +- docs/handbook/writing-your-own-file-decoder.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 71a5b50eac6..2877697aab0 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -221,7 +221,7 @@ def _open(self): header = BytesIO(header_bytes) flags, height, width = struct.unpack("<3I", header.read(12)) - self.size = (width, height) + self._size = (width, height) self.mode = "RGBA" pitch, depth, mipmaps = struct.unpack("<3I", header.read(12)) diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index 107e25f3612..2e68656ca28 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -69,7 +69,7 @@ true color. header = string.split(header) # size in pixels (width, height) - self.size = int(header[1]), int(header[2]) + self._size = int(header[1]), int(header[2]) # mode setting bits = int(header[3]) From 6f44ae1d27fa89a9e313e0da9dbfe3d129bb0763 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 15:08:35 +1000 Subject: [PATCH 0557/1393] Only deprecate setting of TIFF image sizes --- Tests/test_file_tiff.py | 8 ++++++++ src/PIL/TiffImagePlugin.py | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index a920032f351..a92c2351f22 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -69,6 +69,14 @@ def test_set_legacy_api(self): self.assertEqual(str(e.exception), "Not allowing setting of legacy api") + def test_size(self): + filename = "Tests/images/pil168.tif" + im = Image.open(filename) + + def set_size(): + im.size = (256, 256) + self.assert_warning(DeprecationWarning, set_size) + def test_xyres_tiff(self): filename = "Tests/images/pil168.tif" im = Image.open(filename) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 8bd3bef10a3..d18ca39d814 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1049,6 +1049,19 @@ def tell(self): "Return the current frame number" return self.__frame + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + warnings.warn( + 'Setting the size of a TIFF image direcly is deprecated, and will ' + 'be removed in a future version. Use the resize method instead.', + DeprecationWarning + ) + self._size = value + def load(self): if self.use_load_libtiff: return self._load_libtiff() From e3675f95fbdf2ebeb51dcdb945a68ed8d18c3725 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 14:47:05 +1000 Subject: [PATCH 0558/1393] Added tests --- Tests/test_file_icns.py | 4 ++++ Tests/test_file_ico.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 06a7e39bb82..b19cf2e4c85 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -64,6 +64,10 @@ def test_sizes(self): self.assertEqual(im2.mode, 'RGBA') self.assertEqual(im2.size, (wr, hr)) + # Check that we cannot load an incorrect size + with self.assertRaises(ValueError): + im.size = (1, 1) + def test_older_icon(self): # This icon was made with Icon Composer rather than iconutil; it still # uses PNG rather than JP2, however (since it was made on 10.9). diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 20f21db57af..d3024ee905d 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -47,6 +47,11 @@ def test_save_to_bytes(self): self.assert_image_equal(reloaded, hopper().resize((32, 32), Image.LANCZOS)) + def test_incorrect_size(self): + im = Image.open(TEST_ICO_FILE) + with self.assertRaises(ValueError): + im.size = (1, 1) + def test_save_256x256(self): """Issue #2264 https://github.com/python-pillow/Pillow/issues/2264""" # Arrange From da2c12533dfb26989b9b0be655ca1e5153c73470 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 15:26:50 +1000 Subject: [PATCH 0559/1393] Added release notes for #3227 [ci skip] --- docs/releasenotes/5.3.0.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 10d6ecbd24f..f71cdadf3aa 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -42,4 +42,7 @@ image within the new area through a ``centering`` argument. Other Changes ============= +Added support for reading tiled TIFF images through LibTIFF. Compressed TIFF +images are now read through LibTIFF. + RGB WebP images are now read as RGB mode, rather than RGBX. From 82d942c3d8d5f70126e37be724c38f202b227d1e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 15:34:27 +1000 Subject: [PATCH 0560/1393] Added warnings if image file identification fails due to lack of support --- Tests/test_file_webp.py | 22 ++++++++++++++++++++-- src/PIL/Image.py | 8 +++++++- src/PIL/WebPImagePlugin.py | 23 ++++++++++++++++------- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index fa01cf93e90..d815ab09a7c 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image +from PIL import Image, WebPImagePlugin try: from PIL import _webp @@ -13,15 +13,27 @@ class TestFileWebp(PillowTestCase): def setUp(self): if not HAVE_WEBP: - self.skipTest('WebP support not installed') return self.rgb_mode = "RGB" + def test_unsupported(self): + if HAVE_WEBP: + WebPImagePlugin.SUPPORTED = False + + file_path = "Tests/images/hopper.webp" + self.assert_warning(UserWarning, + lambda: self.assertRaises(IOError, Image.open, file_path)) + + if HAVE_WEBP: + WebPImagePlugin.SUPPORTED = True + + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_version(self): _webp.WebPDecoderVersion() _webp.WebPDecoderBuggyAlpha() + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_read_rgb(self): """ Can we read a RGB mode WebP file without error? @@ -41,6 +53,7 @@ def test_read_rgb(self): self.assert_image_similar_tofile( image, 'Tests/images/hopper_webp_bits.ppm', 1.0) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_rgb(self): """ Can we write a RGB mode file to webp without error. @@ -70,6 +83,7 @@ def test_write_rgb(self): target = hopper(self.rgb_mode) self.assert_image_similar(image, target, 12.0) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_unsupported_mode_L(self): """ Saving a black-and-white file to WebP format should work, and be @@ -90,6 +104,7 @@ def test_write_unsupported_mode_L(self): self.assert_image_similar(image, target, 10.0) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_unsupported_mode_P(self): """ Saving a palette-based file to WebP format should work, and be @@ -110,6 +125,7 @@ def test_write_unsupported_mode_P(self): self.assert_image_similar(image, target, 50.0) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_WebPEncode_with_invalid_args(self): """ Calling encoder functions with no arguments should result in an error. @@ -119,6 +135,7 @@ def test_WebPEncode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimEncoder) self.assertRaises(TypeError, _webp.WebPEncode) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_WebPDecode_with_invalid_args(self): """ Calling decoder functions with no arguments should result in an error. @@ -128,6 +145,7 @@ def test_WebPDecode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimDecoder) self.assertRaises(TypeError, _webp.WebPDecode) + @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_no_resource_warning(self): file_path = "Tests/images/hopper.webp" image = Image.open(file_path) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 3631c78ebc0..73a600168ef 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2615,11 +2615,15 @@ def open(fp, mode="r"): preinit() + acceptWarnings = [] def _open_core(fp, filename, prefix): for i in ID: try: factory, accept = OPEN[i] - if not accept or accept(prefix): + result = not accept or accept(prefix) + if type(result) in [str, bytes]: + acceptWarnings.append(result) + elif result: fp.seek(0) im = factory(fp, filename) _decompression_bomb_check(im.size) @@ -2643,6 +2647,8 @@ def _open_core(fp, filename, prefix): if exclusive_fp: fp.close() + for message in acceptWarnings: + warnings.warn(message) raise IOError("cannot identify image file %r" % (filename if filename else fp)) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 08c6b26ac25..7a5f8cdaded 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -1,4 +1,9 @@ -from . import Image, ImageFile, _webp +from . import Image, ImageFile +try: + from . import _webp + SUPPORTED = True +except ImportError as e: + SUPPORTED = False from io import BytesIO @@ -25,7 +30,10 @@ def _accept(prefix): is_webp_file = prefix[8:12] == b"WEBP" is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER - return is_riff_file_format and is_webp_file and is_valid_vp8_mode + if is_riff_file_format and is_webp_file and is_valid_vp8_mode: + if not SUPPORTED: + return "image file could not be identified because WEBP support not installed" + return True class WebPImageFile(ImageFile.ImageFile): @@ -321,8 +329,9 @@ def _save(im, fp, filename): Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -Image.register_save(WebPImageFile.format, _save) -if _webp.HAVE_WEBPANIM: - Image.register_save_all(WebPImageFile.format, _save_all) -Image.register_extension(WebPImageFile.format, ".webp") -Image.register_mime(WebPImageFile.format, "image/webp") +if SUPPORTED: + Image.register_save(WebPImageFile.format, _save) + if _webp.HAVE_WEBPANIM: + Image.register_save_all(WebPImageFile.format, _save_all) + Image.register_extension(WebPImageFile.format, ".webp") + Image.register_mime(WebPImageFile.format, "image/webp") From a0fda6066262bdd9f0b855598dc03e8a6d77783c Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 29 Sep 2018 19:34:03 +0300 Subject: [PATCH 0561/1393] Use snake_case --- 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 73a600168ef..88a677b5eac 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2615,14 +2615,14 @@ def open(fp, mode="r"): preinit() - acceptWarnings = [] + accept_warnings = [] def _open_core(fp, filename, prefix): for i in ID: try: factory, accept = OPEN[i] result = not accept or accept(prefix) if type(result) in [str, bytes]: - acceptWarnings.append(result) + accept_warnings.append(result) elif result: fp.seek(0) im = factory(fp, filename) @@ -2647,7 +2647,7 @@ def _open_core(fp, filename, prefix): if exclusive_fp: fp.close() - for message in acceptWarnings: + for message in accept_warnings: warnings.warn(message) raise IOError("cannot identify image file %r" % (filename if filename else fp)) From 2c11974b86f9bbb095a0cc54e876823854ad0a10 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 21:09:42 +1000 Subject: [PATCH 0562/1393] Fixed typo --- src/PIL/TiffImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index d18ca39d814..5059a132442 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1056,8 +1056,8 @@ def size(self): @size.setter def size(self, value): warnings.warn( - 'Setting the size of a TIFF image direcly is deprecated, and will ' - 'be removed in a future version. Use the resize method instead.', + 'Setting the size of a TIFF image directly is deprecated, and will' + ' be removed in a future version. Use the resize method instead.', DeprecationWarning ) self._size = value From 05f21695c7bbf6c3965d32dc563e66ad9d46912a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 21:32:46 +1000 Subject: [PATCH 0563/1393] Added release notes [ci skip] --- docs/releasenotes/5.3.0.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 10d6ecbd24f..efa84e21464 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -39,6 +39,22 @@ and size, new method ``ImageOps.pad`` pads images to fill a requested aspect ratio and size, filling new space with a provided ``color`` and positioning the image within the new area through a ``centering`` argument. +Image Size +========== + +If you attempt to set the size of an image directly, e.g. +``im.size = (100, 100)``, you will now receive an ``AttributeError``. This is +not about removing existing functionality, but instead about raising an +explicit error to prevent later consequences. The ``resize`` method is the +correct way to change an image's size. + +The exceptions to this are: +* The ICO and ICNS image formats, which use ``im.size = (100, 100)`` to select +a subimage. +* The TIFF image format, which now has a ``DeprecationWarning`` for this +action, as direct image size setting was previously necessary to work around an +issue with tile extents. + Other Changes ============= From e839648a24969d9c5ab47f6f16948db12d2b3092 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 21:37:50 +1000 Subject: [PATCH 0564/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f42b2b80ea4..f918d5899f4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.3.0 (unreleased) ------------------ +- Changed Image size property to be read-only by default #3203 + [radarhere] + +- Add warnings if image file identification fails due to lack of WebP support #3169 + [radarhere, hugovk] + - Hide the Ghostscript progress dialog popup on Windows #3378 [hugovk] From 39e95a6a4398d1c848c17f724bf14916a68298b7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Sep 2018 21:47:47 +1000 Subject: [PATCH 0565/1393] Corrected documentation syntax --- docs/releasenotes/5.3.0.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index e1c97f8d99c..7a5bd0f69ae 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -49,11 +49,9 @@ explicit error to prevent later consequences. The ``resize`` method is the correct way to change an image's size. The exceptions to this are: -* The ICO and ICNS image formats, which use ``im.size = (100, 100)`` to select -a subimage. -* The TIFF image format, which now has a ``DeprecationWarning`` for this -action, as direct image size setting was previously necessary to work around an -issue with tile extents. + +* The ICO and ICNS image formats, which use ``im.size = (100, 100)`` to select a subimage. +* The TIFF image format, which now has a ``DeprecationWarning`` for this action, as direct image size setting was previously necessary to work around an issue with tile extents. Other Changes ============= From bb795fc2d1c9b6656487640ee52dcca5fd265bb0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 30 Sep 2018 17:12:20 +0300 Subject: [PATCH 0566/1393] Move "Image size" under "API Changes" To try to keep the headings consistent with before: https://pillow.readthedocs.io/en/5.2.x/releasenotes/index.html [CI skip] --- docs/releasenotes/5.3.0.rst | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 7a5bd0f69ae..cce671c3206 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -1,6 +1,24 @@ 5.3.0 ----- +API Changes +=========== + +Image size +^^^^^^^^^^ + +If you attempt to set the size of an image directly, e.g. +``im.size = (100, 100)``, you will now receive an ``AttributeError``. This is +not about removing existing functionality, but instead about raising an +explicit error to prevent later consequences. The ``resize`` method is the +correct way to change an image's size. + +The exceptions to this are: + +* The ICO and ICNS image formats, which use ``im.size = (100, 100)`` to select a subimage. +* The TIFF image format, which now has a ``DeprecationWarning`` for this action, as direct image size setting was previously necessary to work around an issue with tile extents. + + API Additions ============= @@ -28,6 +46,7 @@ Now it supports three-color mapping with the optional ``mid`` parameter, and the positions for all three color arguments can each be optionally specified (``blackpoint``, ``whitepoint`` and ``midpoint``). For example, with all optional arguments:: + ImageOps.colorize(im, black=(32, 37, 79), white='white', mid=(59, 101, 175), blackpoint=15, whitepoint=240, midpoint=100) @@ -39,20 +58,6 @@ and size, new method ``ImageOps.pad`` pads images to fill a requested aspect ratio and size, filling new space with a provided ``color`` and positioning the image within the new area through a ``centering`` argument. -Image Size -========== - -If you attempt to set the size of an image directly, e.g. -``im.size = (100, 100)``, you will now receive an ``AttributeError``. This is -not about removing existing functionality, but instead about raising an -explicit error to prevent later consequences. The ``resize`` method is the -correct way to change an image's size. - -The exceptions to this are: - -* The ICO and ICNS image formats, which use ``im.size = (100, 100)`` to select a subimage. -* The TIFF image format, which now has a ``DeprecationWarning`` for this action, as direct image size setting was previously necessary to work around an issue with tile extents. - Other Changes ============= From 0ac14725ef4444fdb2871a54bcc95fcd6b8807b3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Oct 2018 15:48:10 +1000 Subject: [PATCH 0567/1393] 5.3.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 f918d5899f4..52f1e165881 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,7 +2,7 @@ Changelog (Pillow) ================== -5.3.0 (unreleased) +5.3.0 (2018-10-01) ------------------ - Changed Image size property to be read-only by default #3203 diff --git a/src/PIL/_version.py b/src/PIL/_version.py index f4bf34e00bb..b5e4f0d7566 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.3.0.dev0' +__version__ = '5.3.0' From 3437d5fcb4880f622f72f313ecc764e140f13dfb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Oct 2018 18:39:58 +1000 Subject: [PATCH 0568/1393] 5.4.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 b5e4f0d7566..3bfc16ff401 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,2 +1,2 @@ # Master version for Pillow -__version__ = '5.3.0' +__version__ = '5.4.0.dev0' From a7eb2ea9ccdf4f55ae97c0c65cb353af033cebfb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 2 Oct 2018 20:52:07 +1000 Subject: [PATCH 0569/1393] Change tuple background to global color table index when saving --- Tests/test_file_gif.py | 11 +++++++++++ src/PIL/GifImagePlugin.py | 11 +++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 917b36905fd..cfa1bb1e76a 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -4,6 +4,12 @@ from io import BytesIO +try: + from PIL import _webp + HAVE_WEBP = True +except ImportError: + HAVE_WEBP = False + codecs = dir(Image.core) # sample gif stream @@ -411,6 +417,11 @@ def test_background(self): self.assertEqual(reread.info['background'], im.info['background']) + if HAVE_WEBP and _webp.HAVE_WEBPANIM: + im = Image.open("Tests/images/hopper.webp") + self.assertIsInstance(im.info['background'], tuple) + im.save(out) + def test_comment(self): im = Image.open(TEST_GIF) self.assertEqual(im.info['comment'], diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 107c015729a..ecd993cd560 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -711,11 +711,18 @@ def _get_global_header(im, info): if im.info.get("version") == b"89a": version = b"89a" + background = 0 + if "background" in info: + background = info["background"] + if isinstance(background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + background = im.palette.getcolor(background) + palette_bytes = _get_palette_bytes(im) color_table_size = _get_color_table_size(palette_bytes) - background = info["background"] if "background" in info else 0 - return [ b"GIF"+version + # signature + version o16(im.size[0]) + # canvas width From 2e288e74ab79141765329ce7f473e8530139d235 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Tue, 11 Sep 2018 15:58:31 +0200 Subject: [PATCH 0570/1393] Fix potential un-terminated buffer problem (CWE-120) --- src/libImaging/Histo.c | 4 +++- src/libImaging/Palette.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 0bfc8dfe954..2b35873e84c 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -41,7 +41,9 @@ ImagingHistogramNew(Imaging im) /* Create histogram descriptor */ h = calloc(1, sizeof(struct ImagingHistogramInstance)); - strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH); + 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)); diff --git a/src/libImaging/Palette.c b/src/libImaging/Palette.c index 31c2c0245ca..7aee6e8eef4 100644 --- a/src/libImaging/Palette.c +++ b/src/libImaging/Palette.c @@ -37,7 +37,8 @@ ImagingPaletteNew(const char* mode) if (!palette) return (ImagingPalette) ImagingError_MemoryError(); - strncpy(palette->mode, mode, IMAGING_MODE_LENGTH); + strncpy(palette->mode, mode, IMAGING_MODE_LENGTH-1); + palette->mode[IMAGING_MODE_LENGTH-1] = 0; /* Initialize to ramp */ for (i = 0; i < 256; i++) { From 78bf8ea0413c80f23f016a16c274d31d8bd23f66 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Thu, 13 Sep 2018 12:22:11 +0200 Subject: [PATCH 0571/1393] Fix potential leaked storage issues (CWE-772) --- src/Tk/tkImaging.c | 2 ++ src/_imaging.c | 15 +++++++++++++-- src/encode.c | 12 +++++++++--- src/libImaging/Histo.c | 12 +++++++++--- src/libImaging/Quant.c | 2 ++ src/libImaging/QuantOctree.c | 1 + src/libImaging/Resample.c | 2 ++ src/path.c | 8 ++++++-- 8 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/Tk/tkImaging.c b/src/Tk/tkImaging.c index 66e093faecc..991cf1c9537 100644 --- a/src/Tk/tkImaging.c +++ b/src/Tk/tkImaging.c @@ -425,6 +425,7 @@ int load_tkinter_funcs(void) /* Try loading from the main program namespace first */ main_program = dlopen(NULL, RTLD_LAZY); if (_func_loader(main_program) == 0) { + dlclose(main_program); return 0; } /* Clear exception triggered when we didn't find symbols above */ @@ -453,6 +454,7 @@ int load_tkinter_funcs(void) /* dlclose probably safe because tkinter has been imported. */ dlclose(tkinter_lib); exit: + dlclose(main_program); Py_XDECREF(pModule); Py_XDECREF(pString); return ret; diff --git a/src/_imaging.c b/src/_imaging.c index e4b31f10b84..5afef976bbd 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -1042,8 +1042,10 @@ _gaussian_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingGaussianBlur(imOut, imIn, radius, passes)) + if (!ImagingGaussianBlur(imOut, imIn, radius, passes)) { + ImagingDelete(imOut); return NULL; + } return PyImagingNew(imOut); } @@ -1931,8 +1933,10 @@ _box_blur(ImagingObject* self, PyObject* args) if (!imOut) return NULL; - if (!ImagingBoxBlur(imOut, imIn, radius, n)) + if (!ImagingBoxBlur(imOut, imIn, radius, n)) { + ImagingDelete(imOut); return NULL; + } return PyImagingNew(imOut); } @@ -2578,6 +2582,7 @@ _draw_arc(ImagingDrawObject* self, PyObject* args) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); return NULL; } @@ -2615,6 +2620,7 @@ _draw_bitmap(ImagingDrawObject* self, PyObject* args) PyErr_SetString(PyExc_TypeError, "coordinate list must contain exactly 1 coordinate" ); + free(xy); return NULL; } @@ -2651,6 +2657,7 @@ _draw_chord(ImagingDrawObject* self, PyObject* args) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); return NULL; } @@ -2687,6 +2694,7 @@ _draw_ellipse(ImagingDrawObject* self, PyObject* args) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); return NULL; } @@ -2838,6 +2846,7 @@ _draw_pieslice(ImagingDrawObject* self, PyObject* args) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); return NULL; } @@ -2876,6 +2885,7 @@ _draw_polygon(ImagingDrawObject* self, PyObject* args) PyErr_SetString(PyExc_TypeError, "coordinate list must contain at least 2 coordinates" ); + free(xy); return NULL; } @@ -2919,6 +2929,7 @@ _draw_rectangle(ImagingDrawObject* self, PyObject* args) return NULL; if (n != 2) { PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); + free(xy); return NULL; } diff --git a/src/encode.c b/src/encode.c index c60048c41d3..a6fc16e7302 100644 --- a/src/encode.c +++ b/src/encode.c @@ -584,11 +584,15 @@ PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) dictionary = NULL; encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE)); - if (encoder == NULL) + if (encoder == NULL) { + free(dictionary); return NULL; + } - if (get_packer(encoder, mode, rawmode) < 0) + if (get_packer(encoder, mode, rawmode) < 0) { + free(dictionary); return NULL; + } encoder->encode = ImagingZipEncode; encoder->cleanup = ImagingZipEncodeCleanup; @@ -749,8 +753,10 @@ 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 - if (!pp) + if (!pp) { + if (extra) free(extra); return PyErr_NoMemory(); + } memcpy(pp, rawExif, rawExifLen); rawExif = pp; } else diff --git a/src/libImaging/Histo.c b/src/libImaging/Histo.c index 2b35873e84c..b7c1a9834c4 100644 --- a/src/libImaging/Histo.c +++ b/src/libImaging/Histo.c @@ -82,8 +82,10 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) h->histogram[im->image8[y][x]]++; ImagingSectionLeave(&cookie); } else { /* yes, we need the braces. C isn't Python! */ - if (im->type != IMAGING_TYPE_UINT8) + if (im->type != IMAGING_TYPE_UINT8) { + ImagingHistogramDelete(h); return ImagingError_ModeError(); + } ImagingSectionEnter(&cookie); for (y = 0; y < im->ysize; y++) { UINT8* in = (UINT8*) im->image32[y]; @@ -122,8 +124,10 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_INT32: - if (!minmax) + if (!minmax) { + ImagingHistogramDelete(h); return ImagingError_ValueError("min/max not given"); + } if (!im->xsize || !im->ysize) break; imin = ((INT32*) minmax)[0]; @@ -143,8 +147,10 @@ ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) ImagingSectionLeave(&cookie); break; case IMAGING_TYPE_FLOAT32: - if (!minmax) + if (!minmax) { + ImagingHistogramDelete(h); return ImagingError_ValueError("min/max not given"); + } if (!im->xsize || !im->ysize) break; fmin = ((FLOAT32*) minmax)[0]; diff --git a/src/libImaging/Quant.c b/src/libImaging/Quant.c index df31381629c..b94dc6e1d09 100644 --- a/src/libImaging/Quant.c +++ b/src/libImaging/Quant.c @@ -568,6 +568,8 @@ split(BoxNode *node) left=malloc(sizeof(BoxNode)); right=malloc(sizeof(BoxNode)); if (!left||!right) { + free(left); + free(right); return 0; } for(i=0;i<3;i++) { diff --git a/src/libImaging/QuantOctree.c b/src/libImaging/QuantOctree.c index 6e4143d9e3a..6c0f605c968 100644 --- a/src/libImaging/QuantOctree.c +++ b/src/libImaging/QuantOctree.c @@ -481,6 +481,7 @@ int quantize_octree(Pixel *pixelData, free(qp); free_color_cube(lookupCube); free_color_cube(coarseLookupCube); + free(paletteBuckets); free(paletteBucketsCoarse); free(paletteBucketsFine); free_color_cube(coarseCube); diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index 6fae2081d2a..90e2aa1d0a4 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -621,6 +621,8 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize, if ( ! ksize_vert) { free(bounds_horiz); free(kk_horiz); + free(bounds_vert); + free(kk_vert); return NULL; } diff --git a/src/path.c b/src/path.c index d1c18c8ed79..eb1e065f98d 100644 --- a/src/path.c +++ b/src/path.c @@ -82,12 +82,16 @@ path_new(Py_ssize_t count, double* xy, int duplicate) xy = p; } - if (PyType_Ready(&PyPathType) < 0) + if (PyType_Ready(&PyPathType) < 0) { + free(xy); return NULL; + } path = PyObject_New(PyPathObject, &PyPathType); - if (path == NULL) + if (path == NULL) { + free(xy); return NULL; + } path->count = count; path->xy = xy; From ddb01ac67e7052ccdf5f66df6858ba38eff4cf8e Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 4 Oct 2018 10:32:10 +0200 Subject: [PATCH 0572/1393] Add environment variables for settings component prefixes --- setup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup.py b/setup.py index a9e96b8367f..bceb9169f36 100755 --- a/setup.py +++ b/setup.py @@ -245,6 +245,11 @@ def build_extensions(self): IMAGEQUANT_ROOT="libimagequant" ).items(): root = globals()[root_name] + + if root is None and root_name in os.environ: + prefix = os.environ[root_name] + root = (os.path.join(prefix, 'lib'), os.path.join(prefix, 'include')) + if root is None and pkg_config: if isinstance(lib_name, tuple): for lib_name2 in lib_name: From 9807f1ad5670c224ce852b799a4810d9fc5211a3 Mon Sep 17 00:00:00 2001 From: Erich Seifert Date: Fri, 5 Oct 2018 01:11:24 +0200 Subject: [PATCH 0573/1393] Fixed documentation on bilevel conversion The cutoff when converting an image to bilevel (mode "1") is 128. This should resolve issue #3394. --- 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 edea3125bf6..b537b65281d 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -873,9 +873,9 @@ def convert(self, mode=None, matrix=None, dither=None, 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 NONE, all non-zero values are set to 255 (white). To - use other thresholds, use the :py:meth:`~PIL.Image.Image.point` - method. + dither is NONE, all values larger than 128 are set to 255 (white), + all other values to 0 (black). To use other thresholds, use the + :py:meth:`~PIL.Image.Image.point` method. When converting from "RGBA" to "P" without a **matrix** argument, this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, From 7cdfddd1e87f7068ed5f54d6c7ab6e96da7705fe Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 5 Oct 2018 21:40:20 +1000 Subject: [PATCH 0574/1393] Added macOS Mojave tested Pillow version [ci skip] --- docs/installation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 9f0393563f8..66c40cb6b9d 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -423,6 +423,8 @@ These platforms have been reported to work at the versions mentioned. +----------------------------------+------------------------------+--------------------------------+-----------------------+ |**Operating system** |**Tested Python versions** |**Latest tested Pillow version**|**Tested processors** | +----------------------------------+------------------------------+--------------------------------+-----------------------+ +| macOS 10.14 Mojave | 2.7, 3.4, 3.5, 3.6, 3.7 | 5.3.0 |x86-64 | ++----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.13 High Sierra | 2.7, 3.4, 3.5, 3.6 | 4.2.1 |x86-64 | +----------------------------------+------------------------------+--------------------------------+-----------------------+ | macOS 10.12 Sierra | 2.7, 3.4, 3.5, 3.6 | 4.1.1 |x86-64 | From afb6ba562684265dc632d23887355df1cad1160e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Oct 2018 19:43:11 +1100 Subject: [PATCH 0575/1393] Added Python 3.5-3.7 AppVeyor builds --- .appveyor.yml | 8 ++- setup.py | 5 +- winbuild/build.py | 42 ++++++++++----- winbuild/build_dep.py | 32 ++++++----- winbuild/config.py | 120 +++++++++++++++++++++++++++--------------- 5 files changed, 134 insertions(+), 73 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 95d816a9871..da8c1708b51 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -18,8 +18,14 @@ environment: PIP_DIR: bin VENV: YES - PYTHON: C:/Python27-x64 - - PYTHON: C:/Python34 + - PYTHON: C:/Python37 - PYTHON: C:/Python27 + - PYTHON: C:/Python37-x64 + - PYTHON: C:/Python36 + - PYTHON: C:/Python36-x64 + - PYTHON: C:/Python35 + - PYTHON: C:/Python35-x64 + - PYTHON: C:/Python34 - PYTHON: C:/Python34-x64 - PYTHON: C:/msys64/mingw32 EXECUTABLE: bin/python3 diff --git a/setup.py b/setup.py index 15d81e4653b..c0278fd19e6 100755 --- a/setup.py +++ b/setup.py @@ -191,10 +191,11 @@ def __iter__(self): ('disable-platform-guessing', None, 'Disable platform guessing on Linux'), ('debug', None, 'Debug logging') - ] + ] + [('add-imaging-libs=', None, 'Add libs to _imaging build')] def initialize_options(self): self.disable_platform_guessing = None + self.add_imaging_libs = "" build_ext.initialize_options(self) for x in self.feature: setattr(self, 'disable_%s' % x, None) @@ -598,7 +599,7 @@ def build_extensions(self): for src_file in _LIB_IMAGING: files.append(os.path.join("src/libImaging", src_file + ".c")) - libs = [] + libs = self.add_imaging_libs.split() defs = [] if feature.jpeg: libs.append(feature.jpeg) diff --git a/winbuild/build.py b/winbuild/build.py index 859a4027787..ad8b2a2a9da 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -7,7 +7,7 @@ import os from config import (compilers, compiler_from_env, pythons, pyversion_from_env, - VIRT_BASE, X64_EXT) + bit_from_env, VIRT_BASE, X64_EXT) def setup_vms(): @@ -64,7 +64,15 @@ def footer(): """ -def build_one(py_ver, compiler): +def vc_setup(compiler, bit): + script = "" + if compiler['vc_version'] == '2015': + arch = "x86" if bit == 32 else "x86_amd64" + script = r""" +call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %s""" % arch + return script + +def build_one(py_ver, compiler, bit): # UNDONE virtual envs if we're not running on appveyor args = {} args.update(compiler) @@ -78,12 +86,17 @@ def build_one(py_ver, compiler): args['executable'] = "%EXECUTABLE%" args['py_ver'] = py_ver - if '34' in py_ver: + if '27' in py_ver: + args['tcl_ver'] = '85' + else: args['tcl_ver'] = '86' + + if compiler['vc_version'] == '2015': + args['imaging_libs'] = ' build_ext --add-imaging-libs=msvcrt' else: - args['tcl_ver'] = '85' + args['imaging_libs'] = '' - return r""" + script = r""" setlocal EnableDelayedExpansion call "%%ProgramFiles%%\Microsoft SDKs\Windows\%(env_version)s\Bin\SetEnv.Cmd" /Release %(env_flags)s set DISTUTILS_USE_SDK=1 @@ -91,12 +104,13 @@ def build_one(py_ver, compiler): set INCLUDE=%%INCLUDE%%;%%INCLIB%%\%(inc_dir)s;%%INCLIB%%\tcl%(tcl_ver)s\include setlocal -set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl -call %(python_path)s\%(executable)s setup.py %%BLDOPT%% +set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl""" + vc_setup(compiler, bit) + r""" +call %(python_path)s\%(executable)s setup.py %(imaging_libs)s %%BLDOPT%% endlocal endlocal -""" % args +""" + return script % args def clean(): @@ -111,19 +125,18 @@ def clean(): def main(op): scripts = [] - for py_version, compiler_version in pythons.items(): + for py_version, py_info in pythons.items(): + py_compilers = compilers[py_info['compiler']][py_info['vc']] scripts.append((py_version, "\n".join([header(op), build_one(py_version, - compilers[(compiler_version, - 32)]), + py_compilers[32], 32), footer()]))) scripts.append(("%s%s" % (py_version, X64_EXT), "\n".join([header(op), build_one("%sx64" % py_version, - compilers[(compiler_version, - 64)]), + py_compilers[64], 64), footer()]))) results = map(run_script, scripts) @@ -136,10 +149,11 @@ def run_one(op): compiler = compiler_from_env() py_version = pyversion_from_env() + bit = bit_from_env() run_script((py_version, "\n".join([header(op), - build_one(py_version, compiler), + build_one(py_version, compiler, bit), footer()]) )) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index 6ac3baa473f..3eefb26111f 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -3,7 +3,9 @@ import os from fetch import fetch -from config import compilers, compiler_from_env, libs +from config import (compilers, all_compilers, compiler_from_env, bit_from_env, + libs) +from build import vc_setup def _relpath(*args): @@ -28,7 +30,7 @@ def mkdirs(): os.mkdir(inc_dir) except OSError: pass - for compiler in compilers.values(): + for compiler in all_compilers(): try: os.mkdir(os.path.join(inc_dir, compiler['inc_dir'])) except OSError: @@ -48,7 +50,7 @@ def extract_libs(): if not os.path.exists(filename): filename = fetch(lib['url']) if name == 'openjpeg': - for compiler in compilers.values(): + for compiler in all_compilers(): if not os.path.exists(os.path.join( build_dir, lib['dir']+compiler['inc_dir'])): extract(filename, build_dir) @@ -148,11 +150,12 @@ def msbuild_openjpeg(compiler): """ % atts -def nmake_libs(compiler): +def nmake_libs(compiler, bit): # undone -- pre, makes, headers, libs - return r""" + script = r""" rem Build libjpeg setlocal +""" + vc_setup(compiler, bit) + r""" cd /D %%JPEG%% nmake -f makefile.vc setup-vc6 nmake -f makefile.vc clean @@ -176,6 +179,7 @@ def nmake_libs(compiler): rem Build webp setlocal +""" + vc_setup(compiler, bit) + r""" cd /D %%WEBP%% rd /S /Q %%WEBP%%\output\release-static nmake -f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output all @@ -186,6 +190,7 @@ def nmake_libs(compiler): rem Build libtiff setlocal +""" + vc_setup(compiler, bit) + r""" rem do after building jpeg and zlib copy %%~dp0\nmake.opt %%TIFF%% @@ -196,9 +201,8 @@ def nmake_libs(compiler): copy /Y /B libtiff\*.lib %%INCLIB%% copy /Y /B libtiff\tiff*.h %%INCLIB%% endlocal - - -""" % compiler +""" + return script % compiler def msbuild_freetype(compiler): @@ -273,9 +277,9 @@ def build_lcms_71(compiler): """ % compiler -def add_compiler(compiler): +def add_compiler(compiler, bit): script.append(setup_compiler(compiler)) - script.append(nmake_libs(compiler)) + script.append(nmake_libs(compiler, bit)) # script.append(extract_openjpeg(compiler)) @@ -293,12 +297,12 @@ def add_compiler(compiler): if 'PYTHON' in os.environ: - add_compiler(compiler_from_env()) + add_compiler(compiler_from_env(), bit_from_env()) else: - # for compiler in compilers.values(): + # for compiler in all_compilers(): # add_compiler(compiler) - add_compiler(compilers[(7.0, 32)]) - # add_compiler(compilers[(7.1, 64)]) + add_compiler(compilers[7.0][2008][32], 32) + # add_compiler(compilers[7.1][2010][64]) with open('build_deps.cmd', 'w') as f: f.write("\n".join(script)) diff --git a/winbuild/config.py b/winbuild/config.py index 404ce16a7da..2bd49552a7d 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -3,12 +3,13 @@ SF_MIRROR = 'http://iweb.dl.sourceforge.net' PILLOW_DEPENDS_DIR = 'C:\\pillow-depends\\' -pythons = { # '26': 7, - '27': 7, - 'pypy2': 7, - # '32': 7, - '33': 7.1, - '34': 7.1} +pythons = {'27': {'compiler':7, 'vc':2008}, + 'pypy2': {'compiler':7, 'vc':2008}, + '33': {'compiler':7.1, 'vc':2010}, + '34': {'compiler':7.1, 'vc':2010}, + '35': {'compiler':7.1, 'vc':2015}, + '36': {'compiler':7.1, 'vc':2015}, + '37': {'compiler':7.1, 'vc':2015}} VIRT_BASE = "c:/vp/" X64_EXT = os.environ.get('X64_EXT', "x64") @@ -78,38 +79,64 @@ } compilers = { - (7, 64): { - 'env_version': 'v7.0', - 'vc_version': '2008', - 'env_flags': '/x64 /xp', - 'inc_dir': 'msvcr90-x64', - 'platform': 'x64', - 'webp_platform': 'x64', - }, - (7, 32): { - 'env_version': 'v7.0', - 'vc_version': '2008', - 'env_flags': '/x86 /xp', - 'inc_dir': 'msvcr90-x32', - 'platform': 'Win32', - 'webp_platform': 'x86', - }, - (7.1, 64): { - 'env_version': 'v7.1', - 'vc_version': '2010', - 'env_flags': '/x64 /vista', - 'inc_dir': 'msvcr10-x64', - 'platform': 'x64', - 'webp_platform': 'x64', - }, - (7.1, 32): { - 'env_version': 'v7.1', - 'vc_version': '2010', - 'env_flags': '/x86 /vista', - 'inc_dir': 'msvcr10-x32', - 'platform': 'Win32', - 'webp_platform': 'x86', + 7: { + 2008: { + 64: { + 'env_version': 'v7.0', + 'vc_version': '2008', + 'env_flags': '/x64 /xp', + 'inc_dir': 'msvcr90-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.0', + 'vc_version': '2008', + 'env_flags': '/x86 /xp', + 'inc_dir': 'msvcr90-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + } }, + 7.1: { + 2010: { + 64: { + 'env_version': 'v7.1', + 'vc_version': '2010', + 'env_flags': '/x64 /vista', + 'inc_dir': 'msvcr10-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.1', + 'vc_version': '2010', + 'env_flags': '/x86 /vista', + 'inc_dir': 'msvcr10-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + }, + 2015: { + 64: { + 'env_version': 'v7.1', + 'vc_version': '2015', + 'env_flags': '/x64 /vista', + 'inc_dir': 'msvcr10-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.1', + 'vc_version': '2015', + 'env_flags': '/x86 /vista', + 'inc_dir': 'msvcr10-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + } + } } @@ -133,11 +160,20 @@ def compiler_from_env(): for k, v in pythons.items(): if k in py: - compiler_version = v + py_info = v break - bit = 32 - if '64' in py: - bit = 64 + bit = bit_from_env() + return compilers[py_info['compiler']][py_info['vc']][bit] + +def bit_from_env(): + py = os.environ['PYTHON'] + + return 64 if '64' in py else 32 - return compilers[(compiler_version, bit)] +def all_compilers(): + all = [] + for vc_compilers in compilers.values(): + for bit_compilers in vc_compilers.values(): + all += bit_compilers.values() + return all From 3d8024c45fb3d2e717871c4570aac99bb3911249 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Oct 2018 06:11:09 +1100 Subject: [PATCH 0576/1393] Removed unused line --- winbuild/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/winbuild/config.py b/winbuild/config.py index 2bd49552a7d..bfce09b0331 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -5,7 +5,6 @@ pythons = {'27': {'compiler':7, 'vc':2008}, 'pypy2': {'compiler':7, 'vc':2008}, - '33': {'compiler':7.1, 'vc':2010}, '34': {'compiler':7.1, 'vc':2010}, '35': {'compiler':7.1, 'vc':2015}, '36': {'compiler':7.1, 'vc':2015}, From 7edca01921fdd7dce41d4c27f2f1359eeb935314 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 11 Oct 2018 19:36:50 +1100 Subject: [PATCH 0577/1393] Minor documentation improvement [ci skip] --- src/PIL/ImageDraw.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 6a70def3b20..27205cfff4f 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -391,8 +391,8 @@ def floodfill(image, xy, value, border=None, thresh=0): pixel. :param thresh: Optional threshold value which specifies a maximum tolerable difference of a pixel value from the 'background' in - order for it to be replaced. Useful for filling regions of non- - homogeneous, but similar, colors. + order for it to be replaced. Useful for filling regions of + non-homogeneous, but similar, colors. """ # based on an implementation by Eric S. Raymond # amended by yo1995 @20180806 From a6ce3d6f3be8beaadae8542a02f1e533aa4feb84 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 11 Oct 2018 18:16:03 +0300 Subject: [PATCH 0578/1393] CI targets: update Appveyor and MinGW versions [CI skip] --- docs/installation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 66c40cb6b9d..c87307ad0db 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -399,13 +399,13 @@ These platforms are built and tested for every change. | Ubuntu Linux 16.04 LTS | 2.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ | Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, 3.7, |x86-64 | -| | pypy, pypy3 | | +| | PyPy, PyPy3 | | | +-------------------------------+-----------------------+ | | 2.7 |x86 | +----------------------------------+-------------------------------+-----------------------+ -| Windows Server 2012 R2 | 2.7, 3.4 |x86, x86-64 | +| Windows Server 2012 R2 | 2.7, 3.4, 3.5, 3.6, 3.7 |x86, x86-64 | | +-------------------------------+-----------------------+ -| | pypy, 3.5/mingw |x86 | +| | PyPy, 3.7/MinGW |x86 | +----------------------------------+-------------------------------+-----------------------+ \* Mac OS X CI is not run for every commit, but is run for every release. From 26065d3dd6877a99ef9bac585208c85fcd8fa86c Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 11 Oct 2018 18:22:25 +0300 Subject: [PATCH 0579/1393] CI targets: update Ubuntu versions * 14.04 Trusty has 2.7, 3.4-3.6, PyPy and PyPy3 * 16.04 Xenial has 2.7, 3.5-3.7 [CI skip] --- docs/installation.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index c87307ad0db..8d80e514498 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -396,9 +396,9 @@ These platforms are built and tested for every change. +----------------------------------+-------------------------------+-----------------------+ | Mac OS X 10.10 Yosemite* | 2.7, 3.4, 3.5, 3.6, 3.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ -| Ubuntu Linux 16.04 LTS | 2.7 |x86-64 | +| Ubuntu Linux 16.04 LTS | 2.7, 3.5, 3.6, 3.7 |x86-64 | +----------------------------------+-------------------------------+-----------------------+ -| Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, 3.7, |x86-64 | +| Ubuntu Linux 14.04 LTS | 2.7, 3.4, 3.5, 3.6, |x86-64 | | | PyPy, PyPy3 | | | +-------------------------------+-----------------------+ | | 2.7 |x86 | From 468c405a47770d4947b970af78bf1a8e73eea7c9 Mon Sep 17 00:00:00 2001 From: Nazime Date: Sun, 14 Oct 2018 16:12:58 +0200 Subject: [PATCH 0580/1393] Image pixels negative index --- src/PIL/PyAccess.py | 8 ++++++-- src/_imaging.c | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/PIL/PyAccess.py b/src/PIL/PyAccess.py index cce2de2b811..395dbcd3bed 100644 --- a/src/PIL/PyAccess.py +++ b/src/PIL/PyAccess.py @@ -88,8 +88,12 @@ def __getitem__(self, xy): :returns: a pixel value for single band images, a tuple of pixel values for multiband images. """ - - (x, y) = self.check_xy(xy) + (x, y) = xy + if (x < 0): + x = self.xsize + x + if (y < 0): + y = self.ysize + y + (x, y) = self.check_xy((x, y)) return self.get_pixel(x, y) putpixel = __setitem__ diff --git a/src/_imaging.c b/src/_imaging.c index e4b31f10b84..ede531e03ce 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -471,7 +471,12 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) INT32 i; FLOAT32 f; } pixel; - + if (x < 0){ + x = im->xsize + x; + } + if (y < 0){ + y = im->ysize + y; + } if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return NULL; From 86324a842dd2851f0b4c758064a2acf3c805e41a Mon Sep 17 00:00:00 2001 From: Nazime Date: Mon, 15 Oct 2018 12:51:24 +0200 Subject: [PATCH 0581/1393] Add setting negative pixels and unittest --- Tests/test_image_access.py | 57 ++++++++++++++++++++++++++++++++++++++ src/PIL/PyAccess.py | 11 ++++++-- src/_imaging.c | 20 +++++++++++-- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index a7e39a499a0..f88cfc2f620 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -64,6 +64,43 @@ def test_sanity(self): self.assert_image_equal(im1, im2) + def test_sanity_negative_index(self): + im1 = hopper() + im2 = Image.new(im1.mode, im1.size, 0) + + width, heigth = im1.size + self.assertEqual(im1.getpixel((0, 0)), im1.getpixel((-width, -heigth))) + self.assertEqual(im1.getpixel((-1, -1)), + im1.getpixel((width-1, heigth-1))) + + for y in range(-1, -im1.size[1]-1, -1): + for x in range(-1, -im1.size[0]-1, -1): + pos = x, y + im2.putpixel(pos, im1.getpixel(pos)) + + self.assert_image_equal(im1, im2) + + im2 = Image.new(im1.mode, im1.size, 0) + im2.readonly = 1 + + for y in range(-1, -im1.size[1]-1, -1): + for x in range(-1, -im1.size[0]-1, -1): + pos = x, y + im2.putpixel(pos, im1.getpixel(pos)) + + self.assertFalse(im2.readonly) + self.assert_image_equal(im1, im2) + + im2 = Image.new(im1.mode, im1.size, 0) + + pix1 = im1.load() + pix2 = im2.load() + + for y in range(-1, -im1.size[1]-1, -1): + for x in range(-1, -im1.size[0]-1, -1): + pix2[x, y] = pix1[x, y] + + self.assert_image_equal(im1, im2) class TestImageGetPixel(AccessTest): @staticmethod @@ -85,23 +122,43 @@ def check(self, mode, c=None): im.getpixel((0, 0)), c, "put/getpixel roundtrip failed for mode %s, color %s" % (mode, c)) + # check putpixel negative index + im.putpixel((-1, -1), c) + self.assertEqual( + im.getpixel((-1, -1)), c, + "put/getpixel roundtrip negative index failed" + " for mode %s, color %s" % (mode, c)) + # Check 0 im = Image.new(mode, (0, 0), None) with self.assertRaises(IndexError): im.putpixel((0, 0), c) with self.assertRaises(IndexError): im.getpixel((0, 0)) + # Check 0 negative index + with self.assertRaises(IndexError): + im.putpixel((-1, -1), c) + with self.assertRaises(IndexError): + im.getpixel((-1, -1)) # check initial color im = Image.new(mode, (1, 1), c) self.assertEqual( im.getpixel((0, 0)), c, "initial color failed for mode %s, color %s " % (mode, c)) + # check initial color negative index + self.assertEqual( + im.getpixel((-1, -1)), c, + "initial color failed with negative index" + "for mode %s, color %s " % (mode, c)) # Check 0 im = Image.new(mode, (0, 0), c) with self.assertRaises(IndexError): im.getpixel((0, 0)) + # Check 0 negative index + with self.assertRaises(IndexError): + im.getpixel((-1, -1)) def test_basic(self): for mode in ("1", "L", "LA", "I", "I;16", "I;16B", "F", diff --git a/src/PIL/PyAccess.py b/src/PIL/PyAccess.py index 395dbcd3bed..adbd6132da9 100644 --- a/src/PIL/PyAccess.py +++ b/src/PIL/PyAccess.py @@ -74,7 +74,12 @@ def __setitem__(self, xy, color): """ if self.readonly: raise ValueError('Attempt to putpixel a read only image') - (x, y) = self.check_xy(xy) + (x, y) = xy + if x < 0: + x = self.xsize + x + if y < 0: + y = self.ysize + y + (x, y) = self.check_xy((x, y)) return self.set_pixel(x, y, color) def __getitem__(self, xy): @@ -89,9 +94,9 @@ def __getitem__(self, xy): pixel values for multiband images. """ (x, y) = xy - if (x < 0): + if x < 0: x = self.xsize + x - if (y < 0): + if y < 0: y = self.ysize + y (x, y) = self.check_xy((x, y)) return self.get_pixel(x, y) diff --git a/src/_imaging.c b/src/_imaging.c index ede531e03ce..47444434841 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -471,12 +471,14 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) INT32 i; FLOAT32 f; } pixel; - if (x < 0){ + + if (x < 0) { x = im->xsize + x; } - if (y < 0){ + if (y < 0) { y = im->ysize + y; } + if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return NULL; @@ -1654,6 +1656,13 @@ _putpixel(ImagingObject* self, PyObject* args) im = self->image; + if (x < 0) { + x = im->xsize + x; + } + if (y < 0) { + y = im->ysize + y; + } + if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return NULL; @@ -3019,6 +3028,13 @@ pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) if (_getxy(xy, &x, &y)) return -1; + if (x < 0) { + x = im->xsize + x; + } + if (y < 0) { + y = im->ysize + y; + } + if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { PyErr_SetString(PyExc_IndexError, outside_image); return -1; From 63a0b801b4d5703f8f2eba01b13a6c108e425cee Mon Sep 17 00:00:00 2001 From: Nazime Date: Mon, 15 Oct 2018 13:06:08 +0200 Subject: [PATCH 0582/1393] misspelled variable name --- Tests/test_image_access.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index f88cfc2f620..338ab025817 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -68,10 +68,10 @@ def test_sanity_negative_index(self): im1 = hopper() im2 = Image.new(im1.mode, im1.size, 0) - width, heigth = im1.size - self.assertEqual(im1.getpixel((0, 0)), im1.getpixel((-width, -heigth))) + width, height = im1.size + self.assertEqual(im1.getpixel((0, 0)), im1.getpixel((-width, -height))) self.assertEqual(im1.getpixel((-1, -1)), - im1.getpixel((width-1, heigth-1))) + im1.getpixel((width-1, height-1))) for y in range(-1, -im1.size[1]-1, -1): for x in range(-1, -im1.size[0]-1, -1): From 73eec9000d5fa0e88786a560882fba921cfc42df Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 17 Oct 2018 01:57:55 +0300 Subject: [PATCH 0583/1393] Optimise ImageOps.fit by combining resize in crop --- src/PIL/ImageOps.py | 69 ++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 9f516bac1fb..49ea056987f 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -380,9 +380,10 @@ def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): (width, height) tuple. :param method: What resampling method to use. Default is :py:attr:`PIL.Image.NEAREST`. - :param bleed: Remove a border around the outside of the image (from all + :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 one percent). The default value is 0 (no border). + Cannot be greater than or equal to 0.5. :param centering: Control the cropping position. Use (0.5, 0.5) for center cropping (e.g. if cropping the width, take 50% off of the left side, and therefore 50% off the right side). @@ -400,66 +401,50 @@ def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): # kevin@cazabon.com # http://www.cazabon.com - # ensure inputs are valid - if not isinstance(centering, list): - centering = [centering[0], centering[1]] + # ensure centering is mutable + centering = list(centering) - if centering[0] > 1.0 or centering[0] < 0.0: - centering[0] = 0.50 - if centering[1] > 1.0 or centering[1] < 0.0: - centering[1] = 0.50 + if not 0.0 <= centering[0] <= 1.0: + centering[0] = 0.5 + if not 0.0 <= centering[1] <= 1.0: + centering[1] = 0.5 - if bleed > 0.49999 or bleed < 0.0: + if not 0.0 <= bleed < 0.5: bleed = 0.0 # calculate the area to use for resizing and cropping, subtracting # the 'bleed' around the edges # number of pixels to trim off on Top and Bottom, Left and Right - bleedPixels = ( - int((float(bleed) * float(image.size[0])) + 0.5), - int((float(bleed) * float(image.size[1])) + 0.5) - ) - - liveArea = (0, 0, image.size[0], image.size[1]) - if bleed > 0.0: - liveArea = ( - bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1, - image.size[1] - bleedPixels[1] - 1 - ) + bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1]) + live_size = (image.size[0] - bleed_pixels[0] * 2, + image.size[1] - bleed_pixels[1] * 2) - # calculate the aspect ratio of the liveArea - liveAreaAspectRatio = float(liveSize[0])/float(liveSize[1]) + # calculate the aspect ratio of the live_size + live_size_ratio = float(live_size[0]) / live_size[1] # calculate the aspect ratio of the output image - aspectRatio = float(size[0]) / float(size[1]) + output_ratio = float(size[0]) / size[1] # figure out if the sides or top/bottom will be cropped off - if liveAreaAspectRatio >= aspectRatio: - # liveArea is wider than what's needed, crop the sides - cropWidth = int((aspectRatio * float(liveSize[1])) + 0.5) - cropHeight = liveSize[1] + if live_size_ratio >= output_ratio: + # live_size is wider than what's needed, crop the sides + crop_width = output_ratio * live_size[1] + crop_height = live_size[1] else: - # liveArea is taller than what's needed, crop the top and bottom - cropWidth = liveSize[0] - cropHeight = int((float(liveSize[0])/aspectRatio) + 0.5) + # live_size is taller than what's needed, crop the top and bottom + crop_width = live_size[0] + crop_height = live_size[0] / output_ratio # make the crop - leftSide = int(liveArea[0] + (float(liveSize[0]-cropWidth) * centering[0])) - if leftSide < 0: - leftSide = 0 - topSide = int(liveArea[1] + (float(liveSize[1]-cropHeight) * centering[1])) - if topSide < 0: - topSide = 0 - - out = image.crop( - (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight) - ) + crop_left = bleed_pixels[0] + (live_size[0]-crop_width) * centering[0] + crop_top = bleed_pixels[1] + (live_size[1]-crop_height) * centering[1] + + crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) # resize the image and return it - return out.resize(size, method) + return image.resize(size, method, box=crop) def flip(image): From 67563cff336e8198bae93aa48918a00943fc941c Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 17 Oct 2018 09:23:41 +0300 Subject: [PATCH 0584/1393] Fix 'no such option: --use-wheel' --- depends/diffcover-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/diffcover-install.sh b/depends/diffcover-install.sh index 850d368f8f6..8a8cee07675 100755 --- a/depends/diffcover-install.sh +++ b/depends/diffcover-install.sh @@ -4,4 +4,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 --use-wheel diff_cover +time CFLAGS=-O0 pip install diff_cover From 88e72498c7e652b60319809a07e686242d875b71 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 17 Oct 2018 16:41:28 +0300 Subject: [PATCH 0585/1393] Name the build jobs https://docs.travis-ci.com/user/customizing-the-build/#naming-jobs-within-matrices --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index 36a956e9502..480e98d2056 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,25 +14,37 @@ matrix: fast_finish: true include: - python: "pypy" + name: "PyPy Trusty" dist: trusty - python: "pypy3" + name: "PyPy3 Trusty" dist: trusty - python: '3.7' + name: "3.7 Xenial" - python: '2.7' + name: "2.7 Xenial" - python: '2.7' + name: "2.7 Trusty" dist: trusty - python: "2.7_with_system_site_packages" # For PyQt4 + name: "2.7_with_system_site_packages Xenial" - python: "2.7_with_system_site_packages" # For PyQt4 + name: "2.7_with_system_site_packages Trusty" dist: trusty - python: '3.6' + name: "3.6 Xenial" - python: '3.6' + name: "3.6 Trusty PYTHONOPTIMIZE=1" dist: trusty env: PYTHONOPTIMIZE=1 - python: '3.5' + name: "3.5 Xenial" - python: '3.5' + name: "3.5 Trusty PYTHONOPTIMIZE=2" dist: trusty env: PYTHONOPTIMIZE=2 - python: '3.4' + name: "3.4 Trusty" dist: trusty - env: DOCKER="alpine" DOCKER_TAG="pytest" - env: DOCKER="arch" DOCKER_TAG="pytest" # contains PyQt5 From bada6be2db6321ad49d1bef25ad0ba22175f2295 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 17 Oct 2018 18:01:07 +0300 Subject: [PATCH 0586/1393] pep8 is now pycodestyle: https://github.com/PyCQA/pycodestyle/issues/466 --- depends/diffcover-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/diffcover-run.sh b/depends/diffcover-run.sh index 02efab6aea5..a0d545bc254 100755 --- a/depends/diffcover-run.sh +++ b/depends/diffcover-run.sh @@ -1,4 +1,4 @@ coverage xml diff-cover coverage.xml diff-quality --violation=pyflakes -diff-quality --violation=pep8 +diff-quality --violation=pycodestyle From cadfbed43b6e7c3f308d6c3dd746f9224088e353 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 17 Oct 2018 22:24:05 +0300 Subject: [PATCH 0587/1393] Run lint in own job, but don't let it fail build --- .travis.yml | 37 +++++++++++++++++++++++++----------- .travis/after_success.sh | 9 --------- depends/diffcover-install.sh | 1 + depends/diffcover-run.sh | 1 + 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 480e98d2056..b9492393323 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,13 +6,18 @@ cache: pip notifications: irc: "chat.freenode.net#pil" -# Run slow PyPy* first, to give them a headstart and reduce waiting time. +# Run fast lint first to get fast feedback. +# Run slow PyPy* next, to give them a headstart and reduce waiting time. # Run latest 3.x and 2.x next, to get quick compatibility results. # Then run the remainder, with fastest Docker jobs last. matrix: fast_finish: true include: + - python: "3.6" + name: "Lint" + env: LINT="true" + sudo: false - python: "pypy" name: "PyPy Trusty" dist: trusty @@ -62,7 +67,12 @@ services: - docker install: - - if [ "$DOCKER" == "" ]; then .travis/install.sh; fi + - | + if [ "$LINT" == "true" ]; then + pip install -U flake8 + elif [ "$DOCKER" == "" ]; then + .travis/install.sh; + fi before_install: - if [ "$DOCKER" ]; then travis_retry docker pull pythonpillow/$DOCKER:$DOCKER_TAG; fi @@ -73,14 +83,19 @@ before_script: - "sh -e /etc/init.d/xvfb start" script: - - | - if [ "$DOCKER" == "" ]; then - .travis/script.sh - else - # the Pillow user in the docker container is UID 1000 - sudo chown -R 1000 $TRAVIS_BUILD_DIR - docker run -v $TRAVIS_BUILD_DIR:/Pillow pythonpillow/$DOCKER:$DOCKER_TAG - fi +- | + if [ "$DOCKER" == "" ] && [ "$LINT" == "" ]; then + .travis/script.sh + elif [ "$DOCKER" ]; then + # the Pillow user in the docker container is UID 1000 + sudo chown -R 1000 $TRAVIS_BUILD_DIR + docker run -v $TRAVIS_BUILD_DIR:/Pillow pythonpillow/$DOCKER:$DOCKER_TAG + fi after_success: - - .travis/after_success.sh +- | + if [ "$LINT" == "true" ]; then + flake8 --statistics --count + else + .travis/after_success.sh + fi diff --git a/.travis/after_success.sh b/.travis/after_success.sh index c215f421997..ad1aeffa368 100755 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -15,15 +15,6 @@ pip install coveralls-merge coveralls-merge coverage.c.json codecov -if [ "$DOCKER" == "" ]; then - pip install pyflakes pycodestyle - pyflakes *.py | tee >(wc -l) - pyflakes src/PIL/*.py | tee >(wc -l) - pyflakes Tests/*.py | tee >(wc -l) - pycodestyle --statistics --count src/PIL/*.py - pycodestyle --statistics --count Tests/*.py -fi - if [ "$TRAVIS_PYTHON_VERSION" == "2.7" ] && [ "$DOCKER" == "" ]; then # Coverage and quality reports on just the latest diff. # (Installation is very slow on Py3, so just do it for Py2.) diff --git a/depends/diffcover-install.sh b/depends/diffcover-install.sh index 8a8cee07675..a0b462b56d7 100755 --- a/depends/diffcover-install.sh +++ b/depends/diffcover-install.sh @@ -1,3 +1,4 @@ +#!/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 diff --git a/depends/diffcover-run.sh b/depends/diffcover-run.sh index a0d545bc254..b007494e922 100755 --- a/depends/diffcover-run.sh +++ b/depends/diffcover-run.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash coverage xml diff-cover coverage.xml diff-quality --violation=pyflakes From f8d4aa58829228ee246e562cde9ba50f2b564af9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 18 Oct 2018 10:19:11 +0300 Subject: [PATCH 0588/1393] Quick fix: revert #3341 due to regression --- src/PIL/WebPImagePlugin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index e6485c2530c..1e9a028a7f1 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -163,8 +163,6 @@ def load(self): self.__loaded = self.__logical_frame # Set tile - if self.fp: - self.fp.close() self.fp = BytesIO(data) self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] From e7aa44f58c842249b6c8a1e35dde7a15a19b07fb Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 18 Oct 2018 10:32:17 +0300 Subject: [PATCH 0589/1393] add test for regression --- Tests/test_file_webp.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index d815ab09a7c..399b585e85f 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -9,14 +9,7 @@ HAVE_WEBP = False -class TestFileWebp(PillowTestCase): - - def setUp(self): - if not HAVE_WEBP: - return - - self.rgb_mode = "RGB" - +class TestUnsupportedWebp(PillowTestCase): def test_unsupported(self): if HAVE_WEBP: WebPImagePlugin.SUPPORTED = False @@ -28,12 +21,18 @@ def test_unsupported(self): if HAVE_WEBP: WebPImagePlugin.SUPPORTED = True - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") + + +@unittest.skipIf(not HAVE_WEBP, "WebP support not installed") +class TestFileWebp(PillowTestCase): + + def setUp(self): + self.rgb_mode = "RGB" + def test_version(self): _webp.WebPDecoderVersion() _webp.WebPDecoderBuggyAlpha() - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_read_rgb(self): """ Can we read a RGB mode WebP file without error? @@ -53,7 +52,6 @@ def test_read_rgb(self): self.assert_image_similar_tofile( image, 'Tests/images/hopper_webp_bits.ppm', 1.0) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_rgb(self): """ Can we write a RGB mode file to webp without error. @@ -83,7 +81,6 @@ def test_write_rgb(self): target = hopper(self.rgb_mode) self.assert_image_similar(image, target, 12.0) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_unsupported_mode_L(self): """ Saving a black-and-white file to WebP format should work, and be @@ -104,7 +101,6 @@ def test_write_unsupported_mode_L(self): self.assert_image_similar(image, target, 10.0) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_write_unsupported_mode_P(self): """ Saving a palette-based file to WebP format should work, and be @@ -125,7 +121,6 @@ def test_write_unsupported_mode_P(self): self.assert_image_similar(image, target, 50.0) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_WebPEncode_with_invalid_args(self): """ Calling encoder functions with no arguments should result in an error. @@ -135,7 +130,6 @@ def test_WebPEncode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimEncoder) self.assertRaises(TypeError, _webp.WebPEncode) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_WebPDecode_with_invalid_args(self): """ Calling decoder functions with no arguments should result in an error. @@ -145,7 +139,6 @@ def test_WebPDecode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimDecoder) self.assertRaises(TypeError, _webp.WebPDecode) - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") def test_no_resource_warning(self): file_path = "Tests/images/hopper.webp" image = Image.open(file_path) @@ -153,6 +146,12 @@ def test_no_resource_warning(self): temp_file = self.tempfile("temp.webp") self.assert_warning(None, image.save, temp_file) + def test_file_pointer_could_be_reused(self): + file_path = "Tests/images/hopper.webp" + with open(file_path, 'rb') as blob: + Image.open(blob).load() + Image.open(blob).load() + if __name__ == '__main__': unittest.main() From e26696cb8a753a28e62fc2a37ebb506e752f0583 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 18 Oct 2018 10:33:52 +0300 Subject: [PATCH 0590/1393] skip old test --- Tests/test_file_webp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 399b585e85f..956a2699605 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -139,6 +139,7 @@ def test_WebPDecode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimDecoder) self.assertRaises(TypeError, _webp.WebPDecode) + @unittest.skip("Currently is not working") def test_no_resource_warning(self): file_path = "Tests/images/hopper.webp" image = Image.open(file_path) From 6cabcadae4c81059b63c2096d02b3fe6d206c02e Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 18 Oct 2018 10:58:20 +0300 Subject: [PATCH 0591/1393] add release notes --- docs/releasenotes/5.4.0.rst | 14 ++++++++++++++ docs/releasenotes/index.rst | 1 + src/PIL/ImageOps.py | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 docs/releasenotes/5.4.0.rst diff --git a/docs/releasenotes/5.4.0.rst b/docs/releasenotes/5.4.0.rst new file mode 100644 index 00000000000..094efdc617c --- /dev/null +++ b/docs/releasenotes/5.4.0.rst @@ -0,0 +1,14 @@ +5.4.0 (unreleased) +----- + + +Other Changes +============= + +ImageOps.fit +^^^^^^^^^^^^ + +Now uses the one resize operation with ``box`` argument internally +instead of the crop and scale operations sequence. +This improves the performance and accuracy of cropping since +``box`` parameter accepts float values. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index fc8d686eb00..df4fd493090 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -6,6 +6,7 @@ Release Notes .. toctree:: :maxdepth: 2 + 5.4.0 5.3.0 5.2.0 5.1.0 diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 49ea056987f..8092268479c 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -419,7 +419,7 @@ def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) live_size = (image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2) + image.size[1] - bleed_pixels[1] * 2) # calculate the aspect ratio of the live_size live_size_ratio = float(live_size[0]) / live_size[1] From 61e46c265e8f4371a89af340ffde2bffacc3ff04 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 18 Oct 2018 11:40:32 +0300 Subject: [PATCH 0592/1393] [ci skip] fix notes --- docs/releasenotes/5.4.0.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/5.4.0.rst b/docs/releasenotes/5.4.0.rst index 094efdc617c..df0622cdcb1 100644 --- a/docs/releasenotes/5.4.0.rst +++ b/docs/releasenotes/5.4.0.rst @@ -8,7 +8,7 @@ Other Changes ImageOps.fit ^^^^^^^^^^^^ -Now uses the one resize operation with ``box`` argument internally -instead of the crop and scale operations sequence. +Now uses one resize operation with ``box`` parameter internally +instead of a crop and scale operations sequence. This improves the performance and accuracy of cropping since -``box`` parameter accepts float values. +the ``box`` parameter accepts float values. From f4ce428a4f6ff02a436568322a50aaefe6d1de0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 18 Oct 2018 20:10:54 +1100 Subject: [PATCH 0593/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 52f1e165881..ce738d968ec 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,6 +2,12 @@ Changelog (Pillow) ================== +5.4.0 (unreleased) +------------------ + +- Optimise ImageOps.fit by combining resize and crop #3409 + [homm] + 5.3.0 (2018-10-01) ------------------ From 2bf3ceee8515d38b94c28d3c5dd15226489adf5c Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Thu, 18 Oct 2018 21:23:06 -0700 Subject: [PATCH 0594/1393] Only ask for YCbCr->RGB libtiff conversion for jpeg-compressed tiffs JPEG-related tiff pseudo-tags are registered only when tiff image has jpeg compression. Trying to set TIFFTAG_JPEGCOLORMODE on non jpeg-compressed file prints error "Unknown pseudo-tag 65538". --- src/libImaging/TiffDecode.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 98302389b4d..998e9de97ac 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -169,10 +169,11 @@ int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset) { } int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes) { - TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - char *filename = "tempfile.tif"; - char *mode = "r"; - TIFF *tiff; + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + char *filename = "tempfile.tif"; + char *mode = "r"; + TIFF *tiff; + uint16 photometric = 0, compression; /* buffer is the encoded file, bytes is the length of the encoded file */ @@ -234,7 +235,12 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int } } - TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); + TIFFGetFieldDefaulted(tiff, TIFFTAG_COMPRESSION, &compression); + TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); + if (compression == COMPRESSION_JPEG && photometric == PHOTOMETRIC_YCBCR) { + /* Set pseudo-tag to force automatic YCbCr->RGB conversion */ + TIFFSetField(tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); + } if (TIFFIsTiled(tiff)) { uint32 x, y, tile_y; From e84a78d828845d7a87da8139d0f8ceeb0c40926e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 19 Oct 2018 20:12:08 +1100 Subject: [PATCH 0595/1393] Only close existing fp if fp is exclusive --- Tests/test_file_webp.py | 1 - src/PIL/WebPImagePlugin.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 956a2699605..399b585e85f 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -139,7 +139,6 @@ def test_WebPDecode_with_invalid_args(self): self.assertRaises(TypeError, _webp.WebPAnimDecoder) self.assertRaises(TypeError, _webp.WebPDecode) - @unittest.skip("Currently is not working") def test_no_resource_warning(self): file_path = "Tests/images/hopper.webp" image = Image.open(file_path) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 1e9a028a7f1..eb4618a16b1 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -163,6 +163,8 @@ def load(self): self.__loaded = self.__logical_frame # Set tile + if self.fp and self._exclusive_fp: + self.fp.close() self.fp = BytesIO(data) self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] From 28cdb993b9e35fc8ee23ce3166d768f11d0c4f06 Mon Sep 17 00:00:00 2001 From: Konstantin Kopachev Date: Fri, 19 Oct 2018 11:42:40 -0700 Subject: [PATCH 0596/1393] Convert tabs into spaces [ci skip] --- src/libImaging/TiffDecode.c | 570 ++++++++++++++++++------------------ 1 file changed, 285 insertions(+), 285 deletions(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 998e9de97ac..e77afdf6187 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -21,8 +21,8 @@ #include "TiffDecode.h" 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)); + 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)); } /* @@ -30,140 +30,140 @@ void dump_state(const TIFFSTATE *state){ */ tsize_t _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) { - TIFFSTATE *state = (TIFFSTATE *)hdata; - tsize_t to_read; + TIFFSTATE *state = (TIFFSTATE *)hdata; + tsize_t to_read; - TRACE(("_tiffReadProc: %d \n", (int)size)); - dump_state(state); + TRACE(("_tiffReadProc: %d \n", (int)size)); + dump_state(state); - to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); - TRACE(("to_read: %d\n", (int)to_read)); + to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc); + TRACE(("to_read: %d\n", (int)to_read)); - _TIFFmemcpy(buf, (UINT8 *)state->data + state->loc, to_read); - state->loc += (toff_t)to_read; + _TIFFmemcpy(buf, (UINT8 *)state->data + state->loc, to_read); + state->loc += (toff_t)to_read; - TRACE( ("location: %u\n", (uint)state->loc)); - return to_read; + TRACE( ("location: %u\n", (uint)state->loc)); + return to_read; } tsize_t _tiffWriteProc(thandle_t hdata, tdata_t buf, tsize_t size) { - TIFFSTATE *state = (TIFFSTATE *)hdata; - tsize_t to_write; + TIFFSTATE *state = (TIFFSTATE *)hdata; + tsize_t to_write; - TRACE(("_tiffWriteProc: %d \n", (int)size)); - dump_state(state); + TRACE(("_tiffWriteProc: %d \n", (int)size)); + dump_state(state); - to_write = min(size, state->size - (tsize_t)state->loc); - if (state->flrealloc && size>to_write) { - tdata_t new_data; - tsize_t newsize=state->size; - while (newsize < (size + state->size)) { + to_write = min(size, state->size - (tsize_t)state->loc); + if (state->flrealloc && size>to_write) { + tdata_t new_data; + tsize_t newsize=state->size; + while (newsize < (size + state->size)) { if (newsize > INT_MAX - 64*1024){ return 0; } - newsize += 64*1024; - // newsize*=2; // UNDONE, by 64k chunks? - } - TRACE(("Reallocing in write to %d bytes\n", (int)newsize)); + newsize += 64*1024; + // newsize*=2; // UNDONE, by 64k chunks? + } + TRACE(("Reallocing in write to %d bytes\n", (int)newsize)); /* malloc check ok, overflow checked above */ - new_data = realloc(state->data, newsize); - if (!new_data) { - // fail out - return 0; - } - state->data = new_data; - state->size = newsize; - to_write = size; - } - - TRACE(("to_write: %d\n", (int)to_write)); - - _TIFFmemcpy((UINT8 *)state->data + state->loc, buf, to_write); - state->loc += (toff_t)to_write; - state->eof = max(state->loc, state->eof); - - dump_state(state); - return to_write; + new_data = realloc(state->data, newsize); + if (!new_data) { + // fail out + return 0; + } + state->data = new_data; + state->size = newsize; + to_write = size; + } + + TRACE(("to_write: %d\n", (int)to_write)); + + _TIFFmemcpy((UINT8 *)state->data + state->loc, buf, to_write); + state->loc += (toff_t)to_write; + state->eof = max(state->loc, state->eof); + + dump_state(state); + return to_write; } 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; - } - dump_state(state); - return state->loc; + 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; + } + dump_state(state); + return state->loc; } int _tiffCloseProc(thandle_t hdata) { - TIFFSTATE *state = (TIFFSTATE *)hdata; + TIFFSTATE *state = (TIFFSTATE *)hdata; - TRACE(("_tiffCloseProc \n")); - dump_state(state); + TRACE(("_tiffCloseProc \n")); + dump_state(state); - return 0; + return 0; } toff_t _tiffSizeProc(thandle_t hdata) { - TIFFSTATE *state = (TIFFSTATE *)hdata; + TIFFSTATE *state = (TIFFSTATE *)hdata; - TRACE(("_tiffSizeProc \n")); - dump_state(state); + TRACE(("_tiffSizeProc \n")); + dump_state(state); - return (toff_t)state->size; + return (toff_t)state->size; } int _tiffMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { - TIFFSTATE *state = (TIFFSTATE *)hdata; + TIFFSTATE *state = (TIFFSTATE *)hdata; - TRACE(("_tiffMapProc input size: %u, data: %p\n", (uint)*psize, *pbase)); - dump_state(state); + TRACE(("_tiffMapProc input size: %u, data: %p\n", (uint)*psize, *pbase)); + dump_state(state); - *pbase = state->data; - *psize = state->size; - TRACE(("_tiffMapProc returning size: %u, data: %p\n", (uint)*psize, *pbase)); - return (1); + *pbase = state->data; + *psize = state->size; + TRACE(("_tiffMapProc returning size: %u, data: %p\n", (uint)*psize, *pbase)); + return (1); } int _tiffNullMapProc(thandle_t hdata, tdata_t* pbase, toff_t* psize) { - (void) hdata; (void) pbase; (void) psize; - return (0); + (void) hdata; (void) pbase; (void) psize; + return (0); } void _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) { - TRACE(("_tiffUnMapProc\n")); - (void) hdata; (void) base; (void) size; + TRACE(("_tiffUnMapProc\n")); + (void) hdata; (void) base; (void) size; } int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset) { - TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + 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(("State: bits %d, bytes %d \n", state->bits, state->bytes)); - TRACE(("State: context %p \n", state->context)); - - clientstate->loc = 0; - clientstate->size = 0; - clientstate->data = 0; - clientstate->fp = fp; + 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)); + + clientstate->loc = 0; + clientstate->size = 0; + clientstate->data = 0; + clientstate->fp = fp; clientstate->ifd = offset; - clientstate->eof = 0; + clientstate->eof = 0; return 1; } @@ -176,64 +176,64 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int uint16 photometric = 0, compression; - /* 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 */ + /* 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: 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)); - - dump_state(clientstate); - clientstate->size = bytes; - clientstate->eof = clientstate->size; - clientstate->loc = 0; - clientstate->data = (tdata_t)buffer; - clientstate->flrealloc = 0; - dump_state(clientstate); + 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)); + + dump_state(clientstate); + clientstate->size = bytes; + clientstate->eof = clientstate->size; + clientstate->loc = 0; + clientstate->data = (tdata_t)buffer; + clientstate->flrealloc = 0; + dump_state(clientstate); TIFFSetWarningHandler(NULL); 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. - tiff = TIFFFdOpen(clientstate->fp, filename, mode); - } else { - TRACE(("Opening from string\n")); - tiff = TIFFClientOpen(filename, mode, - (thandle_t) clientstate, - _tiffReadProc, _tiffWriteProc, - _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, - _tiffMapProc, _tiffUnmapProc); - } - - if (!tiff){ - TRACE(("Error, didn't get the tiff\n")); - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } + 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. + tiff = TIFFFdOpen(clientstate->fp, filename, mode); + } else { + TRACE(("Opening from string\n")); + tiff = TIFFClientOpen(filename, mode, + (thandle_t) clientstate, + _tiffReadProc, _tiffWriteProc, + _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, + _tiffMapProc, _tiffUnmapProc); + } + + if (!tiff){ + TRACE(("Error, didn't get the tiff\n")); + state->errcode = IMAGING_CODEC_BROKEN; + return -1; + } if (clientstate->ifd){ - int rv; - uint32 ifdoffset = clientstate->ifd; - TRACE(("reading tiff ifd %u\n", ifdoffset)); - rv = TIFFSetSubDirectory(tiff, ifdoffset); - if (!rv){ - TRACE(("error in TIFFSetSubDirectory")); - return -1; - } - } + int rv; + uint32 ifdoffset = clientstate->ifd; + TRACE(("reading tiff ifd %u\n", ifdoffset)); + rv = TIFFSetSubDirectory(tiff, ifdoffset); + if (!rv){ + TRACE(("error in TIFFSetSubDirectory")); + return -1; + } + } TIFFGetFieldDefaulted(tiff, TIFFTAG_COMPRESSION, &compression); TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); @@ -332,173 +332,173 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int } } - TIFFClose(tiff); - TRACE(("Done Decoding, Returning \n")); - // Returning -1 here to force ImageFile.load to break, rather than - // even think about looping back around. - return -1; + TIFFClose(tiff); + TRACE(("Done Decoding, Returning \n")); + // Returning -1 here to force ImageFile.load to break, rather than + // even think about looping back around. + return -1; } 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. - // If we have a memory string, we're probably going to have to malloc, then - // shuffle bytes into the writescanline process. - // Going to have to deal with the directory as well. + // 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. + // If we have a memory string, we're probably going to have to malloc, then + // shuffle bytes into the writescanline process. + // Going to have to deal with the directory as well. - TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - int bufsize = 64*1024; - char *mode = "w"; + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + 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(("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->data = 0; - clientstate->flrealloc = 0; - clientstate->fp = fp; - - state->state = 0; - - if (fp) { - TRACE(("Opening using fd: %d for writing \n",clientstate->fp)); - clientstate->tiff = TIFFFdOpen(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. - TRACE(("Opening a buffer for writing \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(("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->data = 0; + clientstate->flrealloc = 0; + clientstate->fp = fp; + + state->state = 0; + + if (fp) { + TRACE(("Opening using fd: %d for writing \n",clientstate->fp)); + clientstate->tiff = TIFFFdOpen(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. + TRACE(("Opening a buffer for writing \n")); /* malloc check ok, small constant allocation */ - clientstate->data = malloc(bufsize); - clientstate->size = bufsize; - clientstate->flrealloc=1; + clientstate->data = malloc(bufsize); + clientstate->size = bufsize; + clientstate->flrealloc=1; - if (!clientstate->data) { - TRACE(("Error, couldn't allocate a buffer of size %d\n", bufsize)); - return 0; - } + 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) { - TRACE(("Error, couldn't open tiff file\n")); - return 0; - } + if (!clientstate->tiff) { + TRACE(("Error, couldn't open tiff file\n")); + return 0; + } return 1; } int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ - // after tif_dir.c->TIFFSetField. - TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - va_list ap; - int status; - - va_start(ap, tag); - status = TIFFVSetField(clientstate->tiff, tag, ap); - va_end(ap); - return status; + // after tif_dir.c->TIFFSetField. + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + va_list ap; + int status; + + va_start(ap, tag); + status = TIFFVSetField(clientstate->tiff, tag, ap); + va_end(ap); + return status; } 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. + /* 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. - If we're going to memory, then we need to write the whole file into memory, then - parcel it back out to the pystring buffer bytes at a time. + If we're going to memory, then we need to write the whole file into memory, then + parcel it back out to the pystring buffer bytes at a time. - */ + */ - TIFFSTATE *clientstate = (TIFFSTATE *)state->context; - TIFF *tiff = clientstate->tiff; + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + 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: 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)); - - 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); - - 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){ - free(clientstate->data); - } - return -1; - } - state->y++; - } - - if (state->y == state->ysize) { - state->state=1; - - TRACE(("Flushing \n")); - if (!TIFFFlush(tiff)) { - TRACE(("Error flushing the tiff")); - // likely reason is memory. - state->errcode = IMAGING_CODEC_MEMORY; - TIFFClose(tiff); - if (!clientstate->fp){ - free(clientstate->data); - } - return -1; - } - TRACE(("Closing \n")); - TIFFClose(tiff); - // reset the clientstate metadata to use it to read out the buffer. - clientstate->loc = 0; - 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])); - if (clientstate->loc == clientstate->eof) { - TRACE(("Hit EOF, calling an end, freeing data")); - state->errcode = IMAGING_CODEC_END; - free(clientstate->data); - } - return read; - } - - state->errcode = IMAGING_CODEC_END; - return 0; + 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)); + + 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); + + 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){ + free(clientstate->data); + } + return -1; + } + state->y++; + } + + if (state->y == state->ysize) { + state->state=1; + + TRACE(("Flushing \n")); + if (!TIFFFlush(tiff)) { + TRACE(("Error flushing the tiff")); + // likely reason is memory. + state->errcode = IMAGING_CODEC_MEMORY; + TIFFClose(tiff); + if (!clientstate->fp){ + free(clientstate->data); + } + return -1; + } + TRACE(("Closing \n")); + TIFFClose(tiff); + // reset the clientstate metadata to use it to read out the buffer. + clientstate->loc = 0; + 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])); + if (clientstate->loc == clientstate->eof) { + TRACE(("Hit EOF, calling an end, freeing data")); + state->errcode = IMAGING_CODEC_END; + free(clientstate->data); + } + return read; + } + + state->errcode = IMAGING_CODEC_END; + return 0; } #endif From 866658eadfebd74efbf3f58087d14d4a0e22ea53 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 19 Oct 2018 22:02:47 +0300 Subject: [PATCH 0597/1393] Use a newer Python for the virtualenv for PyPy --- winbuild/appveyor_install_pypy.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winbuild/appveyor_install_pypy.cmd b/winbuild/appveyor_install_pypy.cmd index f68e75daa9d..8c254ad9015 100644 --- a/winbuild/appveyor_install_pypy.cmd +++ b/winbuild/appveyor_install_pypy.cmd @@ -1,3 +1,3 @@ curl -fsSL -o pypy2.zip https://bitbucket.org/pypy/pypy/downloads/pypy2-v6.0.0-win32.zip 7z x pypy2.zip -oc:\ -c:\Python34\Scripts\virtualenv.exe -p c:\pypy2-v6.0.0-win32\pypy.exe c:\vp\pypy2 +c:\Python37\Scripts\virtualenv.exe -p c:\pypy2-v6.0.0-win32\pypy.exe c:\vp\pypy2 From b581b0e0fc53aea7599a34e9affa310490b9d1d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 20 Oct 2018 08:04:08 +1100 Subject: [PATCH 0598/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ce738d968ec..9776786a75e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Only ask for YCbCr->RGB libtiff conversion for jpeg-compressed tiffs #3417 + [kkopachev] + - Optimise ImageOps.fit by combining resize and crop #3409 [homm] From 6099ddeef910673bff1b1ab7f6e8c6000e88dbae Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:01:25 +1100 Subject: [PATCH 0599/1393] Expected 1 blank line before a nested definition --- src/PIL/Image.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index b537b65281d..ca801accbf3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2620,6 +2620,7 @@ def open(fp, mode="r"): preinit() accept_warnings = [] + def _open_core(fp, filename, prefix): for i in ID: try: From 77f807cf7360a45d4796803cae87ec2846ed55f0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:15:26 +1100 Subject: [PATCH 0600/1393] Continuation line under-indented for visual indent --- src/PIL/IcnsImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 21236d46709..07ffad20d36 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -284,7 +284,7 @@ def size(self, value): if info_size not in self.info['sizes'] and len(info_size) == 3 and \ info_size[2] == 1: simple_sizes = [(size[0] * size[2], size[1] * size[2]) - for size in self.info['sizes']] + for size in self.info['sizes']] if value in simple_sizes: info_size = self.info['sizes'][simple_sizes.index(value)] if info_size not in self.info['sizes']: From d26575765128b67ea3022bc6bd125da5880314a1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:23:14 +1100 Subject: [PATCH 0601/1393] Continuation line unaligned for hanging indent --- src/PIL/ImageGrab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 712b02cd0d9..e8961cd1752 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -56,7 +56,7 @@ def grabclipboard(): commands = [ "set theFile to (open for access POSIX file \""+filepath+"\" with write permission)", "try", - "write (the clipboard as JPEG picture) to theFile", + " write (the clipboard as JPEG picture) to theFile", "end try", "close access theFile" ] From ede35510c1ee9d4a64cd4f1cfb6709814ca6d26d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:34:12 +1100 Subject: [PATCH 0602/1393] Continuation line over-indented for visual indent --- src/PIL/ImageFilter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index de99e641045..ebee3fc1acb 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -467,7 +467,7 @@ def transform(self, callback, with_normals=False, channels=None, def __repr__(self): r = [ "{} from {}".format(self.__class__.__name__, - self.table.__class__.__name__), + self.table.__class__.__name__), "size={:d}x{:d}x{:d}".format(*self.size), "channels={:d}".format(self.channels), ] From 94b3e534962b8ec0637a609c376200e3a22e0531 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:45:30 +1100 Subject: [PATCH 0603/1393] Missing whitespace after ':' --- winbuild/config.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index bfce09b0331..70254caf5eb 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -3,12 +3,12 @@ SF_MIRROR = 'http://iweb.dl.sourceforge.net' PILLOW_DEPENDS_DIR = 'C:\\pillow-depends\\' -pythons = {'27': {'compiler':7, 'vc':2008}, - 'pypy2': {'compiler':7, 'vc':2008}, - '34': {'compiler':7.1, 'vc':2010}, - '35': {'compiler':7.1, 'vc':2015}, - '36': {'compiler':7.1, 'vc':2015}, - '37': {'compiler':7.1, 'vc':2015}} +pythons = {'27': {'compiler': 7, 'vc': 2008}, + 'pypy2': {'compiler': 7, 'vc': 2008}, + '34': {'compiler': 7.1, 'vc': 2010}, + '35': {'compiler': 7.1, 'vc': 2015}, + '36': {'compiler': 7.1, 'vc': 2015}, + '37': {'compiler': 7.1, 'vc': 2015}} VIRT_BASE = "c:/vp/" X64_EXT = os.environ.get('X64_EXT', "x64") From d1f9803aeb9ca8e1b17a80da3bb5011d37cf1d37 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 18:00:39 +1100 Subject: [PATCH 0604/1393] Expected 2 blank lines, found 1 --- winbuild/build.py | 1 + winbuild/config.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/winbuild/build.py b/winbuild/build.py index ad8b2a2a9da..9f1c393a04a 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -72,6 +72,7 @@ def vc_setup(compiler, bit): call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %s""" % arch return script + def build_one(py_ver, compiler, bit): # UNDONE virtual envs if we're not running on appveyor args = {} diff --git a/winbuild/config.py b/winbuild/config.py index 70254caf5eb..65fad994b6d 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -165,11 +165,13 @@ def compiler_from_env(): bit = bit_from_env() return compilers[py_info['compiler']][py_info['vc']][bit] + def bit_from_env(): py = os.environ['PYTHON'] return 64 if '64' in py else 32 + def all_compilers(): all = [] for vc_compilers in compilers.values(): From f2d4d19cc4e6615b1f4001104766d6d39f640ce4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 17:16:17 +1100 Subject: [PATCH 0605/1393] Undefined name --- src/PIL/IcnsImagePlugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 07ffad20d36..d156b240f31 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -333,6 +333,7 @@ def _save(im, fp, filename): provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} last_w = None + second_path = None for w in [16, 32, 128, 256, 512]: prefix = 'icon_{}x{}'.format(w, w) From ac20a02b7a25f1412e763e25a6d4c35c3d68d8de Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 18:11:39 +1100 Subject: [PATCH 0606/1393] Do not use bare 'except' --- src/PIL/ImageCms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 4b6281f1312..107dc9f8799 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -647,7 +647,7 @@ def createProfile(colorSpace, colorTemp=-1): if colorSpace == "LAB": try: colorTemp = float(colorTemp) - except: + except (TypeError, ValueError): raise PyCMSError( "Color temperature must be numeric, \"%s\" not valid" % colorTemp) From c7d924fd859c80385aa8df7c583d81bd23959e4e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 18:01:39 +1100 Subject: [PATCH 0607/1393] Too many blank lines --- Tests/test_file_libtiff.py | 1 - Tests/test_file_webp.py | 1 - 2 files changed, 2 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 8fc71ee3ede..ddd39ba8c05 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -670,6 +670,5 @@ def test_tiled_ycbcr_jpeg_2x2_sampling(self): self.assert_image_similar_tofile(im, "Tests/images/flower.jpg", 0.5) - if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index 956a2699605..3fad8237ce2 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -22,7 +22,6 @@ def test_unsupported(self): WebPImagePlugin.SUPPORTED = True - @unittest.skipIf(not HAVE_WEBP, "WebP support not installed") class TestFileWebp(PillowTestCase): From 929f7397dbd15c7e3406a20ce97d2aea6e25ba9e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 21 Oct 2018 18:26:08 +1100 Subject: [PATCH 0608/1393] Line too long --- Tests/test_file_tiff.py | 12 ++++++++---- src/PIL/FtexImagePlugin.py | 9 ++++++++- src/PIL/Image.py | 25 ++++++++++++++----------- src/PIL/ImageDraw.py | 4 +++- src/PIL/ImageFont.py | 2 +- src/PIL/ImageOps.py | 5 ++++- src/PIL/ImageQt.py | 4 ++-- src/PIL/WebPImagePlugin.py | 6 ++++-- 8 files changed, 44 insertions(+), 23 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index a92c2351f22..96ad0593353 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -425,21 +425,24 @@ def test_strip_raw(self): infile = "Tests/images/tiff_strip_raw.tif" im = Image.open(infile) - self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + self.assert_image_equal_tofile(im, + "Tests/images/tiff_adobe_deflate.png") def test_strip_planar_raw(self): # gdal_translate -of GTiff -co INTERLEAVE=BAND tiff_strip_raw.tif tiff_strip_planar_raw.tiff infile = "Tests/images/tiff_strip_planar_raw.tif" im = Image.open(infile) - self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + self.assert_image_equal_tofile(im, + "Tests/images/tiff_adobe_deflate.png") def test_strip_planar_raw_with_overviews(self): # gdaladdo tiff_strip_planar_raw2.tif 2 4 8 16 infile = "Tests/images/tiff_strip_planar_raw_with_overviews.tif" im = Image.open(infile) - self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + self.assert_image_equal_tofile(im, + "Tests/images/tiff_adobe_deflate.png") def test_tiled_planar_raw(self): # gdal_translate -of GTiff -co TILED=YES -co BLOCKXSIZE=32 -co BLOCKYSIZE=32 -co INTERLEAVE=BAND \ @@ -447,7 +450,8 @@ def test_tiled_planar_raw(self): infile = "Tests/images/tiff_tiled_planar_raw.tif" im = Image.open(infile) - self.assert_image_equal_tofile(im, "Tests/images/tiff_adobe_deflate.png") + self.assert_image_equal_tofile(im, + "Tests/images/tiff_adobe_deflate.png") def test_tiff_save_all(self): import io diff --git a/src/PIL/FtexImagePlugin.py b/src/PIL/FtexImagePlugin.py index 08ce0e006f6..b2161595c25 100644 --- a/src/PIL/FtexImagePlugin.py +++ b/src/PIL/FtexImagePlugin.py @@ -20,7 +20,14 @@ {format_directory} {data} Where: -{header} = { u32:magic, u32:version, u32:width, u32:height, u32:mipmap_count, u32:format_count } +{header} = { + u32:magic, + u32:version, + u32:width, + u32:height, + u32:mipmap_count, + u32:format_count +} * The "magic" number is "FTEX". * "width" and "height" are the dimensions of the texture. diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ca801accbf3..0ce3f7f498a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1047,7 +1047,8 @@ def quantize(self, colors=256, method=None, kmeans=0, palette=None): 2 = fast octree 3 = libimagequant :param kmeans: Integer - :param palette: Quantize to the palette of given :py:class:`PIL.Image.Image`. + :param palette: Quantize to the palette of given + :py:class:`PIL.Image.Image`. :returns: A new image """ @@ -1773,11 +1774,10 @@ def resize(self, size, resample=NEAREST, box=None): if self.mode in ("1", "P"): resample = NEAREST - if self.mode == 'LA': - return self.convert('La').resize(size, resample, box).convert('LA') - - if self.mode == 'RGBA': - return self.convert('RGBa').resize(size, resample, box).convert('RGBA') + if self.mode in ['LA', 'RGBA']: + im = self.convert(self.mode[:-1]+'a') + im = im.resize(size, resample, box) + return im.convert(self.mode) self.load() @@ -1849,7 +1849,8 @@ def rotate(self, angle, resample=NEAREST, expand=0, center=None, else: post_trans = translate if center is None: - rotn_center = (w / 2.0, h / 2.0) # FIXME These should be rounded to ints? + # FIXME These should be rounded to ints? + rotn_center = (w / 2.0, h / 2.0) else: rotn_center = center @@ -1864,7 +1865,8 @@ def transform(x, y, matrix): return a*x + b*y + c, d*x + e*y + f matrix[2], matrix[5] = transform(-rotn_center[0] - post_trans[0], - -rotn_center[1] - post_trans[1], matrix) + -rotn_center[1] - post_trans[1], + matrix) matrix[2] += rotn_center[0] matrix[5] += rotn_center[1] @@ -1887,7 +1889,8 @@ def transform(x, y, matrix): matrix) w, h = nw, nh - return self.transform((w, h), AFFINE, matrix, resample, fillcolor=fillcolor) + return self.transform((w, h), AFFINE, matrix, resample, + fillcolor=fillcolor) def save(self, fp, format=None, **params): """ @@ -2154,8 +2157,8 @@ def getdata(self): :param fill: If **method** is an :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the transform - in the output image. + :param fillcolor: Optional fill color for the area outside the + transform in the output image. :returns: An :py:class:`~PIL.Image.Image` object. """ diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 27205cfff4f..ac549790a78 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -406,7 +406,9 @@ def floodfill(image, xy, value, border=None, thresh=0): except (ValueError, IndexError): return # seed point outside image edge = {(x, y)} - full_edge = set() # use a set to keep record of current and previous edge pixels to reduce memory consumption + # use a set to keep record of current and previous edge pixels + # to reduce memory consumption + full_edge = set() while edge: new_edge = set() for (x, y) in edge: # 4 adjacent method diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 5384a725b4b..22729492582 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -203,7 +203,7 @@ def font_variant(self, font=None, size=None, index=None, encoding=None, size=self.size if size is None else size, index=self.index if index is None else index, encoding=self.encoding if encoding is None else encoding, - layout_engine=self.layout_engine if layout_engine is None else layout_engine + layout_engine=layout_engine or self.layout_engine ) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index 8092268479c..058447b6825 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -441,7 +441,10 @@ def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): crop_left = bleed_pixels[0] + (live_size[0]-crop_width) * centering[0] crop_top = bleed_pixels[1] + (live_size[1]-crop_height) * centering[1] - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) + crop = ( + crop_left, crop_top, + crop_left + crop_width, crop_top + crop_height + ) # resize the image and return it return image.resize(size, method, box=crop) diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index e6026136005..bdfe3886cc8 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -185,8 +185,8 @@ def __init__(self, im): An PIL image wrapper for Qt. This is a subclass of PyQt's QImage class. - :param im: A PIL Image object, or a file name (given either as Python - string or a PyQt string object). + :param im: A PIL Image object, or a file name (given either as + Python string or a PyQt string object). """ im_data = _toqclass_helper(im) # must keep a reference, or Qt will crash! diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 1e9a028a7f1..52f997954a8 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -32,7 +32,8 @@ def _accept(prefix): if is_riff_file_format and is_webp_file and is_valid_vp8_mode: if not SUPPORTED: - return "image file could not be identified because WEBP support not installed" + return "image file could not be identified " \ + "because WEBP support not installed" return True @@ -253,7 +254,8 @@ def _save_all(im, fp, filename): rawmode = ims.mode if ims.mode not in _VALID_WEBP_MODES: alpha = 'A' in ims.mode or 'a' in ims.mode \ - or (ims.mode == 'P' and 'A' in ims.im.getpalettemode()) + or (ims.mode == 'P' and + 'A' in ims.im.getpalettemode()) rawmode = 'RGBA' if alpha else 'RGB' frame = ims.convert(rawmode) From fc28e47385446556d575dd2d648df388d12a2d64 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 16:24:39 +0300 Subject: [PATCH 0609/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9776786a75e..a7e2dc799b9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Flake8 fixes #3422 + [radarhere] + - Only ask for YCbCr->RGB libtiff conversion for jpeg-compressed tiffs #3417 [kkopachev] From a1b9f94d60983a5d082b7256f52c1b85524bbe31 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 16:42:41 +0300 Subject: [PATCH 0610/1393] skipUnless takes a condition and _reason_ --- Tests/test_features.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index 54d668d2f09..c1f5b5cc67a 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -23,19 +23,19 @@ def test_check(self): self.assertEqual(features.check_feature(feature), features.check(feature)) - @unittest.skipUnless(HAVE_WEBP, True) + @unittest.skipUnless(HAVE_WEBP, "WebP not available") def check_webp_transparency(self): self.assertEqual(features.check('transp_webp'), not _webp.WebPDecoderBuggyAlpha()) self.assertEqual(features.check('transp_webp'), _webp.HAVE_TRANSPARENCY) - @unittest.skipUnless(HAVE_WEBP, True) + @unittest.skipUnless(HAVE_WEBP, "WebP not available") def check_webp_mux(self): self.assertEqual(features.check('webp_mux'), _webp.HAVE_WEBPMUX) - @unittest.skipUnless(HAVE_WEBP, True) + @unittest.skipUnless(HAVE_WEBP, "WebP not available") def check_webp_anim(self): self.assertEqual(features.check('webp_anim'), _webp.HAVE_WEBPANIM) From cfc4c3e1011ff9f44c91154d1ffea0d78feae212 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 16:44:12 +0300 Subject: [PATCH 0611/1393] Switch check_ to test_ to enable them --- Tests/test_features.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index c1f5b5cc67a..312894cb478 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -24,19 +24,19 @@ def test_check(self): features.check(feature)) @unittest.skipUnless(HAVE_WEBP, "WebP not available") - def check_webp_transparency(self): + def test_webp_transparency(self): self.assertEqual(features.check('transp_webp'), not _webp.WebPDecoderBuggyAlpha()) self.assertEqual(features.check('transp_webp'), _webp.HAVE_TRANSPARENCY) @unittest.skipUnless(HAVE_WEBP, "WebP not available") - def check_webp_mux(self): + def test_webp_mux(self): self.assertEqual(features.check('webp_mux'), _webp.HAVE_WEBPMUX) @unittest.skipUnless(HAVE_WEBP, "WebP not available") - def check_webp_anim(self): + def test_webp_anim(self): self.assertEqual(features.check('webp_anim'), _webp.HAVE_WEBPANIM) From cbba2c24bfa330e79cc12c133ab35a034ac3f9dd Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 17:05:14 +0300 Subject: [PATCH 0612/1393] Remove unused helper method --- Tests/test_format_hsv.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index d7820400e24..8728c484bd7 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -13,12 +13,8 @@ def int_to_float(self, i): return float(i)/255.0 def str_to_float(self, i): - return float(ord(i))/255.0 - def to_int(self, f): - return int(f*255.0) - def tuple_to_ints(self, tp): x, y, z = tp return (int(x*255.0), int(y*255.0), int(z*255.0)) From e33812c56cf5d00015e598d14f02f972db0e6ed4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 17:05:40 +0300 Subject: [PATCH 0613/1393] Remove redundant parentheses --- Tests/test_format_hsv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index 8728c484bd7..0385bd66f0e 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -17,7 +17,7 @@ def str_to_float(self, i): def tuple_to_ints(self, tp): x, y, z = tp - return (int(x*255.0), int(y*255.0), int(z*255.0)) + return int(x*255.0), int(y*255.0), int(z*255.0) def test_sanity(self): Image.new('HSV', (100, 100)) From 06ad343d3586268572ee3f86c176a1870f677c42 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 21 Oct 2018 17:47:35 +0300 Subject: [PATCH 0614/1393] Simplify skipping --- Tests/test_pyroma.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index cf5fc361f60..e147161a706 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -5,19 +5,12 @@ try: import pyroma except ImportError: - # Skip via setUp() - pass + pyroma = None class TestPyroma(PillowTestCase): - def setUp(self): - try: - import pyroma - assert pyroma # Ignore warning - except ImportError: - self.skipTest("ImportError") - + @unittest.skipUnless(pyroma, "Pyroma is not installed") def test_pyroma(self): # Arrange data = pyroma.projectdata.get_data(".") From 467d2089becef82497de747ec21846d30d9dc965 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Oct 2018 18:39:07 +1100 Subject: [PATCH 0615/1393] Enabled ImageGrab.grab test on AppVeyor --- Tests/test_imagegrab.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 87a6956f617..24521ef2007 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, on_appveyor +from helper import unittest, PillowTestCase import sys @@ -7,7 +7,6 @@ class TestImageGrab(PillowTestCase): - @unittest.skipIf(on_appveyor(), "Test fails on appveyor") def test_grab(self): im = ImageGrab.grab() self.assert_image(im, im.mode, im.size) From bd9cfb124bbe0aaf9968ba441862c9a0f6356dd0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 22 Oct 2018 18:55:16 +1100 Subject: [PATCH 0616/1393] Added ImageGrab.grabclipboard test --- Tests/test_imagegrab.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 24521ef2007..250a7aefe0b 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase import sys +import subprocess try: from PIL import ImageGrab @@ -11,6 +12,21 @@ def test_grab(self): im = ImageGrab.grab() self.assert_image(im, im.mode, im.size) + def test_grabclipboard(self): + if sys.platform == "darwin": + subprocess.call(['screencapture', '-c']) + else: + p = subprocess.Popen(['powershell', '-command', '-'], + stdin=subprocess.PIPE) + p.stdin.write(b'''[Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +$bmp = New-Object Drawing.Bitmap 200, 200 +[Windows.Forms.Clipboard]::SetImage($bmp)''') + p.communicate() + + im = ImageGrab.grabclipboard() + self.assert_image(im, im.mode, im.size) + except ImportError: class TestImageGrab(PillowTestCase): def test_skip(self): From 989b358cd15efc92a4f37fbae9c0e25bae65c873 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 24 Oct 2018 19:46:43 +1100 Subject: [PATCH 0617/1393] Install project using pip in ReadTheDocs build --- .readthedocs.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .readthedocs.yml diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 00000000000..73e1f821366 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,2 @@ +python: + pip_install: true From 901c1e2aea0a080d50cfe26e81511bf8e8db155e Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 4 Aug 2018 20:46:03 +0300 Subject: [PATCH 0618/1393] Simplify test skipping --- Tests/test_file_webp_alpha.py | 9 ++------- Tests/test_imagetk.py | 3 +-- Tests/test_pyroma.py | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Tests/test_file_webp_alpha.py b/Tests/test_file_webp_alpha.py index 60a324d182c..85682e382af 100644 --- a/Tests/test_file_webp_alpha.py +++ b/Tests/test_file_webp_alpha.py @@ -5,18 +5,13 @@ try: from PIL import _webp except ImportError: - pass - # Skip in setUp() + _webp = None +@unittest.skipIf(_webp is None, "WebP support not installed") class TestFileWebpAlpha(PillowTestCase): def setUp(self): - try: - from PIL import _webp - except ImportError: - self.skipTest('WebP support not installed') - if _webp.WebPDecoderBuggyAlpha(self): self.skipTest("Buggy early version of WebP installed, " "not testing transparency") diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 14ce74eb1e3..aec7429ce25 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -18,11 +18,10 @@ TK_MODES = ('1', 'L', 'P', 'RGB', 'RGBA') +@unittest.skipIf(not HAS_TK, "Tk not installed") class TestImageTk(PillowTestCase): def setUp(self): - if not HAS_TK: - self.skipTest("Tk not installed") try: # setup tk tk.Frame() diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index e147161a706..8d23d024b71 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -8,9 +8,9 @@ pyroma = None +@unittest.skipIf(pyroma is None, "Pyroma is not installed") class TestPyroma(PillowTestCase): - @unittest.skipUnless(pyroma, "Pyroma is not installed") def test_pyroma(self): # Arrange data = pyroma.projectdata.get_data(".") From d1ca4916e009cf13428347bdb97ea3ceabfd3276 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 4 Aug 2018 21:08:40 +0300 Subject: [PATCH 0619/1393] Use more specific assertions --- Tests/helper.py | 4 ++-- Tests/test_file_libtiff.py | 4 ++-- Tests/test_image.py | 2 +- Tests/test_image_convert.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 8fb34848b6f..03033574519 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -187,10 +187,10 @@ def assert_warning(self, warn_class, func, *args, **kwargs): return result def assert_all_same(self, items, msg=None): - self.assertTrue(items.count(items[0]) == len(items), msg) + self.assertEqual(items.count(items[0]), len(items), msg) def assert_not_all_same(self, items, msg=None): - self.assertFalse(items.count(items[0]) == len(items), msg) + self.assertNotEqual(items.count(items[0]), len(items), msg) def assert_tuple_approx_equal(self, actuals, targets, threshold, msg): """Tests if actuals has values within threshold from targets""" diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index ddd39ba8c05..5b0b0c46b9b 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -545,11 +545,11 @@ def test_fd_duplication(self): def test_read_icc(self): with Image.open("Tests/images/hopper.iccprofile.tif") as img: icc = img.info.get('icc_profile') - self.assertNotEqual(icc, None) + self.assertIsNotNone(icc) TiffImagePlugin.READ_LIBTIFF = True with Image.open("Tests/images/hopper.iccprofile.tif") as img: icc_libtiff = img.info.get('icc_profile') - self.assertNotEqual(icc_libtiff, None) + self.assertIsNotNone(icc_libtiff) TiffImagePlugin.READ_LIBTIFF = False self.assertEqual(icc, icc_libtiff) diff --git a/Tests/test_image.py b/Tests/test_image.py index ad56a079a5f..715c588da00 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -516,7 +516,7 @@ def _make_new(base_image, im, palette_result=None): self.assertEqual(new_im.palette.tobytes(), palette_result.tobytes()) else: - self.assertEqual(new_im.palette, None) + self.assertIsNone(new_im.palette) _make_new(im, im_p, im_p.palette) _make_new(im_p, im, None) diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 1b3815d8034..e57ae430519 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -88,7 +88,7 @@ def test_trns_p_rgba(self): # Assert self.assertNotIn('transparency', im_rgba.info) # https://github.com/python-pillow/Pillow/issues/2702 - self.assertEqual(im_rgba.palette, None) + self.assertIsNone(im_rgba.palette) def test_trns_l(self): im = hopper('L') From a3b06597903f556c4e2d1e5ea71ec114450a16e1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 1 Oct 2018 13:22:18 +0300 Subject: [PATCH 0620/1393] flake8 --- Tests/helper.py | 2 +- Tests/test_file_libtiff.py | 2 +- Tests/test_image.py | 2 +- Tests/test_imagetk.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 03033574519..d2bcbb7f995 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -110,7 +110,7 @@ def assert_image_equal(self, a, b, msg=None): try: url = test_image_results.upload(a, b) logger.error("Url for test images: %s" % url) - except Exception as msg: + except Exception: pass self.fail(msg or "got different content") diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 5b0b0c46b9b..58a3d38c534 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -415,7 +415,7 @@ def test_multipage_nframes(self): im = Image.open('Tests/images/multipage.tiff') frames = im.n_frames self.assertEqual(frames, 3) - for idx in range(frames): + for _ in range(frames): im.seek(0) # Should not raise ValueError: I/O operation on closed file im.load() diff --git a/Tests/test_image.py b/Tests/test_image.py index 715c588da00..3d7e4dc4df7 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -56,7 +56,7 @@ def test_width_height(self): self.assertEqual(im.width, 1) self.assertEqual(im.height, 2) - with self.assertRaises(AttributeError) as e: + with self.assertRaises(AttributeError): im.size = (3, 4) def test_invalid_image(self): diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index aec7429ce25..72ca91ca223 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -11,7 +11,7 @@ import Tkinter as tk dir(ImageTk) HAS_TK = True -except (OSError, ImportError) as v: +except (OSError, ImportError): # Skipped via setUp() HAS_TK = False From bab194b6f599bbec4c06421b24c31bdd2d13e694 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 10:57:07 +0300 Subject: [PATCH 0621/1393] Fix DeprecationWarning: invalid escape sequence --- Tests/test_image_resample.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 1b7081d55d0..226e7873abd 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -453,7 +453,7 @@ def test_subsample(self): # error with box should be much smaller than without self.assert_image_similar(reference, with_box, 6) - with self.assertRaisesRegex(AssertionError, "difference 29\."): + with self.assertRaisesRegex(AssertionError, r"difference 29\."): self.assert_image_similar(reference, without_box, 5) def test_formats(self): @@ -496,7 +496,7 @@ def test_no_passthrough(self): try: res = im.resize(size, Image.LANCZOS, box) self.assertEqual(res.size, size) - with self.assertRaisesRegex(AssertionError, "difference \d"): + with self.assertRaisesRegex(AssertionError, r"difference \d"): # check that the difference at least that much self.assert_image_similar(res, im.crop(box), 20) except AssertionError: From cb8a4bac21d84a356bbb90fbb58643460b7e3a57 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:22:00 +0300 Subject: [PATCH 0622/1393] Use set literal --- 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 d3024ee905d..e1ec27932b5 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -28,7 +28,7 @@ def test_save_to_bytes(self): # the default image output.seek(0) reloaded = Image.open(output) - self.assertEqual(reloaded.info['sizes'], set([(32, 32), (64, 64)])) + self.assertEqual(reloaded.info['sizes'], {(32, 32), (64, 64)}) self.assertEqual(im.mode, reloaded.mode) self.assertEqual((64, 64), reloaded.size) @@ -81,7 +81,7 @@ def test_only_save_relevant_sizes(self): # Assert self.assertEqual( im_saved.info['sizes'], - set([(16, 16), (24, 24), (32, 32), (48, 48)])) + {(16, 16), (24, 24), (32, 32), (48, 48)}) if __name__ == '__main__': From fc3a159c87ed0354330e5da8fa8238ac0477c817 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:36:07 +0300 Subject: [PATCH 0623/1393] More specific exception clause --- Tests/test_features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index 312894cb478..03ad0d4c97e 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -5,7 +5,7 @@ try: from PIL import _webp HAVE_WEBP = True -except: +except ImportError: HAVE_WEBP = False From 4352edb1ec9f7eb90684b60fd4b09d60a20150f0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:37:10 +0300 Subject: [PATCH 0624/1393] Assert all images in loop --- Tests/test_file_eps.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index 66fedee9002..9d650e96801 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -228,12 +228,10 @@ def test_open_eps(self): "Tests/images/illuCS6_no_preview.eps", "Tests/images/illuCS6_preview.eps"] - # Act + # Act / Assert for filename in FILES: img = Image.open(filename) - - # Assert - self.assertEqual(img.mode, "RGB") + self.assertEqual(img.mode, "RGB") def test_emptyline(self): # Test file includes an empty line in the header data From bac99bd5ae2c0e8746ee40d71b3bd724e594e677 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:44:06 +0300 Subject: [PATCH 0625/1393] Add assert for previously unused 'lut' variable --- Tests/test_color_lut.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index ec370f70a09..6c8a185dfc6 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -294,6 +294,8 @@ def test_convert_table(self): lut = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, channels=4) + self.assertEqual(tuple(lut.size), (2, 2, 2)) + self.assertEqual(lut.table, list(range(4)) * 8) @unittest.skipIf(numpy is None, "Numpy is not installed") def test_numpy_sources(self): From 619e5fde8d1f78ce35e5811bf275fdafcd69b625 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:44:43 +0300 Subject: [PATCH 0626/1393] Remove unused local variables --- Tests/helper.py | 1 - Tests/test_000_sanity.py | 12 ++++++------ Tests/test_file_png.py | 10 +++++----- Tests/test_file_tiff.py | 10 +++++----- Tests/test_imagefile.py | 4 ++-- Tests/test_qt_image_toqimage.py | 2 +- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index d2bcbb7f995..8905e400904 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -163,7 +163,6 @@ def assert_image_similar_tofile(self, a, filename, epsilon, msg=None, def assert_warning(self, warn_class, func, *args, **kwargs): import warnings - result = None with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") diff --git a/Tests/test_000_sanity.py b/Tests/test_000_sanity.py index 67aff8ecc87..62a9b587000 100644 --- a/Tests/test_000_sanity.py +++ b/Tests/test_000_sanity.py @@ -9,7 +9,7 @@ class TestSanity(PillowTestCase): def test_sanity(self): # Make sure we have the binary extension - im = PIL.Image.core.new("L", (100, 100)) + PIL.Image.core.new("L", (100, 100)) self.assertEqual(PIL.Image.VERSION[:3], '1.1') @@ -19,11 +19,11 @@ def test_sanity(self): self.assertEqual(len(im.tobytes()), 1300) # Create images in all remaining major modes. - im = PIL.Image.new("L", (100, 100)) - im = PIL.Image.new("P", (100, 100)) - im = PIL.Image.new("RGB", (100, 100)) - im = PIL.Image.new("I", (100, 100)) - im = PIL.Image.new("F", (100, 100)) + PIL.Image.new("L", (100, 100)) + PIL.Image.new("P", (100, 100)) + PIL.Image.new("RGB", (100, 100)) + PIL.Image.new("I", (100, 100)) + PIL.Image.new("F", (100, 100)) if __name__ == '__main__': diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index e9dcd52033e..c958c0b3940 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -82,19 +82,19 @@ def test_sanity(self): self.assertEqual(im.format, "PNG") hopper("1").save(test_file) - im = Image.open(test_file) + Image.open(test_file) hopper("L").save(test_file) - im = Image.open(test_file) + Image.open(test_file) hopper("P").save(test_file) - im = Image.open(test_file) + Image.open(test_file) hopper("RGB").save(test_file) - im = Image.open(test_file) + Image.open(test_file) hopper("I").save(test_file) - im = Image.open(test_file) + Image.open(test_file) def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 96ad0593353..b4a1221c440 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -26,19 +26,19 @@ def test_sanity(self): self.assertEqual(im.format, "TIFF") hopper("1").save(filename) - im = Image.open(filename) + Image.open(filename) hopper("L").save(filename) - im = Image.open(filename) + Image.open(filename) hopper("P").save(filename) - im = Image.open(filename) + Image.open(filename) hopper("RGB").save(filename) - im = Image.open(filename) + Image.open(filename) hopper("I").save(filename) - im = Image.open(filename) + Image.open(filename) def test_mac_tiff(self): # Read RGBa images from macOS [@PIL136] diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index c95611b0847..8a8cdb64b81 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -204,7 +204,7 @@ def test_negsize(self): im = MockImageFile(buf) im.tile = [("MOCK", (xoff, yoff, -10, yoff+ysize), 32, None)] - d = self.get_decoder() + self.get_decoder() self.assertRaises(ValueError, im.load) @@ -218,7 +218,7 @@ def test_oversize(self): im.tile = [ ("MOCK", (xoff, yoff, xoff+xsize + 100, yoff+ysize), 32, None) ] - d = self.get_decoder() + self.get_decoder() self.assertRaises(ValueError, im.load) diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index 28871d20119..b9d095cd9da 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -86,7 +86,7 @@ def __init__(self): pixmap1 = QtGui.QPixmap.fromImage(qimage) - hbox = QHBoxLayout(self) + QHBoxLayout(self) lbl = QLabel(self) # Segfault in the problem From d69ef6a529723649446c679ebf8cb128abb7f352 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 11:55:28 +0300 Subject: [PATCH 0627/1393] Remove redundant parentheses --- Tests/check_large_memory.py | 2 +- Tests/test_file_webp_lossless.py | 2 +- Tests/test_image.py | 4 ++-- Tests/test_image_getdata.py | 2 +- Tests/test_image_getextrema.py | 2 +- Tests/test_image_resample.py | 2 +- Tests/test_imagedraw.py | 4 ++-- Tests/test_imagefile.py | 2 +- Tests/test_imagetk.py | 2 +- Tests/test_lib_pack.py | 4 ++-- Tests/test_qt_image_toqimage.py | 4 ++-- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Tests/check_large_memory.py b/Tests/check_large_memory.py index ef0cd1f80b7..5c8dc10f7cf 100644 --- a/Tests/check_large_memory.py +++ b/Tests/check_large_memory.py @@ -21,7 +21,7 @@ class LargeMemoryTest(PillowTestCase): def _write_png(self, xdim, ydim): f = self.tempfile('temp.png') - im = Image.new('L', (xdim, ydim), (0)) + im = Image.new('L', (xdim, ydim), 0) im.save(f) def test_large(self): diff --git a/Tests/test_file_webp_lossless.py b/Tests/test_file_webp_lossless.py index 4c35dad73ea..4d9eff7f102 100644 --- a/Tests/test_file_webp_lossless.py +++ b/Tests/test_file_webp_lossless.py @@ -16,7 +16,7 @@ def setUp(self): self.skipTest('WebP support not installed') return - if (_webp.WebPDecoderVersion() < 0x0200): + if _webp.WebPDecoderVersion() < 0x0200: self.skipTest('lossless not included') self.rgb_mode = "RGB" diff --git a/Tests/test_image.py b/Tests/test_image.py index 3d7e4dc4df7..73f3917342c 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -286,9 +286,9 @@ def test_alpha_inplace(self): source.alpha_composite, over, (0, 0), "invalid destination") self.assertRaises(ValueError, - source.alpha_composite, over, (0)) + source.alpha_composite, over, 0) self.assertRaises(ValueError, - source.alpha_composite, over, (0, 0), (0)) + source.alpha_composite, over, (0, 0), 0) self.assertRaises(ValueError, source.alpha_composite, over, (0, -1)) self.assertRaises(ValueError, diff --git a/Tests/test_image_getdata.py b/Tests/test_image_getdata.py index ef07844df5e..de502065b36 100644 --- a/Tests/test_image_getdata.py +++ b/Tests/test_image_getdata.py @@ -23,7 +23,7 @@ def getdata(mode): self.assertEqual(getdata("L"), (16, 960, 960)) self.assertEqual(getdata("I"), (16, 960, 960)) self.assertEqual(getdata("F"), (16.0, 960, 960)) - self.assertEqual(getdata("RGB"), (((11, 13, 52), 960, 960))) + self.assertEqual(getdata("RGB"), ((11, 13, 52), 960, 960)) self.assertEqual(getdata("RGBA"), ((11, 13, 52, 255), 960, 960)) self.assertEqual(getdata("CMYK"), ((244, 242, 203, 0), 960, 960)) self.assertEqual(getdata("YCbCr"), ((16, 147, 123), 960, 960)) diff --git a/Tests/test_image_getextrema.py b/Tests/test_image_getextrema.py index 9783141a365..f002419da23 100644 --- a/Tests/test_image_getextrema.py +++ b/Tests/test_image_getextrema.py @@ -19,7 +19,7 @@ def extrema(mode): self.assertEqual( extrema("RGBA"), ((0, 255), (0, 255), (0, 255), (255, 255))) self.assertEqual( - extrema("CMYK"), (((0, 255), (0, 255), (0, 255), (0, 0)))) + extrema("CMYK"), ((0, 255), (0, 255), (0, 255), (0, 0))) self.assertEqual(extrema("I;16"), (0, 255)) def test_true_16(self): diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 226e7873abd..46a45833e58 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -196,7 +196,7 @@ def test_enlarge_lanczos(self): class CoreResampleConsistencyTest(PillowTestCase): def make_case(self, mode, fill): im = Image.new(mode, (512, 9), fill) - return (im.resize((9, 512), Image.LANCZOS), im.load()[0, 0]) + return im.resize((9, 512), Image.LANCZOS), im.load()[0, 0] def run_case(self, case): channel, color = case diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index bfc43b7b614..7f2accdcbf5 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -46,7 +46,7 @@ def test_valueerror(self): im = Image.open("Tests/images/chi.gif") draw = ImageDraw.Draw(im) - draw.line(((0, 0)), fill=(0, 0, 0)) + draw.line((0, 0), fill=(0, 0, 0)) def test_mode_mismatch(self): im = hopper("RGB").copy() @@ -543,7 +543,7 @@ def create_base_image_draw(self, size, for y in range(0, size[1]): if (x + y) % 2 == 0: img.putpixel((x, y), background2) - return (img, ImageDraw.Draw(img)) + return img, ImageDraw.Draw(img) def test_square(self): expected = Image.open(os.path.join(IMAGES_PATH, 'square.png')) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 8a8cdb64b81..4f81df12eaf 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -144,7 +144,7 @@ def test_broken_datastream_without_errors(self): class MockPyDecoder(ImageFile.PyDecoder): def decode(self, buffer): # eof - return (-1, 0) + return -1, 0 xoff, yoff, xsize, ysize = 10, 20, 100, 100 diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 72ca91ca223..667d18e8fa9 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -26,7 +26,7 @@ def setUp(self): # setup tk tk.Frame() # root = tk.Tk() - except (tk.TclError) as v: + except tk.TclError as v: self.skipTest("TCL Error: %s" % v) def test_kw(self): diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 6f755c23916..33590eeb451 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -17,7 +17,7 @@ def assert_pack(self, mode, rawmode, data, *pixels): for x, pixel in enumerate(pixels): im.putpixel((x, 0), pixel) - if isinstance(data, (int)): + if isinstance(data, int): data_len = data * len(pixels) data = bytes(bytearray(range(1, data_len + 1))) @@ -217,7 +217,7 @@ def assert_unpack(self, mode, rawmode, data, *pixels): """ data - either raw bytes with data or just number of bytes in rawmode. """ - if isinstance(data, (int)): + if isinstance(data, int): data_len = data * len(pixels) data = bytes(bytearray(range(1, data_len + 1))) diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index b9d095cd9da..6f4a044e277 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -70,8 +70,8 @@ def test_sanity(self): def test_segfault(self): app = QApplication([]) ex = Example() - assert(app) # Silence warning - assert(ex) # Silence warning + assert app # Silence warning + assert ex # Silence warning if ImageQt.qt_is_installed: From 088d04470ef1c03954cf0dc0bdd85528dc22db17 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 13:43:48 +0300 Subject: [PATCH 0628/1393] Unnecessary list comprehension - 'tuple' can take a generator --- Tests/test_file_tiff_metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index d1e2b577e1f..9c615354cd0 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -136,8 +136,8 @@ def test_write_metadata(self): if isinstance(v, IFDRational): original[k] = IFDRational(*_limit_rational(v, 2**31)) if isinstance(v, tuple) and isinstance(v[0], IFDRational): - original[k] = tuple([IFDRational(*_limit_rational(elt, 2**31)) - for elt in v]) + original[k] = tuple(IFDRational(*_limit_rational(elt, 2**31)) + for elt in v) ignored = ['StripByteCounts', 'RowsPerStrip', 'PageNumber', 'StripOffsets'] From 5df41b43993dd807e3321fffbf5244c7d545fdc9 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 2 Oct 2018 13:45:48 +0300 Subject: [PATCH 0629/1393] Unnecessary generator - rewrite as a list comprehension --- Tests/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index 8905e400904..f6995e4b541 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -174,7 +174,7 @@ def assert_warning(self, warn_class, func, *args, **kwargs): if warn_class is None: self.assertEqual(len(w), 0, "Expected no warnings, got %s" % - list(v.category for v in w)) + [v.category for v in w]) else: self.assertGreaterEqual(len(w), 1) found = False From 1893ac2492f85215bd44e27306c1ef49b24e794d Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 22:35:15 +0300 Subject: [PATCH 0630/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index a7e2dc799b9..0e3d5d35753 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Change tuple background to global color table index when saving as GIF #3385 + [radarhere] + - Flake8 fixes #3422 [radarhere] From 487248d1c7b175d6b6ed468d6fe12b59112c4b66 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 28 Oct 2018 12:27:14 +1100 Subject: [PATCH 0631/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0e3d5d35753..07fe8ff6ee1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Added negative index to PixelAccess #3406 + [Nazime] + - Change tuple background to global color table index when saving as GIF #3385 [radarhere] From 97eb784645fa434e4dc51ed515ad09668b32ba29 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 29 Oct 2018 20:40:43 +1100 Subject: [PATCH 0632/1393] Updated libimagequant to 2.12.2 --- 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 56dfabf8fdc..e284bb0e4af 100755 --- a/depends/install_imagequant.sh +++ b/depends/install_imagequant.sh @@ -1,7 +1,7 @@ #!/bin/bash # install libimagequant -archive=libimagequant-2.12.1 +archive=libimagequant-2.12.2 ./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 8d80e514498..28a0cd884a7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -165,7 +165,7 @@ Many of Pillow's features require external libraries: * **libimagequant** provides improved color quantization - * Pillow has been tested with libimagequant **2.6-2.12.1** + * Pillow has been tested with libimagequant **2.6-2.12.2** * Libimagequant is licensed GPLv3, which is more restrictive than the Pillow license, therefore we will not be distributing binaries with libimagequant support enabled. From 317fc665088785d376d8b6b93db7fce3e5de6e19 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 29 Oct 2018 16:11:42 +0200 Subject: [PATCH 0633/1393] Revert "Remove broken downloads badge" This reverts commit 45cbd2566470890bd5bc2fe20c4257f5e1a0d981. --- docs/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index 9106efe8d2b..112798c94d8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -26,6 +26,10 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Mon, 29 Oct 2018 16:15:21 +0200 Subject: [PATCH 0634/1393] Revert "Comment out broken PyPI downloads badge" This reverts commit 5364abbae3c693bbb16d3844ac9b05be3e6c7bba. --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b88a103b05f..e18639e579c 100644 --- a/README.rst +++ b/README.rst @@ -16,7 +16,7 @@ Pillow is the friendly PIL fork by `Alex Clark and Contributors Date: Tue, 30 Oct 2018 19:18:53 +1100 Subject: [PATCH 0635/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 07fe8ff6ee1..3e4c72ab8ea 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Docs: Re-add the downloads badge #3443 + [hugovk] + - Added negative index to PixelAccess #3406 [Nazime] From 2e8238fe34e6bf451ba9e19d8cd0c3917539d190 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 31 Oct 2018 06:16:33 +1100 Subject: [PATCH 0636/1393] Updated El Capitan tested Pillow version [ci skip] --- docs/installation.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 8d80e514498..9685e9f8611 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -429,7 +429,9 @@ 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.3, 3.4, 3.5 | 4.1.0 |x86-64 | +| Mac OS X 10.11 El Capitan | 2.7, 3.4, 3.5, 3.6, 3.7 | 5.3.0 |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 7dd480f253a84127c92ea2d87e247537e2e5c02c Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 31 Oct 2018 09:24:02 +0200 Subject: [PATCH 0637/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3e4c72ab8ea..09546bab66f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Only close existing fp in WebP if fp is exclusive #3418 + [radarhere] + - Docs: Re-add the downloads badge #3443 [hugovk] From 012d788c3a5d353bf60fab1a3db5e73e2cb84746 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 2 Nov 2018 20:16:03 +1100 Subject: [PATCH 0638/1393] Changed URL [ci skip] --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 09546bab66f..2481af8c448 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3898,7 +3898,7 @@ Pre-fork (1.1.3 final released) + Made setup.py look for old versions of zlib. For some back- - ground, see: http://www.gzip.org/zlib/advisory-2002-03-11.txt + ground, see: https://zlib.net/advisory-2002-03-11.txt (1.1.3c2 released) From 1ace2f47ff38b53a2921840fbda086c8b7ff6b71 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Nov 2018 21:11:25 +1100 Subject: [PATCH 0639/1393] Added release notes for #3406 [ci skip] --- docs/releasenotes/5.4.0.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/releasenotes/5.4.0.rst b/docs/releasenotes/5.4.0.rst index df0622cdcb1..421ebbbf2a7 100644 --- a/docs/releasenotes/5.4.0.rst +++ b/docs/releasenotes/5.4.0.rst @@ -1,6 +1,19 @@ 5.4.0 (unreleased) ----- +API Changes +=========== + +Negative indexes in pixel access +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When accessing individual image pixels, negative indexes are now also accepted. +For example, to get or set the farthest pixel in the lower right of an image:: + + px = im.load() + print(px[-1, -1]) + px[-1, -1] = (0, 0, 0) + Other Changes ============= From e805401403282c7cb23ff0b758fef62b2c8ece8e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 Nov 2018 21:30:04 +1100 Subject: [PATCH 0640/1393] Added documentation for negative index pixel access [ci skip] --- docs/reference/PixelAccess.rst | 7 +++++++ docs/reference/PyAccess.rst | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/docs/reference/PixelAccess.rst b/docs/reference/PixelAccess.rst index 5389dab33a8..522e70937fb 100644 --- a/docs/reference/PixelAccess.rst +++ b/docs/reference/PixelAccess.rst @@ -28,6 +28,13 @@ Results in the following:: (23, 24, 68) (0, 0, 0) +Access using negative indexes is also possible. + +.. code-block:: python + + px[-1,-1] = (0,0,0) + print (px[-1,-1]) + :py:class:`PixelAccess` Class diff --git a/docs/reference/PyAccess.rst b/docs/reference/PyAccess.rst index 8bd8af9ff67..6a492cd86c3 100644 --- a/docs/reference/PyAccess.rst +++ b/docs/reference/PyAccess.rst @@ -29,6 +29,13 @@ Results in the following:: (23, 24, 68) (0, 0, 0) +Access using negative indexes is also possible. + +.. code-block:: python + + px[-1,-1] = (0,0,0) + print (px[-1,-1]) + :py:class:`PyAccess` Class From 40c6e4f13624955ce7ca4fdbc146c2ad76adb53d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 Nov 2018 06:05:45 +1100 Subject: [PATCH 0641/1393] Do not play sound when running screencapture command --- Tests/test_imagegrab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 250a7aefe0b..10e150fc481 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -14,7 +14,7 @@ def test_grab(self): def test_grabclipboard(self): if sys.platform == "darwin": - subprocess.call(['screencapture', '-c']) + subprocess.call(['screencapture', '-cx']) else: p = subprocess.Popen(['powershell', '-command', '-'], stdin=subprocess.PIPE) From 747eccbfc2e86aa4cfb87453220959b8006cd912 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 Nov 2018 11:35:08 +1100 Subject: [PATCH 0642/1393] Close exclusive fp on open exception --- Tests/test_bmp_reference.py | 14 +++++++++----- src/PIL/Image.py | 4 ++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index af25f71622b..b3121e305de 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -17,11 +17,15 @@ def test_bad(self): """ These shouldn't crash/dos, but they shouldn't return anything either """ for f in self.get_files('b'): - try: - im = Image.open(f) - im.load() - except Exception: # as msg: - pass + def open(f): + try: + im = Image.open(f) + im.load() + except Exception: # as msg: + pass + + # Assert that there is no unclosed file warning + self.assert_warning(None, open, f) def test_questionable(self): """ These shouldn't crash/dos, but it's not well defined that these diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 0ce3f7f498a..be94f0787c8 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2641,6 +2641,10 @@ def _open_core(fp, filename, prefix): # opening failures that are entirely expected. # logger.debug("", exc_info=True) continue + except Exception: + if exclusive_fp: + fp.close() + raise return None im = _open_core(fp, filename, prefix) From c501eedcb51f77dd35bb66abd4689ec5c35866e6 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sat, 10 Nov 2018 15:07:24 +0200 Subject: [PATCH 0643/1393] Update CHANGES.rst --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 2481af8c448..f8fe9ba12a9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,12 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Test: Do not play sound when running screencapture command #3454 + [radarhere] + +- Close exclusive fp on open exception #3456 + [radarhere] + - Only close existing fp in WebP if fp is exclusive #3418 [radarhere] From 52c175d1bc31bfcfdd65b2794d7eed128ff0cff5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Nov 2018 16:00:17 +1100 Subject: [PATCH 0644/1393] Added context manager, __del__ and close methods --- Tests/test_file_tar.py | 34 +++++++++++++++++++--------------- src/PIL/TarIO.py | 23 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index 9e02ab1a58e..bbf2a803b7a 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -15,21 +15,25 @@ def setUp(self): self.skipTest("neither jpeg nor zip support available") def test_sanity(self): - if "zip_decoder" in codecs: - tar = TarIO.TarIO(TEST_TAR_FILE, 'hopper.png') - im = Image.open(tar) - im.load() - self.assertEqual(im.mode, "RGB") - self.assertEqual(im.size, (128, 128)) - self.assertEqual(im.format, "PNG") - - if "jpeg_decoder" in codecs: - tar = TarIO.TarIO(TEST_TAR_FILE, 'hopper.jpg') - im = Image.open(tar) - im.load() - self.assertEqual(im.mode, "RGB") - self.assertEqual(im.size, (128, 128)) - self.assertEqual(im.format, "JPEG") + for codec, test_path, format in [ + ['zip_decoder', 'hopper.png', 'PNG'], + ['jpeg_decoder', 'hopper.jpg', 'JPEG'] + ]: + if codec in codecs: + tar = TarIO.TarIO(TEST_TAR_FILE, test_path) + im = Image.open(tar) + im.load() + self.assertEqual(im.mode, "RGB") + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, format) + + def test_close(self): + tar = TarIO.TarIO(TEST_TAR_FILE, 'hopper.jpg') + tar.close() + + def test_contextmanager(self): + with TarIO.TarIO(TEST_TAR_FILE, 'hopper.jpg') as tar: + pass if __name__ == '__main__': diff --git a/src/PIL/TarIO.py b/src/PIL/TarIO.py index 0e949ff88eb..7c09685f72b 100644 --- a/src/PIL/TarIO.py +++ b/src/PIL/TarIO.py @@ -14,6 +14,7 @@ # See the README file for information on usage and redistribution. # +import sys from . import ContainerIO @@ -30,11 +31,11 @@ def __init__(self, tarfile, file): :param tarfile: Name of TAR file. :param file: Name of member file. """ - fh = open(tarfile, "rb") + self.fh = open(tarfile, "rb") while True: - s = fh.read(512) + s = self.fh.read(512) if len(s) != 512: raise IOError("unexpected end of tar file") @@ -50,7 +51,21 @@ def __init__(self, tarfile, file): if file == name: break - fh.seek((size + 511) & (~511), 1) + self.fh.seek((size + 511) & (~511), 1) # Open region - ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) + ContainerIO.ContainerIO.__init__(self, self.fh, self.fh.tell(), size) + + # Context Manager Support + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + if sys.version_info.major >= 3: + def __del__(self): + self.close() + + def close(self): + self.fh.close() From 5288cf63c955267af34aa8021d707a69f5065443 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 11 Nov 2018 15:48:32 +1100 Subject: [PATCH 0645/1393] Changed capitalisation Co-Authored-By: radarhere <3112309+radarhere@users.noreply.github.com> --- src/PIL/TarIO.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/TarIO.py b/src/PIL/TarIO.py index 7c09685f72b..89957fba4ae 100644 --- a/src/PIL/TarIO.py +++ b/src/PIL/TarIO.py @@ -56,7 +56,7 @@ def __init__(self, tarfile, file): # Open region ContainerIO.ContainerIO.__init__(self, self.fh, self.fh.tell(), size) - # Context Manager Support + # Context manager support def __enter__(self): return self From e3220c0f4df0b97c56f245f76a2dccd88091de53 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Nov 2018 15:50:34 +1100 Subject: [PATCH 0646/1393] Changed capitalisation --- 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 be94f0787c8..4a8e37026f8 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -564,7 +564,7 @@ def _new(self, im): new.info = self.info.copy() return new - # Context Manager Support + # Context manager support def __enter__(self): return self From f542697a7a5dbca958c446e214e9fe4a12d97688 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 11 Nov 2018 13:05:36 +0200 Subject: [PATCH 0647/1393] Update CHANGES.rst --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index f8fe9ba12a9..53cda0df4ea 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Add context manager, __del__ and close methods to TarIO #3455 + [radarhere] + - Test: Do not play sound when running screencapture command #3454 [radarhere] From eb9aee70481359cde0bf094c847f6d0e2a633979 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 Oct 2018 21:49:14 +0300 Subject: [PATCH 0648/1393] flake8: F841 local variable is assigned to but never used --- Tests/test_file_tar.py | 2 +- Tests/test_image_transform.py | 2 +- Tests/test_imagecms.py | 2 +- Tests/test_qt_image_toqimage.py | 2 +- docs/example/DdsImagePlugin.py | 4 +--- src/PIL/DdsImagePlugin.py | 2 +- src/PIL/FtexImagePlugin.py | 4 ++-- src/PIL/ImImagePlugin.py | 2 +- src/PIL/PcfFontFile.py | 2 +- src/PIL/PsdImagePlugin.py | 8 ++------ src/PIL/WebPImagePlugin.py | 2 +- 11 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Tests/test_file_tar.py b/Tests/test_file_tar.py index bbf2a803b7a..7f29c5fc56b 100644 --- a/Tests/test_file_tar.py +++ b/Tests/test_file_tar.py @@ -32,7 +32,7 @@ def test_close(self): tar.close() def test_contextmanager(self): - with TarIO.TarIO(TEST_TAR_FILE, 'hopper.jpg') as tar: + with TarIO.TarIO(TEST_TAR_FILE, 'hopper.jpg'): pass diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index add8cc5e72a..313e7ad0946 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -152,7 +152,7 @@ def test_blank_fill(self): ] # Yeah. Watch some JIT optimize this out. - pattern = None + pattern = None # noqa: F841 self.test_mesh() diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index dc6c85f0595..df523db4d9f 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -10,7 +10,7 @@ from PIL import ImageCms from PIL.ImageCms import ImageCmsProfile ImageCms.core.profile_open -except ImportError as v: +except ImportError: # Skipped via setUp() pass diff --git a/Tests/test_qt_image_toqimage.py b/Tests/test_qt_image_toqimage.py index 6f4a044e277..25391e09a68 100644 --- a/Tests/test_qt_image_toqimage.py +++ b/Tests/test_qt_image_toqimage.py @@ -86,7 +86,7 @@ def __init__(self): pixmap1 = QtGui.QPixmap.fromImage(qimage) - QHBoxLayout(self) + QHBoxLayout(self) # hbox lbl = QLabel(self) # Segfault in the problem diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 2877697aab0..631dc2d61e1 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -225,7 +225,7 @@ def _open(self): self.mode = "RGBA" pitch, depth, mipmaps = struct.unpack("<3I", header.read(12)) - reserved = struct.unpack("<11I", header.read(44)) + struct.unpack("<11I", header.read(44)) # reserved # pixel format pfsize, pfflags = struct.unpack("<2I", header.read(8)) @@ -235,10 +235,8 @@ def _open(self): if fourcc == b"DXT1": self.decoder = "DXT1" - codec = _dxt1 elif fourcc == b"DXT5": self.decoder = "DXT5" - codec = _dxt5 else: raise NotImplementedError("Unimplemented pixel format %r" % fourcc) diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 7660827c5ef..edc1b7aa360 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -118,7 +118,7 @@ def _open(self): self.mode = "RGBA" pitch, depth, mipmaps = struct.unpack("<3I", header.read(12)) - reserved = struct.unpack("<11I", header.read(44)) + struct.unpack("<11I", header.read(44)) # reserved # pixel format pfsize, pfflags = struct.unpack("<2I", header.read(8)) diff --git a/src/PIL/FtexImagePlugin.py b/src/PIL/FtexImagePlugin.py index b2161595c25..f1b9acdc1c8 100644 --- a/src/PIL/FtexImagePlugin.py +++ b/src/PIL/FtexImagePlugin.py @@ -66,8 +66,8 @@ class FtexImageFile(ImageFile.ImageFile): format_description = "Texture File Format (IW2:EOC)" def _open(self): - magic = struct.unpack(" Date: Thu, 18 Oct 2018 19:46:20 +0300 Subject: [PATCH 0649/1393] flake8: F401 imported but unused --- selftest.py | 3 ++- src/PIL/Image.py | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/selftest.py b/selftest.py index ed2ba815f91..f4383b1206a 100755 --- a/selftest.py +++ b/selftest.py @@ -5,7 +5,7 @@ import sys import os -from PIL import Image, ImageDraw, ImageFilter, ImageMath +from PIL import Image from PIL import features try: @@ -26,6 +26,7 @@ def testimage(): """ PIL lets you create in-memory images with various pixel types: + >>> from PIL import Image, ImageDraw, ImageFilter, ImageMath >>> im = Image.new("1", (128, 128)) # monochrome >>> _info(im) (None, '1', (128, 128)) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 4a8e37026f8..c824bf3653e 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -28,12 +28,15 @@ # PILLOW_VERSION is deprecated and will be removed after that. # Use __version__ instead. from . import VERSION, PILLOW_VERSION, __version__, _plugins +assert VERSION +assert PILLOW_VERSION from ._util import py3 import logging import warnings import math + logger = logging.getLogger(__name__) @@ -134,9 +137,8 @@ def __getattr__(self, id): USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') try: import cffi - HAS_CFFI = True except ImportError: - HAS_CFFI = False + cffi = None try: from pathlib import Path @@ -376,26 +378,32 @@ def preinit(): try: from . import BmpImagePlugin + assert BmpImagePlugin except ImportError: pass try: from . import GifImagePlugin + assert GifImagePlugin except ImportError: pass try: from . import JpegImagePlugin + assert JpegImagePlugin except ImportError: pass try: from . import PpmImagePlugin + assert PpmImagePlugin except ImportError: pass try: from . import PngImagePlugin + assert PngImagePlugin except ImportError: pass # try: # import TiffImagePlugin +# assert TiffImagePlugin # except ImportError: # pass @@ -833,7 +841,7 @@ def load(self): self.palette.mode = "RGBA" if self.im: - if HAS_CFFI and USE_CFFI_ACCESS: + if cffi and USE_CFFI_ACCESS: if self.pyaccess: return self.pyaccess from . import PyAccess From 8a6f2b9de828df1ec18291f93d2ba6a297e1aea0 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 Oct 2018 18:18:44 +0300 Subject: [PATCH 0650/1393] flake8: E711 comparison to None should be 'if cond is None:' --- Tests/test_image.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 73f3917342c..9618e14279e 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -139,7 +139,6 @@ def test_comparison_with_other_type(self): # Act/Assert # Shouldn't cause AttributeError (#774) self.assertFalse(item is None) - self.assertFalse(item == None) self.assertFalse(item == num) def test_expand_x(self): From 0b7910c7cd3d9a9f327bbdba573db86643c27c39 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 19 Oct 2018 11:39:08 +0300 Subject: [PATCH 0651/1393] flake8: E402 module level import not at top of file --- docs/conf.py | 6 +++-- src/PIL/Image.py | 56 ++++++++++++++++++++++++---------------------- src/PIL/ImageTk.py | 6 ++--- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ba0a552b3d1..d61b394cf94 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,10 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) +import sphinx_rtd_theme + +import PIL + # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. @@ -52,7 +56,6 @@ # built documents. # # The short X.Y version. -import PIL version = PIL.__version__ # The full version, including alpha/beta/rc tags. release = PIL.__version__ @@ -107,7 +110,6 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c824bf3653e..541c62c493f 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -28,14 +28,41 @@ # PILLOW_VERSION is deprecated and will be removed after that. # Use __version__ instead. from . import VERSION, PILLOW_VERSION, __version__, _plugins -assert VERSION -assert PILLOW_VERSION from ._util import py3 import logging import warnings import math +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + +from . import ImageMode +from ._binary import i8 +from ._util import isPath, isStringType, deferred_error + +import os +import sys +import io +import struct +import atexit + +# type stuff +import numbers +try: + # Python 3 + from collections.abc import Callable +except ImportError: + # Python 2.7 + from collections import Callable + + +# Silence warnings +assert VERSION +assert PILLOW_VERSION logger = logging.getLogger(__name__) @@ -107,31 +134,6 @@ def __getattr__(self, id): # see docs/porting.rst raise -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - -from . import ImageMode -from ._binary import i8 -from ._util import isPath, isStringType, deferred_error - -import os -import sys -import io -import struct -import atexit - -# type stuff -import numbers -try: - # Python 3 - from collections.abc import Callable -except ImportError: - # Python 2.7 - from collections import Callable - # works everywhere, win for pypy, not cpython USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') diff --git a/src/PIL/ImageTk.py b/src/PIL/ImageTk.py index c56f5560a5e..935f9f7783c 100644 --- a/src/PIL/ImageTk.py +++ b/src/PIL/ImageTk.py @@ -26,15 +26,15 @@ # import sys +from io import BytesIO + +from . import Image if sys.version_info.major > 2: import tkinter else: import Tkinter as tkinter -from . import Image -from io import BytesIO - # -------------------------------------------------------------------- # Check for Tkinter interface hooks From afefc99096460bc4bd32e663ecad901870135656 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 19 Oct 2018 11:42:24 +0300 Subject: [PATCH 0652/1393] flake8: E122 continuation line missing indentation or outdented --- docs/conf.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d61b394cf94..cb23203f179 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -208,17 +208,17 @@ # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + #'preamble': '', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # Latex figure (float) alignment + #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples From a3079eab9ec6af20e7d992ea10b0392cdf67f090 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 18:54:16 +0300 Subject: [PATCH 0653/1393] flake8: E127 continuation line over-indented for visual indent --- src/PIL/EpsImagePlugin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index b2dec78094d..cc2c1b1f88a 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -125,10 +125,11 @@ def Ghostscript(tile, size, fp, scale=1): "-dSAFER", # safe mode "-sDEVICE=ppmraw", # ppm driver "-sOutputFile=%s" % outfile, # output file + # adjust for image origin "-c", "%d %d translate" % (-bbox[0], -bbox[1]), - # adjust for image origin "-f", infile, # input file - "-c", "showpage", # showpage (see: https://bugs.ghostscript.com/show_bug.cgi?id=698272) + # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) + "-c", "showpage", ] if gs_windows_binary is not None: From 6fbebdeeb3bb47fa94b2d8ed1af73a1693c6db38 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 18 Oct 2018 23:14:54 +0300 Subject: [PATCH 0654/1393] flake8: E265 block comment should start with '# ' --- docs/conf.py | 96 ++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index cb23203f179..b65dcec7230 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,7 +15,7 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) import sphinx_rtd_theme @@ -24,7 +24,7 @@ # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom @@ -41,7 +41,7 @@ source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -69,9 +69,9 @@ # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -79,27 +79,27 @@ # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -116,26 +116,26 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # 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 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -145,62 +145,62 @@ # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'PillowPILForkdoc' @@ -209,16 +209,16 @@ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). - #'papersize': 'letterpaper', + # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). - #'pointsize': '10pt', + # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. - #'preamble': '', + # 'preamble': '', # Latex figure (float) alignment - #'figure_align': 'htbp', + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples @@ -231,23 +231,23 @@ # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -260,7 +260,7 @@ ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -275,13 +275,13 @@ ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False From 717add44b0732b87725234cbff057ed2ec3398d4 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 19:00:19 +0300 Subject: [PATCH 0655/1393] flake8: E201 whitespace after '(' --- Tests/test_imagecms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index df523db4d9f..5f7e78167cf 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -404,8 +404,8 @@ def create_test_image(): # channel. nine_grid_deltas = [ (-1, -1), (-1, 0), (-1, 1), - ( 0, -1), ( 0, 0), ( 0, 1), - ( 1, -1), ( 1, 0), ( 1, 1), + (0, -1), (0, 0), (0, 1), + (1, -1), (1, 0), (1, 1), ] chans = [] bands = ImageMode.getmode(mode).bands From 94c94eb1f75de522543851901a5e8f6c3025f539 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 19:05:54 +0300 Subject: [PATCH 0656/1393] flake8: E128 continuation line under-indented for visual indent --- Tests/test_file_webp.py | 6 ++++-- Tests/test_imagecms.py | 2 +- src/PIL/JpegImagePlugin.py | 2 +- src/PIL/JpegPresets.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index ab244f89805..bdec8273de0 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -15,8 +15,10 @@ def test_unsupported(self): WebPImagePlugin.SUPPORTED = False file_path = "Tests/images/hopper.webp" - self.assert_warning(UserWarning, - lambda: self.assertRaises(IOError, Image.open, file_path)) + self.assert_warning( + UserWarning, + lambda: self.assertRaises(IOError, Image.open, file_path) + ) if HAVE_WEBP: WebPImagePlugin.SUPPORTED = True diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 5f7e78167cf..b6869299016 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -402,7 +402,7 @@ def assert_aux_channel_preserved(self, mode, def create_test_image(): # set up test image with something interesting in the tested aux # channel. - nine_grid_deltas = [ + nine_grid_deltas = [ # noqa: E128 (-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1), diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index f2068189f2b..6090d252f1c 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -578,7 +578,7 @@ def _getmp(self): "YCbCr": "YCbCr", } -zigzag_index = (0, 1, 5, 6, 14, 15, 27, 28, +zigzag_index = (0, 1, 5, 6, 14, 15, 27, 28, # noqa: E128 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, diff --git a/src/PIL/JpegPresets.py b/src/PIL/JpegPresets.py index 5f01f0d2d1e..75d61223e86 100644 --- a/src/PIL/JpegPresets.py +++ b/src/PIL/JpegPresets.py @@ -66,7 +66,7 @@ """ -presets = { +presets = { # noqa: E128 'web_low': {'subsampling': 2, # "4:2:0" 'quantization': [ [20, 16, 25, 39, 50, 46, 62, 68, From 254f959c3a29f0b66be08e7fa74f97f00e276e8b Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 19:09:35 +0300 Subject: [PATCH 0657/1393] flake8: E127 continuation line over-indented for visual indent --- Tests/test_image_filter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 6936a84f00f..5e732b345c4 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -106,7 +106,7 @@ def test_kernel_not_enough_coefficients(self): def test_consistency_3x3(self): source = Image.open("Tests/images/hopper.bmp") reference = Image.open("Tests/images/hopper_emboss.bmp") - kernel = ImageFilter.Kernel((3, 3), + kernel = ImageFilter.Kernel((3, 3), # noqa: E127 (-1, -1, 0, -1, 0, 1, 0, 1, 1), .3) @@ -122,7 +122,7 @@ def test_consistency_3x3(self): def test_consistency_5x5(self): source = Image.open("Tests/images/hopper.bmp") reference = Image.open("Tests/images/hopper_emboss_more.bmp") - kernel = ImageFilter.Kernel((5, 5), + kernel = ImageFilter.Kernel((5, 5), # noqa: E127 (-1, -1, -1, -1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, From 7d625940ae87b2ef79344a32bd3dbc3e2d620c09 Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 19:12:17 +0300 Subject: [PATCH 0658/1393] flake8: E131 continuation line unaligned for hanging indent --- src/PIL/PalmImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/PalmImagePlugin.py b/src/PIL/PalmImagePlugin.py index 7d7b16579c5..e4865b0dede 100644 --- a/src/PIL/PalmImagePlugin.py +++ b/src/PIL/PalmImagePlugin.py @@ -12,7 +12,7 @@ __version__ = "1.0" -_Palm8BitColormapValues = ( +_Palm8BitColormapValues = ( # noqa: E131 (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), From ceebfc6fe82ea06aa2f166b00ee03c803accebae Mon Sep 17 00:00:00 2001 From: Hugo Date: Wed, 24 Oct 2018 22:24:03 +0300 Subject: [PATCH 0659/1393] flake8: E501 line too long --- Tests/test_file_tiff.py | 6 ++-- Tests/test_imagecms.py | 15 ++++++-- docs/conf.py | 3 +- src/PIL/BmpImagePlugin.py | 73 +++++++++++++++++++++++++-------------- src/PIL/GdImageFile.py | 3 +- src/PIL/ImageCms.py | 2 +- src/PIL/ImageColor.py | 10 ++++-- src/PIL/ImageGrab.py | 3 +- src/PIL/JpegPresets.py | 3 +- src/PIL/PdfParser.py | 6 ++-- winbuild/build.py | 6 ++-- 11 files changed, 89 insertions(+), 41 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index b4a1221c440..56ad6947358 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -429,7 +429,8 @@ def test_strip_raw(self): "Tests/images/tiff_adobe_deflate.png") def test_strip_planar_raw(self): - # gdal_translate -of GTiff -co INTERLEAVE=BAND tiff_strip_raw.tif tiff_strip_planar_raw.tiff + # gdal_translate -of GTiff -co INTERLEAVE=BAND \ + # tiff_strip_raw.tif tiff_strip_planar_raw.tiff infile = "Tests/images/tiff_strip_planar_raw.tif" im = Image.open(infile) @@ -445,7 +446,8 @@ def test_strip_planar_raw_with_overviews(self): "Tests/images/tiff_adobe_deflate.png") def test_tiled_planar_raw(self): - # gdal_translate -of GTiff -co TILED=YES -co BLOCKXSIZE=32 -co BLOCKYSIZE=32 -co INTERLEAVE=BAND \ + # gdal_translate -of GTiff -co TILED=YES -co BLOCKXSIZE=32 \ + # -co BLOCKYSIZE=32 -co INTERLEAVE=BAND \ # tiff_tiled_raw.tif tiff_tiled_planar_raw.tiff infile = "Tests/images/tiff_tiled_planar_raw.tif" im = Image.open(infile) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index b6869299016..b4d53a2dfc7 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -294,7 +294,14 @@ def truncate_tuple(tuple_or_float): p.blue_primary, ((0.14306641366715667, 0.06060790921083026, 0.7140960805782015), (0.15588475410450106, 0.06603820408959558, 0.06060790921083026))) - assert_truncated_tuple_equal(p.chromatic_adaptation, (((1.04791259765625, 0.0229339599609375, -0.050201416015625), (0.02960205078125, 0.9904632568359375, -0.0170745849609375), (-0.009246826171875, 0.0150604248046875, 0.7517852783203125)), ((1.0267159024652783, 0.022470062342089134, 0.0229339599609375), (0.02951378324103937, 0.9875098886387147, 0.9904632568359375), (-0.012205438066465256, 0.01987915407854985, 0.0150604248046875)))) + assert_truncated_tuple_equal( + p.chromatic_adaptation, + (((1.04791259765625, 0.0229339599609375, -0.050201416015625), + (0.02960205078125, 0.9904632568359375, -0.0170745849609375), + (-0.009246826171875, 0.0150604248046875, 0.7517852783203125)), + ((1.0267159024652783, 0.022470062342089134, 0.0229339599609375), + (0.02951378324103937, 0.9875098886387147, 0.9904632568359375), + (-0.012205438066465256, 0.01987915407854985, 0.0150604248046875)))) self.assertIsNone(p.chromaticity) self.assertEqual(p.clut, { 0: (False, False, True), @@ -421,7 +428,11 @@ def create_test_image(): ) channel_data = Image.new(channel_type, channel_pattern.size) for delta in nine_grid_deltas: - channel_data.paste(channel_pattern, tuple(paste_offset[c] + delta[c]*channel_pattern.size[c] for c in range(2))) + channel_data.paste( + channel_pattern, + tuple(paste_offset[c] + delta[c] * channel_pattern.size[c] + for c in range(2)), + ) chans.append(channel_data) return Image.merge(mode, chans) diff --git a/docs/conf.py b/docs/conf.py index b65dcec7230..b788febee02 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -270,7 +270,8 @@ # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'PillowPILFork', u'Pillow (PIL Fork) Documentation', - author, 'PillowPILFork', 'Pillow is the friendly PIL fork by Alex Clark and Contributors.', + author, 'PillowPILFork', + 'Pillow is the friendly PIL fork by Alex Clark and Contributors.', 'Miscellaneous'), ] diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 731b94e21ac..e146f4da912 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -50,16 +50,17 @@ def _accept(prefix): return prefix[:2] == b"BM" -# ============================================================================== +# ============================================================================= # Image plugin for the Windows BMP format. -# ============================================================================== +# ============================================================================= class BmpImageFile(ImageFile.ImageFile): """ Image plugin for the Windows Bitmap format (BMP) """ - # -------------------------------------------------------------- Description + # ------------------------------------------------------------- Description format_description = "Windows Bitmap" format = "BMP" - # --------------------------------------------------- BMP Compression values + + # -------------------------------------------------- BMP Compression values COMPRESSIONS = { 'RAW': 0, 'RLE8': 1, @@ -79,12 +80,14 @@ def _bitmap(self, header=0, offset=0): # read bmp header size @offset 14 (this is part of the header size) file_info['header_size'] = i32(read(4)) file_info['direction'] = -1 - # --------------------- If requested, read header at a specific position + + # -------------------- If requested, read header at a specific position # read the rest of the bmp header, without its size header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) - # --------------------------------------------------- IBM OS/2 Bitmap v1 - # ------ This format has different offsets because of width/height types + + # -------------------------------------------------- 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]) @@ -92,8 +95,10 @@ def _bitmap(self, header=0, offset=0): file_info['bits'] = i16(header_data[6:8]) file_info['compression'] = self.RAW file_info['palette_padding'] = 3 - # ---------------------------------------------- Windows Bitmap v2 to v5 - elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 + + # --------------------------------------------- Windows Bitmap v2 to v5 + # v3, OS/2 v2, v4, v5 + elif file_info['header_size'] in (40, 64, 108, 124): if file_info['header_size'] >= 40: # v3 and OS/2 file_info['y_flip'] = i8(header_data[7]) == 0xff file_info['direction'] = 1 if file_info['y_flip'] else -1 @@ -119,12 +124,15 @@ def _bitmap(self, header=0, offset=0): '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:40 + idx * 4] + ) else: # 40 byte headers only have the three components in the - # bitfields masks, - # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also https://github.com/python-pillow/Pillow/issues/1293 + # bitfields masks, ref: + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also + # https://github.com/python-pillow/Pillow/issues/1293 # There is a 4th component in the RGBQuad, in the alpha # location, but it is listed as a reserved component, # and it is not generally an alpha channel @@ -141,20 +149,27 @@ def _bitmap(self, header=0, offset=0): else: raise IOError("Unsupported BMP header type (%d)" % file_info['header_size']) + # ------------------ Special case : header is reported 40, which # ---------------------- is shorter than real size for bpp >= 16 self._size = file_info['width'], file_info['height'] - # -------- If color count was not found in the header, compute from bits - file_info['colors'] = file_info['colors'] if file_info.get('colors', 0) else (1 << file_info['bits']) - # -------------------------------- Check abnormal values for DOS attacks + + # ------- If color count was not found in the header, compute from bits + file_info["colors"] = (file_info["colors"] + if file_info.get("colors", 0) + else (1 << file_info["bits"])) + + # ------------------------------- Check abnormal values for DOS attacks if file_info['width'] * file_info['height'] > 2**31: raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) - # ----------------------- Check bit depth for unusual unsupported values + + # ---------------------- Check bit depth for unusual unsupported values self.mode, raw_mode = BIT2MODE.get(file_info['bits'], (None, None)) if self.mode is None: raise IOError("Unsupported BMP pixel depth (%d)" % file_info['bits']) - # ----------------- Process BMP with Bitfields compression (not palette) + + # ---------------- Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: SUPPORTED = { 32: [(0xff0000, 0xff00, 0xff, 0x0), @@ -176,7 +191,9 @@ def _bitmap(self, header=0, offset=0): if file_info['bits'] in SUPPORTED: if file_info['bits'] == 32 and \ file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: - raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] + raw_mode = MASK_MODES[ + (file_info["bits"], file_info["rgba_mask"]) + ] self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode elif (file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]): @@ -193,9 +210,11 @@ def _bitmap(self, header=0, offset=0): else: raise IOError("Unsupported BMP compression (%d)" % file_info['compression']) - # ---------------- Once the header is processed, process the palette/LUT + + # --------------- Once the header is processed, process the palette/LUT if self.mode == "P": # Paletted for 1, 4 and 8 bit images - # ----------------------------------------------------- 1-bit images + + # ---------------------------------------------------- 1-bit images if not (0 < file_info['colors'] <= 65536): raise IOError("Unsupported BMP Palette size (%d)" % file_info['colors']) @@ -205,12 +224,14 @@ def _bitmap(self, header=0, offset=0): greyscale = True indices = (0, 255) if file_info['colors'] == 2 else \ list(range(file_info['colors'])) - # ------------------ Check if greyscale and ignore palette if so + + # ----------------- Check if greyscale and ignore palette if so for ind, val in enumerate(indices): rgb = palette[ind*padding:ind*padding + 3] if rgb != o8(val) * 3: greyscale = False - # -------- If all colors are grey, white or black, ditch palette + + # ------- If all colors are grey, white or black, ditch palette if greyscale: self.mode = "1" if file_info['colors'] == 2 else "L" raw_mode = self.mode @@ -219,7 +240,7 @@ def _bitmap(self, header=0, offset=0): self.palette = ImagePalette.raw( "BGRX" if padding == 4 else "BGR", palette) - # ----------------------------- Finally set the tile data for the plugin + # ---------------------------- Finally set the tile data for the plugin self.info['compression'] = file_info['compression'] self.tile = [ ('raw', @@ -243,9 +264,9 @@ def _open(self): self._bitmap(offset=offset) -# ============================================================================== +# ============================================================================= # Image plugin for the DIB format (BMP alias) -# ============================================================================== +# ============================================================================= class DibImageFile(BmpImageFile): format = "DIB" diff --git a/src/PIL/GdImageFile.py b/src/PIL/GdImageFile.py index 136154238a6..8b688381c03 100644 --- a/src/PIL/GdImageFile.py +++ b/src/PIL/GdImageFile.py @@ -59,7 +59,8 @@ def _open(self): if tindex < 256: self.info["transparency"] = tindex - self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4]) + self.palette = ImagePalette.raw( + "XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4]) self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, ("L", 0, 1))] diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 107dc9f8799..e8871bb1e0e 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -727,7 +727,7 @@ def getProfileInfo(profile): # add an extra newline to preserve pyCMS compatibility # Python, not C. the white point bits weren't working well, # so skipping. - # // info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint description = profile.profile.product_description cpright = profile.profile.product_copyright arr = [] diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 08c00fd5421..d3b3b00acae 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -87,7 +87,10 @@ def getrgb(color): int((int(m.group(3)) * 255) / 100.0 + 0.5) ) - m = re.match(r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + m = re.match( + r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", + color, + ) if m: from colorsys import hls_to_rgb rgb = hls_to_rgb( @@ -101,7 +104,10 @@ def getrgb(color): int(rgb[2] * 255 + 0.5) ) - m = re.match(r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + m = re.match( + r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", + color, + ) if m: from colorsys import hsv_to_rgb rgb = hsv_to_rgb( diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index e8961cd1752..d0fe76ef4a8 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -54,7 +54,8 @@ def grabclipboard(): fh, filepath = tempfile.mkstemp('.jpg') os.close(fh) commands = [ - "set theFile to (open for access POSIX file \""+filepath+"\" with write permission)", + "set theFile to (open for access POSIX file \"" + + filepath + "\" with write permission)", "try", " write (the clipboard as JPEG picture) to theFile", "end try", diff --git a/src/PIL/JpegPresets.py b/src/PIL/JpegPresets.py index 75d61223e86..f7a533c18c0 100644 --- a/src/PIL/JpegPresets.py +++ b/src/PIL/JpegPresets.py @@ -62,7 +62,8 @@ You can convert the dict format to the preset format with the `JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. -Libjpeg ref.: https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html +Libjpeg ref.: +https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html """ diff --git a/src/PIL/PdfParser.py b/src/PIL/PdfParser.py index bcd29db0dae..66d6ecfb198 100644 --- a/src/PIL/PdfParser.py +++ b/src/PIL/PdfParser.py @@ -386,7 +386,8 @@ def pdf_repr(x): class PdfParser: - """Based on https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + """Based on + https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf Supports PDF up to 1.4 """ @@ -863,7 +864,8 @@ def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): raise PdfFormatError( "unrecognized object: " + repr(data[offset:offset+32])) - re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") + re_lit_str_token = re.compile( + br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") escaped_chars = { b"n": b"\n", b"r": b"\r", diff --git a/winbuild/build.py b/winbuild/build.py index 9f1c393a04a..9e8d442c17c 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -74,7 +74,7 @@ def vc_setup(compiler, bit): def build_one(py_ver, compiler, bit): - # UNDONE virtual envs if we're not running on appveyor + # UNDONE virtual envs if we're not running on AppVeyor args = {} args.update(compiler) if 'PYTHON' in os.environ: @@ -97,6 +97,8 @@ def build_one(py_ver, compiler, bit): else: args['imaging_libs'] = '' + args['vc_setup'] = vc_setup(compiler, bit) + script = r""" setlocal EnableDelayedExpansion call "%%ProgramFiles%%\Microsoft SDKs\Windows\%(env_version)s\Bin\SetEnv.Cmd" /Release %(env_flags)s @@ -105,7 +107,7 @@ def build_one(py_ver, compiler, bit): set INCLUDE=%%INCLUDE%%;%%INCLIB%%\%(inc_dir)s;%%INCLIB%%\tcl%(tcl_ver)s\include setlocal -set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl""" + vc_setup(compiler, bit) + r""" +set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl%(vc_setup)s call %(python_path)s\%(executable)s setup.py %(imaging_libs)s %%BLDOPT%% endlocal From a568a8730e1c84339e3ab987323972507354c7bb Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 11 Nov 2018 18:57:57 +0200 Subject: [PATCH 0660/1393] flake8: E302 expected 2 blank lines, found 1 --- Tests/test_image_access.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 338ab025817..ae9692b3950 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -102,6 +102,7 @@ def test_sanity_negative_index(self): self.assert_image_equal(im1, im2) + class TestImageGetPixel(AccessTest): @staticmethod def color(mode): From 990fb03218440e9aa2f4dd18c4ea7806a96cc8ed Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 26 Aug 2018 13:52:02 +1000 Subject: [PATCH 0661/1393] Changed if to elif --- Tests/test_file_tiff_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 9c615354cd0..7407cc45676 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -135,7 +135,7 @@ def test_write_metadata(self): for k, v in original.items(): if isinstance(v, IFDRational): original[k] = IFDRational(*_limit_rational(v, 2**31)) - if isinstance(v, tuple) and isinstance(v[0], IFDRational): + elif isinstance(v, tuple) and isinstance(v[0], IFDRational): original[k] = tuple(IFDRational(*_limit_rational(elt, 2**31)) for elt in v) From a3d45e9cefd05105a360588cd3087ccd5ae63b35 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Oct 2018 19:45:13 +1100 Subject: [PATCH 0662/1393] Added custom int and float TIFF tags --- Tests/test_file_libtiff.py | 18 +++++++++++++++ src/PIL/TiffImagePlugin.py | 9 ++++---- src/PIL/TiffTags.py | 1 + src/encode.c | 46 ++++++++++++++++++++++++++----------- src/libImaging/TiffDecode.c | 13 +++++++++++ src/libImaging/TiffDecode.h | 1 + 6 files changed, 69 insertions(+), 19 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 58a3d38c534..19c952ae4d6 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -231,6 +231,24 @@ def test_additional_metadata(self): TiffImagePlugin.WRITE_LIBTIFF = False + def test_custom_metadata(self): + custom = { + 37000: 4, + 37001: 4.2 + } + for libtiff in [False, True]: + TiffImagePlugin.WRITE_LIBTIFF = libtiff + + im = hopper() + + out = self.tempfile("temp.tif") + im.save(out, tiffinfo=custom) + TiffImagePlugin.WRITE_LIBTIFF = False + + reloaded = Image.open(out) + for tag, value in custom.items(): + self.assertEqual(reloaded.tag_v2[tag], value) + def test_int_dpi(self): # issue #1765 im = hopper('RGB') diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 5059a132442..c2b09e294ae 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1499,11 +1499,10 @@ def _save(im, fp, filename): getattr(im, 'tag_v2', {}).items(), legacy_ifd.items()): # Libtiff can only process certain core items without adding - # them to the custom dictionary. It will segfault if it attempts - # to add a custom tag without the dictionary entry - # - # UNDONE -- add code for the custom dictionary - if tag not in TiffTags.LIBTIFF_CORE: + # them to the custom dictionary. Support has only been been added + # for int and float values + if tag not in TiffTags.LIBTIFF_CORE and not \ + (isinstance(value, int) or isinstance(value, float)): continue if tag not in atts and tag not in blocklist: if isinstance(value, str if py3 else unicode): diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index c1e14af4ae1..d810f2f35be 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -425,6 +425,7 @@ def _populate(): # some of these are not in our TAGS_V2 dict and were included from tiff.h +# This list also exists in encode.c LIBTIFF_CORE = {255, 256, 257, 258, 259, 262, 263, 266, 274, 277, 278, 280, 281, 340, 341, 282, 283, 284, 286, 287, 296, 297, 321, 320, 338, 32995, 322, 323, 32998, diff --git a/src/encode.c b/src/encode.c index c60048c41d3..385d576ddc9 100644 --- a/src/encode.c +++ b/src/encode.c @@ -804,7 +804,13 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) PyObject *dir; PyObject *key, *value; Py_ssize_t pos = 0; - int status; + int key_int, status, is_core_tag, i; + // This list also exists in TiffTags.py + const int tags[32] = { + 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, + 341, 282, 283, 284, 286, 287, 296, 297, 321, 338, 32995, 32998, 32996, + 339, 32997, 330, 531, 530 + }; Py_ssize_t d_size; PyObject *keys, *values; @@ -845,21 +851,33 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) for (pos = 0; pos < d_size; pos++) { key = PyList_GetItem(keys, pos); + key_int = (int)PyInt_AsLong(key); value = PyList_GetItem(values, pos); status = 0; - TRACE(("Attempting to set key: %d\n", (int)PyInt_AsLong(key))); + is_core_tag = 0; + for (i=0; i<32; i++) { + if (tags[i] == key_int) { + is_core_tag = 1; + break; + } + } + TRACE(("Attempting to set key: %d\n", key_int)); if (PyInt_Check(value)) { - TRACE(("Setting from Int: %d %ld \n", (int)PyInt_AsLong(key),PyInt_AsLong(value))); - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) PyInt_AsLong(key), - PyInt_AsLong(value)); + TRACE(("Setting from Int: %d %ld \n", key_int, PyInt_AsLong(value))); + if (is_core_tag || !ImagingLibTiffMergeFieldInfo(&encoder->state, TIFF_LONG, key_int)) { + status = ImagingLibTiffSetField(&encoder->state, + (ttag_t) PyInt_AsLong(key), + PyInt_AsLong(value)); + } } else if (PyFloat_Check(value)) { - TRACE(("Setting from Float: %d, %f \n", (int)PyInt_AsLong(key),PyFloat_AsDouble(value))); - status = ImagingLibTiffSetField(&encoder->state, - (ttag_t) PyInt_AsLong(key), - (float)PyFloat_AsDouble(value)); + TRACE(("Setting from Float: %d, %f \n", key_int, PyFloat_AsDouble(value))); + if (is_core_tag || !ImagingLibTiffMergeFieldInfo(&encoder->state, TIFF_DOUBLE, key_int)) { + status = ImagingLibTiffSetField(&encoder->state, + (ttag_t) PyInt_AsLong(key), + (double)PyFloat_AsDouble(value)); + } } else if (PyBytes_Check(value)) { - TRACE(("Setting from Bytes: %d, %s \n", (int)PyInt_AsLong(key),PyBytes_AsString(value))); + TRACE(("Setting from Bytes: %d, %s \n", key_int, PyBytes_AsString(value))); status = ImagingLibTiffSetField(&encoder->state, (ttag_t) PyInt_AsLong(key), PyBytes_AsString(value)); @@ -867,7 +885,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) Py_ssize_t len,i; float *floatav; int *intav; - TRACE(("Setting from Tuple: %d \n", (int)PyInt_AsLong(key))); + TRACE(("Setting from Tuple: %d \n", key_int)); len = PyTuple_Size(value); if (len) { if (PyInt_Check(PyTuple_GetItem(value,0))) { @@ -898,13 +916,13 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) } } else { TRACE(("Unhandled type in tuple for key %d : %s \n", - (int)PyInt_AsLong(key), + key_int, PyBytes_AsString(PyObject_Str(value)))); } } } else { TRACE(("Unhandled type for key %d : %s \n", - (int)PyInt_AsLong(key), + key_int, PyBytes_AsString(PyObject_Str(value)))); } if (!status) { diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index e77afdf6187..bfab4b79ed2 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -402,6 +402,19 @@ int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) { } +int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key){ + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + char field_name[10]; + uint32 n; + + const TIFFFieldInfo info[] = { + { key, 0, 1, field_type, FIELD_CUSTOM, 1, 0, field_name } + }; + n = sizeof(info) / sizeof(info[0]); + + return TIFFMergeFieldInfo(clientstate->tiff, info, n); +} + int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ // after tif_dir.c->TIFFSetField. TIFFSTATE *clientstate = (TIFFSTATE *)state->context; diff --git a/src/libImaging/TiffDecode.h b/src/libImaging/TiffDecode.h index e14a0932922..e29a6c88f4b 100644 --- a/src/libImaging/TiffDecode.h +++ b/src/libImaging/TiffDecode.h @@ -45,6 +45,7 @@ typedef struct { extern int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); +extern int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_type, int key); extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); From ddf8593e7bb4f5edc64c96ea730076920ea8cf33 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Oct 2018 19:36:49 +1100 Subject: [PATCH 0663/1393] Do not write custom tags with libtiff < 4 --- Tests/test_file_libtiff.py | 11 ++++++++++- Tests/versions.py | 1 + src/PIL/TiffImagePlugin.py | 13 ++++++++++--- src/_imaging.c | 7 +++++++ src/libImaging/TiffDecode.c | 16 +++++++++++++++- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 19c952ae4d6..2ddb2263a58 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -8,6 +8,7 @@ import logging import itertools import os +import distutils.version from PIL import Image, TiffImagePlugin, TiffTags @@ -236,7 +237,15 @@ def test_custom_metadata(self): 37000: 4, 37001: 4.2 } - for libtiff in [False, True]: + + libtiff_version = TiffImagePlugin._libtiff_version() + + libtiffs = [False] + if distutils.version.StrictVersion(libtiff_version) >= \ + distutils.version.StrictVersion("4.0"): + libtiffs.append(True) + + for libtiff in libtiffs: TiffImagePlugin.WRITE_LIBTIFF = libtiff im = hopper() diff --git a/Tests/versions.py b/Tests/versions.py index abc1a3be95d..835865b37eb 100644 --- a/Tests/versions.py +++ b/Tests/versions.py @@ -10,6 +10,7 @@ def version(module, version): version(Image, "jpeglib") version(Image, "zlib") +version(Image, "libtiff") try: from PIL import ImageFont diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index c2b09e294ae..2b4ddb03867 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -54,6 +54,7 @@ import struct import sys import warnings +import distutils.version from .TiffTags import TYPES @@ -284,6 +285,10 @@ def _limit_rational(val, max_val): return n_d[::-1] if inv else n_d +def _libtiff_version(): + return Image.core.libtiff_version.split("\n")[0].split("Version ")[1] + + ## # Wrapper for TIFF IFDs. @@ -1501,9 +1506,11 @@ def _save(im, fp, filename): # Libtiff can only process certain core items without adding # them to the custom dictionary. Support has only been been added # for int and float values - if tag not in TiffTags.LIBTIFF_CORE and not \ - (isinstance(value, int) or isinstance(value, float)): - continue + if tag not in TiffTags.LIBTIFF_CORE: + if (distutils.version.StrictVersion(_libtiff_version()) < + distutils.version.StrictVersion("4.0")) \ + or not (isinstance(value, int) or isinstance(value, float)): + continue if tag not in atts and tag not in blocklist: if isinstance(value, str if py3 else unicode): atts[tag] = value.encode('ascii', 'replace') + b"\0" diff --git a/src/_imaging.c b/src/_imaging.c index 47444434841..5b8ccb8ad99 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3849,6 +3849,13 @@ setup_module(PyObject* m) { } #endif +#ifdef HAVE_LIBTIFF + { + extern const char * ImagingTiffVersion(void); + PyDict_SetItemString(d, "libtiff_version", PyUnicode_FromString(ImagingTiffVersion())); + } +#endif + PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(version)); return 0; diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index bfab4b79ed2..64ac86e6a35 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -406,13 +406,20 @@ int ImagingLibTiffMergeFieldInfo(ImagingCodecState state, TIFFDataType field_typ TIFFSTATE *clientstate = (TIFFSTATE *)state->context; char field_name[10]; uint32 n; + int status = 0; const TIFFFieldInfo info[] = { { key, 0, 1, field_type, FIELD_CUSTOM, 1, 0, field_name } }; n = sizeof(info) / sizeof(info[0]); - return TIFFMergeFieldInfo(clientstate->tiff, info, n); + // 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 + status = TIFFMergeFieldInfo(clientstate->tiff, info, n); +#else + TIFFMergeFieldInfo(clientstate->tiff, info, n); +#endif + return status; } int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...){ @@ -514,4 +521,11 @@ int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int state->errcode = IMAGING_CODEC_END; return 0; } + +const char* +ImagingTiffVersion(void) +{ + return TIFFGetVersion(); +} + #endif From 207ed04d87cd29f0117566d1191bdcc6e5716acb Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 25 Oct 2018 20:17:20 +1100 Subject: [PATCH 0664/1393] Removed hardcoded array size Co-Authored-By: radarhere --- src/encode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/encode.c b/src/encode.c index 385d576ddc9..238eabd1ef2 100644 --- a/src/encode.c +++ b/src/encode.c @@ -855,7 +855,8 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) value = PyList_GetItem(values, pos); status = 0; is_core_tag = 0; - for (i=0; i<32; i++) { + int number_of_tags = sizeof(tags) / sizeof(int); + for (i=0; i Date: Thu, 25 Oct 2018 20:18:49 +1100 Subject: [PATCH 0665/1393] Changed array size to be arbitrary Co-Authored-By: radarhere --- src/encode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encode.c b/src/encode.c index 238eabd1ef2..2626e0eb8ef 100644 --- a/src/encode.c +++ b/src/encode.c @@ -806,7 +806,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) Py_ssize_t pos = 0; int key_int, status, is_core_tag, i; // This list also exists in TiffTags.py - const int tags[32] = { + const int tags[] = { 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, 341, 282, 283, 284, 286, 287, 296, 297, 321, 338, 32995, 32998, 32996, 339, 32997, 330, 531, 530 From d8e66c1882a11a0f81c1f3e3308a64134779ab55 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Oct 2018 21:00:38 +1100 Subject: [PATCH 0666/1393] Moved variable declaration and execution --- src/encode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/encode.c b/src/encode.c index 2626e0eb8ef..bce1c2988fb 100644 --- a/src/encode.c +++ b/src/encode.c @@ -804,7 +804,7 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) PyObject *dir; PyObject *key, *value; Py_ssize_t pos = 0; - int key_int, status, is_core_tag, i; + int key_int, status, is_core_tag, number_of_tags, i; // This list also exists in TiffTags.py const int tags[] = { 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, @@ -849,13 +849,13 @@ PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) return NULL; } + number_of_tags = sizeof(tags) / sizeof(int); for (pos = 0; pos < d_size; pos++) { key = PyList_GetItem(keys, pos); key_int = (int)PyInt_AsLong(key); value = PyList_GetItem(values, pos); status = 0; is_core_tag = 0; - int number_of_tags = sizeof(tags) / sizeof(int); for (i=0; i Date: Sat, 3 Nov 2018 13:13:04 +1100 Subject: [PATCH 0667/1393] Added UnixViewer get_command --- Tests/test_imageshow.py | 10 ++++++++++ src/PIL/ImageShow.py | 9 +++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py index da91e35c77f..244c18d91e1 100644 --- a/Tests/test_imageshow.py +++ b/Tests/test_imageshow.py @@ -14,6 +14,9 @@ def test_register(self): # Test registering a viewer that is not a class ImageShow.register("not a class") + # Restore original state + ImageShow._viewers.pop() + def test_show(self): class TestViewer: methodCalled = False @@ -28,6 +31,9 @@ def show(self, image, title=None, **options): self.assertTrue(ImageShow.show(im)) self.assertTrue(viewer.methodCalled) + # Restore original state + ImageShow._viewers.pop(0) + def test_viewer(self): viewer = ImageShow.Viewer() @@ -35,6 +41,10 @@ def test_viewer(self): self.assertRaises(NotImplementedError, viewer.get_command, None) + def test_viewers(self): + for viewer in ImageShow._viewers: + viewer.get_command('test.jpg') + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index b50d6135884..f1819cc5c8e 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -148,12 +148,9 @@ class UnixViewer(Viewer): format = "PNG" options = {'compress_level': 1} - def show_file(self, file, **options): - command, executable = self.get_command_ex(file, **options) - command = "(%s %s; rm -f %s)&" % (command, quote(file), - quote(file)) - os.system(command) - return 1 + def get_command(self, file, **options): + command = self.get_command_ex(file, **options)[0] + return "(%s %s; rm -f %s)&" % (command, quote(file), quote(file)) # implementations From fea3dafd05c8ca44c30167c34ce4d82964421efb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 Nov 2018 14:24:10 +1100 Subject: [PATCH 0668/1393] Supply filename through stdin instead of inline in Mac and Unix ImageShow viewers --- src/PIL/ImageShow.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index f1819cc5c8e..7d758c737c8 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -17,6 +17,8 @@ from PIL import Image import os import sys +import subprocess +import tempfile if sys.version_info.major >= 3: from shlex import quote @@ -128,6 +130,21 @@ def get_command(self, file, **options): quote(file)) return command + def show_file(self, file, **options): + """Display given file""" + f, path = tempfile.mkstemp() + f.write(file) + f.close() + with open(path, "r") as f: + subprocess.Popen([ + 'im=$(cat);' + 'open -a /Applications/Preview.app $im;' + 'sleep 20;' + 'rm -f $im' + ], shell=True, stdin=f) + os.remove(path) + return 1 + register(MacViewer) else: @@ -152,6 +169,21 @@ def get_command(self, file, **options): command = self.get_command_ex(file, **options)[0] return "(%s %s; rm -f %s)&" % (command, quote(file), quote(file)) + def show_file(self, file, **options): + """Display given file""" + f, path = tempfile.mkstemp() + f.write(file) + f.close() + with open(path, "r") as f: + command = self.get_command_ex(file, **options)[0] + subprocess.Popen([ + 'im=$(cat);' + + command+' $im;' + 'rm -f $im' + ], shell=True, stdin=f) + os.remove(path) + return 1 + # implementations class DisplayViewer(UnixViewer): From 3ff4b540503e9fb875fa02b622a54087ff5946d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 12 Nov 2018 19:54:26 +1100 Subject: [PATCH 0669/1393] Added __main__ code --- Tests/test_core_resources.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tests/test_core_resources.py b/Tests/test_core_resources.py index 11f26d38e80..fd8fb424463 100644 --- a/Tests/test_core_resources.py +++ b/Tests/test_core_resources.py @@ -179,3 +179,7 @@ def test_warnings(self): self.assert_warning( UserWarning, Image._apply_env_variables, {'PILLOW_BLOCKS_MAX': 'wat'}) + + +if __name__ == '__main__': + unittest.main() From 9a1c3915aec0ca5683fd50793a5dd0c018beb780 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 13 Nov 2018 21:45:52 +1100 Subject: [PATCH 0670/1393] Corrected TypeError in Python 3 --- Tests/check_png_dos.py | 2 +- Tests/createfontdatachunk.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index 0bbaf6a4d3d..0cb775aed9e 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -36,7 +36,7 @@ def test_dos_text(self): def test_dos_total_memory(self): im = Image.new('L', (1, 1)) - compressed_data = zlib.compress('a'*1024*1023) + compressed_data = zlib.compress(b'a'*1024*1023) info = PngImagePlugin.PngInfo() diff --git a/Tests/createfontdatachunk.py b/Tests/createfontdatachunk.py index 720fd0067af..1a3076da792 100755 --- a/Tests/createfontdatachunk.py +++ b/Tests/createfontdatachunk.py @@ -10,7 +10,9 @@ print(" f._load_pilfont_data(") print(" # %s" % os.path.basename(font)) print(" BytesIO(base64.decodestring(b'''") - base64.encode(open(font + ".pil", "rb"), sys.stdout) + with open(font + ".pil", "rb") as fp: + print(base64.b64encode(fp.read()).decode()) print("''')), Image.open(BytesIO(base64.decodestring(b'''") - base64.encode(open(font + ".pbm", "rb"), sys.stdout) + with open(font + ".pbm", "rb") as fp: + print(base64.b64encode(fp.read()).decode()) print("'''))))") From b637b5f7a2faefcc5db45262f409d143c62bc74f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 13 Nov 2018 22:13:55 +1100 Subject: [PATCH 0671/1393] Close exclusive fp before discarding --- Tests/test_file_icns.py | 5 ++++- Tests/test_file_png.py | 4 +++- src/PIL/IcnsImagePlugin.py | 2 ++ src/PIL/PngImagePlugin.py | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index b19cf2e4c85..5e0f377c41d 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -17,7 +17,10 @@ def test_sanity(self): # Loading this icon by default should result in the largest size # (512x512@2x) being loaded im = Image.open(TEST_FILE) - im.load() + + # Assert that there is no unclosed file warning + self.assert_warning(None, im.load) + self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (1024, 1024)) self.assertEqual(im.format, "ICNS") diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index c958c0b3940..ca7d3c0390a 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -327,7 +327,9 @@ def test_load_verify(self): # Check open/load/verify exception (@PIL150) im = Image.open(TEST_PNG_FILE) - im.verify() + + # Assert that there is no unclosed file warning + self.assert_warning(None, im.verify) im = Image.open(TEST_PNG_FILE) im.load() diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index d156b240f31..2ea66675ffc 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -311,6 +311,8 @@ def load(self): self.im = im.im self.mode = im.mode self.size = im.size + if self._exclusive_fp: + self.fp.close() self.fp = None self.icns = None self.tile = () diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 15077fceb50..b89bd0efcff 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -600,6 +600,8 @@ def verify(self): self.png.verify() self.png.close() + if self._exclusive_fp: + self.fp.close() self.fp = None def load_prepare(self): From c0ee319af13a9ff9a93561e7c30bbdcfdef35a17 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 13 Nov 2018 22:24:59 +1100 Subject: [PATCH 0672/1393] Close fp before replacing --- Tests/test_file_cur.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/test_file_cur.py b/Tests/test_file_cur.py index 23055a0ad48..1628007ee21 100644 --- a/Tests/test_file_cur.py +++ b/Tests/test_file_cur.py @@ -26,6 +26,7 @@ def test_invalid_file(self): no_cursors_file = "Tests/images/no_cursors.cur" cur = CurImagePlugin.CurImageFile(TEST_FILE) + cur.fp.close() with open(no_cursors_file, "rb") as cur.fp: self.assertRaises(TypeError, cur._open) From 61397de88b69de514add818dedaed142345b5b44 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 16 Nov 2018 23:31:42 +1100 Subject: [PATCH 0673/1393] Check quality_layers type --- Tests/test_file_jpeg2k.py | 16 ++++++++++++++++ src/PIL/Jpeg2KImagePlugin.py | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index be49c99bf4b..8f027b65124 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -105,6 +105,22 @@ def test_reduce(self): im.load() self.assertEqual(im.size, (160, 120)) + def test_layers_type(self): + outfile = self.tempfile('temp_layers.jp2') + for quality_layers in [ + [100, 50, 10], + (100, 50, 10), + None + ]: + test_card.save(outfile, quality_layers=quality_layers) + + for quality_layers in [ + 'quality_layers', + ('100', '50', '10') + ]: + self.assertRaises(ValueError, test_card.save, outfile, + quality_layers=quality_layers) + def test_layers(self): out = BytesIO() test_card.save(out, 'JPEG2000', quality_layers=[100, 50, 10], diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 7659b6bf18d..2bf51989630 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -232,6 +232,13 @@ def _save(im, fp, filename): tile_size = info.get('tile_size', None) quality_mode = info.get('quality_mode', 'rates') quality_layers = info.get('quality_layers', None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) and + all([isinstance(quality_layer, (int, float)) + for quality_layer in quality_layers]) + ): + raise ValueError('quality_layers must be a sequence of numbers') + num_resolutions = info.get('num_resolutions', 0) cblk_size = info.get('codeblock_size', None) precinct_size = info.get('precinct_size', None) From 68343197b14990341a6d03547c4330fd5d0d1c1c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Nov 2018 12:31:15 +1100 Subject: [PATCH 0674/1393] Update CHANGES.rst [ci skip] --- CHANGES.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 53cda0df4ea..1fb56050add 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 5.4.0 (unreleased) ------------------ +- Check quality_layers type #3464 + [radarhere] + - Add context manager, __del__ and close methods to TarIO #3455 [radarhere] @@ -26,9 +29,12 @@ Changelog (Pillow) - Change tuple background to global color table index when saving as GIF #3385 [radarhere] -- Flake8 fixes #3422 +- Test: Improved ImageGrab tests #3424 [radarhere] +- Flake8 fixes #3422, #3440 + [radarhere, hugovk] + - Only ask for YCbCr->RGB libtiff conversion for jpeg-compressed tiffs #3417 [kkopachev] From bbb4bdcd9e0af252f0b82f40c551fa3ce0c8811a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 16 Nov 2018 19:53:02 +1100 Subject: [PATCH 0675/1393] Updated Tk Tcl to 8.6.9 --- winbuild/config.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 65fad994b6d..cc27c1c021f 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -55,15 +55,15 @@ 'version': '8.5.19', }, 'tcl-8.6': { - 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.8/tcl868-src.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tcl868-src.zip', + 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.9/tcl869-src.zip', + 'filename': PILLOW_DEPENDS_DIR + 'tcl869-src.zip', 'dir': '', }, 'tk-8.6': { - 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.8/tk868-src.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tk868-src.zip', + 'url': SF_MIRROR+'/project/tcl/Tcl/8.6.9/tk869-src.zip', + 'filename': PILLOW_DEPENDS_DIR + 'tk869-src.zip', 'dir': '', - 'version': '8.6.8', + 'version': '8.6.9', }, 'webp': { 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-1.0.0.tar.gz', From 06eab8b2a038b171671b25bc10780854b24b1d73 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Nov 2018 19:44:13 +1100 Subject: [PATCH 0676/1393] Removed unused function --- winbuild/build_dep.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index 3eefb26111f..51a4e821aab 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -121,24 +121,6 @@ def nmake_openjpeg(compiler): setlocal @echo on cd /D %%OPENJPEG%%%(inc_dir)s -%%CMAKE%% -DBUILD_THIRDPARTY:BOOL=OFF -G "NMake Makefiles" . -nmake -f Makefile clean -nmake -f Makefile -copy /Y /B bin\* %%INCLIB%% -mkdir %%INCLIB%%\openjpeg-%(op_ver)s -copy /Y /B src\lib\openjp2\*.h %%INCLIB%%\openjpeg-%(op_ver)s -endlocal -""" % atts - - -def msbuild_openjpeg(compiler): - atts = {'op_ver': '2.1'} - atts.update(compiler) - return r""" -rem build openjpeg -setlocal -@echo on -cd /D %%OPENJPEG%%%(inc_dir)s %%CMAKE%% -DBUILD_THIRDPARTY:BOOL=OFF -G "NMake Makefiles" . nmake -f Makefile clean From ea8a80ba311aa385c664bb7c056cb20c1759722b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Nov 2018 19:55:24 +1100 Subject: [PATCH 0677/1393] Updated libwebp to 1.0.1 --- depends/install_webp.sh | 2 +- winbuild/config.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index e27fedc5100..6394d52be4d 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -1,7 +1,7 @@ #!/bin/bash # install webp -archive=libwebp-1.0.0 +archive=libwebp-1.0.1 ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/master/$archive.tar.gz diff --git a/winbuild/config.py b/winbuild/config.py index 65fad994b6d..47b89277dc9 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -66,9 +66,9 @@ 'version': '8.6.8', }, 'webp': { - 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-1.0.0.tar.gz', - 'filename': PILLOW_DEPENDS_DIR + 'libwebp-1.0.0.tar.gz', - 'dir': 'libwebp-1.0.0', + 'url': 'http://downloads.webmproject.org/releases/webp/libwebp-1.0.1.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'libwebp-1.0.1.tar.gz', + 'dir': 'libwebp-1.0.1', }, 'openjpeg': { 'url': SF_MIRROR+'/project/openjpeg/openjpeg/2.3.0/openjpeg-2.3.0.tar.gz', From 47775f3d50b634d1a293370e55fd72fa62640ded Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 17 Nov 2018 21:56:06 +1100 Subject: [PATCH 0678/1393] Resolve __fp when closing and deleting --- Tests/test_file_dcx.py | 6 ++++++ Tests/test_file_fli.py | 6 ++++++ Tests/test_file_gif.py | 6 ++++++ Tests/test_file_im.py | 6 ++++++ Tests/test_file_mpo.py | 6 ++++++ Tests/test_file_spider.py | 6 ++++++ Tests/test_file_tiff.py | 6 ++++++ src/PIL/DcxImagePlugin.py | 8 ++++++++ src/PIL/FliImagePlugin.py | 8 ++++++++ src/PIL/GifImagePlugin.py | 8 ++++++++ src/PIL/ImImagePlugin.py | 8 ++++++++ src/PIL/Image.py | 4 ++++ src/PIL/MicImagePlugin.py | 9 ++++++++- src/PIL/MpoImagePlugin.py | 8 ++++++++ src/PIL/SpiderImagePlugin.py | 8 ++++++++ src/PIL/TiffImagePlugin.py | 8 ++++++++ 16 files changed, 110 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index 28ebb91dc9e..52c0e13f41b 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -20,6 +20,12 @@ def test_sanity(self): orig = hopper() self.assert_image_equal(im, orig) + def test_unclosed_file(self): + def open(): + im = Image.open(TEST_FILE) + im.load() + self.assert_warning(None, open) + def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: self.assertRaises(SyntaxError, diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 142af3cec40..2b2f2da6d54 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -27,6 +27,12 @@ def test_sanity(self): self.assertEqual(im.info["duration"], 71) self.assertTrue(im.is_animated) + def test_unclosed_file(self): + def open(): + im = Image.open(static_test_file) + im.load() + self.assert_warning(None, open) + def test_tell(self): # Arrange im = Image.open(static_test_file) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index cfa1bb1e76a..16803dc1171 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -33,6 +33,12 @@ def test_sanity(self): self.assertEqual(im.format, "GIF") self.assertEqual(im.info["version"], b"GIF89a") + def test_unclosed_file(self): + def open(): + im = Image.open(TEST_GIF) + im.load() + self.assert_warning(None, open) + def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index c9992476774..f3349b736af 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -15,6 +15,12 @@ def test_sanity(self): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "IM") + def test_unclosed_file(self): + def open(): + im = Image.open(TEST_IM) + im.load() + self.assert_warning(None, open) + def test_tell(self): # Arrange im = Image.open(TEST_IM) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 70bb9b10544..9f79d8cfaf4 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -31,6 +31,12 @@ def test_sanity(self): self.assertEqual(im.size, (640, 480)) self.assertEqual(im.format, "MPO") + def test_unclosed_file(self): + def open(): + im = Image.open(test_files[0]) + im.load() + self.assert_warning(None, open) + def test_app(self): for test_file in test_files: # Test APP/COM reader (@PIL135) diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index b54b92e04bb..4612b36a1a5 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -18,6 +18,12 @@ def test_sanity(self): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "SPIDER") + def test_unclosed_file(self): + def open(): + im = Image.open(TEST_FILE) + im.load() + self.assert_warning(None, open) + def test_save(self): # Arrange temp = self.tempfile('temp.spider') diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 56ad6947358..95a18136318 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -40,6 +40,12 @@ def test_sanity(self): hopper("I").save(filename) Image.open(filename) + def test_unclosed_file(self): + def open(): + im = Image.open("Tests/images/multipage.tiff") + im.load() + self.assert_warning(None, open) + def test_mac_tiff(self): # Read RGBa images from macOS [@PIL136] diff --git a/src/PIL/DcxImagePlugin.py b/src/PIL/DcxImagePlugin.py index 2045927596f..1b72cbc990e 100644 --- a/src/PIL/DcxImagePlugin.py +++ b/src/PIL/DcxImagePlugin.py @@ -81,6 +81,14 @@ def seek(self, frame): def tell(self): return self.frame + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + Image.register_open(DcxImageFile.format, DcxImageFile, _accept) diff --git a/src/PIL/FliImagePlugin.py b/src/PIL/FliImagePlugin.py index c78c8c622d5..d093ed705db 100644 --- a/src/PIL/FliImagePlugin.py +++ b/src/PIL/FliImagePlugin.py @@ -154,6 +154,14 @@ def _seek(self, frame): def tell(self): return self.__frame + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # # registry diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index ecd993cd560..7a68064fdb5 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -296,6 +296,14 @@ def load_end(self): self.im = self._prev_im self._prev_im = self.im.copy() + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # -------------------------------------------------------------------- # Write GIF files diff --git a/src/PIL/ImImagePlugin.py b/src/PIL/ImImagePlugin.py index 38b3f46f487..1a4fdb65a27 100644 --- a/src/PIL/ImImagePlugin.py +++ b/src/PIL/ImImagePlugin.py @@ -290,6 +290,14 @@ def seek(self, frame): def tell(self): return self.frame + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # # -------------------------------------------------------------------- # Save IM files diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 541c62c493f..ad30de4781b 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -596,6 +596,8 @@ def close(self): try: self.fp.close() self.fp = None + if hasattr(self, "_close__fp"): + self._close__fp() except Exception as msg: logger.debug("Error closing: %s", msg) @@ -613,6 +615,8 @@ def __del__(self): and self.fp and self._exclusive_fp): self.fp.close() self.fp = None + if hasattr(self, "_close__fp"): + self._close__fp() def _copy(self): self.load() diff --git a/src/PIL/MicImagePlugin.py b/src/PIL/MicImagePlugin.py index 1dbb6a588e1..6e29e456dc8 100644 --- a/src/PIL/MicImagePlugin.py +++ b/src/PIL/MicImagePlugin.py @@ -95,9 +95,16 @@ def seek(self, frame): self.frame = frame def tell(self): - return self.frame + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # # -------------------------------------------------------------------- diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index a1a8d655a64..06b93d92146 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -84,6 +84,14 @@ def seek(self, frame): def tell(self): return self.__frame + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # --------------------------------------------------------------------- # Registry stuff diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index 3f579521045..9dd7a7c03ca 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -193,6 +193,14 @@ def tkPhotoImage(self): from PIL import ImageTk return ImageTk.PhotoImage(self.convert2byte(), palette=256) + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # -------------------------------------------------------------------- # Image series diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 5059a132442..5ae8211a4f8 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1347,6 +1347,14 @@ def _setup(self): palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + def _close__fp(self): + try: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + # # -------------------------------------------------------------------- From 130b8b3971245113914df72897f4d28176a877de Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 11 Nov 2018 15:36:25 +1100 Subject: [PATCH 0679/1393] Updated libtiff to 4.0.10 --- winbuild/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 65fad994b6d..1e05df8a235 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -29,9 +29,9 @@ 'dir': 'jpeg-9c', }, 'tiff': { - 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.9.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.9.zip', - 'dir': 'tiff-4.0.9', + 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.10.zip', + 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.10.zip', + 'dir': 'tiff-4.0.10', }, 'freetype': { 'url': 'https://download.savannah.gnu.org/releases/freetype/freetype-2.9.1.tar.gz', From e2a1ad329f9178216a55261b7bc1ce26fea57d0d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 19 Nov 2018 22:46:27 +1100 Subject: [PATCH 0680/1393] Changed libtiff to use .tar.gz --- winbuild/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winbuild/config.py b/winbuild/config.py index 1e05df8a235..3273d2e5708 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -29,8 +29,8 @@ 'dir': 'jpeg-9c', }, 'tiff': { - 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.10.zip', - 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.10.zip', + 'url': 'ftp://download.osgeo.org/libtiff/tiff-4.0.10.tar.gz', + 'filename': PILLOW_DEPENDS_DIR + 'tiff-4.0.10.tar.gz', 'dir': 'tiff-4.0.10', }, 'freetype': { From 84df069169b4ad429f34a6b1bc318ba9aae73129 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Nov 2018 18:50:00 +1100 Subject: [PATCH 0681/1393] Use im.info background when saving --- src/PIL/WebPImagePlugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 0e9de6e485e..084eedf53ae 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -191,7 +191,11 @@ def _save_all(im, fp, filename): _save(im, fp, filename) return - background = encoderinfo.get("background", (0, 0, 0, 0)) + background = (0, 0, 0, 0) + if "background" in encoderinfo: + background = encoderinfo["background"] + elif "background" in im.info: + background = im.info["background"] duration = im.encoderinfo.get("duration", 0) loop = im.encoderinfo.get("loop", 0) minimize_size = im.encoderinfo.get("minimize_size", False) From 6c126ca2821d0fba00fffc290aa3226692e15ff8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 20 Nov 2018 19:50:14 +1100 Subject: [PATCH 0682/1393] Change color table index background to tuple when saving --- Tests/test_file_webp.py | 20 ++++++++++++++++++++ src/PIL/WebPImagePlugin.py | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index bdec8273de0..a79ae8d9f2c 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -153,6 +153,26 @@ def test_file_pointer_could_be_reused(self): Image.open(blob).load() Image.open(blob).load() + @unittest.skipUnless(HAVE_WEBP and _webp.HAVE_WEBPANIM, + "WebP save all not available") + def test_background_from_gif(self): + im = Image.open("Tests/images/chi.gif") + original_value = im.convert("RGB").getpixel((1, 1)) + + # Save as WEBP + out_webp = self.tempfile("temp.webp") + im.save(out_webp, save_all=True) + + # Save as GIF + out_gif = self.tempfile("temp.gif") + Image.open(out_webp).save(out_gif) + + reread = Image.open(out_gif) + reread_value = reread.convert("RGB").getpixel((1, 1)) + difference = sum([abs(original_value[i] - reread_value[i]) + for i in range(0, 3)]) + self.assertLess(difference, 5) + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/WebPImagePlugin.py b/src/PIL/WebPImagePlugin.py index 084eedf53ae..212e6b4c76c 100644 --- a/src/PIL/WebPImagePlugin.py +++ b/src/PIL/WebPImagePlugin.py @@ -196,6 +196,14 @@ def _save_all(im, fp, filename): background = encoderinfo["background"] elif "background" in im.info: background = im.info["background"] + if isinstance(background, int): + # GifImagePlugin stores a global color table index in + # info["background"]. So it must be converted to an RGBA value + palette = im.getpalette() + if palette: + r, g, b = palette[background*3:(background+1)*3] + background = (r, g, b, 0) + duration = im.encoderinfo.get("duration", 0) loop = im.encoderinfo.get("loop", 0) minimize_size = im.encoderinfo.get("minimize_size", False) From f87406479c4fede2c4363782560a715f92befd64 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 20 Nov 2018 10:51:40 +0200 Subject: [PATCH 0683/1393] Use VM-based infrastructure https://blog.travis-ci.com/2018-11-19-required-linux-infrastructure-migration --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b9492393323..ec1c0b536e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,6 @@ matrix: - python: "3.6" name: "Lint" env: LINT="true" - sudo: false - python: "pypy" name: "PyPy Trusty" dist: trusty From 248d5f7eede2c5b0d54ad2a075c5e6bbf6c224b3 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 20 Nov 2018 11:06:28 +0200 Subject: [PATCH 0684/1393] 'sudo: required' no longer needed --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec1c0b536e8..6e8bb7b5fbc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ dist: xenial -sudo: required language: python cache: pip From 0f42cdd63936fcc4c805c55e3b9c666d2bd64439 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 23 Nov 2018 18:57:17 +1100 Subject: [PATCH 0685/1393] Added functions to Read The Docs sidebar --- docs/_static/js/script.js | 60 +++++++++++++++++++++++++++++++++++++++ docs/conf.py | 3 ++ 2 files changed, 63 insertions(+) create mode 100644 docs/_static/js/script.js diff --git a/docs/_static/js/script.js b/docs/_static/js/script.js new file mode 100644 index 00000000000..2cd7335ece6 --- /dev/null +++ b/docs/_static/js/script.js @@ -0,0 +1,60 @@ +jQuery(document).ready(function ($) { + setTimeout(function () { + var sectionID = 'base'; + var search = function ($section, $sidebarItem) { + $section.children('.section, .function, .method').each(function () { + if ($(this).hasClass('section')) { + sectionID = $(this).attr('id'); + search($(this), $sidebarItem.parent().find('[href=#'+sectionID+']')); + } else { + var $dt = $(this).children('dt'); + var id = $dt.attr('id'); + if (id === undefined) { + return; + } + + var $functionsUL = $sidebarItem.siblings('[data-sectionID='+sectionID+']'); + if (!$functionsUL.length) { + $functionsUL = $('

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 delta 6410 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 diff --git a/Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif b/Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif index bbb969cc20f9043ee1c730b1656ce22d6ffb34e4..ca8b634bb32a4a3db2b3be8cb026921d77341feb 100644 GIT binary patch literal 71401 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 Z(MNfnxBmbxfA-G2ANh>=n|-g5|Jij*Rrmk^ literal 44042 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 diff --git a/Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif b/Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif index 86b5816668e2faf7e07d32ee047b566401f9e02b..c3207e451e6b8170f29f5fdc15169a25522afd7a 100644 GIT binary patch literal 29068 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 literal 35896 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

WT^bZp)uZTu?+hNy@LtgP7=K-~B0*MkF2SKcs| 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 +o?x?bSCLebuIi%`Zq@lf;SNI&5*Vr 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%0Dq3A?O@= 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